2014-10-30 261 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