2010-04-18 1 views
2

В моем коде я ввожу зарплату, которая недоступна в таблице сотрудников, а затем снова вставляю дубликат employee_id в столбце первичного ключа таблицы employee в блоке исключений, где я обрабатываю исключение, исключенное данными, но я не понимаю, почему исключение No data found в конец тоже?Исключение 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;  
+0

Технически ваше первоначальное исключение не было обработано, оно забросило еще одно исключение. Это кажется мне ожидаемым поведением. – David

ответ

4

поведения является то, что ошибки швырять в ОСВОБОЖДЕНИИ блока получить сцепляются к SQLERRM, и, следовательно, распространяются вверх , Я даю вам it is not documented, но мы можем ясно видеть его здесь:

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

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

ORA-01400: не может вставить NULL в

ORA-01403: no data found является частью стека-следа, вызванного не удалась выбрать ("SCOTT" "СОТРУДНИКИ" "LAST_NAME"..).


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

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