包的现有状态已被丢弃

Dan*_*Dan 15 sql oracle error-handling plsql stored-procedures

所以我一直运行PLSQL程序就好了,编译没有错误.我对我的程序做了一个更改,它仍然编译得很好,但现在当我运行它时,我收到此错误:

ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "SCHEMA.XP_COVER_PAGEP" has been invalidated
ORA-04065: not executed, altered or dropped package body "SCHEMA.XP_COVER_PAGEP"
ORA-06508: PL/SQL: could not find program unit being called: "SCHEMA.XP_COVER_PAGEP"
ORA-06512: at "SCHEMA.XP_ST_002180", line 141
ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)

任何想法可能是什么?我所做的改变是如此微不足道,我怀疑它可能导致了这个错误.预先感谢您的帮助!

dar*_*jnz 26

当会话使用包时会话保留包的某些状态.如果在下次同一会话引用该包时重新编译该包,则会收到该错误.

为避免这种情况,请确保断开可能已使用该程序包的每个会话,或让会话执行DBMS_SESSION.RESET_PACKAGE以重置程序包状态.

  • 谢谢 darreljnz,该解决方案对我来说效果很好。但一开始我不明白你在说什么。所以,我只是想为其他人澄清一下你的解决方案。在 pl/sql 中打开一个新的测试窗口并粘贴“Begin sys.dbms_session.reset_package; end;” 然后按 F9 执行它,然后对包进行更改或重新编译包,现在我们的应用程序中不会出现任何错误 (2认同)
  • @YogeshJindal 我读到的是每个会话都需要运行这个命令,这在阅读命令的作用后才有意义,[RESET_PACKAGE](http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sessio .htm#i1010767): _"此过程取消实例化此会话中的所有包。"_ 它不应影响数据库中的其他会话,因此从测试窗口运行它不会影响其他会话。 (2认同)

Kla*_*äck 6

如果重新编译包规范,则所有依赖对象都将失效。依赖对象是引用重新编译的包规范中的任何声明的任何视图、包规范、包主体、函数或过程。

此外,正如 darreljnz 所指出的,会话通常会保留对它们访问过的包状态的引用,从而导致ORA-04068: existing state of packages has been discarded下次会话尝试引用包时。

后一种行为是一个真正的麻烦,并且必须在安装新版本的包(有效地重新启动应用程序/服务)后编写代码来重试操作或关闭所有活动会话。底线:这使得安装修补程序变得更加困难。