【问题标题】:Show the output before the exception显示异常前的输出
【发布时间】:2020-03-27 07:43:46
【问题描述】:

我有一个函数(2 个 IN 参数),它返回一个人的平均工资,如果数据库中不存在此人(数据库中不存在 ID 和姓名),我将提出一个例外,或者如果他没有任何薪水,那么将引发另一个例外。

问题是我有一个集合,其中包含一些 id 和名称,它们将为不同的参数生成不同的输出,
其中一半将生成正常输出,这意味着人们在数据库中并且有薪水,而另一半没有薪水或数据库中不存在。

即使我将“正确”的人放在“不正确的”人之前,SQL Developer 也会显示用户定义的异常。

在引发异常之前如何打印返回的消息?

【问题讨论】:

  • 请给我们看一下这个功能。
  • @VBoka 该功能可以正常工作。问题是:如果我在一个块中使用数据库中的参数调用函数 3 次,它将产生 3 个不同的输出,但如果我使用不在数据库中的参数调用它,它只会打印忽略的异常之前的 3 个输出。
  • 请告诉我们这个功能。您说“该功能按应有的方式工作”,但随后您描述了什么不起作用……

标签: sql oracle plsql oracle-sqldeveloper


【解决方案1】:

这取决于你如何做到这一点。人们通常在(光标)循环中执行此操作。如果你也在做同样的事情,那么你需要在循环本身中包含额外的 begin-exception-end 块。

我不知道你的表格,所以这是一个愚蠢的代码,但应该给你一个想法:

declare
  l_ename emp.ename%type;
  l_sal   emp.sal%type;
begin
  for cur_d in (select deptno, dname from dept) loop
    begin                                         --> begins here
      select e.ename, e.sal 
        into l_ename, l_sal
        from emp e
        where e.deptno = cur_d.deptno;

    exception                                     --> handle errors
      when no_data_found then
        null;
      when too_many_rows then
        null;
    end;                                          --> ends here
  end loop;
end;

【讨论】:

  • 这看起来不错,但我还有一个问题。我的函数已经处理了可能的异常,我只需要在块内调用它。我可以处理块中的函数异常吗?我的意思是把异常处理从函数移到块中?
  • 您可以处理任何您想要的异常,但是 - 此代码(我发布的)将处理您在循环中遇到的错误。如果您将这些处理程序移出,您将处于现在的位置 - 出现未处理的错误。
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 2020-06-11
  • 2021-02-26
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2016-03-14
相关资源
最近更新 更多