2013-04-08 72 views
3

我正在使用SQL加载器将我的数据加载到数据库中。ORA删除/截断

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

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错误/截断了表IMPORT_ABC ORA-30036:无法在撤消表空间中将段8扩展为'撤消1'

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

+3

如果它不需要恢复 - 大概没有,如果你要更换 - 是否有你使用['替换']的原因(http://docs.oracle.com/cd/E11882_01/ server.112/e22490/ldr_control_file.htm#sthref660)而不是['truncate'](http://docs.oracle.com/cd/E11882_01/server.112/e22490/ldr_control_file.htm#sthref669)? – 2013-04-08 12:11:25

+0

不, 我只想删除表 中的所有项目,然后插入一个新的 – 4est 2013-04-08 12:56:58

回答

1

删除之前批量记录可以在PL/SQL循环中完成,但通常被认为是不好的做法,因为整个删除通常应被视为单个事务;并且不能从SQL * Loader控制文件内完成。你的DBA应该调整空间来容纳你需要做的工作。

如果您要删除整个表,你几乎肯定会是无论如何更好截断,要么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单独truncate声明*加/ SQL开发人员/其他客户启动加载之前:

truncate table import_abc; 

的缺点是,当正在加载的新行的表将显示为空给其他用户,但如果它是一个专用的进口区域(从名字猜测),可能并不重要任何办法。

如果您的UNDO确实很小,那么您可能需要运行多个负载,在这种情况下 - 很明显 - 您需要确保在第一个控制文件中只有truncate(或使用单独的truncate声明),并且在注释中记下的后续控制文件中有append

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

+0

我可以这样做: 拳头sql *装载程序文件: '代码选项(skip = 1,装载= 250000,错误= 0,ROWS = 30000,BINDSIZE = 10485760) 装载数据 infile'G:\ Remediation metrics \ Source data \ Data Backup&Recovery \ ALL_admin_combined_report_v1.csv” “海峡 '^ _ ^'” 截断 到表IMPORT_ABC ..... 第二使用SQL * Loader文件: 选项(跳过= 250001,负荷= 250000错误= 0,行数= 30000 ,BINDSIZE = 10485760) 加载数据 infile'2.csv''str '^ _ ^”' 追加 成表.. 第三SQL *装载机: 选项(跳过= 500001,负荷= 25万,误差= 0,ROWS = 30000,BINDSIZE = 10485760) 负载数据 infile的“1 .csv'“str'^ _ ^'” 将 附加到表 – 4est 2013-04-08 14:11:08

+0

@ user2207426 - 是的,这就是我的意思。增加了对答案的参考;谢谢。 – 2013-04-08 14:27:38

+0

@AlexPoole:Thx!它会工作,但我的用户不会被授予截断权限。我只删除privs。现在我使用一个单独的sqlplus语句来删除数据,而不是像上面那样sqlldr ...但我并不好笑...... – Sauer 2017-11-03 13:40:52

0

您的撤销表空间很小以容纳所有撤消信息,而且看起来不能扩展。

您可以导入分割成更小批量,并发出每个批次后提交或让你的DBA增加表空间undo1

和使用替代的代替截断启动immports

+1

'replace'将尝试在第一次运行时删除表中的所有内容,但是很多记录正在插入;并且随后使用相同参数运行将删除刚插入的行。批处理可能需要插入阶段虽然... – 2013-04-08 12:15:55

+0

是的,但使用截断应该可以解决这个问题 – Sibster 2013-04-08 12:27:54

+0

是的, 我有数据导入拆分为3个配置文件,并没关系 但我不能删除所有项目在数据库)一次,不知何故我需要删除他们由1000rows等 我该怎么办呢? – 4est 2013-04-08 12:36:58