【问题标题】:"ORA-04068: existing state of packages has been discarded ORA-04065: not executed, altered or dropped stored procedure“ORA-04068:包的现有状态已被丢弃 ORA-04065:未执行、更改或删除存储过程
【发布时间】:2014-12-26 02:07:15
【问题描述】:

当我尝试在过程“CALLING_PROCEDURE_NAME”下执行过程“PROCEDURE_NAME”时出现以下错误。 但是我的 PROCEDURE_NAME 已经处于有效状态并成功用于其他一些程序。

ORA-04068: existing state of packages has been discarded
ORA-04065: not executed, altered or dropped stored procedure ""PROCEDURE_NAME""
ORA-06508: PL/SQL: could not find program unit being called: ""PROCEDURE_NAME""
ORA-06512: at ""CALLING_PROCEDURE_NAME"", line LINE_NO
ORA-06512: at line 1

【问题讨论】:

  • 你需要重新编译你的 proc/package
  • @Thomas:不,在这种情况下,这是因为会话有一些包状态,在重新编译包时该包状态被丢弃。

标签: oracle plsql oracle11g


【解决方案1】:

但我的 PROCEDURE_NAME 已经处于有效状态并成功使用 在其他一些程序中。

当前调用包的会话,它保留包的状态。如果您重新编译包,那么在该会话中再次调用包时,您将遇到此错误。

  1. 在使调用完成运行的 PL/SQL 调用之后,您可以执行 DBMS_SESSION.RESET_PACKAGE; 以释放内存、游标和包变量。

  2. 您可以关闭所有现有会话并重新执行。

  3. 您可以使用PRAGMA SERIALLY_REUSABLE; 语句制作包SERIALLY_REUSABLE Packages。如果一个包是SERIALLY_REUSABLE,它的包状态存储在系统全局区(SGA)的一个小池中的一个工作区中。包状态仅在服务器调用的生命周期内持续存在。

【讨论】:

  • 注意这些不同选项的性能影响;如果您的包被大量调用,选项 3 可能不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 2014-10-19
  • 1970-01-01
  • 2018-08-29
相关资源
最近更新 更多