如果我們使用Oracle的oerr程序看看ORA-04068的定義,我們會得到下面的信息:
傳說中的04068啊,這個錯誤在開發中比較容易見到,簡單說,就是你與數據庫建立鏈接后,這個package被編譯過,然后你再去調用這個包,會報這個錯誤,但只會報一次。
所以比較常見的做法,就是程序catch捕獲異常后,判斷錯誤是否是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. |
這個錯誤顯示執行包的現有狀態被另一個會話的一個動作無效化了。這個“狀態”涉及包在規范或體中定義的任何全局變量(包括常量)。引起這個錯誤的動作一般是(但不局限于此)在得到了發生錯誤的會話所使用的連接之后包的重新編譯。Oracle 建議的動作是重新初始化應用程序狀態以調整包的新狀態后重新嘗試。
出現原因:
一般是系統運行過程中,對Package重新編譯,tbw會導致系統對于這個Session的Package失效。
解決辦法:
重啟業務系統,重新獲得Oracle Session。
避免方案:
不要在系統運行過程中,對Package重新編譯。
傳說中的04068啊,這個錯誤在開發中比較容易見到,簡單說,就是你與數據庫建立鏈接后,這個package被編譯過,然后你再去調用這個包,會報這個錯誤,但只會報一次。
所以比較常見的做法,就是程序catch捕獲異常后,判斷錯誤是否是04068,如果是,重新調用一次,第二次調用就沒問題了。