我有一个如下所述的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,“圈子代码错误或与记录不同”)。从过程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
我怎样才能做到这一点?
该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
-别管它,这样您就可以处理意外的错误并且不要隐藏重要的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句