ここではPL/SQLでエラーが発生ときの対応を記述する例外処理について紹介します。

EXCEPTION文による例外処理

例外処理(EXCEPTION文)は、WHENを複数記述することでエラーの種類により処理を分けることができます。OTHERSは未処理例外が発生しないように必ず最後に記述します。

構文

BEGIN
    処理部
EXCEPTION
    WHEN {例外1} TEHN
        {例外1}の場合の処理
    WHEN {例外2} TEHN
        {例外2}の場合の処理
    WHEN OTHERS THEN
        上記以外の例外の場合の処理
END;

以下はEXCEPTION文のサンプルです。事前定義例外の「NO_DATA_FOUND」を指定してデータが見つからない場合はメッセージ「NO_DATA_FOUND」を出力します。

CREATE OR REPLACE PROCEDURE PROC_SAMPLE
IS
    w_EMPNO emp.emp_no%TYPE := '999'; -- 存在しない社員番号
    w_NAME emp.emp_name%TYPE;
  
BEGIN
    SELECT emp_name INTO w_NAME FROM emp
    WHERE emp_no = w_EMPNO;
      
    DBMS_OUTPUT.PUT_LINE(w_NAME);
  
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        -- データが見つからない場合
        DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND');
    WHEN OTHERS THEN
        -- 上記以外のエラーが発生した場合
        DBMS_OUTPUT.PUT_LINE('Error');
END;


主な事前定義例外

例外名エラーコードエラー内容
DUP_VAL_ON_INDEXORA-00001一意制約に反しています。
INVALID_CURSORORA-01001カーソルが無効です。
NO_DATA_FOUNDORA-01403データが見つかりません。
INVALID_NUMBERORA-01722数値が無効です。
ZERO_DIVIDEORA-01476除数がゼロです。
STORAGE_ERRORORA-06500PL/SQL: 記憶域エラーが発生しました。


エラーコードとエラーメッセージを取得する

エラーが発生した時のエラーコードはSQLCODE関数で取得します。エラーメッセージはSQLERRM関数で取得します。

以下はエラーが発生したらエラーコードとエラーメッセージを出力するサンプルです。

CREATE OR REPLACE PROCEDURE PROC_SAMPLE
IS
    w_EMPNO emp.emp_no%TYPE := '999'; -- 存在しない社員番号
    w_NAME emp.emp_name%TYPE;
  
BEGIN
    SELECT emp_name INTO w_NAME FROM emp
    WHERE emp_no = w_EMPNO;
      
    DBMS_OUTPUT.PUT_LINE(w_NAME);
  
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLCODE || ':' || SQLERRM);
        -- ORA-01403: データが見つかりません。
END;


以上、PL/SQLでエラーが発生ときの対応を記述する例外処理について解説しました。