包的现有状态已被丢弃

时间:2011-10-27 18:15:12

标签: sql oracle stored-procedures error-handling plsql

所以我一直在运行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

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

3 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:3)

在您的程序包及其正文中使用pragma serially_reusable