天天看點

(轉)關于PL/SQL Developer中對存儲過程add debug information關于PL/SQL Developer中對存儲過程add debug information

如果使用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;