ここでは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_INDEX | ORA-00001 | 一意制約に反しています。 |
INVALID_CURSOR | ORA-01001 | カーソルが無効です。 |
NO_DATA_FOUND | ORA-01403 | データが見つかりません。 |
INVALID_NUMBER | ORA-01722 | 数値が無効です。 |
ZERO_DIVIDE | ORA-01476 | 除数がゼロです。 |
STORAGE_ERROR | ORA-06500 | PL/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でエラーが発生ときの対応を記述する例外処理について解説しました。