2013-04-08 95 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