プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

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プロシージャが正常に完了しました。
*/