oracle - 不处理 no_data_found
问题描述
我有emp表,因为没有记录。我使用了那些表SQL
并PL/SQL
阻止
SQL> BEGIN
2 FOR i IN (SELECT * FROM emp WHERE 1=2) -- emp table having no data
3 LOOP
4 dbms_output.put_line('Done');
5 END LOOP;
6 EXCEPTION
7 WHEN no_data_found THEN
8 dbms_output.put_line('No such value');
9 END;
10 /
PL/SQL procedure successfully completed. -- it shows completed, instead of handling no_data_found
SQL> SELECT * FROM emp
2 WHERE 1=2;
no rows selected -- but here it show no rows selected
在 pl/sql 块中,而不是处理no_data_found
它显示pl/sql successfully completed
但在SQL
声明中它显示没有选择行。
我想知道plsql
和sql
声明中实际发生了什么?
解决方案
LOOP 和 END LOOP 子句之间的代码在游标中的每一行执行一次。您的游标返回零行,因此它永远不会被执行。
游标循环按设计优雅地处理空结果,因为预期会到达结果集的末尾,即使它是零行。所以它不会抛出 NO_DATA_FOUND 异常。
这就是您看不到任何消息的原因。
另一方面,SQL 语句期望查询返回行,并在没有返回行时引发未找到数据。但是,您正在客户端中执行 SQL 语句 - 在本例中为 SQL*Plus - 处理此结果并显示一条消息。
如果您希望您的 PL/SQL 表现出相同的行为,请不要使用游标循环:
declare
l_emp_rec emp%rowtype;
begin
select *
into l_emp_rec
from emp
where 1 = 2; -- emp table having no data
dbms_output.put_line('Done');
exception
when no_data_found then
dbms_output.put_line('No such value');
end;
/
推荐阅读
- swift - 快速日期格式
- spring - 发送状态 200 无需等待任何返回
- php - PHP 和使用 strcmp 函数的正确方法
- vue.js - Vue计算属性未更新
- javascript - Get as Image 生成错误的图像 - Google App Script
- javascript - 调整大小和滚动问题 (JS/HTML)
- python - 在 Pytorch 中将 loss 乘以 n 后,多次 loss.backward() 和 loss.backward() 之间有区别吗?
- angular - 在角材料表上绑定枚举值
- c# - MVVM 如何将数据绑定到多个实例控件
- javascript - 使用javascript生成具有特定时间范围的随机模拟数据