"ORA-04068:已丢弃现有的包状态ORA-04065:未执行,更改或删除存储过程

Taj*_*der 9 oracle plsql oracle11g

当我试图在程序" PROCEDURE_NAME"下执行程序" " 时,我得到以下错误CALLING_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
Run Code Online (Sandbox Code Playgroud)

Lal*_*r B 12

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

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

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

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

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

  • 注意这些不同选项对性能的影响;如果您的包被多次调用,则选项 3 可能是个坏主意。 (2认同)