No_data_found 异常也传播到外部块?
Posted
技术标签:
【中文标题】No_data_found 异常也传播到外部块?【英文标题】:No_data_found exception is propagating to outer block also? 【发布时间】:2010-04-18 06:57:51 【问题描述】:在我的代码中,我输入了雇员表中不可用的薪水,然后再次在异常块中的雇员表的主键列中插入重复的雇员 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;
【问题讨论】:
从技术上讲,您的原始异常没有得到处理,它引发了另一个异常。在我看来,这似乎是预期的行为。 【参考方案1】:行为是在 EXCEPTIONS 块中抛出的错误连接到 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 由一堆未成功处理的异常组成。
【讨论】:
【参考方案2】:在您的异常块中,您尝试插入employees
,但不要设置列last_name
,这不是NULL
-able。
ORA-01400:无法将 NULL 插入 ("SCOTT"."EMPLOYEES"."LAST_NAME")
ORA-01403: no data found
是堆栈跟踪的一部分,由您的选择失败引起。
您可以为所有不可为空的列定义 DEFAULT
值或更改插入:
INSERT INTO employees (employee_id, last_name, ...) Values (100, 'Scott', ...);
【讨论】:
以上是关于No_data_found 异常也传播到外部块?的主要内容,如果未能解决你的问题,请参考以下文章