我有一个使用包(PKG_MY_PACKAGE)的脚本。我将更改该包中查询的一些字段,然后重新编译它(我不更改或编译任何其他包)。我运行脚本,得到一个错误,看起来像
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "USER3.PKG_MY_PACKAGE" has been invalidated
ORA-04065: not executed, altered or dropped package body "USER3.PKG_MY_PACKAGE"
ORA-06508: PL/SQL: could not find program unit being called: "USER3.PKG_MY_PACKAGE"
ORA-06512: at line 34
我再次运行该脚本(不更改系统中的任何其他内容),脚本成功执行。
我认为在执行脚本之前进行编译时,会修复任何无效的引用。这是100%可重复的,我使用这个脚本越多,它就越烦人。什么会导致这种情况,什么会解决它?
(oracle 10 g,使用PL/SQL Developer 7)
4条答案
按热度按时间piah890a1#
背景
existing state of packages has been discarded
意味着你的包(或主体)有某种状态,但在重新编译时丢失了。这是由存储在您的Package中的全局变量引起的。
在www.example.com之前11.2.0.2,常量也会导致这种行为(请参阅文档)。
由于包已在会话中使用,Oracle假定此状态与您相关。某些变量可能已更改,重新编译时,这些值将重置。
这个异常被抛出,这样你的客户端就知道他们不能再依赖这些变量了。
解决方案
解决方案(更改源)
DETERMINISTIC
函数替换全局变量(如this answer所建议)PRAGMA SERIALLY_REUSABLE
定义包会导致Oracle在每次调用服务器时重新初始化全局变量。mgdq6dx12#
如果你正在运行脚本中的东西,在运行重新编译的代码之前,尝试这些命令。
他们做的是名字所暗示的。
ldxq2e6h3#
您可能遇到的问题包括:
vof42yt14#
上述错误:ORA-06508:PL/SQL:找不到正在调用的程序单元。
当试图调用找不到的存储程序时,会导致。该程序可能已被删除或被不兼容地修改,或者编译时出错。
检查所有引用的程序,包括它们的包体,是否存在并且兼容。
您可以运行此查询来查找无效对象,这可能会导致ORA-06508错误:
从dba_registry中选择comp_id、comp_name、version、status、namespace、schema;