ユーザー定義の例外を格納するOracleテーブルはありますか?
質問する
1550 次
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 に答える