2014-09-23 114 views
1

我存储我的存储过程可能抛出的错误代码(通过调用raise_application_error)作为常量。我的一个程序必须捕获另一个抛出的错误,并且我正在尝试使用pragma exception_init来执行此操作。 它似乎只接受数字字面值(正如它在我得到的错误消息中明确表示的那样),但是如果不能硬连接我以其他方式存储在常量中的错误代码,那将是非常好的。是否有一些解决方法,以便我可以实现相同,如果我写道:带常量的Pragma异常初始化

pragma exception_init(myException,pkg_constants.error_not_null);

+0

你得到PLS-00103,如果你想直接参阅包变量;和PLS-00702如果你使用一个局部变量(设置包变量),对吧? – 2014-09-23 12:13:12

回答

2

您不能在编译指示中使用包常量或任何变量。

你可以做的就是定义例外本身及其相关编译在你的包:

create package pkg_constants as 
    MyException exception; 
    error_not_null constant pls_integer := -20001; 
    pragma exception_init(myException, -20001); 
end pkg_constants; 
/

你还是要重复错误数,但至少只能在同一个文件中。然后,您可以参考的处理程序,包定义的异常,而不必重新声明它:

exception 
    when pkg_constants.MyException then 
    ... 

例如:

set serveroutput on 
begin 
    raise_application_error(pkg_constants.error_not_null, 'Threw it'); 
exception 
    when pkg_constants.MyException then 
    dbms_output.put_line('Caught it'); 
    raise; 
end; 
/

Error report - 
ORA-20001: Threw it 
ORA-06512: at line 6 

Caught it