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