2012-09-21 46 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;