2012-08-28 13 views
6

Biraz şüphe duyuyorum. en bu paketin prosedürleri varsayalım:otonom işlem kapsamı ve hata bildirme

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; 

Yani, err_manager() yönteminde ele alınması ardından test() kadar yükseltmek için gidiyor test2() bir hata, orada görmek ve gibi.

Yani 2 soru var:

err_manager kapsamını ne
  1. ()? Hala otonom işlemin içinde mi? Sanırım, sadece bir işlev çağrısı olduğu için,
  2. emin olmak isterim ki, üst düzey seviyelere yükselen bir hata nedeniyle otonom bir işlemden çıkıp, herhangi bir taahhüt veya geri alma işlemine devam etmeden ne oluyor?

Çok teşekkür ederim. S.

cevap

9
  1. err_manager prosedürlerinin yürütülmesi işlem kapsamı doğru olan, çağrı özerk işlemdir.

    Prosedürler ve işlevler, kendileri bağımsız işlemler olmadıkça arama işlemlerini devralırlar.

  2. Özerk bir işlem, işlenmemiş bir hatayı artırdığında, değişikliklerini geri yükler ve hata çağrıya yayılan uygulamaya yayılır. İşte bir test:

    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

fantastik, teşekkür ederim! – Sebas