Intereting Posts
Как найти все дочерние столбцы таблицы в таблице sql server? Как отметить некоторые nr строк в таблице при одновременном доступе Создание запроса для создания сложного набора запросов Django «Перевернутый» SQL SELECT – поиск сотрудников, которые не совершали холодные вызовы между диапазоном дат Ошибка функции следующего значения SQL выбирает несколько максимальных строк, где ID одинаковый Создание функции в Postgresql, которая не возвращает составные значения Поставщик профилей ASP.NET SQL. Использует ли метод ProfileBase.Create () доступ к базе данных? Почему Entity Framework 6 генерирует сложные SQL-запросы для простого поиска? mysql – порядок внутри внутри подзапроса Доступ к sql, как вернуться между датами Создать заявление на вывод из внешних отношений в SQL 2008? Ужасно медленный SQL-запрос с COUNT и GROUP BY на двух столбцах Лучше всего использовать * при вызове большого количества полей в mysql? Как сделать динамическое смещение по лимиту с использованием только (My) SQL

Проблема блока 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 года, моя проблема заключается в том, что когда я вводил идентификатор студента, отсутствующий в таблице, он возвращает мне следующие ошибки

 Отчет об ошибке: ORA-01403: данных не найдено
 ORA-06512: в строке 7
 01403. 00000 - «данных не найдено»
 * Причина:    
 * Действие:

но в соответствии с книгой он должен был вернуть нулевое значение, а затем следовать потоку событий.

пожалуйста, помогите мне …

заранее спасибо

Когда вы выбираете 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 ... 

Возможно, стоит проверить онлайн в разделе ошибок для вашей книги.

Ниже приведен пример обработки этого исключения: http://www.dba-oracle.com/sf_ora_01403_no_data_found.htm

Ваш SELECT не находит данные, которые вы ищете. То есть, нет записи в таблице STUDENT_ID с данными STUDENT_ID и SECTION_ID . Вы можете попробовать поставить некоторые инструкции DBMS_OUTPUT.PUT_LINE перед запуском запроса, распечатав значения v_student_id и v_section_id . Они не могут содержать то, что вы ожидаете от них.

Существует альтернативный подход, который я использовал, когда я не мог полагаться на блок 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; 

Эти данные не найдены из-за некоторого типа данных, который мы используем.

как выбрать empid в v_test

выше empid и v_test должен быть типом числа, тогда будут сохраняться только данные.

Поэтому следить за типом данных, при получении этой ошибки, может быть, это поможет.