我使用的是 oracle 10g 和 toad 11.5。我正在尝试从匿名块调用 api。
如果我添加后重新编译apidbms_output.put_line
然后尝试执行匿名块,它显示错误为:
"ORA-06508: PL/SQL: could not find program unit being called".
但是,如果我结束当前会话并打开一个新会话,则匿名块将执行而不会出现错误。
由于这个问题,每次更改 API 时我都必须重新连接会话。
如果可以通过在蟾蜍或数据库级别进行任何配置来解决此问题,任何人都可以提供帮助。
我怀疑您只报告堆栈中的最后一个错误,如下所示:
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"
如果是这样,那是因为你的包是有状态的 http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/packages.htm#CJADDABG:
包中的变量、常量和游标的值
声明(在其规范或正文中)包括其包裹
状态。如果 PL/SQL 包声明至少一个变量、常量、
或光标,则包为stateful;否则,就是无国籍的.
当您重新编译时,状态会丢失:
如果实例化的有状态包的主体被重新编译(或者
显式地,使用“ALTER PACKAGE 语句”,或隐式地),
下一次调用包中的子程序会导致 Oracle 数据库
放弃现有的包状态并引发异常
ORA-04068。
PL/SQL 引发异常后,对包的引用会导致
Oracle数据库重新实例化包,即重新初始化
它...
如果你的包有状态,你就无法避免这种情况。我认为真正需要有状态的包的情况相当罕见,因此您应该重新访问在包中(但在函数或过程之外)声明的任何内容,以查看该级别是否确实需要它。由于您使用的是 10g,因此它包括常量,而不仅仅是变量和游标。
但是引用文档中的最后一段意味着下次您在同一会话中引用该包时,您将不会收到错误,并且它将正常工作(直到您再次重新编译)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)