ora-04068 ora-06508 已丟棄程式包 的當前狀態

發表於2012-11-13

在呼叫含有全域性變數的包的儲存過程裡的異常處理模組加一句:
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
IF SQLCODE = -6508 THEN
dbms_session.reset_package;
......
這樣當全域性變數包被修訂後,儲存過程會報一次警告通知使用者再次重試一次即可成功,達到重新整理包快取的效果。

[@more@]

在包頭中宣告的變數的作用域為全域性範圍,故稱為全域性變數,這些變數對於具有執行許可權的任何PL/QSL塊都是可見的。由於包的變數都存放在使用者全域性區(UGA)的會話儲存區中,全域性變數自然也不例外。故全域性變數的值是基於會話級別的,在整個會話期間它都會維持它的最新值,在會話中設定、修改、維護全域性變數的值對其它會話不會有影響。不同的會話都有自己全域性變數的本地副本。當pl/sql包pkgA進行重編時,引用了pkgA的其它包,包括pkgB,全都會自動變成失效狀態。pkgB下次執行時,發現狀態已失效,於是按oracle機制自動進行重編。由於全域性變數的全域性性是會話級別的,每個會話本地副本中全域性變數的值可能都不一樣。但自動重編譯導致全域性變數值的重新獲取,覆蓋了本地副本中的值。此時,oracle若再“靜默”地自動重編譯,會導致各會話本地全域性變數的值變得不可控,因為它不再是以前的值了,而是被重置成了初始值。因此,oracle必須採取丟擲錯誤的辦法來顯式地通知使用者會話,否則,使用者沒辦法知道全域性變數的值已發生了變化。

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

相關文章