如果使用PL/SQL Developer中選擇一個存儲過程debug但又debug不進去!
解決這個問題是很簡單的,隻需要在PL/SQL Developer中選擇要debug的存儲過程,然後點右鍵,在彈出的菜單中選擇"Add debug information"後再重新開一個視窗開始debug就能debug進去了。
現在的關鍵問題是:當對一個存儲過程選擇"Add debug information"後,PL/SQL Developer到底做了什麼事情?在PL/SQL Developer中如果某個存儲過程能夠被debug進去,則你在這個存儲過程上點右鍵,在彈出的菜單中選項"Add debug information"前面會有一個小勾,PL/SQL Developer是從哪兒知道這個小勾應不應該勾上的?
第一個問題的答案是PL/SQL Developer實際是執行了ALTER PROCEDUREOWNER.PROCEDURENAME COMPILE DEBUG。
如下是我研究上述問題的整個過程:
打開一個 PL/SQL Developer,查詢一下這個PL/SQL Developer的main session的sid,這裡得到的結果是421。
SQL> select p.PID,p.SPID,s.SID from v$process p,v$session s where s.paddr = p.addr and s.sid = 421;
PID SPID SID
---------- ------------ ----------
28 241816 421
SQL> oradebug setospid 241816
SQL> oradebug unlimit
已處理的語句
SQL> oradebug event 10046 trace name context forever,level 12
上述幾步做完後回到原先的那個PL/SQL Developer,選中存儲過程A_TESTINGFORJOBMANAGER,然後點右鍵,在彈出的菜單中選擇"Add debug information"。
再回到sqlplus視窗,依次執行如下語句:
SQL> oradebug tracefile_name
/u01/app/oracle/admin/ipratest/udump/ipratest_ora_241816.trc
SQL> oradebug event 10046 trace name context off
然後去看上述trace檔案,裡面有這樣一段:
PARSING IN CURSOR #9 len=60 dep=0 uid=55 ct=25 lid=55 tim=18452123749141 hv=884574241 ad='a2ac0198'
ALTER PROCEDURE CAIPRA.A_TESTINGFORJOBMANAGER COMPILE DEBUG
END OF STMT
PARSE #9:c=0,e=641,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=18452123749137
BINDS #9:
你可以随便再選另外一個debug不進去的存儲過程,手工執行一下上述sql,你會發現,手工執行完上述sql後,原先debug不進去的存儲過程現在已經可以debug進去了。
好了,這裡我回答了第一個問題。現在我們來回答第二個問題:
如法炮制,可以很容易的看到PL/SQL Developer是通過視圖sys.all_probe_objects中的字段debuginfo來判斷是否應該給一個存儲過程的"Add debug information"選項帶上小勾。
當debuginfo為T的時候,會有小勾。
當debuginfo為F的時候,就沒有小勾。
如下是ipradev中ipra使用者下所有不能夠debug進去的存儲過程,大家在debug的時候注意一下:
SQL> select object_name from sys.all_probe_objects t where wner='IPRA' and object_type='PROCEDURE' and debuginfo='F';
OBJECT_NAME
------------------------------
P_SFINDDIFF
P_SATGENERATEAUDITINTERFACE
P_SAT_GETSATDATFROMSALDAT
P_SAT_GETDATAFROMSAL_1
P_IUPDATEWIV_NC
P_IPACCHECK
P_SATBATCHINTERFACE_NC
P_IPACTOWIV_NC
P_YCALLWRTLOG
9 rows selected
另外,可以用如下指令友善的在"能夠debug"和"不能夠debug"之間轉換,這裡是以caipratest中的存儲過程P_ADCGETAGTFORALARM為例來說明:
SQL> select t.debuginfo from sys.all_probe_objects t where object_name='P_ADCGETAGTFORALARM';
DEBUGINFO
---------
F
SQL> alter procedure P_ADCGETAGTFORALARM compile debug;
Procedure altered
T
SQL> alter procedure P_ADCGETAGTFORALARM compile;