LoginSignup
3
2

More than 5 years have passed since last update.

【Oracle】SELECT文の実行結果(NULL)とPL/SQLでの戻り値取得結果(NO_DATA_FOUNDエラー)が違っていた件

Last updated at Posted at 2018-02-09

###【概要】
下記のようなデータを1件も取得しないNULL_TESTファンクションをSELECT文の実行結果とPL/SQLで実行した結果が予想と異なっていました。

・SELECT文で実行  →  NULLを取得する
・PL/SQLで実行   →  NO_DATA_FOUNDエラーが発生する

11.2.0で検証しています。
なぜこのような結果になるのか謎。同じ結果になると思っていたが、Oracleの仕様なのかな・・・。

###【準備】

-- テスト用テーブル作成
CREATE TABLE NULL_TEST_TABLE (col1 VARCHAR(10));

-- テスト用テーブルにデータ挿入
INSERT INTO NULL_TEST_TABLE (col1) VALUES ('abc'); 

-- 1件もデータを取得しないテスト用ファンクション作成
CREATE OR REPLACE FUNCTION NULL_TEST
  RETURN VARCHAR2
IS
  func_res VARCHAR2(10);
BEGIN
  SELECT COL1 INTO func_res FROM NULL_TEST_TABLE WHERE COL1 = 'xyz';
  RETURN func_res;
END;
/

###【実行結果】
#####■NULLを取得するパターン

SELECT NULL_TEST() FROM DUAL;

/* 実行結果
null
*/

#####■NO_DATA_FOUNDエラーが生じるパターン その1

BEGIN
  DBMS_OUTPUT.PUT_LINE(NULL_TEST());
END;
/

/* 実行結果
エラー・レポート -
ORA-01403: データが見つかりません。
ORA-06512: "SYS.NULL_TEST", 行6
ORA-06512: 行2
01403. 00000 -  "no data found"
*Cause:    No data was found from the objects.
*Action:   There was no data from the objects which may be due to end of fetch.
*/

#####■NO_DATA_FOUNDエラーが生じるパターン その2

DECLARE
  res VARCHAR2(10);
BEGIN
  res := NULL_TEST();
  DBMS_OUTPUT.PUT_LINE(res);
END;
/

/* 実行結果
エラー・レポート -
ORA-01403: データが見つかりません。
ORA-06512: "SYS.NULL_TEST", 行6
ORA-06512: 行4
01403. 00000 -  "no data found"
*Cause:    No data was found from the objects.
*Action:   There was no data from the objects which may be due to end of fetch.
*/

###【例外処理を追加してエラーを回避】
#####■NO_DATA_FOUNDエラーが生じるパターン その1

SET SERVEROUTPUT ON
BEGIN
  DBMS_OUTPUT.PUT_LINE(NULL_TEST());
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('例外としてキャッチされました。');
END;
/

/* 実行結果
例外としてキャッチされました。
*/

#####■NO_DATA_FOUNDエラーが生じるパターン その2

SET SERVEROUTPUT ON
DECLARE
  res VARCHAR2(10);
BEGIN
  res := NULL_TEST();
  DBMS_OUTPUT.PUT_LINE(res);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('例外としてキャッチされました。');
END;
/

/* 実行結果
例外としてキャッチされました。
*/

###【おまけのコーナー】
OracleのDBは好き。他のDBはほとんど触ったことないが・・・。

3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2