60
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;

「OraclePL/SQL by Example、4th Edition 2009」という本から抜粋した上記のコード私の問題はstudent_id、表に存在しないものを入力すると、次のエラーが返されることです。

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

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

4

5 に答える 5

3

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;
于 2016-01-08T23:09:58.290 に答える
2

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

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

于 2009-08-10T17:26:57.250 に答える
2

あなたのSELECTステートメントは、探しているデータを見つけていません。つまり、与えられたとENROLLMENTを持つテーブルにはレコードがありません。クエリを実行する前に、 と の値を出力するステートメントをいくつか入れてみてください。それらには、期待する内容が含まれていない可能性があります。STUDENT_IDSECTION_IDDBMS_OUTPUT.PUT_LINEv_student_idv_section_id

于 2009-08-13T13:16:04.837 に答える