我在子程序中引发异常,我希望看到调用函数此时会停止执行。但是,调用函数继续处理,好像什么也没发生,我不明白为什么。
我的函数看起来像这样:
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;
当我在 TOAD 中调试此函数时,它会告诉我 NO_DATA_FOUND 异常已引发。但是,它会立即继续执行下一行(barCursor()
调用的地方),并且函数结束,就好像没有出错一样。
为了测试目的,我尝试doRaiseException();
直接替换RAISE NO_DATA_FOUND;
为(它实际上做的不止于此),这会停止执行,getFooCursor()
但无论 SQL 再次调用它是否完全忽略了异常。
这就是异常在 PL/SQL 中的工作方式吗?他们不会像在 Java 或 C# 中那样冒泡吗?也许我错过了有关 Oracle 异常的一些重要信息。如何让异常冒泡到主机?
这是我的 Oracle 版本(从 v$version 返回):
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