ORA-06508:PL/SQL:找不到被调用的程序单元

bat*_*ech 13 oracle plsql anonymous

我正在使用oracle 10g和toad 11.5.我试图从一个匿名块调用api.

如果我在添加后重新编译api dbms_output.put_line然后尝试执行匿名块,则显示错误为

"ORA-06508: PL/SQL: could not find program unit being called".
Run Code Online (Sandbox Code Playgroud)

但是,如果我结束当前会话并打开一个新会话,那么匿名块将执行而不会出错.

由于这个问题,每次我更改API时,我都会重新连接会话.如果可以通过在toad或数据库级别进行任何配置来解决此问题,任何人都可以提供帮助.

Ale*_*ole 23

我怀疑你只报告堆栈中的最后一个错误,如下所示:

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"
Run Code Online (Sandbox Code Playgroud)

如果是这样,那是因为你的包是有状态的:

包声明的变量,常量和游标的值(在其规范或正文中)构成其包状态.如果PL/SQL包声明至少一个变量,常量或游标,那么包是有状态的 ; 否则,它是无国籍的.

当你重新编译状态丢失时:

如果重新编译实例化的有状态包的主体(显式地,使用"ALTER PACKAGE语句"或隐式),则下一次调用包中的子程序会导致Oracle数据库丢弃现有包状态并引发异常ORA -04068.

在PL/SQL引发异常之后,对该包的引用会导致Oracle数据库重新实例化该包,并重新初始化它...

如果你的包有状态,你无法避免这种情况.我认为真的需要一个包有状态是非常罕见的,所以你应该重新审视你在包中声明的任何东西,但是在函数或过程之外,看看它是否真的需要在那个级别.因为你在10g上,它包括常量,而不仅仅是变量和游标.

但引用文档中的最后一段意味着下次在同一会话中引用包时,您将不会收到错误,它将正常工作(直到您再次重新编译).


mkb*_*mkb 5

好像开新会是关键.

看到这个答案.

这是关于这个错误的一个很棒的解释


小智 5

我重新编译了包规范,即使更改仅在包主体中。这解决了我的问题