5

我正在使用 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 行?我知道我的数据库有一些限制。

4

2 回答 2

3

批量删除记录可以在 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
...

truncate或者在开始加载之前作为 SQL*Plus/SQL Developer/其他客户端中的单独语句:

truncate table import_abc;

缺点是在加载新行时,您的表对其他用户来说是空的,但如果它是一个专用的导入区域(从名称猜测),无论如何都可能无关紧要。

如果你UNDO真的那么小,那么你可能必须运行多个负载,在这种情况下 - 可能很明显 - 你需要确保你只有truncate第一个的控制文件(或使用单独的truncate语句),append而是有正如您在评论中指出的那样,在后续的控制文件中。

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

于 2013-04-08T13:33:52.170 回答
0

您的撤消表空间太小,无法容纳所有撤消信息,并且似乎无法扩展。

您可以将导入拆分为更小的批次并在每个批次之后发出提交,或者让您的 DBA 增加表空间以进行 undo1

并在开始导入之前使用 truncate 而不是 replace

于 2013-04-08T11:55:09.080 回答