oracle存储用户定义的异常?

时间:2012-09-24 12:06:28

标签: oracle

是否存在用于存储用户定义的异常的oracle表?

1 个答案:

答案 0 :(得分:4)

没有

用户定义的异常与其他变量一样,在PL / SQL块中定义,并且具有PL / SQL变量所具有的任何范围。所以,例如

DECLARE
  my_exception EXCEPTION;
BEGIN
  RAISE my_exception;
EXCEPTION 
  WHEN my_exception
  THEN
    dbms_output.put_line( 'Caught my_exception' );
END;

将创建用户定义的异常my_exception,但异常仅存在于匿名PL / SQL块的范围内。您可以在包中定义异常,以便多个PL / SQL块可以引用它们。您可以使用exception_init编译指示将用户定义的异常与特定错误代码相关联

SQL> ed
Wrote file afiedt.buf

  1      DECLARE
  2        my_exception EXCEPTION;
  3        pragma exception_init( my_exception, -20001 );
  4      BEGIN
  5        RAISE my_exception;
  6*     END;
SQL> /
    DECLARE
*
ERROR at line 1:
ORA-20001:
ORA-06512: at line 5

或者您可以单独使用raise_application_error函数,也可以与用户定义的异常变量一起使用

SQL> ed
Wrote file afiedt.buf

  1      DECLARE
  2        my_exception EXCEPTION;
  3        pragma exception_init( my_exception, -20001 );
  4      BEGIN
  5        RAISE_APPLICATION_ERROR( -20001, 'This is my error text' );
  6      EXCEPTION
  7        WHEN my_exception
  8        THEN
  9          dbms_output.put_line( 'Caught my_exception' );
 10          dbms_output.put_line( sqlerrm );
 11*     END;
SQL> /
Caught my_exception
ORA-20001: This is my error text

PL/SQL procedure successfully completed.

没有用于存储用户定义的异常的数据字典表,因为您的代码可能有很多(可能有冲突的)方式来定义这些异常。从良好的异常管理角度来看,您通常希望提出一种一致的方法来定义特定于应用程序的异常并坚持使用该方法。就个人而言,我喜欢一个定义所有异常并将它们与错误代码相关联的包

SQL> ed
Wrote file afiedt.buf

  1  create or replace package error_pkg
  2  as
  3    invalid_name exception;
  4    pragma exception_init( invalid_name, -20001 );
  5    invalid_address exception;
  6    pragma exception_init( invalid_address, -20002 );
  7* end;
SQL> /

Package created.

假设我的所有用户定义的异常都是这样定义的,我可以转到我的所有定义的包定义。