web-dev-qa-db-ja.com

PL / SQLブロックの問題:データが見つかりませんエラー

SET SERVEROUTPUT ON
DECLARE
    v_student_id NUMBER := &sv_student_id;
    v_section_id NUMBER := 89;
    v_final_grade NUMBER;
    v_letter_grade CHAR(1);
BEGIN
    SELECT final_grade
    INTO v_final_grade
    FROM enrollment
    WHERE student_id = v_student_id
    AND section_id = v_section_id;

    CASE -- outer CASE
        WHEN v_final_grade IS NULL THEN
            DBMS_OUTPUT.PUT_LINE ('There is no final grade.');
        ELSE
            CASE -- inner CASE
                WHEN v_final_grade >= 90 THEN v_letter_grade := 'A';
                WHEN v_final_grade >= 80 THEN v_letter_grade := 'B';
                WHEN v_final_grade >= 70 THEN v_letter_grade := 'C';
                WHEN v_final_grade >= 60 THEN v_letter_grade := 'D';
                ELSE v_letter_grade := 'F';
            END CASE;

            -- control resumes here after inner CASE terminates
            DBMS_OUTPUT.PUT_LINE ('Letter grade is: '||v_letter_grade);
    END CASE;
    -- control resumes here after outer CASE terminates
END;

私が本から取った上記のコード"例によるOracle PL/SQL、第4版2009"私の問題は、student_idテーブルに存在しない場合、次のエラーが返されます

エラーレポート:ORA-01403:データが見つかりません
 ORA-06512:7行目
 01403。 00000-「データが見つかりません」
 *原因:
 *アクション:

しかし、本によると、null値を返してから、ケースフローに従う必要があります。

45
Orapps

変数にINTOを選択し、レコードが返されない場合、NO DATA FOUNDエラーが発生します。上記のコードを記述する正しい方法は、SELECTステートメントを独自のBEGIN/EXCEPTION/ENDブロックでラップすることだと思います。例:

...
v_final_grade NUMBER;
v_letter_grade CHAR(1);
BEGIN

    BEGIN
    SELECT final_grade
      INTO v_final_grade
      FROM enrollment
     WHERE student_id = v_student_id
       AND section_id = v_section_id;

    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        v_final_grade := NULL;
    END;

    CASE -- outer CASE
      WHEN v_final_grade IS NULL THEN
      ...
86
brian newman

SELECTステートメントは、探しているデータを見つけられません。つまり、指定されたSTUDENT_IDおよびSECTION_IDを持つENROLLMENTテーブルにはレコードがありません。クエリを実行する前にいくつかのDBMS_OUTPUT.PUT_LINEステートメントを入れて、v_student_idおよびv_section_idの値を出力してみてください。期待するものが含まれていない可能性があります。

2
Adam Paynter

あなたの本の正誤表セクションをオンラインでチェックする価値があるかもしれません。

ここにこの例外を処理する例があります http://www.dba-Oracle.com/sf_ora_01403_no_data_found.htm

2
pjp

プロシージャの下部にあるEXCEPTIONブロックに依存できない場合に使用した別のアプローチがあります。最初に変数を宣言しました:

my_value VARCHAR := 'default';
number_rows NUMBER := 0;
.
.
.
SELECT count(*) FROM TABLE INTO number_rows (etc.)

IF number_rows > 0 -- Then obtain my_value with a query or constant, etc.
END IF;
1
John Harris

使用しているデータ型が原因で、このデータが見つかりません。

empidをv_testに選択するように

上記のempidおよびv_testは数値型である必要があり、データのみが保存されます。

したがって、このエラーが発生した場合、データ型を追跡してください。

0
Ankur Nirmalkar