我正在使用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执行delete / truncate时出现OCI错误 ORA-30036:无法在撤消表空间'undo1'
中将段扩展8如何删除数据,例如10000行? 我知道我的数据库有一些限制。
答案 0 :(得分:2)
批量删除记录可以在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
...
或者在开始加载之前,在SQL * Plus / SQL Developer /其他客户端中作为单独的truncate
语句:
truncate table import_abc;
缺点是,在加载新行时,您的表对其他用户显示为空,但如果它是一个专用的导入区域(从名称猜测),无论如何都可能无关紧要。
如果您的UNDO
真的很小,那么您可能需要运行多个加载,在这种情况下 - 可能显然 - 您需要确保在控制文件中只有truncate
用于第一个(或使用单独的truncate
语句),并在后续控制文件中使用append
,如您在评论中所述。
如果您使用此数据作为填充其他内容的基础,您可能还需要考虑external tables,因为更换外部数据源时没有UNDO
开销。您可能需要与您的DBA讨论如何设置并为您提供必要的目录权限。
答案 1 :(得分:0)
你的撤销表空间很小,可以容纳所有的撤消信息,似乎无法扩展。
您可以将导入拆分为较小的批处理并在每个批处理后发出提交,或者让DBA增加undo1的表空间
在开始进口之前使用truncate而不是替换