我怀疑你只报告堆栈中的最后一个错误,如下所示:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "schema.package" has been invalidated
ORA-04065: not executed, altered or dropped package body "schema.package"
ORA-06508: PL/SQL: could not find program unit being called: "schema.package"
如果是这样,那是因为您的包是有状态的:
包声明的变量、常量和游标的值(在其规范或主体中)构成其包状态。如果 PL/SQL 包声明了至少一个变量、常量或游标,则该包是有状态的;否则,它是无状态的。
重新编译时状态丢失:
如果重新编译实例化的有状态包的主体(显式地,使用“ALTER PACKAGE 语句”,或隐式地),包中子程序的下一次调用会导致 Oracle 数据库丢弃现有包状态并引发异常 ORA -04068。
在 PL/SQL 引发异常后,对包的引用会导致 Oracle 数据库重新实例化包,从而重新初始化它...
如果您的包裹有状态,您将无法避免这种情况。我认为真正需要有状态的包是相当罕见的,所以你应该重新访问你在包中声明的任何东西,但在函数或过程之外,看看它是否真的需要在那个级别。由于您使用的是 10g,因此其中包括常量,而不仅仅是变量和游标。
但是引用文档的最后一段意味着下次您在同一会话中引用该包时,您将不会收到错误并且它将正常工作(直到您再次重新编译)。