2012-08-28 12 views
6

Estoy dudando un poco. Supongamos procedimientos de este paquete:Alcance de transacción autónoma y aumento de error

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; 

Por lo tanto, como se puede ver que hay un error en test2(), que se va a levantar a test(), y luego ser manejado en el método err_manager().

así que tengo 2 preguntas:

  1. ¿cuál es el alcance de err_manager()? ¿Todavía está dentro de la transacción autónoma? Supongo que sí, ya que solo es una llamada a función, pero me gustaría estar seguro
  2. ¿Qué sucede si sale brutalmente de una transacción autónoma debido a un error al subir a niveles superiores, sin proceder a ningún tipo de confirmación o reversión?

Muchas gracias. S.

Respuesta

9
  1. El ámbito de transacción de la ejecución del procedimiento err_manager es la transacción autónoma llamar, estás en lo correcto.

    Los procedimientos y funciones heredan sus transacciones de llamadas a menos que sean en sí mismas transacciones autónomas.

  2. Cuando una transacción autónoma genera un error no controlado, revierte sus cambios y el error se propaga a la aplicación de llamada. Aquí está una prueba:

    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

fantástica, gracias! – Sebas

Cuestiones relacionadas