天天看點

PL/SQL重新編譯包無反應

  前幾天碰到一個有趣的事情:早上同僚執行一個包很久沒有反應,就中斷了執行,發郵件讓我幫忙檢視具體情況,我用PL/SQL Developer登入後,找到這個包的過程中發現這個包的圖示有紅色叉叉,也就是說這個包有地方沒有編譯通過,于是我便單擊右鍵點選“重新編譯”,結果一直沒有響應,導緻PL/SQL Developer直接卡死,剛開始沒太留意,直接殺掉PL/SQL Developer相關程序,重新打開它然後編譯這個包,結果還是這個情況,還是頭一次遇到這種情況,一頭霧水. 後來搜尋了一下才知道原因:

  1:當包正在被調用執行時,編譯該包會導緻無響應情況。

  2:包中的對象或依賴對象被其它session所擁有。

檢視包體是否被其它使用者調用正在執行,以sys身份登入,執行下面SQL查詢

SELECT DISTINCT '(' || s.sid || ') - ' || username AS "(session) - username"    

FROM V$SESSION s, sys.x$kglob o, sys.x$kglpn p  

WHERE upper(o.kglnaobj) LIKE upper('%不能編譯的包體%')     

     AND p.kglpnhdl = o.kglhdadr     

  AND s.SADDR = p.kglpnuse;

發現該包沒有正在running,然後檢視被鎖的對象中是否有該包依賴的對象,結果發現包中某個表被某個會話給鎖住了。殺掉該程序後,重新編譯該包,問題解決了。

參考資料:

http://blog.csdn.net/robinson_0612/article/details/7616923