在pl / sql中使用嵌套函数的过程中的异常处理

时间:2013-08-05 09:53:04

标签: oracle stored-procedures plsql

我有一个pl / sql程序,如下所述

CREATE OR REPLACE PROCEDURE add_affectedCircle
(v_affected_circle IN v_circle.circle_code%type)
IS
    v_circle_id  NUMBER;

BEGIN
        v_circle_id := get_circleID(v_affected_circle);
        INSERT INTO vf_affected_circle (affected_circle) 
        values (v_circle_id);

EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR (-20101, 'Problem in loading Affected Circle data');
END;
/

首先,我使用函数get_circleID检查特定数据v_affected_circle在vf_circle表的circle_code列中是否可用,并返回与circle_code关联的circle_id。

CREATE OR REPLACE FUNCTION get_circleID 
( v_circle_code  vf_circle.circle_code%TYPE)
RETURN vf_circle.circle_id%TYPE
IS
    return_value  vf_circle.circle_id%TYPE; 
BEGIN
    BEGIN
        SELECT circle_id INTO return_value
        FROM vf_circle
        WHERE circle_code = v_circle_code;
   END;
   RETURN return_value;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20102, 'Circle Code is wrong or not available');
END get_circleID;
/

当数据不可用时,我想在功能 get_circleID 中引发用户异常( - 20102,'Circle Code错误或与记录不一致)对于提供的数据 v_affected_circle 。从过程add_affectedCircle

调用此函数

如果在将数据加载到特定表vf_affected_circle中时出现问题,我试图引发另一个用户异常( - 20102,“加载受影响的圈子数据时出现问题”)

现在的问题是我尝试使用错误的值运行 add_affectedCircle 过程,我只是从程序而不是从函数中获得异常。此外,我看到其他例外,我无法处理和压制它。

现在我得到这样的例外

BEGIN add_affectedCircle(69,'ODI:ASA'); END;

*
ERROR at line 1:
ORA-20102: Problem in loading Affected Circle data
ORA-06512: at "SRUSER.ADD_AFFECTEDCIRCLE", line 28
ORA-06512: at line 1

但我需要展示的是这样的

   ORA-20102: Circle Code is wrong or not available
   ORA-20101: Problem in loading Affected Circle data

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:4)

RAISE_APPLICATION_ERROR procedure有第三个参数,它控制异常是替换当前异常堆栈(默认行为)还是添加到它。

  

如果指定TRUE,PL / SQL会将error_code置于错误堆栈之上。   否则,PL / SQL用error_code替换错误堆栈。

因此,如果你传递它TRUE,它将显示两条消息;在您的程序调用中:

...
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR (-20101, 'Problem in loading Affected Circle data',
  TRUE);
END;

为您提供输出:

BEGIN
*
ERROR at line 1:
ORA-20101: Problem in loading Affected Circle data
ORA-06512: at "SRUSER.ADD_AFFECTEDCIRCLE", line 13
ORA-20102: Circle Code is wrong or not available
ORA-06512: at line 2

要仅显示消息而不显示您需要操纵堆栈的其他堆栈信息。 This article触及了如何使用format_error_backtrace来提取您感兴趣的信息,但不幸的是,BT包的链接已经死亡。一些相同的基础is covered here。基本上你需要将异常字符串解析成行,并且只显示那些以ORA-20%开头的字符串。

但要小心丢失可能实际上至关重要的信息。特别是我建议你只捕获你正在寻找的特定错误,而不是OTHERS - 留下这一点,这样你就可以处理意外错误而不会隐藏重要的错误。