2012-09-21 44 views
12

在一個過程中,我想要做的邏輯單元1,如果失敗不要緊,執行邏輯單元2嘗試捕捉象異常處理在PL/SQL

這似乎是一個典型的try-catch場景。但我怎麼能在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; 

正如您所看到的第二個異常塊導致問題。

回答

16

將第二個EXCEPTION包含在BEGIN..END塊中。試試這個方法

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響應評論

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

幾乎完全符合我的答案。我會刪除我的。 –

+0

對不起,我應該讓它更清楚。執行邏輯1,無所謂如果失敗,執行邏輯2 –

+0

看看第二種方法 –

1

程序( ) IS

BEGIN

- 邏輯1單元 BEGIN ... EXCEPTION 當其他人 THEN ... END;

- 邏輯UNIT2 BEGIN ... EXCEPTION WHEN OTHERS THEN ... END;

- 決賽異常塊 EXCEPTION WHEN OTHERS THEN ...

END;