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 リターンするのかは、謎です。不思議です。