如何解决have been existingg state of packages has been discarded问题

异常ORA-04068:ORA-04061:ORA-04065:ORA-06508解决办法
今天在执行EBS工作流的时候,遇到了一个及其古怪的问题,下面我把我遇到的问题及其解决问题的整个过程分享给大家。
首先我提交了工作流wf_a, 提交完成后在前台查看工作流,工作流状态为active(这点对于解决问题很重要),因为遇到问题不能继续向下进行。
第二步,修改后台对应的程序package: pkg_b.func_c.
第三步,重新提交工作流wf_a,这时遇到了如下错误:&
ORA-04068: existing state of packages has been discardedORA-04061: existing state of package &pkg_b.func_c& has been invalidatedORA-04065: not executed, altered or dropped package &pkg_b.func_c&ORA-06508: PL/SQL: could not find program unit being called&
这个错误太奇怪了,我的程序明明好好的,为什么会提示这种错误呢?我想那就baidu吧,那就google 吧, 那就metalink吧,总之是查了很久感觉总和我遇到的问题对不上号,就在快要放弃的时候,终于看见了一片文章《OraclePLSQL之子程序和包》里面有这么一段描述:&
包运行状态的相关:除了在存储对象之间的存在着相关外,包状态和匿名块之间也有相关特性。例如,请看下面的包:节选自在线代码anonymousDependencies.sql
CREATE&OR&REPLACE&PACKAGE&SimplePkg&AS&&
&&&v_GlobalVar&NUMBER&:=&1;&&
&&&PROCEDURE&UpdateV&&&
END&SimpleP&&
CREATE&OR&REPLACE&PACKAGE&BODY&SimplePkg&AS&&&
&&&PROCEDURE&UpdateVar&IS&&
&&&BEGIN&&
&&&&&&v_GlobalVar&:=&7;&&&
&&&END&UpdateV&&
END&SimpleP&&
CREATE&OR&REPLACE&PACKAGE&SimplePkg&AS&&
&&&v_GlobalVar&NUMBER&:=&1;&&
&&&PROCEDURE&UpdateV&&&
END&SimpleP&&
CREATE&OR&REPLACE&PACKAGE&BODY&SimplePkg&AS&&&
&&&PROCEDURE&UpdateVar&IS&&
&&&BEGIN&&
&&&&&&v_GlobalVar&:=&7;&&&
&&&END&UpdateV&&
END&SimpleP&&CREATE OR REPLACE PACKAGE SimplePkg AS
v_GlobalVar NUMBER := 1;
PROCEDURE UpdateV
END SimpleP
CREATE OR REPLACE PACKAGE BODY SimplePkg AS
PROCEDURE UpdateVar IS
v_GlobalVar := 7;
END UpdateV
END SimpleP
包SimplePkg包含了一个包全局量 v_GlobalVar.假设我们从一个数据库会话创建包 SimplePkg.接着,在第二个会话中,我们使用下面的块来调用 SimplePkg.UpdateVar:
&&&simplePkg.UpdateV&&&
&&&simplePkg.UpdateV&&&
END;&&BEGIN
simplePkg.UpdateV
现在返回第一个会话,我们运行创建脚本再次创建包 SimplePkg。最后,我们在第二个会话中提交同样的匿名块。下面是得到的输出信息:&&
ORA-04068:&existing&state&of&packages&has&been&discarded&&&
ORA-04061:&existing&state&of&package&&EXAMPLE.SIMPLEPKG&&has&been&&&
invalidated&&&
ORA-04065:&not&executed,&altered&or&dropped&package&&&
&EXAMPLE.SIMPLEPKG&&&&
ORA-06508:&PL/SQL:&could&not&find&program&unit&being&called&&&
ORA-06512:&at&line&2&&
ORA-04068:&existing&state&of&packages&has&been&discarded&&&
ORA-04061:&existing&state&of&package&&EXAMPLE.SIMPLEPKG&&has&been&&&
invalidated&&&
ORA-04065:&not&executed,&altered&or&dropped&package&&&
&EXAMPLE.SIMPLEPKG&&&&
ORA-06508:&PL/SQL:&could&not&find&program&unit&being&called&&&
ORA-06512:&at&line&2&&ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package &EXAMPLE.SIMPLEPKG& has been
invalidated
ORA-04065: not executed, altered or dropped package
&EXAMPLE.SIMPLEPKG&
ORA-06508: PL/SQL: could not find program unit being called
ORA-06512: at line 2
上面的程序发生了什么问题?图 5 - 1 3是上述情况的相关图示。匿名块依赖于包 SimplePkg。这种相关是编译时的依赖性,也就是在匿名块首次编译时就确定的相关关系。然而,除此之外,由于每个会话都有其自己包变量的复本,所以运行时包变量之间也存在着依赖关系。因此,当重编SimplePkg时,运行时相关就紧随其后,引发了错误ORA-04068并作废了该块。
运行时相关仅存在于包状态之上,它包括包中的变量和游标声明。如果包没有全局变量的话,则匿名块的第二次运行将会成功。
匿名块依赖于SimplePky,并包括v_Globa Var的实例
图5-13 包的全局相关图示&
到这里我终于明白了,有种顿悟的感觉。也就是说在一个会话中调用程序包package时,会生成package中全局变量的副本,如果在另一个会话中对此package进行编译就会使前一个会话中的副本失效,故而产生错误。
因此,我查看自己的程序,发现确实存在着全局变量。对照这种说法,那么就是我之前提交的工作流wf_a(相当于会话)存在着pkg_b中全局变量的副本,并且此工作流是active状态,所以我在编译pkg_b之后,就触发了ORA-04068的错误。
那么既然知道了错误产生的原因,解决起来就容易了。
我将之前提交的工作流只要是活动的就全部取消,这样会将其占用的会话释放掉,因此也就不会存在pkg_b的在别的会话当中的副本。然后重新提交工作流wf_a,果然不出所料,工作流顺利通过。
请各位遵纪守法并注意语言文明博客访问: 657687
博文数量: 519
注册时间:
ITPUB论坛APP
ITPUB论坛APP
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
发布时间: 16:07:21
可以通过在package中引入PRAGMA SERIALLY_REUSABLE来避免参考:http://www./t_ora_04068_existing_state_of_packages_string_discarded.htm& & & &&http://www./sf_ora_04068_existing_state_of_packages_string_has_been_discarded.htm......
阅读(43) | 评论(0) | 转发(0)
给主人留下些什么吧!~~
请登录后留言。ORA-04068: existing state of packages has been discarded - CSDN博客
ORA-04068: existing state of packages has been discarded
一.版本信息
操作系统版本:
数据库版本:
11.2.0.3(psu5)
二.错误描述
#因为该错误有很多可能的原因,所以此处描述场景的时候需要详细点
该错误是我在解决oracle &Doc ID &所描述错误时触发的。(具体可以见我的前面的博客)
1. 按照&Doc ID &提供的临时解决方案,我分别执行了如下命令
-- Login as sys user.
SQL& sqlplus / as sysdba
-- From the sqlplus execute the following:
-- Drop the DBSNMP user by executing catnsnmp.sql script.
SQL& @$ORACLE_HOME/rdbms/admin/catnsnmp.sql
-- Create the DBSNMP user by executing catsnmp.sql
SQL& @$ORACLE_HOME/rdbms/admin/catsnmp.sql
#删除时报了某角色不存在,重建时报了一些object已存。没有大的问题。
2. 为了确保没有问题我再次重复了上面删除和重建DBSNMP用户的命令(在同一个会话中)
#删除用户时,跟首次执行一致,但是在重建用户时我看到了如下报错:
Package body created.
Package body created.
ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package &DBSNMP.BSLN& has been invalidated
ORA-04065: not executed, altered or dropped package &DBSNMP.BSLN&
ORA-06508: PL/SQL: could not find program unit being called: &DBSNMP.BSLN&
ORA-06512: at line 18
PL/SQL procedure successfully completed.
#从报错中其实我们已经可以看出一些端倪出来,报错说package的state(申明)已经无效,然后导致了后面的错误
三. 错误原因及解决方案
查找我们的老帮手MOS发现了&Doc ID &这篇NOTE可以解释我遇到的问题,我贴出了其中一部分:
When a package is compiled, altered or an object on which the package depends is altered, all copies of that package in the shared pool are flagged as invalid.
The next invocation of the package from another database session ( even if it is the same username) sees that this flag is set and goes to get a new copy.
&span style=&color:#ff0000;&&If the package has package state, i.e. it has one or more package variables that would normally persist across calls to the package within the same session, then ORA-4068 error is raised to indicate to the caller that that package state (i.e the current values of those package variables)
has been lost&/span&.
When the ORA-4068 is raised, ORACLE will throw away all existing instantiations of the package.
When the package (more properly, the subprogram referring to the package) is re-executed, ORACLE will re-instantiate the package automatically (If possible), which will typically succeed, and re-execution of the subprogram will succeed.
The mechanism is not sensitive enough to check whether the calling session actually referred to any of the package variables so you always get the error in these situations if the package you are calling has package variables defined.
&span style=&color:#ff0000;&&This is quite common therefore if your program calls a system level package (typically beginning DBMS_ or
that has been recompiled, as the majority of them have at least one package variable defined.&/span&
#大概就是说一个程序包被编译或者alert或者包所依赖的对象被alert,那么shared pool(注意此处是shared pool )中该包的copies都会标记为失效状态。
其他的会话再次调用该报的时候发现失效标记后,会去获取新的copy。
& 如果这个包有申明的话,比如这个包申明了变量,那么我们在同一个会话中再次调用这个变动过的包,就会报ORA-4068这个错误,向调用者表明该包的申明已经失效。(这就是我第二次执行重建DBSNMP用户报错的原因)。
#这个报错我们可以看错是一个警告,我们无需处理,再次调用就没有问题了。
四. 相关知识
#上面我们只列出了我工作中碰到的情况,还有一些其他情况会触发该报错
&Doc ID &中列出了一些常见的场景,我们也可以在MOS中直接搜该报错查看符合自己问题的note
本文已收录于以下专栏:
相关文章推荐
08:49:31,604 ERROR [STDERR] java.sql.SQLException: ORA-04068: existing state of packa...
环境:rhel5.3 oracle 11.2.0.1.0
数据库1(db1)上过程p1通过dblink调用数据库2(db2)上的过程p2
当db2上p2中的内容改变后,重新编译后,再重新...
今天上服务器发现tomcat 里面报如下错误 但是网站并没有挂 后来找了原来
16-Nov-:08.437 警告 [http-nio-8989-exec-5] com.mchan...
甲骨文Oracle数据库使用EXPDP/IMPDP进行Oracle数据迁移从高版本(11g)到底版本(10g)步骤 Oralce数据导入
可能产生的错误
今天到表的时候遇到这么一个怪问题。表的大小明明只有2G,设置的dumpfile文件为5G,足足有余了。可是导出表时却一直报ora-39095这个问题。
导出文件脚本
userid='/ as sy...
SDK更新后,重新打开Eclipse时提示错误Location of the Android SDK has not been setup in the preferences
      ...
打开eclipse时出现无法识别android的项目,即所有android项目均显示红色错误标记。点击eclipse管理android SDK and AVD Manager 插件的标志时出现错误:
...
本文转自:/azhangdeng/blog/item/063b4e9e068c8d.html
location of the a...
阅读内核代码习惯和喜欢使用source insight。如果能在source insight上修改内核代码,同时又不需要把修改的内核代码再拷贝到虚拟ubuntu上去那就方便了。于是想通过用samba与...
在重启Eclipse时报Location of the Android SDK has not been setup in the preferences的解决方法
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 open existing 的文章

 

随机推荐