2012-09-21 24 views
12

En un procedimiento, quiero hacer unidad lógica 1, no importa si no funciona, ejecute unidad lógica 2Try Catch Como control de excepciones En PL/SQL

esto parece un escenario típico try-catch. pero ¿cómo puedo hacerlo en pl/sql?

create or replace 
PACKAGE BUILD_PKG 
AS 
PROCEDURE reset_seq_and_truncate_tbl(
    p_seq_name IN VARCHAR2, 
    p_table_name IN VARCHAR2); 
END BUILD_PKG; 
/
create or replace 
PACKAGE BODY BUILD_PKG 
AS 
BEGIN 
PROCEDURE reset_seq_and_truncate_tbl(
    p_seq_name IN VARCHAR2, 
    p_table_name IN VARCHAR2) 
IS 
    l_val NUMBER; 
BEGIN 
    BEGIN 
    EXECUTE immediate 'truncate table ' || p_table_name; 
    EXCEPTION 
     WHEN OTHERS 
     THEN dbms_output.put_line(SQLCODE); 
    END; 

    BEGIN 
    EXECUTE immediate 'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0'; 
    EXCEPTION 
     WHEN OTHERS 
     THEN dbms_output.put_line(SQLCODE); 
    END; 
END reset_seq_and_truncate_tbl; 

END BUILD_PKG; 

como se puede ver el segundo bloque de excepción causa del problema.

Respuesta

16

Enclose el segundo EXCEPTION en el bloque BEGIN..END. Pruebe esta manera

PROCEDURE reset_seq_and_truncate_tbl(
    p_seq_name IN VARCHAR2, 
    p_table_name IN VARCHAR2) 
IS 
    l_val NUMBER; 
BEGIN 
    EXECUTE immediate 'truncate table ' || p_table_name; 
EXCEPTION 
     WHEN OTHERS 
     THEN 
     BEGIN 
     dbms_output.put_line(SQLCODE); 
     EXECUTE immediate 'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0'; 
     --this would cause compilation error 
     EXCEPTION 
      WHEN OTHERS 
      THEN dbms_output.put_line(SQLCODE); 
    END; 
END reset_seq_and_truncate_tbl; 

de actualización en respuesta a la observación

PROCEDURE reset_seq_and_truncate_tbl(
    p_seq_name IN VARCHAR2, 
    p_table_name IN VARCHAR2) 
IS 
    l_val NUMBER; 
BEGIN 
    BEGIN 
    EXECUTE immediate 'truncate table ' || p_table_name; 
    EXCEPTION 
     WHEN OTHERS 
     THEN dbms_output.put_line(SQLCODE); 
    END; 

    BEGIN 
    EXECUTE immediate 'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0'; 
    EXCEPTION 
     WHEN OTHERS 
     THEN dbms_output.put_line(SQLCODE); 
    END; 
END reset_seq_and_truncate_tbl; 
+0

Casi exacto a mi respuesta. Eliminaré el mío. –

+0

lo siento, debería haberlo dejado más claro. Ejecute la lógica 1, no importa si falla, ejecute la lógica 2 –

+0

eche un vistazo a la segunda aproximación –

1

PROCEDIMIENTO ( ) ES

COMENZAR

- Logical Unit 1 COMENZAR ... EXCEPCIÓN CUANDO OTROS THEN ... END;

- Logical Unit 2 COMENZAR ... EXCEPCIÓN CUANDO OTROS ENTONCES ... FIN;

- Excepción final del bloque EXCEPCIÓN CUANDO OTROS ENTONCES ...

FIN;