侧边栏壁纸
  • 累计撰写 129 篇文章
  • 累计创建 13 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

【ORACLE】谈一谈PLSQL DEVELOPER的调试(debug)功能

DarkAthena
2022-05-08 / 0 评论 / 0 点赞 / 1141 阅读 / 4366 字

前言

最近在研究国产数据库存储过程debug的一些东西,想到以前我经常用plsql developer的debug功能,就整理回顾一下其用法,顺便也是给已经或者即将开发国产数据库存储过程debug功能的设计人员和开发人员一个借鉴,plsql开发者是如何进行debug的。

基本操作

在对象浏览器中鼠标右键,或者直接在sql编辑器中对对象名称鼠标右键,选择测试(debug),注意"添加调试信息"这里要打勾,否则无法跟踪到此对象内部。("添加调试信息"其实就是加上debug参数对对象进行编译,当然也可以直接在会话级开启PLSQL_DEBUG = true;

image

会弹出调试界面,这里上方的“DBMS输出”其实就是dbms_output的内容,相关按钮说明和各区域说明见截图(重点)
image-1652019375892

此处可以进行一些修改,比如
image-1652019520395

取消了一个绑定变量,改为declare声明,并在plsql块中进行了赋值;增加了一条dml语句。
填入相关参数值后,点击"启动调试"(执行 dbms_debug.debug_on;相当于是会话级开启了调试功能,并且开了一个新的会话执行 DBMS_DEBUG.ATTACH_SESSION,接下来所有的调试操作都在这个新会话里)
image-1652019663861

此处的变量区域可以自行填写,比如填个"d"
image-1652019755781

一开始当然是null,然后点"单步进入",代码会逐行执行,当给d赋值的这行执行完后,下面就会显示变量的值已经变了
image-1652019880456

继续"单步进入",会显示要调用的过程的完整代码
image-1652019964620
并且下方右侧的调用堆栈多了一行,
这里的堆栈从下往上,是从外层程序到内层程序,并且显示了当前在各个堆栈的哪一行。如果当前堆栈不是独立的plsql块,而是数据库内的程序对象,那么这个行号其实就是dba_source中的行号,显示的内容其实就是这行对应的"text"字段内容

然后我们可以把想要跟踪的参数或者变量添加到左侧的变量区域(游标中的某个字段和触发器的:new/:old变量均可以跟踪)
image-1652020304880

继续单步执行,可以看到值发生了变化
image-1652020384914

可以点击三个点,看到更多的字符串
image-1652020507988

比如上图就能证实,此处replace函数的确执行有了效果

全部都单步调试效率太低,只想跟踪重点位置,那么可以在左侧行号位置打断点,
image-1652020857287

此时点击第2个按钮或者第7个按钮均可执行到断点(当然前提是代码逻辑的确会运行到这里)

由于我传入的参数中,目录其实是不存在的,因此在运行到保存文件时会报错,我们点运行到下一个异常,即可自动定位到代码即将抛出exception的位置
image-1652020988696

当然,由于这是一个内置包,被加密了,看不到内容,但如果是个没加密的包,就能清楚的看到在哪一行出了问题,此时甚至可以把此行用到的变量再添加到变量区域,看这些值是什么。另外,就算不添加变量,鼠标直接在代码区域悬停在变量名称上,也可以显示变量当前的值是什么

image-1652021372664

另外,在调试过程中,可以点击第8个按钮,在调试会话中执行sql
image-1652023021196
image-1652023049338

试想,如果你代码里有对表数据的修改,比如更新了某个字段,但是最后发现数据是错的,通过单步调试定位到更新的那一行代码,执行过后,就在这个会话里“侵入式”的去查一下更新后的数据是否正常,这样就能检查得更细致,到底这个时候更新的数据是不是对的,以此来排除异常原因,因为有可能是其他原因导致的数据异常。

另外一个常见的场景,A表数据经过处理后逐行插入到B表,但某行插入时报错,由于中间处理过程比较复杂,一般情况下很难知道是哪行数据的问题,如果使用调试功能,直接运行到下一个异常,光标会直接定位insert语句,然后鼠标往插入的变量上一放,直接就能知道是哪一行了。

总结

支持plsql代码开发及调试的各个程序里,plsql developer的调试功能算是近乎完美,我曾用这个调试功能排查了不少藏得极深的代码BUG,而且还能直观地根据每段的执行时长来进行针对性的性能优化。

但是对于我们国产数据库的相关工具,目前能达到plsql developer这个水平的,应该没有。

Oracle数据库几十年沉淀了不少的plsql开发人员,如果我们国产数据库能有个如此方便的plsql代码调试工具,相信会吸引不少原有的Oracle开发者加入国产数据库大军。

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
博主关闭了所有页面的评论