[ Oracle PL/SQL ] SELECT INTO でレコード数なし ( NO_DATA_FOUND )

Pocket

SELECT INTO を使用して以下のようなファンクションを作成する場合に、SQL の取得結果が1レコードの場合は 正常に動作しますが、複数レコードが取得された場合はエラーとなります。 また、レコード件数が0件の場合には、関数は null をリターンします。

スポンサーリンク

複数レコード取得された場合に Oracle エラーが発生するサンプル

ORA-01422: 完全フェッチがリクエストよりも多くの行を戻しました。

CREATE OR REPLACE FUNCTION FNC_TEST RETURN NUMBER
IS
  vRet NUMBER; 
BEGIN

  select
     value into vRet -- クエリ結果を格納
  from
     tbl_abc
  where 
     abc_no = 'レコードが取得できない適当な条件';

  /*
   * 何か処理する。レコード件数が0だとこの位置のコードは処理されない。
   * null がリターンされる
   */
 
  return vRet;
END;
/

SQLが複数レコードを返す場合のエラーは仕方ありませんが、レコード件数が0件の場合には、処理を継続させたいときもあります。

レコードが1件も取得されない場合に処理を継続するには

レコードが1件も取得できない場合でも処理を継続させる場合には、以下のように NO_DATA_FOUND 例外を捕捉する必要があります。

CREATE OR REPLACE FUNCTION FNC_TEST RETURN NUMBER
IS
  vRet NUMBER; 
BEGIN

 BEGIN
   select
     value into vRet -- クエリ結果を格納
   from
     tbl_abc
   where 
     abc_no = 'レコードが取得できない適当な条件';
 EXCEPTION
    -- データが見つからない場合は 0 として扱う
    WHEN NO_DATA_FOUND THEN
    vRet := 0;
 END;

 /*
  * 何か処理する。レコードがなくてもOK
  */
  return vRet;
END;
/

なぜ、デフォルト動作では Oracle エラーとせずに、バサッと終了して null リターンするのかは、謎です。不思議です。

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *