首页 > 解决方案 > no-data-found 异常没有隐式引发吗?

问题描述

问题 1:我注意到未隐式引发 no-data-found 异常,我们是否需要手动/显式引发它们?

问题2:

我编写了一个包含 4 个程序的 SP 包,并且我在一个表上编写了以下程序。

异常处理在每个过程中都是重复的。是否有任何指导/编码标准将其保存在一个地方程序#5 或函数中并在那里调用它。

选择更新插入删除我想如果我将它保存在一个函数中它会引发异常并返回到被调用的过程并继续运行?但是当我们引发异常时,程序应该停止,对吗?

标签: oracleexception

解决方案


您遇到了 PL/SQL 异常处理中的唯一异常 -ORA-1403: no data found当它由 SQL 上下文中调用的函数生成时被抑制。

No data found 异常在 PL/SQL 匿名块中工作正常:

SQL> declare
  2      v_number number;
  3  begin
  4      select 1 into v_number from dual where 1=0;
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 4

在 PL/SQL 语句中调用的函数也没有发现数据也能按预期工作:

SQL> create or replace function exception_no_data_found return number is
  2      v_number number;
  3  begin
  4      select 1 into v_number from dual where 1=0;
  5      return v_number;
  6  end;
  7  /

Function created.

SQL> declare
  2      v_number number;
  3  begin
  4      v_number := exception_no_data_found;
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at "JHELLER.EXCEPTION_NO_DATA_FOUND", line 4
ORA-06512: at line 4

但是在 SQL 上下文中调用函数时,异常消失了:

SQL> select exception_no_data_found from dual;

EXCEPTION_NO_DATA_FOUND
-----------------------

我认为这样做的原因是 SQL 在内部使用 no data found 异常来让系统知道没有更多的行,所以它并不总是异常。(这种行为可能是一个错误,但已经存在了很长时间,以至于它永远不会改变。)

要在这种情况下引发该异常,您必须手动捕获并引发不同的异常,如下所示:

SQL> create or replace function exception_no_data_found return number is
  2      v_number number;
  3  begin
  4      select 1 into v_number from dual where 1=0;
  5      return v_number;
  6  exception when no_data_found then
  7      raise_application_error(-20000, 'No data found.');
  8  end;
  9  /

Function created.

SQL> select exception_no_data_found from dual;
select exception_no_data_found from dual
       *
ERROR at line 1:
ORA-20000: No data found.
ORA-06512: at "JHELLER.EXCEPTION_NO_DATA_FOUND", line 7

但上述情况是迄今为止关于 Oracle 异常处理的最奇怪的部分。除了这种情况,一般来说,不做任何异常处理几乎总是会更好。就让程序中断;异常将向上传播,应用程序将收到一个异常,其中包括完整的错误消息和错误的确切行号。在实践中,这些信息几乎总是足以调试任何问题。仅当您确定需要收集额外数据时才添加自定义异常处理。


推荐阅读