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_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.

すべてのユーザー定義の例外がすべてこのように定義されていると仮定すると、すべての定義のパッケージ定義に移動できます。

于 2012-09-24T12:28:12.190 に答える