2

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

4

1 回答 1

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_initpragma 将用户定义的异常与特定的错误代码相关联

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.

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

于 2012-09-24T12:28:12.190 回答