2014-10-30 263 views
7

即时尝试执行过程“PROCEDURE_NAME”过程“CALLING_PROCEDURE_NAME” 但我的PROCEDURE_NAME已经处于有效状态,并且成功地运用在其他一些程序。”ORA-04068:包的现有状态已被丢弃ORA-04065:未执行,更改或丢弃存储过程

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 
+0

你需要重新编译PROC /包 – Thomas 2014-10-30 06:12:55

+0

@Thomas:没有,在这种情况下,这是因为该会话已经当包裹被重新编译其中滴入一些包的状态。 – 2014-11-03 01:51:59

回答

10

但我PROCEDURE_NAME已经处于有效状态,并且成功地运用在其他一些程序 。

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

  1. 可以执行DBMS_SESSION.RESET_PACKAGE;释放内存,光标,和PL/SQL调用所做的调用运行完成后,包变量。

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

  3. 您可以通过使用PRAGMA SERIALLY_REUSABLE;声明来制作包装,SERIALLY_REUSABLE Packages。如果程序包是SERIALLY_REUSABLE,则其程序包状态将存储在系统全局区域(SGA)中的小池中的工作区中。包状态仅在服务器调用期间持续存在。

+1

请注意这些不同选项的性能影响;如果你的包被调用了很多,选项3可能是一个坏主意。 – 2017-02-21 04:35:08