带有常量的 Pragma Exception init

LNy*_*rla 1 oracle plsql

我将存储过程可能抛出的错误代码(通过调用 raise_application_error)存储为常量。我的一个程序必须捕获另一个程序抛出的错误,我正在尝试使用 pragma exception_init 来执行此操作。看起来它只接受数字文字(因为它在我收到的错误消息中明确说明了这一点),但是如果能够不硬连线我存储在常量中的错误代码,那就太好了。是否有一些解决方法,以便我可以实现与我写的相同的效果:

pragma exception_init(myException, pkg_constants.error_not_null);

Ale*_*ole 5

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

您可以做的是在包中定义异常本身及其关联的编译指示:

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

您仍然必须重复错误号,但至少只能在同一个文件中。然后,您可以在处理程序中引用该包定义的异常,而无需重新声明它:

exception
  when pkg_constants.MyException then
    ...
Run Code Online (Sandbox Code Playgroud)

例如:

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
Run Code Online (Sandbox Code Playgroud)