2012-02-22 31 views
3

我有以下步驟:例外,在存儲過程

procedure mayFailProc() as 
begin 
    insert into t1 (id, val) values (1, '123'); 
    insert into t1 (id, val) values (2, '123'); 
    insert into t1 (id, val) values (3, '123'); //fails, i.e. due to pk uniqueness error 
end; 

此異常mayFailProc拋出是很正常的事情,它是由它的調用者處理。所以事務不會回滾,並繼續執行,就好像mayFailProc中沒有異常一樣。我想知道前兩次成功執行的插入操作會發生什麼?他們會被保留嗎?

回答

3

here for Oracle's explanation。您可以跳轉到如何啓動Oracle隱式回滾部分。

在執行INSERT,UPDATE或DELETE語句之前,Oracle將 標記爲隱式保存點(對您無效)。如果該語句失敗,則Oracle回滾到保存點 。通常,只有失敗的SQL 語句被回滾,而不是整個事務。如果語句 引發未處理的異常,則主機環境確定回滾的內容爲 。

更多:

你應該明確地提交或回滾每一筆交易。在您的PL/SQL程序或 客戶端程序中是否發出提交或回滾的 取決於應用程序邏輯。如果您沒有提交 或顯式回滾事務,則客戶端環境 將確定其最終狀態。例如,在SQL * Plus環境中,如果您的PL/SQL塊 不包含COMMIT或ROLLBACK語句,那麼您的 事務的最終狀態取決於您在運行該塊後執行的操作。如果您執行數據定義,數據控制或COMMIT語句 ,或者如果您發出EXIT,DISCONNECT或QUIT命令,則Oracle提交 事務。如果執行ROLLBACK語句或中止SQL * Plus會話,Oracle將回退該事務。

0

剛剛做了一個快速測試......在我的測試中排在第三插入引起了不保留「唯一約束......違反了」錯誤