ユーザー定義例外を発生させる RAISE
ユーザー定義例外は Oracle によって発動されたものを処理するものではなく、プログラム中から RAISE <例外名> コマンドによって発動して使用する。通常は宣言したブロック内で使用する。ユーザー定義例外はブロック内部だけで有効なローカルな例外とパッケージの宣言部において宣言するグローバルな例外名を作成できる。
ブロックが異なれば同じ例外名を使用することもできる。その場合は [ パッケージ名 | ブロック名 ] . 例外名 のように例外名を修飾して使用する。特に組み込みパッケージプログラムを使用した場合の例外処理の記述で良く使用される構文である。
未処理のユーザー定義例外の行方
ユーザー定義例外も含めプログラム内で例外処理されていないすべての例外は呼び出し元のプログラムに通知される。
ユーザー定義例外の場合、エラーコードは すべて +1 。エラーメッセージもすべて同じになるため複数のユーザー定義例外がある場合には呼び出し元では区別はできない。
未処理のユーザー定義例外の通知例
SQL> create or replace procedure exception_sample1
2 is
3 eUserException exception;
4 begin
5 RAISE eUserException;
6 end;
7 /
SQL> begin
2 exception_sample1();
3 end;
4 /
begin
*
行1でエラーが発生しました。:
ORA-06510: PL/SQL: ユーザー定義の例外が発生しましたが、処理されませんでした
...
ネストした内部ブロックから同名の外部ブロックの例外を呼び出す例
例外名が同名であってもラベル修飾を使用して外部ブロックの例外名を使用することができる。内部の例外処理は起動されていない。
SQL> <<outer_block>>
2 declare
3 eDual exception;
4 begin
5 <<inner_block>>
6 declare
7 eDual exception;
8 begin
9 RAISE outer_block.eDual;
10 exception
11 when eDual then
12 dbms_output.put_line('例外処理 inner block');
13 end innner_block;
14 exception
15 when eDual then
16 dbms_output.put_line('例外処理 outer block');
17 end outer_block;
18 /
例外処理 outer block
PL/SQLプロシージャが正常に完了しました。
例外の再呼び出し RASE [例外名]
例処理で一度処理された例外でも RAISE コマンドを呼び出すことで、例外の再呼び出しができる。
RAISE に引数を指定しない場合には現在の処理中と同じ例外を発生させる。RAISE 例外名 を使用した場合には、引数で指定した例外が発生する。
SQL> create or replace procedure exception_sample2
2 is
3 begin
4 RAISE_APPLICATION_ERROR(-20001, 'ユーザー定義による例外メッセージの文字列');
5 end;
6 /
⇒ RAISE_APPLICATION_ERROR
SQL> declare
2 eORA600 exception;
3 pragma exception_init(eORA600, -600);
4 eMyException exception;
5 pragma exception_init(eMyException, -20001);
6 begin
7 exception_sample2();
8 exception
9 when eMyException then -- ORA-20001 を処理
10 null;
11 RAISE eORA600; -- ORA-00600 に変換してみる(意味は無い)
12 end;
13 /
declare
*
行1でエラーが発生しました。:
ORA-00600: 内部エラー・コード、引数: [],[],[],[],[],[],[],[]
ORA-06512: 行11
ORA-20001: ユーザー定義による例外メッセージの文字列
既存の例外のエラーメッセージはテンプレートの内容になる。
PL/SQL の例外処理に関連する内容