Oracle ORA-04068中经常出现错误:已丢弃现有的包状态

jon*_*ita 10 sql oracle oracle10g

我们每天在每两个小时运行一次的脚本上收到此错误,但是在一天的不同时间.

ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "PACKAGE.NAME" has been
invalidated
ORA-06508: PL/SQL: could not find program unit being called:
"PACKAGE.NAME"
ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)

有人可以列出哪些条件可能导致此错误,以便我们可以调查?

谢谢.

更新:执行'ALTER SESSION CLOSE DATABASE LINK DBLINK'会使包的状态无效吗?

Chr*_*467 14

该包具有公共或私有变量.(对吗?)这个变量构成了包的状态.如果您在第3个会话中编译包.下一次访问此程序包将抛出ORA-04068.

程序包的构建时间戳必须早于程序包会话状态.

如果脚本运行不需要包状态,则DBMS_SESSION.RESET_PACKAGE在脚本开头调用.这将清除会话的所有包状态.

  • martilyo:包的新版本可能有更多/更少/其他包变量.实际上,如果编译一个根本没有包变量的包,那么ORA-04068错误就不会发生.Daredevils在繁忙的工作时间在生产系统上这样做.. (2认同)

jon*_*ita 13

这一个班轮实际上解决了一切:

PRAGMA SERIALLY_REUSABLE;
Run Code Online (Sandbox Code Playgroud)

确保您的全局变量是无状态的,以避免任何问题.

  • 更准确地说,该pragma导致在对数据库的每个请求上重置包状态(再次执行包初始化). (7认同)

Gur*_*uru 5

您也可以检查dba_dependenciesuser_dependencies

select *
from dba_dependencies
where name = 'YOUR_PACKAGE'
and type = 'PACKAGE' --- or 'PACKAGE_BODY'
and owner = USER --- or USERNAME
Run Code Online (Sandbox Code Playgroud)

这将为您提供包所依赖的对象。检查那里发生了什么。