2011-06-06 29 views
5

Tengo un procedimiento almacenadoEl manejo de excepciones en PL/SQL

create or replace procedure Trial 
    is 
Begin 
---Block A-- 
EXCEPTION 
when others then 
insert into error_log values('error'); 
--Block A ends---- 
--Block B ---- 
----Block B ends--- 
end; 

Quiero código en el bloque B para ejecutar en todas las condiciones es decir, si excepción en el bloque A se eleva o not.With el código anterior ejecuta el bloque B solo si se plantea una excepción. Cómo hacer esto. Por favor ayuda.

Respuesta

6

Puede creado bloques anidados:

create or replace procedure Trial 
    is 
Begin 
    begin 
    ---Block A-- 
    EXCEPTION 
    when others then 
     insert into error_log values('error'); 
    end; 
    begin 
    --Block B ---- 
    end; 
end; 
+1

Usted realmente no necesita el 'begin' /' end' alrededor bloque B, pero se puede añadir claridad en este caso. –

2

Tenga en cuenta que se trata de un anti patrón común a capturar todas las excepciones sin levantar ellos. También puede considerar una transacción autónoma para mantener el registro de errores después de una reversión.

Así que probablemente estaría mejor con algo como esto:

create or replace procedure Trial 
is 

    procedure finally is 
    begin 
    --Block B ---- 
    end; 

    procedure logerr (msg varchar2) is 
    PRAGMA AUTONOMOUS_TRANSACTION; 
    begin 
    insert into error_log values(msg); 
    commit; 
    end; 

Begin 
    begin 
    ---Block A-- 
    EXCEPTION 
    when others then 
     logerr(SQLERRM); 
     finally; 
     raise; 
    end; 

    finally; 
end;