0

我有一个 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 检查 vf_circle 表中 circle_code 列中的特定数据 v_affected_circle 是否可用,并返回与 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;
/

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

如果在将数据加载到特定表 vf_affected_circle as (-20102, 'Problem in loading Affected Circle data')时出现问题,我试图引发另一个用户异常。

现在的问题是我尝试使用错误的值运行过程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

我怎样才能做到这一点?

4

1 回答 1

4

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

如果您指定 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

要仅显示消息而不显示您需要操作堆栈的其他堆栈信息。这篇文章讲了如何使用format_error_backtrace来提取你感兴趣的信息,可惜BT包的链接已经失效了。一些相同的地方在这里覆盖。本质上,您需要将异常字符串解析为行,并且只显示以 开头的行ORA-20%,我认为。

但要小心丢失可能实际上很重要的信息。特别是我建议您只捕获您正在寻找的特定错误,而不是OTHERS- 不理会它,这样您就可以处理意外错误并且不要隐藏重要的东西。

于 2013-08-05T10:47:10.433 回答