Проблема блока 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 года, моя проблема заключается в том, что когда я вводил идентификатор студента, отсутствующий в таблице, он возвращает мне следующие ошибки.
Error report: ORA-01403: no data found
ORA-06512: at line 7
01403. 00000 - "no data found"
*Cause:
*Action:
но в соответствии с книгой он должен был вернуть нулевое значение, а затем следовать потоку событий.
пожалуйста, помогите мне...
заблаговременно
Ответы
Ответ 1
Когда вы выбираете INTO для переменной и нет возвращенных записей, вы должны получить ошибку NO DATA FOUND. Я считаю, что правильным способом написания вышеприведенного кода было бы обернуть инструкцию SELECT собственным блоком BEGIN/EXCEPTION/END. Пример:
...
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
...
Ответ 2
Возможно, стоит проверить онлайн для раздела ошибок в вашей книге.
Здесь приведен пример обработки этого исключения http://www.dba-oracle.com/sf_ora_01403_no_data_found.htm
Ответ 3
Ваш оператор SELECT
не находит данные, которые вы ищете. То есть в таблице ENROLLMENT
нет записей в данных STUDENT_ID
и SECTION_ID
. Вы можете попробовать поставить несколько операторов DBMS_OUTPUT.PUT_LINE
перед запуском запроса, распечатав значения v_student_id
и v_section_id
. Они не могут содержать то, что вы ожидаете от них.
Ответ 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
Эти данные не найдены из-за некоторого типа данных, который мы используем.
как выбрать empid в v_test
выше empid, а v_test должен быть типом номера, тогда будут сохраняться только данные.
Так что следите за типом данных, при получении этой ошибки, возможно, это поможет.