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;

上面的代码我取自“Oracle PL/SQL by Example, 4th Edition 2009”一书我的问题是当我输入一个student_id不存在于表中时它返回以下错误

错误报告:ORA-01403:未找到数据
ORA-06512: 在第 7 行
01403. 00000 - “未找到数据”
*原因:    
*行动:

但根据这本书,它应该返回一个空值,然后按照案例流程。

4

5 回答 5

114

当您选择 INTO 变量并且没有返回记录时,您应该收到 NO DATA FOUND 错误。我相信编写上述代码的正确方法是用它自己的 BEGIN/EXCEPTION/END 块包装 SELECT 语句。例子:

...
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
      ...
于 2009-08-13T13:33:31.020 回答
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_ID和的表中没有记录SECTION_ID。您可能想DBMS_OUTPUT.PUT_LINE在运行查询之前尝试放置一些语句,打印 和 的v_student_idv_section_id。它们可能不包含您期望它们包含的内容。

于 2009-08-13T13:16:04.837 回答
0

由于我们使用的某些数据类型,未找到此数据的原因。

就像选择 empid 进入 v_test

上面的 empid 和 v_test 必须是数字类型,那么只有数据会被存储。

所以跟踪数据类型,当得到这个错误时,这可能会有所帮助

于 2017-12-19T14:25:01.550 回答