为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。 【DM版本】:DM8 【操作系统】:未知 【CPU】:未知 【问题描述】*: 通过包中的存储过程,动态调用子存储过程,但是子存储过程报错,未将报错信息抛出给父存储过程
查一下子过程中是否有异常捕获的代码,如果有且需要将异常传递给外部调用过程的话,需要在异常捕获脚本中将异常抛出来。 我刚简单测试了一下,目测没有再现子过程内部异常在调用过程中无法捕获的情况。
CREATE OR REPLACE PACKAGE PKG_EXTEST IS PROCEDURE P_MAIN(V_EXTYPE INT); END; / CREATE OR REPLACE PACKAGE BODY PKG_EXTEST IS EX_MYEX EXCEPTION; PROCEDURE P_CHILD(V_EXTYPE INT) IS BEGIN IF V_EXTYPE = 1 THEN RAISE_APPLICATION_ERROR(-20001, '出错了'); ELSIF V_EXTYPE = 2 THEN RAISE EX_MYEX; ELSE EXECUTE IMMEDIATE 'SELECT 1 FROM ERRDUAL'; END IF; END; PROCEDURE P_MAIN(V_EXTYPE INT) IS BEGIN P_CHILD(V_EXTYPE); EXCEPTION WHEN OTHERS THEN PRINT('HASERR:'||SQLCODE||SQLERRM); END; END; / BEGIN PKG_EXTEST.P_MAIN(1); PKG_EXTEST.P_MAIN(2); PKG_EXTEST.P_MAIN(3); END; --代码块输出信息 HASERR:-20001出错了 HASERR:-15001User define exception HASERR:-2106无效的表或视图名[ERRDUAL]
查一下子过程中是否有异常捕获的代码,如果有且需要将异常传递给外部调用过程的话,需要在异常捕获脚本中将异常抛出来。
我刚简单测试了一下,目测没有再现子过程内部异常在调用过程中无法捕获的情况。
CREATE OR REPLACE PACKAGE PKG_EXTEST IS PROCEDURE P_MAIN(V_EXTYPE INT); END; / CREATE OR REPLACE PACKAGE BODY PKG_EXTEST IS EX_MYEX EXCEPTION; PROCEDURE P_CHILD(V_EXTYPE INT) IS BEGIN IF V_EXTYPE = 1 THEN RAISE_APPLICATION_ERROR(-20001, '出错了'); ELSIF V_EXTYPE = 2 THEN RAISE EX_MYEX; ELSE EXECUTE IMMEDIATE 'SELECT 1 FROM ERRDUAL'; END IF; END; PROCEDURE P_MAIN(V_EXTYPE INT) IS BEGIN P_CHILD(V_EXTYPE); EXCEPTION WHEN OTHERS THEN PRINT('HASERR:'||SQLCODE||SQLERRM); END; END; / BEGIN PKG_EXTEST.P_MAIN(1); PKG_EXTEST.P_MAIN(2); PKG_EXTEST.P_MAIN(3); END; --代码块输出信息 HASERR:-20001出错了 HASERR:-15001User define exception HASERR:-2106无效的表或视图名[ERRDUAL]