首页 > 解决方案 > 不处理 no_data_found

问题描述

我有emp表,因为没有记录。我使用了那些表SQLPL/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声明中它显示没有选择行。

我想知道plsqlsql声明中实际发生了什么?

标签: oracleplsql

解决方案


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;
/

推荐阅读