KB-ORA-04061 existing state of package “PKG_xxx” has been invalidated

最近迷上了 Oracle  PL/SQL 開發,尤其是 Package 還算是好用(雖然沒有辦法像 C# 那樣優雅),

PL/SQL Developer 逐行的除錯方式也讓小熊子比較能夠接受,

(TOAD 就別說啦,常當機,除錯到一半直接關掉不見,是一種非常令人上火的經驗)。

 

寫了 package 後,不知道加了什麼程式後就會在前端應用程式出現以下錯誤訊息:

而且執行第二次時問題就消失。

ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package “PKG_xx” has been invalidated
ORA-04065: not executed, altered or dropped package “PKG_xxx”
ORA-06508: PL/SQL: could not find program unit being called
ORA-06512: at line 1

 

找了一些文章,終於有眉目,原來是 Package Global Variables 的關係,

1.前端呼叫PKG_xxx。

2.Oracle Session 載入 PKG_xxx ,初始化 Package Global Variables。

3.開發人員重新編譯 PKG_xxx 之後,在 Oracle Session 中的 PKG_xxx 被 Oracle 註記成 “Old Copy”

4.前端再呼叫 PKG_xxx ,由於已是 “Old Copy”,所以 Oracle 丟出 ORA-04061 錯誤,並且 Compiler PKG_xxx。

5.前端不死心,再按一次,Oracle Session 載入新版 PKG_xxx,執行成功!!

 

看一下 PKG_xxx 的片段

 

create or replace package PKG_xxx is
	g_NationCode varchar2(4):='TW';
end PKG_xxx ;

 

使用的解法就是將 Global Variable 改至 Function 之中即可。

 

create or replace package PKG_xxx is
	function f_get_NationCode return varchar2;
end PKG_xxx ;

 

 

參考文章

http://oraclequirks.blogspot.com/2007/03/ora-04061-existing-state-of-package-has.html

http://forums.oracle.com/forums/thread.jspa?messageID=3164031&tstart=0

http://www.experts-exchange.com/Database/Oracle/Q_20866249.html

(鋸箭法)http://jasonvogel.blogspot.com/2008/03/how-to-deal-with-frustrating-ora-04068.html

Bookmark the permalink.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *