我在子程序中引发异常,我期待看到调用函数暂停执行。然而,调用函数继续处理,好像什么也没有发生,我不明白为什么。函数在子程序中出现异常后恢复执行
我的功能看起来是这样的:
FUNCTION getFooCursor (i_blah IN VARCHAR)
RETURN t_ref_cursor
IS
v_sum_variable NUMBER;
BEGIN
--lookup number
v_sum_variable := getNumber (i_blah);
--call function that raises NO_DATA_FOUND exception
doRaiseException();
--the exception handler is only supposed to catch for this block
BEGIN
--do stuff and end up with a cursor
RETURN barCursor(v_sum_variable);
EXCEPTION
WHEN OTHERS THEN
--set some variables
END
END;
比方说doRaiseException()
看起来是这样的:
PROCEDURE doRaiseException()
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
当调试蟾蜍这个功能,它帮忙,告诉我,NO_DATA_FOUND例外是上调。然后,它立即执行下一行(调用barCursor()
)并且该函数结束,就好像没有任何错误发生一样。
我曾尝试直接与RAISE NO_DATA_FOUND;
更换doRaiseException();
用于测试目的(它实际上还不止这些),这站内getFooCursor()
执行但无论SQL完全再次调用它忽略了异常。
这是PL/SQL中异常工作的方式吗?他们不像他们在Java或C#中那样冒泡吗?也许我错过了一些关于Oracle中异常的关键。我如何得到一个异常来冒充主机?
这里是我的Oracle版本(从V $版本返回):
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE 10.2.0.5.0 Production
TNS for HPUX: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production
你确定你的第一个功能看起来完全一样吗?例外情况按照您的设想工作并“冒泡”,所以您必须在某处捕捉它。 – Ben
@Ben:我在我的示例中添加了一些信息,在阅读您的评论后突然显得更加相关。回想起来显而易见...... – Stephan