我有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
Run Code Online (Sandbox Code Playgroud)
在 pl/sql 块中,而不是处理no_data_found它显示pl/sql successfully completed
但在SQL语句中它显示没有选择行。
我想知道plsql和sql声明中实际发生了什么?
LOOP 和 END LOOP 子句之间的代码对游标中的每一行执行一次。您的游标返回零行,因此它永远不会被执行。
游标循环按照设计优雅地处理空结果,因为预计会到达结果集的末尾,即使它是零行。所以它不会抛出 NO_DATA_FOUND 异常。
这就是您看不到消息的原因。
另一方面,SQL 语句期望查询返回行,并且在没有返回行时不引发任何数据。但是,您是在客户端(在本例中为 SQL*Plus)中执行 SQL 语句,它处理此结果并显示一条消息。
如果您希望 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;
/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |