我正在使用 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(
.
.
.
.)
但我得到了如下错误:
SQL*LOADER-926:对表 IMPORT_ABC 执行删除/截断时发生 OCI 错误
ORA-30036: 无法在撤消表空间“undo1”中将段扩展 8
如何删除数据,例如 10000 行?
我知道我的数据库有一些限制。
最佳答案
批量删除记录可以在 PL/SQL 循环中完成,但通常被认为是不好的做法,因为整个删除通常应视为单个事务;这不能从 SQL*Loader 控制文件中完成。您的 DBA 的大小应该是 UNDO
空间来容纳您需要做的工作。
如果您要删除整个表,那么无论如何截断几乎肯定会更好,要么in the control file :
options(skip=1,load=250000,errors=0,ROWS=30000,BINDSIZE=10485760)
load data
infile 'G:1.csv' "str '^_^'"
truncate
into table IMPORT_ABC
...
或作为单独的
truncate
开始加载之前在 SQL*Plus/SQL Developer/其他客户端中的语句:truncate table import_abc;
缺点是当加载新行时,您的表对其他用户来说是空的,但如果它是专用的导入区域(从名称中猜测),无论如何都可能无关紧要。
如果您的
UNDO
真的那么小,那么您可能必须运行多个负载,在这种情况下-可能很明显-您需要确保只有 truncate
在第一个的控制文件中(或使用单独的 truncate
语句),并有 append
而是在您在评论中指出的后续控制文件中。您可能还想考虑 external tables如果您将此数据用作填充其他内容的基础,因为没有
UNDO
替换外部数据源的开销。您可能需要与您的 DBA 讨论设置并授予您必要的目录权限。
关于sql - ORA删除/截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15878297/