【发布时间】:2013-05-10 05:32:37
【问题描述】:
我在子程序中引发了一个异常,我希望看到调用函数此时会暂停执行。但是,调用函数继续处理,就好像什么都没发生一样,我不明白为什么。
我的函数看起来像这样:
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
【问题讨论】:
-
你确定你的第一个函数看起来完全一样吗?异常会按照您的设想工作并“冒泡”,因此您一定在某个地方发现了它。
-
@Ben:我在我的示例中添加了一些信息,在阅读了您的评论后,这些信息突然显得更加相关。回想起来很明显......