ORA删除/截断

时间:2013-04-08 11:49:09

标签: 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(
.
.
.
.)

但我得到的错误如下:

SQL * LOADER-926:对表IMPORT_ABC执行delete / truncate时出现OCI错误 ORA-30036:无法在撤消表空间'undo1'

中将段扩展8

如何删除数据,例如10000行? 我知道我的数据库有一些限制。

2 个答案:

答案 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而不是替换