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