2014-02-11 102 views
1

我正在使用以下查詢將數據從一個表複製到同一個數據庫中的另一個表「insert into table select * from time_stamp < =(從double中選擇ADD_MONTHS(sysdate,-1)) 「但我需要一次限制爲1000行,然後提交更改並繼續複製。有人可以幫我解決這個問題嗎?oracle sql批處理

+0

如果您需要複製整個表格,請嘗試使用CTAS(創建表格作爲選擇),然後一次完成。 – tbone

回答

4

你爲什麼要那樣做?它使得這個過程變得更慢,更難編碼,在發生錯誤時難以恢復。

除非您有特殊原因,否則只會在最後提交。否則,你必須編寫PL/SQL來完成它。

你的代碼應該是:

insert into table 
select * 
from table 
where time_stamp <= ADD_MONTHS(sysdate,-1); 
+0

該代碼完美工作,但記錄數量以百萬爲單位,最好是批量複製 –

+1

@ user3274312 - 爲什麼你認爲最好是批量分發? ([這是Tom Kyte認爲它不是的一個例子](http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4951966319022#4959613293151),這與大衛所說的相呼應)。 –

+0

對於「數百萬」,我會考慮直接路徑插入,如果您可以在插入過程中鎖定表格。 –

1

這是PL/SQL塊,你可以用它來實現自己的目標

declare 
    cursor c is 
    select * 
    from tableName 
    where time_stamp <= add_months(sysdate,-1); 

    type tbl is table of c%rowtype; 

    t  tbl; 
begin 
    open c; 

    loop 
    fetch c bulk collect into t limit 1000; 

    exit when c%notfound; 

    forall i in 1..t.count 
    insert into tableName2 values t(i); 

    commit; 
    end loop; 

    close c; 
end; 

不幸的是,我不知道您的欄,你可以重寫這一部分

insert into tableName2 values t(i); 

eg像那

insert into tableName2(col1,col2) values t(i).col1,t(i).col2; 

我還沒有測試,但這是更多關於一個想法如何做到這一點。

+1

將'SAVE EXCEPTIONS'附加到您的FORALL可能會捕獲異常(約束)並進入下一個記錄。否則當發生一個異常時它會停止。來自[Oracle Docs]的更多詳細信息(http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/tuning.htm#i49099) –