編譯過程導致ORA-4068錯誤

yangtingkun發表於2012-05-19

一個10203上的bug,這種問題還是第一次碰到。

 

 

10.2.0.3上,存在bug可能導致編譯過程或檢視失敗,而失敗的結果並不只是當前檢視或過程不可用,而是可能影響整個資料字典,導致儲存過程在執行時出現ORA-4068錯誤。

錯誤資訊如下:

ORA-04068: existing state of packages has been discarded.
ORA-04065: not executed, altered or dropped stored procedure P_PACKAGE.P_PRO
ORA-06508: PL/SQL: could not find program unit being called: P_PACKAGE.P_PRO
ORA-06512: at line 1

這個問題對應的BUG資訊為:Bug 6136074 - ORA-4068 / ORA-4065 ORA-6508 on VALID objects [ID 6136074.8],導致問題的原因就是編譯物件時導致PLSQL的依賴物件的時間戳發生不一致,從而導致問題的產生。

Oracle文件上給出了檢查問題的SQL語句:

select do.obj# d_obj,do.name d_name, do.type# d_type,
po.obj# p_obj,po.name p_name,
to_char(p_timestamp,'DD-MON-YYYY HH24:MI:SS') "P_Timestamp",
to_char(po.stime ,'DD-MON-YYYY HH24:MI:SS') "STIME",
decode(sign(po.stime-p_timestamp),0,'SAME','*DIFFER*') X
from sys.obj$ do, sys.dependency$ d, sys.obj$ po
where P_OBJ#=po.obj#(+)
and D_OBJ#=do.obj#
and do.status=1 /*dependent is valid*/
and po.status=1 /*parent is valid*/
and po.stime!=p_timestamp /*parent timestamp not match*/
order by 2,1;

透過這個指令碼將獲取的物件進行重新編譯,可以解決這個問題,要避免問題的再次出現,應該將資料庫版本升級到10.2.0.4以上。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-730561/,如需轉載,請註明出處,否則將追究法律責任。

相關文章