Search code examples
sqloracle-databaseplsqlora-01400ora-01403

No_data_found exception is propagating to outer block also?


In my code i am entering the salary which is not available in employees table and then again inserting duplicate employee_id in primary key column of employee table in exception block where i am handling no data found exception but i do not why No data found exception in the end also?

OUTPUT coming:

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

This is the code:

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;       

Solution

  • The behaviour is that errors hurled in the EXCEPTIONS block get concatenated to SQLERRM, and hence propagated upwards. I grant you it is not documented but we can clearly see it here:

    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>  
    

    Note: if there is a nested exception block which successfully handles the thrown exception it is not concatenated to SQLERRM. That is, the SQLERRM consists of a stack of unsucessfully handled exceptions.