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通过示例第四版2009年我的问题是,当我input一个学生ID不在表中它返回我以下错误
错误报告:ORA-01403:找不到数据 ORA-06512:在第7行 01403. 00000 - “找不到数据” *原因: *行动:
但根据书本来应该返回一个空值,然后按照案例stream程。
请帮我解决
提前致谢
当你select一个variablesINTO并没有logging返回时,你应该得到一个无数据寻找错误。 我相信正确的方法来编写上面的代码将是包装自己的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 ...
可能值得在线检查您的书的勘误部分。
有一个处理这个exception的例子http://www.dba-oracle.com/sf_ora_01403_no_data_found.htm
您的SELECT
语句没有find您要查找的数据。 也就是说, ENROLLMENT
表中没有给定STUDENT_ID
和SECTION_ID
。 在运行查询之前,您可能需要尝试放置一些DBMS_OUTPUT.PUT_LINE
语句,并打印v_student_id
和v_section_id
的值。 他们可能不会包含你期望他们包含的内容。
当我不能依靠程序底部的EXCEPTION
块时,我使用了另一种方法。 我在开始时声明了variables:
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;