Sql 删除/截断

Sql 删除/截断,sql,oracle,truncate,sql-loader,Sql,Oracle,Truncate,Sql Loader,我正在使用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 nullco

我正在使用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:为表导入执行删除/截断时发生OCI错误 ORA-30036:无法在撤消表空间“undo1”中将段扩展8

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

您的undo表空间太小,无法容纳所有的undo信息,似乎无法扩展

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


在启动immports之前,使用truncate而不是replace可以在PL/SQL循环中批量删除记录,但通常被认为是不好的做法,因为整个删除通常应被视为一个事务;这不能从SQL*加载程序控制文件中完成。DBA应该调整
UNDO
空间的大小,以适应您需要完成的工作

如果要删除整个表,几乎可以肯定的是,不管怎样,截断都会更好:

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

truncate table import_abc;
缺点是,在加载新行时,您的表对其他用户来说将显示为空,但如果它是一个专用的导入区域(根据名称猜测),则无论如何都可能无关紧要

如果您的
UNDO
确实很小,那么您可能需要运行多个加载,在这种情况下-可能很明显-您需要确保第一个加载只在控制文件中包含
truncate
(或使用单独的
truncate
语句),并改为在后续控制文件中,如您在注释中所述


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

如果它不需要可恢复(如果您正在替换它,可能不会),您使用它的原因是什么,我只想删除表中的所有项,然后插入一个新项
replace
将尝试在第一次运行时删除表中的所有项,无论插入了多少条记录;使用相同参数的后续运行将删除刚才插入的行。插入阶段可能需要批处理…是的,我已将数据导入拆分为3个配置文件,这没问题,但我无法一次性删除所有项(以DB为单位),不知何故,我需要将它们删除1000行,等等。我该怎么做?您尝试过截断吗?或者您可以尝试基于rowid删除我可以这样做:First sqlloader文件:`code options(skip=1,load=250000,errors=0,ROWS=30000,BINDSIZE=10485760)加载数据填充'G:\rectification metrics\Source data\data Backup&Recovery\ALL_admin\u combined\u report\u v1.csv''str'^截断为表导入\u ABC。。。。。第二个sqlloader文件:选项(skip=250001,load=250000,errors=0,ROWS=30000,BINDSIZE=10485760)加载数据填充“2.csv”“str'^"追加到表中。。第三个sql*加载程序:选项(skip=500001,load=250000,errors=0,ROWS=30000,BINDSIZE=10485760)加载数据填充到table@user2207426-是的,我就是这个意思。增加了对答案的引用;谢谢。@AlexPoole:谢谢!它可以工作,但我的用户不会被授予truncate权限。我只有删除权限。现在我使用一个单独的sqlplus语句来删除数据,而不是像上面那样使用sqlldr。。。但我不觉得有趣。。。
truncate table import_abc;