ORA-04068,ORA-04065,ORA-06508 PL/SQL: could not find program unit being called

译者注: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,523case,请你们看一下。

一位用户对我说:

我遇到这样的情况,从三月份的第二周开始,我在过去的五、六周里突然开始从一个存储过程SP_A接收到SQLException ‘Cursor is Closed’。这个情况是间歇性发生的。如果我在出现错误几分钟以后,用同样的参数再次执行这个存储过程,它又会返回正确的结果,而不产生错误。…”

当我问他“你看到的是什么ora-xxxx错误?”以后,他回答的更多细节如下:

“很不幸,这种情况并不产生ORA-????错误。我知道在很多情况下,‘Cursor is Closed’错误是个编程错误,但是在这里,情况不是这样。 我不能如我希望的那样重现这个错误。我在我们的开发环境或客户验收环境里都无法重现这个错误。即使在生产环境,我也不能用产生错误的参数重现这个错误。

“我怀疑原因可能是Oracle的内存问题,因为我们刚从9i升级到10g RAC。应用程序—Java代码和存储过程—到现在已经运行了56年了。甚至我们接收到的‘Cursor is Closed’错误也不是确定的,例如产生错误的参数在完全一样的代码下,在几分钟以后就正常工作了。”

好,现在变成这样了他们说“没有ora-xxxx错误,Oracle就是把我们的游标关掉了—没有原因地。我们知道这不会是我们代码的bug,这是Oraclebug.”

故事总是这样上演的。 就在我最后准备放弃把这个问题关闭的时候,他们又继续了:

“我们发现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后面如果没有跟RAISERAISE APPLICATION ERROR,几乎可以肯定(有99.999999999%的准确率),是你开发的代码的一个bug.一定要对when others后面没有跟raiseraise 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值