【PL/SQL】例外処理について

PL/SQLでプログラムを実行する際、予期しないエラーが発生することがあります。このようなエラーを適切に処理するためには、例外処理を実装することが重要です。この記事では、PL/SQLにおける例外処理の基本から独自の例外の定義、エラーハンドリングの実践例までを解説します。

PL/SQLにおける例外処理の基本構造

PL/SQLでは、例外が発生するとそれを処理するためのEXCEPTIONブロックが用意されています。通常の処理とエラーハンドリングを区別するため、以下のような基本構造になります。

BEGIN
   -- 通常の処理
EXCEPTION
   WHEN 例外名 THEN
      -- エラー時の処理
END;

BEGINからEXCEPTIONまでが通常の処理、EXCEPTIONからENDまでが例外が発生した場合の処理を記述する部分です。

事前定義された例外

PL/SQLでは、よくあるエラーに対して事前に定義された例外がいくつか用意されています。これらの例外は明示的に定義せずとも使用できます。代表的な事前定義された例外には以下があります。

  • NO_DATA_FOUND: SELECT文でデータが見つからなかった場合に発生
  • TOO_MANY_ROWS: SELECT文が複数行を返した場合に発生
  • ZERO_DIVIDE: 0による除算が行われた場合に発生
  • INVALID_CURSOR: 無効なカーソル操作が行われた場合に発生

例として、0による除算の例外処理を見てみましょう。

BEGIN
   v_result := 10 / v_divisor;
EXCEPTION
   WHEN ZERO_DIVIDE THEN
      DBMS_OUTPUT.PUT_LINE('ゼロで割ろうとしました。');
END;

独自の例外を定義する方法

PL/SQLでは、独自の例外を定義してプログラム中で任意のタイミングで例外を発生させることができます。独自の例外はDECLAREブロックで宣言し、RAISEを使用して明示的に例外を発生させます。

DECLARE
   e_custom_exception EXCEPTION;
BEGIN
   IF condition THEN
      RAISE e_custom_exception;
   END IF;
EXCEPTION
   WHEN e_custom_exception THEN
      DBMS_OUTPUT.PUT_LINE('独自例外が発生しました。');
END;

このようにして、独自のロジックに基づいて例外を発生させ、特定のエラーハンドリングを行うことが可能です。

OTHERSを使用した汎用的なエラーハンドリング

OTHERSは、すべての例外をキャッチする汎用的なハンドラです。事前定義された例外や独自の例外をキャッチした後、それ以外のエラーに対しても対応したい場合に使用します。

BEGIN
   -- 通常の処理
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('データが見つかりませんでした。');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('その他のエラーが発生しました。');
END;

OTHERSは、予期しないエラーが発生した場合に安全に処理を行うための最後の砦として機能します。

例外発生後のロールバック処理

例外が発生した場合、データベースで行われた変更は自動的にロールバックされません。トランザクション処理を伴う場合は、例外が発生した際に手動でROLLBACKやCOMMITを行う必要があります。

BEGIN
   UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10;
   COMMIT;
EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;
      DBMS_OUTPUT.PUT_LINE('トランザクションが失敗しました。');
END;

このようにして、トランザクションが中途半端な状態で残らないようにすることが大切です。

まとめ

PL/SQLの例外処理は、プログラムの信頼性を高めるための重要な要素です。事前定義された例外に加え、独自の例外を定義することで、より柔軟で細かいエラーハンドリングが可能になります。例外が発生した場合の適切な処理を実装することで、堅牢なPL/SQLプログラムを作成しましょう。