ITPub博客

首页 > 数据库 > Oracle > ora-04068 ora-06508 已丢弃程序包 的当前状态

ora-04068 ora-06508 已丢弃程序包 的当前状态

原创 Oracle 作者: 时间:2012-11-13 11:49:11 0 删除 编辑

在调用含有全局变量的包的存储过程里的异常处理模块加一句:
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
IF SQLCODE = -6508 THEN
dbms_session.reset_package;
......
这样当全局变量包被修订后,存储过程会报一次警告通知用户再次重试一次即可成功,达到刷新包缓存的效果。

[@more@]

在包头中声明的变量的作用域为全局范围,故称为全局变量,这些变量对于具有执行权限的任何PL/QSL块都是可见的。由于包的变量都存放在用户全局区(UGA)的会话存储区中,全局变量自然也不例外。故全局变量的值是基于会话级别的,在整个会话期间它都会维持它的最新值,在会话中设置、修改、维护全局变量的值对其它会话不会有影响。不同的会话都有自己全局变量的本地副本。当pl/sql包pkgA进行重编时,引用了pkgA的其它包,包括pkgB,全都会自动变成失效状态。pkgB下次执行时,发现状态已失效,于是按oracle机制自动进行重编。由于全局变量的全局性是会话级别的,每个会话本地副本中全局变量的值可能都不一样。但自动重编译导致全局变量值的重新获取,覆盖了本地副本中的值。此时,oracle若再“静默”地自动重编译,会导致各会话本地全局变量的值变得不可控,因为它不再是以前的值了,而是被重置成了初始值。因此,oracle必须采取抛出错误的办法来显式地通知用户会话,否则,用户没办法知道全局变量的值已发生了变化。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24870090/viewspace-1059759/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    89
  • 访问量
    394808