我正在使用以下查詢將數據從一個表複製到同一個數據庫中的另一個表「insert into table select * from time_stamp < =(從double中選擇ADD_MONTHS(sysdate,-1)) 「但我需要一次限制爲1000行,然後提交更改並繼續複製。有人可以幫我解決這個問題嗎?oracle sql批處理
回答
你爲什麼要那樣做?它使得這個過程變得更慢,更難編碼,在發生錯誤時難以恢復。
除非您有特殊原因,否則只會在最後提交。否則,你必須編寫PL/SQL來完成它。
你的代碼應該是:
insert into table
select *
from table
where time_stamp <= ADD_MONTHS(sysdate,-1);
該代碼完美工作,但記錄數量以百萬爲單位,最好是批量複製 –
@ user3274312 - 爲什麼你認爲最好是批量分發? ([這是Tom Kyte認爲它不是的一個例子](http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4951966319022#4959613293151),這與大衛所說的相呼應)。 –
對於「數百萬」,我會考慮直接路徑插入,如果您可以在插入過程中鎖定表格。 –
這是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;
我還沒有測試,但這是更多關於一個想法如何做到這一點。
將'SAVE EXCEPTIONS'附加到您的FORALL可能會捕獲異常(約束)並進入下一個記錄。否則當發生一個異常時它會停止。來自[Oracle Docs]的更多詳細信息(http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/tuning.htm#i49099) –
- 1. Oracle SOA中的批處理
- 2. Oracle批處理數據庫
- 3. Oracle在批處理文件中導入批處理文件
- 4. 批處理VS SQL語句
- 5. SQL批處理刪除
- 6. PL/SQL Oracle錯誤處理
- 7. 使用批處理文件循環訪問Oracle SQL腳本
- 8. 將參數從批處理文件傳遞給Oracle SQL文件
- 9. 通過批處理文件連接Oracle
- 10. EclipseLink 2.3加上Oracle 11g批處理
- 11. 批處理DataFieldMaxValueIncrementer
- 12. SQL批處理查詢處理(SQL查詢輸入數組)
- 13. Java&SQL - 批處理必須執行或清除批處理時出錯
- 14. 從批處理cmd窗口執行SQL Plus SQL命令掛起
- 15. 休眠批處理
- 16. 清理批處理preparedstatements
- 17. 組織SQL批處理語句
- 18. 以批處理模式選擇JDBC SQL
- 19. 在批處理中執行SQL腳本
- 20. 在sql中處理批量插入
- 21. 批處理sql服務器錯誤
- 22. SQL觸發批處理文件
- 23. C#和SQL Server 2008批處理更新
- 24. 批處理文件中的SQL結果
- 25. 分組在SQL Server中的批處理
- 26. 創建批處理的sql語句
- 27. Codeigniter - 插入批處理 - 我的sql
- 28. 連接到SQL從批處理腳本
- 29. 在單獨的批處理文件中執行sql批處理文件
- 30. 批處理docx
如果您需要複製整個表格,請嘗試使用CTAS(創建表格作爲選擇),然後一次完成。 – tbone