2011-03-09 125 views
1

PL/SQL循環是否在特定的時間間隔自動提交,還是我需要在循環之後提交?在PL/SQL中運行循環時,是否需要事後提交?

Oracle 10g和11g

FORALL i IN x.FIRST .. x.LAST 
    delete from table where 1=1; 

我現在有一個PL/SQL腳本進行批量收集,然後運行該FORALL遍歷集合循環3種不同的。我目前正在每個循環完成後提交一個腳本中的commit語句。這是否需要?它是否會減慢執行速度,尤其是當該集合有數百萬個條目時?

謝謝

回答

3

FORALL語句是標準的DML:它只是一批單獨的語句。因此,您應該遵循標準規則來決定是否需要提交:只有在事務結束時才提交,當您達到一致的狀態時,永遠不會提交。

如果您有3個FORALL語句,沒有理由提交3次,除非每個語句單獨執行一個事務。

在任何情況下,如果您的作業在第一個FORALL語句後失敗,如果您尚未提交尚未提交,重啓將會容易得多。

4

您必須在FORALL後顯式提交。畢竟,您正在使用FORALL執行高速DML,而且您應該知道,DML不會自動提交。另外,即使hough FORALL遍歷一個集合的所有行,它也不是一個循環,而是一個聲明。它既沒有LOOP也沒有END LOOP語句。

+2

雖然我同意你在答案中所說的一切,但我不認爲它完全回答了這個問題。在FORALL語句後不需要*提交。您可以稍後再提交,並且您不應在交易結束前提交。 – 2011-03-10 12:37:31

+0

+1「FORALL不是一個循環」 – 2011-05-26 03:33:20