Исключение No_data_found распространяется и на внешний блок?
В моем коде я ввожу зарплату, которая недоступна в таблице сотрудников, а затем снова вставляю дубликат 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 ответа
Поведение состоит в том, что ошибки, сгенерированные в блоке 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 состоит из стека неудачно обработанных исключений.
В вашем блоке исключений вы пытаетесь вставить в 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', ...);