2012-08-28 34 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. क्या हो रहा है यदि आप किसी भी प्रकार की प्रतिबद्धता या रोलबैक के बिना ऊपरी स्तर तक बढ़ने में त्रुटि के कारण स्वायत्त लेनदेन से बाहर निकलते हैं तो क्या हो रहा है?

बहुत बहुत धन्यवाद। एस

उत्तर

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

संबंधित मुद्दे