1 如何进行调试
1.1 前言
在工作或者学习中,我们经常会遇到储存过程调用报错或者函数、触发器、包体等调用报错,如果完全依赖个人经验去排查问题,明显是不现实的,所幸PL/SQL Developer工具提供了强大的调试功能,完全可以与其他变成语言的IDE相媲美。后续将详细阐述如何使用PL/SQL Developer工具进行调试,以及调试过程中的常见操作和问题解决办法。
1.2 安装PL/SQL Developer
- 软件版本:目前推荐版本为PL/SQL Developer 12,不推荐使用版本过低或者过高PL/SQL Developer版本。
- 软件下载:
- 软件安装:缺省安装即可。
1.3 登陆PL/SQL Developer
- 使用本地TNS名登陆
在本地oracle客户端主目录下的network\admin文件夹中配置tnsnames.ora,示例如下:
ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.46)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) ) |
然后就可以在PLSQL登陆界面选择对应的服务名,输入账号密码进行登陆
- 使用连接串方式登陆
Oracle连接串格式为:[oracle数据库IP地址]:[端口号缺省为1521]/[实例名]
1.4 准备调试
- 方法一:在SQL窗口输入存储过程(函数、包体)或者左侧的对象列表中找到对应的存储过程,然后右键选择测试,即可自动生成测试脚本
- 方法二:新建测试窗口,会自动将基础的语句生成,然后自行输入测试的语句
- 生成测试语句后,需要对存储过程点击右键,选择添加调试信息。
1.5 常见的测试语句书写
通常存储过程都是有入参和出参的,因此不论是自动生成的测试语句还是自己书写的测试语句,都需要对入参进行设置,设置入参的方法通常有3种。
- 一种是使用绑定变量的方式。即 :变量名 的方式,然后在窗体下面的列表中进行赋值操作。自动生成的测试语句会自动设置变量名,只需要对变量赋值即可。
- 另外一种就是直接将过程的入参写好,通常适用于没有出参的存储过程。
- 最后一种是在测试语句中定义变量,并对变量赋值的方式,通常我们调试clob或者xml类型的入参的存储过程会使用这种方式。
1.6 开始调试
- 点击开始调试按钮即可开始调试
调试中常见的功能有:
- 运行:即直接运行,相当于直接调用存储过程或者运行断点处,通常配合断点使用。
在调试界面,进入到存储过程界面后,在左侧的行号处单击即可打断点,再次单击鼠标左键则取消断点。
单步进入:按顺序逐个语句,快捷键为ctrl+N
运行到光标行:即直接运行到光标定位的位置,该功能较为常用,通常在初步判断异常位置时使用,可以快速运行到自己需要的位置(与断点和运行配合效果类似)
运行到下一个异常:即直接运行到下一个出现异常的地方,对于简单的存储过程,搞功能可以快速定位到异常,非常实用,但是对于较为复杂的存储过程,本身存在很多异常的情况下,往往可能出现无法准确定位到自己需要的位置的情况。
- 在调试过程中查看变量的值,可以将鼠标放置到对应的变量上,也可以对变量点击右键,选择添加到变量监视器,即可在下面的变量列表查看到对应的变量值。
1.6 调试期间常见问题处理
- 点开始调试则PLSQL程序卡死(针对RAC环境)
问题原因:调试存储过程要发起两个会话(运行、调试),我们plsql的默认配置会话方式,是多路会话(工具-首选项-连接), 如果在rac环境,实际PLSQL每次新增一个会话,数据都会根据自身情况随机分配instance。plsql发起调试,数据库如果把调试和运行的会话分配给了不同的instance,这时候,就会出现卡死的情况。
解决办法:修改TNS文件,指定实例名,实例名需要根据实际情况指定。
调试含CLOB类型字段的存储过程提示:ORA-03127: 在活动操作结束之前不允许进行操作
问题原因:clob对象未释放
解决办法:在调试语句end之前加dbms_lob.freetemporary(:变量名);
- 调试报错,提示ORA-01031: insufficient privileges,则说明当前用户权限不足,需要管理员给其赋debug权限,语句示例如:
GRANT debug any procedure, debug connect session TO USERXXX; |