JavaScriptが無効になっています。
この状態では一部の情報が表示されず、すべての機能を利用することができません。
PL/SQL で使用する ユーザー定義例外の宣言と呼び出し
ユーザー定義例外の作成方法
PL/SQL の 宣言部には変数と同様に ローカルな例外 を宣言することでユーザー定義例外を作成することができる。
例外のスコープは、記述したブロック内でのみ有効。通常のユーザー定義例外には、すべてに共通して同じ エラーコード "+1" が割り当てられるが WHEN <例外名> THEN によって個別の例外として判別することができるので問題ない。
後述の EXCEPTION_INIT プラグマ を使用すると +1 以外の 「既存のエラー番号」 に名前を割り当てることができる。
{ DECLARE | CREATE FUNCTION .. | .. }
<例外名> EXCEPTION;
BEGIN
<プログラム本体>
EXCEPTION
WHEN <例外名> THEN
<例外処理>
END;
ユーザー定義例外は Oracle によって発動されたものを処理するものではなく、プログラム中から RAISE <例外名> コマンド によって発動して使用する。
EXCEPTION 定義の例
ストアドプロシージャ内で ユーザー定義例外 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 プラグマ
エラー番号と ユーザー定義例外名 を関連付けするプラグマ 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 を使う。
関連事項