Проблема с блоком PL / SQL: данные не найдены - PullRequest
44 голосов
/ 10 августа 2009
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 на примере, 4-е издание 2009» моя проблема в том, что, когда я ввожу student_id, отсутствующий в таблице, он возвращает мне следующее ошибка

Error report: ORA-01403: no data found
ORA-06512: at line 7
01403. 00000 -  "no data found"
*Cause:    
*Action:

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

Ответы [ 5 ]

86 голосов
/ 13 августа 2009

Когда вы выбираете 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 голосов
/ 13 августа 2009

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

2 голосов
/ 10 августа 2009

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

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

1 голос
/ 09 января 2016

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

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

как выберите empid into v_test

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

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

...