存储过程调试

在开发过程中,遇到CRM的报错了,怎么调试存储过程呢?
首先在业务网关日志里找到对应的功能号(例D2031用户信息查询)可通过该功能号在接口文档或者网关日志里找到其存储过程(例PKG_DC_OUTSERVICE.SP_GETCUSTOMERINFOALL)

在PLSQL里,在程序窗口右键测试进入测试脚本

进入测试脚本后,如需模拟相同报错环境,就在底部变量表里输入网关在请求CRM时传入的相同的入参

调试界面如下,基本和chrome devtools一个布局

单步进入到pkg函数,也就是具体的存储过程方法,这里就可以一步步单步下去看看具体哪里报错了

可以看到一个存储过程大概的结构是:

  1. 进行一系列的入参检查,如果不符合,写好reaonscode和reasoninfo然后return

2.通过检查后,下一步执行的query写好到v-sql里

3.OPEN cursor FOR query,处理EXCEPTION
OPEN cursor FOR query的意思是(可以简单理解为执行query,返回query结果到cursor):
OPEN FOR 执行cursor变量所关联的query。分配数据库资源来处理query并得出结果集-符合query条件的rows。然后cursor变量会指向结果集第一行的前面。
https://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems033.htm

在进行调试时:
如果是环节1入参检查时报错,那么直接找到问题源了。
如果是环节3执行query时报错,那么就需要看看这个query执行时发生甚么事了。
可以编辑一下存过(编辑过程见下),在OPEN cursor FOR query之前加上
insert into sql_sql values('v_sql',v_sql,sysdate);
commit;
将具体query保存到 sql_sql表里查看


然后我们把这段具体的query复制下来跑一遍,就可以看出query执行时报了什么错了

编辑存储过程的话需要在package里找到存过的对应package
PKG_DC_OUTSERVICE.SP_GETCUSTOMERINFOALL的package就是PKG_DC_OUTSERVICE

package点选编辑说明和体,然后选择第二个tab(找了好半天啊啊啊啊)就能编辑了

编辑后F8重新编译,如果提示打开多个窗口无法编译,看下是不是测试窗口还在运行,关闭测试窗口后重新编译,再跑测试