Oracle异常处理 - 查找抛出的异常

时间:2015-08-06 18:30:39

标签: oracle11g

我有一个像这样的代码块:

DECLARE

....a couple custom exceptions....

BEGIN

....do stuff....

EXCEPTION
  WHEN exception1 OR exception2 THEN
    ....do a bunch of stuff that is common to both exceptions

END;

在完成两个异常共有的代码之后,我想根据引发的异常分支并采取不同的操作。有没有办法获取异常名称,以便我可以添加这样的东西?

IF exception1 THEN
  ...take action 1...
ELSE
  ...take action 2...
END IF;

我在Oracle的文档中找不到任何内容,但可能是因为我不知道如何正确地说出来。

提前致谢,

汤姆

2 个答案:

答案 0 :(得分:0)

有几种方法可以解决问题。一对想起我的夫妇

一种方法是将公共位分解为一个过程,作为它自己的独立对象,包中的私有方法(因为几乎每个过程都属于一个包),或者作为过程声明的一部分。例如

Live Chat - Online

另一个选择是根据

给出异常错误代码和分支
DECLARE
  l_ex1 exception;
  l_ex2 exception;

  procedure do_something_common
  as
  begin
    <<common code>>
  end do_something_common;
BEGIN
  <<do something>>
EXCEPTION
  WHEN l_ex1
  THEN 
    do_something_common;
    <<do something else>>
  WHEN l_ex2
  THEN
    do_something_common;
    <<do something else>>
END;

答案 1 :(得分:0)

嗯,我的建议与Justin非常相似,但我还是会发布它,为了显示略有不同的方法。这不同之处在于将SQLCODE和SQLERRM(错误消息)保存到变量中,这些变量稍后用于格式化Oracle错误等自定义错误:

SQL> DECLARE
  2    my_exception_1 EXCEPTION;
  3    my_exception_2 EXCEPTION;
  4    PRAGMA EXCEPTION_INIT( my_exception_1, -20001 );
  5    PRAGMA EXCEPTION_INIT( my_exception_2, -20002 );
  6
  7    err_nbr    NUMBER;         -- Holds a SQL error number if an exception occurs.
  8    err_msg    VARCHAR2(1000); -- Holds a SQL error message if an exception occurs.
  9  BEGIN
 10    raise_application_error(-20002, 'Custom error -20002 was raised');
 11  EXCEPTION
 12    when my_exception_1 OR my_exception_2 then
 13      err_nbr := SQLCODE;
 14      err_msg := SUBSTR(SQLERRM, 1, 1000);
 15      dbms_output.put_line('error 1 or 2 occured');
 16
 17    CASE err_nbr
 18      WHEN -20001 then
 19        dbms_output.put_line('my_exception_1 message: ' || err_msg);
 20      WHEN -20002 then
 21        dbms_output.put_line('my_exception_2 message: ' || err_msg);
 22      ELSE  -- Always expect the unexpected!
 23        dbms_output.put_line('UNKNOWN ERROR: ' || err_msg);
 24    END CASE;
 25  END;
 26  /
error 1 or 2 occured
my_exception_2 message: ORA-20002: Custom error -20002 was raised

PL/SQL procedure successfully completed.

SQL>