我一直在尋找一段時間,找不到這個。我與甲骨文合作,有一個類似,對於循環:自動提交開啓時顯式提交是否正常?
BEGIN
FOR YEARIDs IN (SELECT DISTINCT YEARID From MyTable)
LOOP
UPDATE (
SELECT ......
)
SET MyFlag = 1;
COMMIT; -- Added
END LOOP;
END;
自動提交被打開,但現在看來,提交不會發生,直到整個for循環結束。因此,我在上面的代碼中添加了Commit語句。這是否會導致任何意想不到的結果,還是這違反了最佳做法? (即我不應該進行顯式調用時自動提交開啓以犯?)
感謝, 斯科特
編輯:哎呀...我使用的是Oracle 11g和Oracle SQL Developer中的客戶端。
編輯:謝謝你的迴應,迄今。在查詢運行的時間點,數據正在生成&調整。沒有其他連接應該嘗試訪問數據。至於爲什麼我經常提交,在開發過程中,我針對數據的一個子集運行查詢,查詢運行得很好。該表擁有大約1400萬條記錄,我正在測試大約10萬條記錄。查詢相當複雜,並且在大約5分鐘內針對這個子集運行。當我對整個表格運行時,查詢運行時間超過14小時,無法更新任何記錄。我的理論是,持有這麼多撤銷信息可能會消耗開發服務器上的所有可用資源。如果我頻繁提交,撤消信息可以被釋放並重新使用。是的,這很慢。但是,如果查詢將實際完成,即使需要一整夜,也可以將其移至測試服務器。 (性能調整可以在以後完成。)截止日期早已過去。 (在錯過最後期限之後,我被帶進來提供幫助,而我的專業領域不在Oracle中。)
不應該犯是外循環? (在END LOOP之後)。 – Fergus
自動提交將在聲明完成後發生,在這種情況下,整個匿名塊完成;不是在'for'循環之後。學術在這種情況下,因爲無論如何都要注意循環,但仍然......爲什麼你要這麼頻繁地提交? –
閱讀這篇關於Oracle autocommit(或缺乏)細微差別的文章。 http://asktom.oracle.com/pls/apex/f?p=100:11:0::NO::P11_QUESTION_ID:314816776423。正如其他人所指出的那樣,在每次迭代之後提交是一個壞主意,但如果您有一個覆蓋這些問題的用例,請在您的問題中分享。 –