2009年10月11日 星期日

找出 Oracle Compiling Procedure會Hang住的原因

同事剛遇上一個挺有趣的 Oracle procedure Compile問題。當她以pl/sql develpoer 異動完某個procedure並按下F8執行compiling後,pl/sql develper僅僅顯示compiling訊息之外就沒再動靜, 應用程式就直接hang 在那裡,不知道到底出了什麼事情。這件事讓他困擾了一整個早上,最後只好把這個「磨練」的機會給了我。根據過往的經驗,這種情況有點類似A君開發中的時正在Edit Q Table,但剛好屁股痛去了洗手間,也忘了按Commit,而當B君也要去Edit Q Table,異動完成後按下Commit時卻怎樣也寫不進去,硬是hang在那裡。因此我查了一下解法,答案跟我想的差不多,重點只有一個: 找出誰在使用這個procefure,請它關閉或直接踢掉它就好了。

查詢語法如下:

SELECT B.OSUSER, A.*
FROM V$ACCESS A, V$SESSION B
WHERE A.OBJECT = 'MY_PROC'
AND A.SID = B.SID

結果就會告訴你:哪個session正在使用這物件,所以你無法異動該procedure。譬如說:

OSUSER SID OWNER OBJECT TYPE
--------- ---- -------------- ----------- ----------------------
murderer 519 SCHEMA_OWNER MY_PROC PROCEDURE

表示使用者murderer (sessoon id = 519)這個傢伙正在使用My_PROC這個procedure,並且尚未釋放掉。大部分的情況下就是他正在執行testing 動作,但是因為程式迴圈很大或者他也去上廁所,因此呼叫的程序仍在執行中或暫停著,被呼叫的MY_PROC也就因此跟著被咬住了。Oracle此時就會禁止其他使用者異動該procedure,直到那位仁兄上廁所回來並結束那個testing的程序。

就這樣,以後找兇手簡單多了。

沒有留言:

張貼留言