关于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。
然后再开一个 plus的窗口,依次执行如下语句:
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
pid: 28, Unix process pid: 241816, image: oracle@p690ca
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
SQL> select t.debuginfo from sys.all_probe_objects t where object_name='P_ADCGETAGTFORALARM';
DEBUGINFO
---------
T
SQL> alter procedure P_ADCGETAGTFORALARM compile;
Procedure altered
SQL> select t.debuginfo from sys.all_probe_objects t where object_name='P_ADCGETAGTFORALARM';
DEBUGINFO
---------
F