JavaScriptが無効になっています。
この状態では一部の情報が表示されず、すべての機能を利用することができません。
PL/SQL の 宣言部には変数と同様に ローカルな例外 を宣言することでユーザー定義例外を作成することができる。
例外のスコープは、記述したブロック内でのみ有効。通常のユーザー定義例外には、すべてに共通して同じ エラーコード "+1" が割り当てられるが WHEN <例外名> THEN によって個別の例外として判別することができるので問題ない。
後述の EXCEPTION_INIT プラグマ を使用すると +1 以外の 「既存のエラー番号」 に名前を割り当てることができる。
{ DECLARE | CREATE FUNCTION .. | .. } <例外名> EXCEPTION; BEGIN <プログラム本体> EXCEPTION WHEN <例外名> THEN <例外処理> END;ユーザー定義例外は Oracle によって発動されたものを処理するものではなく、プログラム中から RAISE <例外名> コマンド によって発動して使用する。
ストアドプロシージャ内で ユーザー定義例外 eInvalidParam を使用した例
SQL> create or replace procedure is_oct(p_octstr in varchar2) 2 is 3 eInvalidParam EXCEPTION; 4 begin 5 if (ltrim(p_octstr, '01234567') is not null) then 6 raise eInvalidParam; 7 end if; 8 dbms_output.put_line('8進数です'); 9 exception 10 when eInvalidParam then 11 dbms_output.put_line('8進数ではありません'); 12 end; 13 /SQL> call is_oct('800'); 8進数ではありません
エラー番号と ユーザー定義例外名 を関連付けするプラグマ EXCEPTION_INIT
Oracle の例外は ORA-00001 から ORA-40000 台までの多くのエラー番号が定義されている。しかし 「例外名」が定義されているものは一部のエラー番号だけである。代表的な例外の約 20 種類は PL/SQL 事前定義例外 として定義済なので宣言なしで利用することができる。また、組み込みパッケージを使用する場合にもパッケージに例外が定義されているものも多い。 ⇒ 例 UTL_FILE パッケージにおける例外
そこで、事前定義されていない(または、既成の例外名を上書きして)エラー番号を PL/SQL から例外処理したい場合には、その番号に例外名を割り当てることで例外をキャッチする。
EXCEPTION_INIT の使用例
ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。に好きな例外名(eBufferOver) を割り当てる。
SQL> declare 2 vSmallChar varchar2(8); 3 eBufferOver EXCEPTION; 4 eBlackbox EXCEPTION; 5 PRAGMA EXCEPTION_INIT(eBufferOver, -6502); 6 PRAGMA EXCEPTION_INIT(eBlackbox, -600); 7 begin 8 vSmallChar := '1234567890'; 9 exception 10 when eBlackbox then 11 dbms_output.put_line('私には手が負えないようです'); 12 when eBufferOver then 13 dbms_output.put_line('文字列が長すぎます'); 14 end; 15 / 文字列が長すぎます PL/SQLプロシージャが正常に完了しました。例として ORA-00600 に eBlackbox 、ORA-06502 に eBufferOver という例外名を割り当てているが、ORA-06502 は 既に VALUE_ERROR という例外名が定義されているので、実際のプログラミングでは VALUE_ERROR を使う。
(追記) (追記ここまで)