sql – ORA删除/截断

我正在使用SQL loader将我的数据加载到数据库中.

在插入数据之前,我需要删除表中的现有数据:

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行?
我知道我的数据库有一些限制.

最佳答案 批量删除记录可以在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语句),并且在备注中有append而不是后续控制文件.

如果您使用此数据作为填充其他内容的基础,您可能还需要考虑external tables,因为替换外部数据源时没有UNDO开销.您可能需要与您的DBA讨论如何设置它并为您提供必要的目录权限.

点赞