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_IDSECTION_ID 。 在运行查询之前,您可能需要尝试放置一些DBMS_OUTPUT.PUT_LINE语句,并打印v_student_idv_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; 
Interesting Posts