Oracle 定時Job報錯ORA-04068 ORA-06508

xz43發表於2011-12-01
今早檢查月底Job執行情況,發現一個Job執行失敗,錯誤如下:
ORA-04068: existing state of packages
ORA-04068: existing state of packages has been discarded
ORA-04065: not executed, altered or dropped stored procedure "US.STAT_SC"
ORA-06508: PL/SQL: could not find program unit being called: "US.STAT_SC"
ORA-06512: at line 20 has been discarded
 
檢查該job的JOB_ACTION,內容如下:
begin
...
proc_1(yer,mon);
...
stat_sc(yer,mon);
...
end;
 
其中 proc_1 就是為了後面的統計而準備資料,由於資料量比較大,採用了drop table後再 create table 的方式生成中間表。而後面stat_sc之類的procedure都是基於那些drop掉再create的表。由於後面儲存過程都是依賴於 proc_1 中所涉及的表,同時當前的儲存過程的狀態為available,那麼當 proc_1 中的表被drop掉後,則後面的儲存過程馬上被設定為unavailable,即使這時再重新建立了相應的表,此時後面的儲存過程也不會自動地設定為available(因為其不會自行編譯),除非人工進行編譯該儲存過程。
 
到了這裡,問題應該清楚了,解決辦法有三:
1、在 proc_1 中不採用drop再create的方式;
2、在後面依賴的procedure中,透過execute immediate 方式執行相關表的sql;
3、把 proc_1 單獨放到一個Job中執行,這個方法最簡單,唯一需要注意的是時間順序。
 
悲劇了,這個job的所有事情都得手動做了,時間點和其他報表還不一致,導致報表之間資料有出入。 
 

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

相關文章