发布时间:2026-06-30 15: 05: 00
一个存储过程能够成功地跑完,并不等于调试器就一定能在预先放好的断点那里停下来。要用PL/SQL Developer把存储过程的调试跑起来,得先满足几个条件才行:登录数据库的那个账号要有调试用的权限,打算调试的目标对象里面要带有调试的时候需要用到的信息,从Test Window里调用的得是当前最新版本的代码,而且断点的位置还要刚好落在那条真的会被执行到的语句上面,这几个条件缺哪一个都可能让断点停不下来。碰到断点没反应的情况,不建议反复去点运行按钮,与其一遍遍地重试,不如按一个固定的顺序逐项排查,更容易找到真正的原因。
一、在PL/SQL Developer里面怎么调试存储过程
用PL/SQL Developer调试存储过程的常规办法,是从Object Browser那个区域直接进入Test Window。在正式开始调试之前,要先确保目标过程已经编译成功了,而且调用的时候需要用到的输入参数也已经提前准备好了,不要到了调试界面才发现参数不全。
1、先打开Test Window
在软件左侧的【Object Browser】里面找到需要调试的那个Procedure、Function或者Package,点右键去选【Test】。系统就会自动生成一段测试用的代码,在下面那个变量显示的区域也会列出所有需要填写的参数。当把这些测试值都输进去以后,不要直接去点普通执行的那一类按钮,要从菜单里选择调试模式来启动整个调试过程,这样才能在断点处停下来。
2、给目标对象把调试信息加上
进到【Tools】→【Preferences】→【Debugger】这个页面,把编译时顺便加入调试信息的那一项给勾上,勾好之后再把目标对象重新编译一次。也可以在【Object Browser】里面,在目标过程或者Package Body上面点右键,直接去选【Add debug information】。有一点需要留意,如果测试库是好几个人一起共用的话,别人一旦重新编译了同一个对象,之前加进去的那些调试信息就很可能被覆盖掉了,这个时候就要再重新执行一遍添加调试信息的操作。
3、设好断点再开始执行
把目标代码打开,在想要观察的那个位置旁边,用鼠标去点一下行号边上那个区域,断点就设置好了。再切换回刚才的【Test Window】,去点击【Start Debugger】这个按钮,也可以直接按键盘上的【F9】来启动。当调试器跑起来以后,就可以用单步进入、单步跳过、继续执行这些常见的功能,去观察变量值的变化和代码实际的执行路径了。
二、断点不生效的时候该从哪里查起
当断点没有按照预期停下来的时候,先要看看断点放的位置靠不靠谱,然后再去查对象的版本是不是最新的、调试权限有没有给到位。很多这类问题其实本身并不复杂,只是中间有某一个环节没把状态同步过来。
1、确认一下断点是不是落在了能执行的语句上
像变量声明的部分、注释行、纯粹的空行,还有BEGIN和END这种关键字本身所在的行,调试器在这些地方往往是停不住的。断点更需要放在那些会实际产生动作的地方,比如赋值的语句、查询的操作、数据的更新、对函数的调用,还有条件判断的语句上面。如果代码里面包含了多个IF分支,那还要去确认一下当前填进去的输入参数,是不是真的会让程序跑到那个分支上去,不然停在一条不会走到的路线上,断点当然就不会触发。
2、把Package Body重新编译一遍
在调试Package里面那些过程的时候,改完代码之后不能只刷新一下编辑器的页面就完事了,一定要重新去编译Package Body。因为数据库那一边很可能还保留着之前那份旧版本的代码,编辑器里看着是新的但跑起来还是旧的。重新编译完了之后,还要把原来那个Test Window先关掉,再从【Object Browser】进去重新打开一次【Test】,免得调试窗口还在继续引用旧代码对应的行号。
3、看一下当前的会话模式有没有选对
如果发现【Start Debugger】这个按钮是灰色点不动的,那就可以进到【Tools】→【Preferences】→【Oracle】→【Connection】里面,去查看一下当前的会话模式是怎么设的。调试器想要正常工作,通常是需要Dual Session Mode或者Multi Session Mode这两种模式的,如果当前选的是Single Session Mode,调试按钮就有可能变灰,或者即便能点也走不进过程的内部去。
4、确认对象没有被别人的修改覆盖掉
好几个人同时在测试库上修改代码的时候,断点用到一半突然失效了,这种事情并不算罕见。可以顺手去查一下那个对象最后一次被编译的时间,看看当前数据库里存着的版本,跟自己本地编辑器里看到的代码内容是不是还保持一致。如果有一段时期需要长期依赖调试来排查问题,那么尽量去用一套独立的Schema,这样被别人覆盖掉代码的概率就会低很多。
三、调试权限应该怎么提前准备好
光是用PL/SQL Developer能够连上数据库,并不代表就可以开始调试存储过程了。那种普通的查询权限和执行权限,只能保证过程本身可以被正常调用起来跑一遍,真要进入那种一步一步跟踪的调试状态,还另外需要一些授权才行。
1、把会话调试相关的权限准备好
用来登录数据库的那个账号,必须先拿到DEBUG CONNECT SESSION这个权限,缺了这个权限的话,调试器可能连初始化都做不完,也有可能只能让过程执行起来,却没法在断点位置停下来进入调试。这类权限一般是由数据库的管理员那边统一来授予的,如果有问题可以先找管理员确认一下。
2、把针对目标对象的调试权限也准备好
如果是调试自己那个Schema下面的对象,相对还会简单一些;要是想去调试放在别人的Schema里面的存储过程,除了刚才的会话权限之外,这个账号还要额外具备目标对象的DEBUG和EXECUTE这两种权限,或者由管理员直接授予DEBUG ANY PROCEDURE这个更高一级的权限。在配置权限的时候,最好是按实际要调试的对象来精确配置,不要随便把一些范围很大的权限到处乱放。
3、检查一下编译时用的模式对不对
如果已经把权限确认过了,断点也设置好了,调试信息也重新加上去了,但调试器还是进不去代码里面,那就可以让数据库的管理员帮忙去检查一下PLSQL_CODE_TYPE这个参数的设置。在调试的场景下面,通常应该使用INTERPRETED这种编译模式;如果目标对象是用NATIVE模式去编译的,那么单步跟踪和断点这类调试功能,可能就没有办法按照通常的方式去工作了。
总结
用PL/SQL Developer怎么调试存储过程,以及当断点不起作用的时候该从哪里开始排查,实际操作的顺序其实挺清楚的:先从【Object Browser】里面把目标对象打开到【Test Window】,接着给这个目标对象把调试信息加上去,然后设好断点再按【F9】去启动执行过程。如果碰到断点没有停下来这种情况,优先级排在前面的检查项目是:断点本身放的位置是否恰当、Package Body有没有被重新编译过、Test Window是不是还在引用旧的缓存内容、当前选的会话模式是不是对的,以及数据库那边是不是已经把调试权限给到位了。就按这几个方向一项一项排查下去,多数情况下是不需要去重装整个客户端的,也犯不着一遍遍去来回改代码。
展开阅读全文
︾