我有一个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
我怎样才能做到这一点?
答案 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
- 留下这一点,这样你就可以处理意外错误而不会隐藏重要的错误。