Исключение No_data_found распространяется и на внешний блок? - PullRequest
2 голосов
/ 18 апреля 2010

В моем коде я ввожу зарплату, которая недоступна в таблице сотрудников, а затем снова вставляю повторяющийся идентификатор employee_id в столбец первичного ключа таблицы сотрудников в блоке исключений, где я обрабатываю исключение, в котором отсутствуют данные, но не знаю, почему No data found исключение в конце также?

ВЫХОД:

Enter some other sal
ORA-01400: cannot insert NULL into ("SCOTT"."EMPLOYEES"."LAST_NAME")
ORA-01403: no data found  --This should not come according to logic

Это код:

DECLARE
v_sal number:=&p_sal;
v_num number;
BEGIN
   BEGIN
            select salary INTO v_num from employees where salary=v_sal;
   EXCEPTION
           WHEN no_data_found THEN
                   DBMS_OUTPUT.PUT_LINE('Enter some other sal');

           INSERT INTO employees (employee_id)values(100) ;
   END;
EXCEPTION
   WHEN OTHERS THEN
   DBMS_OUTPUT.PUT_LINE(sqlerrm);
END;       

Ответы [ 2 ]

5 голосов
/ 18 апреля 2010

Поведение состоит в том, что ошибки, сгенерированные в блоке EXCEPTIONS, объединяются с SQLERRM и, следовательно, распространяются вверх. Я даю вам это не задокументировано , но мы можем ясно увидеть это здесь:

SQL> declare
  2      v_sal t23.sal%type := 230;
  3      l_num t23.sal%type;
  4  begin
  5      begin
  6          begin
  7              select sal into l_num
  8              from t23 where sal = v_sal;
  9          exception
 10              when no_data_found then
 11                  dbms_output.put_line('inner exception::'||sqlerrm);
 12                  insert into t23  values (99, 'MR KNOX', v_sal);
 13          end;
 14      exception
 15          when dup_val_on_index then
 16              dbms_output.put_line('middle exception::'||sqlerrm);
 17              insert into t23 (id, sal) values (99, v_sal);
 18      end;
 19  exception
 20      when others then
 21          dbms_output.put_line('outer exception::'||sqlerrm);
 22  end;
 23  /
inner exception::ORA-01403: no data found
middle exception::ORA-00001: unique constraint (APC.T23_PK) violated
ORA-01403: no data found
outer exception::ORA-01400: cannot insert NULL into ("APC"."T23"."LAST_NAME")
ORA-00001: unique constraint (APC.T23_PK) violated
ORA-01403: no data found

PL/SQL procedure successfully completed.

SQL>  

Примечание: если есть вложенный блок исключений, который успешно обрабатывает выброшенное исключение, он не объединяется с SQLERRM. Таким образом, SQLERRM состоит из стека неудачно обработанных исключений.

1 голос
/ 18 апреля 2010

В вашем блоке исключений вы пытаетесь вставить в employees, но не устанавливаете столбец last_name, который не * NULL -able.

ORA-01400: невозможно вставить NULL в ("SCOTT". "СОТРУДНИКИ". "LAST_NAME")

ORA-01403: no data found является частью трассировки стека, вызванной вашим неудачным выбором.


Вы можете либо определить значения DEFAULT для всех необнуляемых столбцов, либо изменить вставку:

INSERT INTO employees (employee_id, last_name, ...) Values (100, 'Scott', ...);
...