2012-08-28 28 views
6

我懷疑了一下。讓我們假設這個包的程序:自治事務範圍和錯誤提升

PROCEDURE ERR_MANAGER(I_ERRM IN VARCHAR2) IS 
BEGIN 
    ROLLBACK; 
    --DO SOME STUFF 
END ERR_MANAGER; 

PROCEDURE test IS 
    PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 

    test2; 
    COMMIT; 
EXCEPTION WHEN OTHERS THEN ERR_MANAGER(SQLERRM); 
END test; 


PROCEDURE test2 IS 
BEGIN 

    --DO SOME TRANSACTIONNAL DML 

    RAISE_APPLICATION_ERROR(-20001, 'ERR'); --for the test purpose, in reality this could be any actual error 

END test2; 

所以,你可以看到有一個在test2()一個錯誤,這是會籌集最多test(),然後在err_manager()方法來處理。

所以我有2個問題:

  1. 什麼err_manager的範圍()?它是否仍在自主交易中?我想是的,因爲它只是一個函數調用,但我想確定
  2. 如果因爲升級錯誤而無法進行任何類型的提交或回滾而退出自治事務,會發生什麼情況?

非常感謝你。 S.

回答

9
  1. err_manager過程執行的事務範圍是調用自治事務,你是正確的。

    程序和函數繼承它們的調用事務,除非它們本身是自治事務。

  2. 當自治事務引發未處理的錯誤時,它將回滾其更改並將錯誤傳播給調用應用程序。這是一個測試:

    SQL> CREATE TABLE t (id number); 
    
    Table created. 
    
    SQL> DECLARE 
        2  l NUMBER; 
        3  PROCEDURE p IS 
        4  pragma autonomous_transaction; 
        5  BEGIN 
        6  insert into t values (1); 
        7  raise_application_error(-20001, 'rollback?'); 
        8  END; 
        9 BEGIN 
    10  p; 
    11 EXCEPTION 
    12  WHEN OTHERS THEN 
    13  DBMS_OUTPUT.put_line('error catched:' || sqlcode); 
    14  SELECT COUNT(*) INTO l FROM t; 
    15  DBMS_OUTPUT.put_line('lines in t: ' || l); 
    16 END; 
    17/
    error catched:-20001 
    lines in t: 0 
    
    PL/SQL procedure successfully completed. 
    
+0

太棒了,謝謝! – Sebas