2012-09-21 12 views
12

In una procedura, voglio fare unità logica 1, non importa se non riesce, eseguire unità logica 2Prova catch Ti piace Gestione delle eccezioni in Pl/Sql

questo mi sembra un tipico scenario try-catch. ma come posso farlo in 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; 

come si può vedere il secondo blocco Eccezione causa il problema.

risposta

16

Accludere il secondo EXCEPTION nel blocco BEGIN..END. Prova questo modo

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; 

UPDATE in risposta al commento

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

Quasi esatto alla mia risposta. cancellerò il mio. –

+0

scusa, avrei dovuto renderlo più chiaro. esegui la logica 1, non importa se fallisce, esegui la logica 2 –

+0

dai un'occhiata al secondo approccio –

1

PROCEDURA ( ) IS

BEGIN

- Logical Unit1 BEGIN ... ECCEZIONE QUANDO GLI ALTRI THEN ... END;

- Logical Unit2 BEGIN ... ECCEZIONE QUANDO ALTRI THEN ... END;

- Eccezione finale Block ECCEZIONE QUANDO ALTRI THEN ...

END;