如果我們使用Oracle的oerr程序看看
ORA-04068的定義,我們會得到下面的信息:
$oerr ora 04068 04068, 00000, "existing state of packages has been discarded" // *Cause: One of errors 4060 - 4067 when attempt to execute a stored procedure. // *Action: Try again after proper re-initialization of any // application's state. |
這個錯誤顯示執(zhí)行包的現(xiàn)有狀態(tài)被另一個會話的一個動作無效化了。這個“狀態(tài)”涉及包在規(guī)范或體中定義的任何全局變量(包括常量)。引起這個錯誤的動作一般是(但不局限于此)在得到了發(fā)生錯誤的會話所使用的連接之后包的重新編譯。Oracle 建議的動作是重新初始化應(yīng)用程序狀態(tài)以調(diào)整包的新狀態(tài)后重新嘗試。
出現(xiàn)原因:
一般是系統(tǒng)運行過程中,對Package重新編譯,tbw會導(dǎo)致系統(tǒng)對于這個Session的Package失效。
解決辦法:
重啟業(yè)務(wù)系統(tǒng),重新獲得Oracle Session。
避免方案:
不要在系統(tǒng)運行過程中,對Package重新編譯。
傳說中的04068啊,這個錯誤在開發(fā)中比較容易見到,簡單說,就是你與數(shù)據(jù)庫建立鏈接后,這個package被編譯過,然后你再去調(diào)用這個包,會報這個錯誤,但只會報一次。
所以比較常見的做法,就是程序catch捕獲異常后,判斷錯誤是否是04068,如果是,重新調(diào)用一次,第二次調(diào)用就沒問題了。