(转)关于PL/SQL Developer中对存储过程add debug information

关于PL/SQL Developer中对存储过程add debug information

 http://space.itpub.net/13129975/viewspace-626245

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

Oracle 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

原文地址:https://www.cnblogs.com/jimeper/p/2995521.html