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 函数之间的异常处理的主要内容,如果未能解决你的问题,请参考以下文章