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上,它包括常量,而不仅仅是变量和游标.
但引用文档中的最后一段意味着下次在同一会话中引用包时,您将不会收到错误,它将正常工作(直到您再次重新编译).