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 を使う。



関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ オラクルサポートセンター