各位前輩及先進好,
前幾天,為了幫Table上新增一個新欄位.結果相關引用到這個Table的store procedure跟function的狀態都變成invalid.導致程式執行到某個procedure時當掉(原因是因為它的狀態變成invalid).
記得以前有人跟我說,若是Table結構有變,只有package需要人工手動重新做編譯,其他的procedure跟function,在執行時會自動重新做編譯.
隔天,另外有一隻程式在cursor loop中反覆去呼叫哪個invalid的某A store procedure,
因cursor中有做exception處理,只有在cursor處理第一筆資料,第一次呼叫哪個A store procedure會當掉,系統出現PLS-00907: cannot load library unit錯誤訊息,但處理第二筆之後就沒問題了.
我以前的認知是若是因table結構被更動,procedure的狀態會被更改成invalid,直到有人要去執行它時,會先做編譯再去執行...這次這樣的執行結果,感覺是執行後是invalid,出error後,系統才去做重新編譯..這感覺好可怕....
感覺現在無法在白天大家都在Run程式時去改Table結構,還要等大家都沒有在用系統,改完Table後,要把所有引用到的store procedure/function/package且狀態是invalid的程式全部重新做編譯...
不知有無辦法可解決嗎?例如改oracle的參數之類的...不然感覺很不方便
建議procedure/function/package 取用資料改以VIEW方式讀取, 這樣Table在後端維護時, 對procedure/function影響最小.