PL/SQL 例外処理
■PL/SQLの例外処理について解説する
例外が発生した時に例外処理を記述しておくと処理は正常終了させることができる
※PL/SQLの基礎(文法)はこちら→PL/SQLの基礎(文法)
例えばTESTテーブルにレコード2件以上ある場合、下記の記述だけだと異常終了(ORA-01422)する
DECLARE
col_1 TEST.ID%TYPE;
BEGIN
SELECT ID INTO col_1 FROM TEST;
-- ※「SELECT INTO文」のSELECT結果は2レコード以上だと異常終了する
DBMS_OUTPUT.PUT_LINE(col_1);
END;
/
/*
行1でエラーが発生しました。:
ORA-01422: 完全フェッチがリクエストよりも多くの行を戻しました
*/
上記のような場合、例外処理を記述しておくと正常終了させることができる
DECLARE
col_1 TEST.ID%TYPE;
BEGIN
SELECT ID INTO col_1 FROM TEST;
-- ※「SELECT INTO文」のSELECT結果は2レコード以上だと異常終了する
DBMS_OUTPUT.PUT_LINE(col_1);
EXCEPTION
WHEN others THEN
DBMS_OUTPUT.PUT_LINE('例外発生');
END;
/
/*
「例外発生」と出力されるが正常終了する
*/
エラーの検証でどのIDでエラーになったのかを特定したい場合
DECLARE
CURSOR CUR IS SELECT * FROM TEST;
NUM NUMBER;
BEGIN
FOR REC IN CUR LOOP
BEGIN
NUM := REC.ID;
IF REC.ID = 3 THEN
REC.ID := 'BABABA';
END IF;
DBMS_OUTPUT.PUT_LINE(REC.ID);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR: ' || NUM);
END;
END LOOP;
END;
/
/*
1
2
ERROR: 3
4
5
6
7
8
9
10
PL/SQLプロシージャが正常に完了しました。
*/