译者注:Tom Kyte (Thomas Kyte)从1988年就开始使用Oracle, 在1993年加入Oracle公司,他的主要时间花费在asktom.oracle.com上。这使得asktom.oracle.com成为最受关注的Oracle问题问答网站。他帮助全球Oracle用户解答了不计其数的问题。
以下这篇博文发表在他的个人博客上:http://tkyte.blogspot.com/2008/06/when-others-then-null-redux.html 本博客已经获得Thomas Kate翻译并转载他的这篇博文的授权。本文的版权仍然属于Thomas Kate。
没有处理的when others又回来了
有些事一直在发生。
重复而又重复地,这些事一直在发生。
这是第124,215,412,523号case,请你们看一下。
一位用户对我说:
“…我遇到这样的情况,从三月份的第二周开始,我在过去的五、六周里突然开始从一个存储过程SP_A接收到SQLException ‘Cursor is Closed’。这个情况是间歇性发生的。如果我在出现错误几分钟以后,用同样的参数再次执行这个存储过程,它又会返回正确的结果,而不产生错误。…”
当我问他“你看到的是什么ora-xxxx错误?”以后,他回答的更多细节如下:
“很不幸,这种情况并不产生ORA-????错误。我知道在很多情况下,‘Cursor is Closed’错误是个编程错误,但是在这里,情况不是这样。 我不能如我希望的那样重现这个错误。我在我们的开发环境或客户验收环境里都无法重现这个错误。即使在生产环境,我也不能用产生错误的参数重现这个错误。
…
“我怀疑原因可能是Oracle的内存问题,因为我们刚从9i升级到10g RAC。应用程序—Java代码和存储过程—到现在已经运行了5,6年了。甚至我们接收到的‘Cursor is Closed’错误也不是确定的,例如产生错误的参数在完全一样的代码下,在几分钟以后就正常工作了。”
…
好,现在变成这样了—他们说“没有ora-xxxx错误,Oracle就是把我们的游标关掉了—没有原因地。我们知道这不会是我们代码的bug,这是Oracle的bug.”
故事总是这样上演的。 就在我最后准备放弃…把这个问题关闭的时候,他们又继续了:
“我们发现SP_A有个WHEN OTHERS的例外处理子句,把真正的错误屏蔽了。
我们把这个错误去掉以后,以下是我们看到的错误:
ORA-04068: existing state of packages has been discarded
ORA-04065: not executed, altered or dropped stored procedure "SP_A
"ORA-06508: PL/SQL: could not find program unit being called:
ORA-06512: at "SP_B", line 317
ORA-06512: at line 1
这就是过去这段时间里间歇发生的事(之前我们并不知道因为存储过程编写的方式和Java代码与返回参数之间的交互方式,这些错误被表现为Cursor Closed错误。)”
现在他们要深入调查为什么会发生这种问题了…
记住,每个人,每个人记住,印在脑子里:
WHEN OTHERS后面如果没有跟RAISE或RAISE APPLICATION ERROR,几乎可以肯定(有99.999999999%的准确率),是你开发的代码的一个bug.一定要对when others后面没有跟raise或raise application error这种做法说“不”。
http://www.oracle.com/technology/oramag/oracle/07-jul/o47asktom.html
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-610497/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-610497/