4es*_*est 5 sql oracle truncate sql-loader
我正在使用 SQL 加载器将我的数据加载到数据库中。
在插入数据之前,我需要删除表中的现有数据:
options(skip=1,load=250000,errors=0,ROWS=30000,BINDSIZE=10485760)
load data
infile 'G:1.csv' "str '^_^'"
replace
into table IMPORT_ABC
fields terminated by "," OPTIONALLY ENCLOSED BY '"'
trailing nullcols(
.
.
.
.)
Run Code Online (Sandbox Code Playgroud)
但我得到了如下错误:
SQL*LOADER-926:对表 IMPORT_ABC 执行删除/截断时发生 OCI 错误 ORA-30036:无法在撤消表空间“undo1”中将段扩展 8
如何删除数据,例如 10000 行?我知道我的数据库有一些限制。
批量删除记录可以在 PL/SQL 循环中完成,但通常被认为是不好的做法,因为整个删除通常应被视为单个事务;这无法从 SQL*Loader 控制文件中完成。您的 DBA 应该调整UNDO空间大小以容纳您需要完成的工作。
如果您要删除整个表,那么几乎肯定最好在控制文件中进行截断:
options(skip=1,load=250000,errors=0,ROWS=30000,BINDSIZE=10485760)
load data
infile 'G:1.csv' "str '^_^'"
truncate
into table IMPORT_ABC
...
Run Code Online (Sandbox Code Playgroud)
truncate或者在开始加载之前作为 SQL*Plus/SQL Developer/其他一些客户端中的单独语句:
truncate table import_abc;
Run Code Online (Sandbox Code Playgroud)
缺点是,在加载新行时,您的表对其他用户来说将显示为空,但如果它是专用导入区域(从名称猜测),则无论如何都可能无关紧要。
如果你UNDO真的那么小,那么你可能必须运行多个加载,在这种情况下 - 可能显然 - 你需要确保你只truncate在第一个加载的控制文件中(或使用单独的truncate语句),并append改为正如您在评论中指出的那样,在后续控制文件中。
如果您使用此数据作为填充其他内容的基础,您可能还需要考虑外部表UNDO,因为替换外部数据源没有开销。您可能需要与您的 DBA 讨论如何设置并授予您必要的目录权限。