【问题标题】:PL/SQL block problem: No data found errorPL/SQL 块问题:No data found 错误
【发布时间】:2010-11-18 08:56:19
【问题描述】:
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 示例,2009 年第 4 版”一书中获取的上述代码我的问题是当我输入表中不存在的 student_id 时,它会返回给我跟随错误

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

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

【问题讨论】:

    标签: sql oracle plsql oracle10g ora-01403


    【解决方案1】:

    可能值得在线查看您图书的勘误表部分。

    这里有一个处理这个异常的例子http://www.dba-oracle.com/sf_ora_01403_no_data_found.htm

    【讨论】:

      【解决方案2】:

      您的SELECT 语句未找到您要查找的数据。也就是说,ENROLLMENT 表中没有给定STUDENT_IDSECTION_ID 的记录。您可能想在运行查询之前尝试放置一些DBMS_OUTPUT.PUT_LINE 语句,打印v_student_idv_section_id 的值。它们可能不包含您期望它们包含的内容。

      【讨论】:

        【解决方案3】:

        当您选择 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
              ...
        

        【讨论】:

          【解决方案4】:

          当我无法依赖程序底部的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;
          

          【讨论】:

            【解决方案5】:

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

            like select empid into v_test

            empid 和 v_test 必须是数字类型,然后只存储数据。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-02-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多