PL\SQL 函数之间的异常处理

Posted

技术标签:

【中文标题】PL\\SQL 函数之间的异常处理【英文标题】:PL\SQL Exceptions handling between functionsPL\SQL 函数之间的异常处理 【发布时间】:2015-09-30 15:02:01 【问题描述】:

我有这样的第一个程序

procedure p1(a in varchar2)
is 
begin 
  -- call second procedure
  p2(a);
  -- other things
end;

我的第二个过程可能有一个异常需要引发:

procedure p2(a in varchar2)
is
  lv varchar2(20);
begin
   select '1' into lv from dual;

   if lv = '2' then
     raise general_exception;
   end if;
end;

我的general_exception 变量是一个全局异常类型,在我的两个程序所在的包中。

我想在第一个过程p1 中捕获异常以避免执行其他事情。

我试过了,但没有结果:

procedure p1(a in varchar2)
is 
begin 
  -- call second procedure
  p2(a);
  -- other things
exception when general_exception then
  dbms_output.put_line('ERROR');
end;

【问题讨论】:

那么会发生什么?引发什么错误?告诉我们您在哪里声明一般异常...... P1 和 P2 在一个包内吗? "我的 general_exception 变量是一个全局异常类型,在我的两个程序所在的包内。" 当我说“没有结果”时,这意味着我可以处理“其他事情”,而 general_exception 没有得到处理。所以...没有引发错误。 您确定异常确实被引发了吗?当然,它永远不会是您发布的代码。希望您真正的 p2 本身不会处理异常。 【参考方案1】:

它对我有用(nb。我确实更改了您的 p2 以引用传入的参数,而不是“1”的静态值!):

create or replace package test_pkg
as
  general_exception exception;

  procedure p1 (p_a in varchar2);
end test_pkg;
/

create package body test_pkg
as
  procedure p2 (p_a in varchar2)
  is
  begin
    if p_a = '2' then
      raise general_exception;
    end if;
  end p2;

  procedure p1 (p_a in varchar2)
  is
  begin
    p2(p_a);
    dbms_output.put_line('p2 executed sucessfully. Do all of the things.');
  exception
    when general_exception then
      dbms_output.put_line('ERROR');
  end p1;
end test_pkg;
/

set serveroutput on;

begin
  test_pkg.p1('1');
  test_pkg.p1('2');
end;
/

使用两个不同的值运行 p1 过程的输出是:

p2 executed sucessfully. Do all of the things.
ERROR

符合预期。

【讨论】:

我发现了问题。在我的真实程序中,我有一些代码在其他人声明时调用其他有异常的程序。这就是为什么 p2 从不处理错误的原因。非常感谢两位的回答。正如我所说,这确实是一个简单的问题。我错过了重点! :) 不用担心;这很容易完成!我们都去过那里 *:-)

以上是关于PL\SQL 函数之间的异常处理的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 异常错误处理

PL/SQL 引发处理异常

PL/SQL 异常处理

总结:整理 oracle异常错误处理 . (转载)

处理过程 PL/SQL 的异常

PL/SQL系统定义的异常操作实例讲解