e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第32回 「パッケージの利用例 ユーザ定義例外」

2012.08.20

今回は、PL/SQLパッケージを使った例外の宣言について解説します。

PL/SQLでは、エラー処理を行うためには、例外名を使って例外ハンドラを記述します。
よくあるエラーについては、例外名が事前定義されている(これを事前定義例外といいます)ので、その例外名を使います。
しかし例外名が定義されていないエラーについては、宣言部で例外名を定義し、システムエラー番号と対応づけることができます。いわゆるユーザ定義例外です。

以下の構文です。

<<宣言部>>
--例外名の宣言
例外名 EXCEPTION;
-- 例外名とシステムエラー番号との対応付け
PRAGMA EXCEPTION_INIT(例外名, システムエラー番号);

しかし、このような記述をPL/SQLブロック内のローカルな宣言部で行うと、そのブロックの中でしか、その例外名は使用できません。
他のPL/SQLプログラムからも、同じ例外名を使うにはどうすればいいのでしょうか?

まさにそんな時、PL/SQLのパッケージを使えば、問題が解決できます。
すなわち、上記の記述をPL/SQLのローカルな宣言部でなく、パッケージ仕様部で宣言しておくのです。そうしておけば、他のPL/SQLプログラムからでも、ユーザ定義例外を使用することが可能です。

以下の例をご覧ください。

SQL> CREATE OR REPLACE PACKAGE PAC1
  2  IS
  3     FK_ERROR  EXCEPTION;
  4     PRAGMA EXCEPTION_INIT(FK_ERROR,-2292);
  5  END;
  6  /

パッケージが作成されました。

上記は、PAC1パッケージで、例外名 FK_ERRORを宣言し、そのエラーをシステムエラー番号 -2292と対応づけています。
ORA-2292エラーは外部キー制約(参照整合性制約)に違反したときのエラーです。
したがって、このパッケージの存在により、ORA-2292エラーに対して、PAC1.FK_ERRORという例外名で処理できるわけです。

以下の例をご覧ください。

SQL> DECLARE
  2     V_DEPTNO NUMBER := &部門番号;
  3  BEGIN
  4     DELETE FROM DEPT WHERE DEPTNO = V_DEPTNO;
  5  EXCEPTION
  6     WHEN  PAC1.FK_ERROR THEN
  7           DBMS_OUTPUT.PUT_LINE('社員の存在する部門:' || V_DEPTNO
  8                                || 'は削除できません');
  9  END;
10  /
部門番号に値を入力してください: 10
旧   2:    V_DEPTNO  NUMBER := &部門番号;
新   2:    V_DEPTNO  NUMBER := 10;
社員の存在する部門:10は削除できません

PL/SQLプロシージャが正常に完了しました。

ここでは、4行目のDELETE文で外部キー制約によって社員の存在する部門(部門番号10)の行を削除しようとした場合、外部キー制約違反のエラー(ORA-2292)になりますが、6行目の「PAC1.FK_ERROR」例外ハンドラによりエラー処理を行い、「社員の存在する部門:10は削除できません」のメッセージ出力しています。

このように、パッケージ仕様部にユーザ定義例外を宣言して、システムエラー番号と対応づけておけば、ローカルな宣言部でユーザ定義例外を宣言していなくても、 例外処理が可能となります。

今回はここまでです。次回もぜひご期待ください。

先頭へ戻る