我在子程序中引發異常,我期待看到調用函數暫停執行。然而,調用函數繼續處理,好像什麼也沒有發生,我不明白爲什麼。函數在子程序中出現異常後恢復執行
我的功能看起來是這樣的:
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