我有一个像这样的代码块:
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的文档中找不到任何内容,但可能是因为我不知道如何正确地说出来。
提前致谢,
汤姆
答案 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>