本文针对南大通用 GBase 8c 数据库,围绕存储过程的使用与问题定位,基于 DBE_PLDEBUGGER 调试接口,详细说明存储过程调试的核心接口、标准流程、常用命令与完整实战操作步骤,帮助用户快速掌握调试方法,高效定位与解决存储过程运行异常。
1 存储过程介绍
1.1 定义
存储过程是一组完成特定功能的 SQL 语句集合,经编译后存储在数据库中,用户通过指定名称与参数调用执行。
1.2 优点
- 执行效率高:一次编译、多次执行,减少网络与解析开销。
- 减少网络传输:在数据库服务器端执行,降低应用与数据库交互量。
- 业务逻辑封装:复杂逻辑封装,便于维护与复用。
- 安全性高:屏蔽基础表,防止 SQL 注入,控制权限。
- 过程化控制:支持条件、循环等流程控制。
2 调试接口与流程
2.1 核心调试接口(DBE_PLDEBUGGER)
| 接口名称 | 执行端 | 功能说明 |
|---|---|---|
| turn_on | 服务端 | 开启存储过程调试,执行时挂起等待调试 |
| turn_off | 服务端 | 关闭存储过程调试 |
| local_debug_server_info | 服务端 | 查看本会话已开启调试的存储过程 |
| attach | 调试端 | 绑定到待调试存储过程 |
| info_locals | 调试端 | 查看所有变量值 |
| print_var | 调试端 | 查看指定变量值 |
| set_var | 调试端 | 修改变量值 |
| next | 调试端 | 单步执行(不进入子过程) |
| step | 调试端 | 单步进入(进入子过程) |
| continue | 调试端 | 执行至断点或结束 |
| abort | 调试端 | 强制终止调试 |
| add_breakpoint | 调试端 | 添加断点 |
| delete_breakpoint | 调试端 | 删除断点 |
| info_breakpoints | 调试端 | 查看断点 |
| info_code | 两端 | 查看存储过程源码与行号 |
2.2 标准调试流程
创建测试表与存储过程
查询存储过程 OID
服务端执行 turn_on 开启调试
服务端调用存储过程(挂起)
调试端 attach 绑定调试会话
单步 / 断点 / 变量查看与修改
调试结束执行 abort/continue,最后 turn_off 关闭调试
3 调试
3.1 准备环境
DROP TABLE IF EXISTS t1;CREATE TABLE t1(c1 int);INSERT INTO t1 (c1) SELECT generate_series(1,20);3.2 创建存储过程
CREATE OR REPLACE PROCEDURE proc_selectCur() AS declare cursor cur1 is select * from t1; BEGIN for i in cur1 loop raise notice '%',i.c1; DELETE FROM t1 WHERE c1 = i.c1; end loop; END; /3.3 获取 OID
SELECT OID FROM PG_PROC WHERE PRONAME='proc_selectcur';3.4 开启调试
-- 服务端 SELECT * FROM DBE_PLDEBUGGER.turn_on(32168);call proc_selectcur();-- 调试端 SELECT * FROM DBE_PLDEBUGGER.attach('dn_6001_6002',0);3.5 调试操作
-- 单步SELECT * FROM DBE_PLDEBUGGER.next();-- 查看所有变量 SELECT * FROM DBE_PLDEBUGGER.info_locals();-- 查看指定变量 SELECT * FROM DBE_PLDEBUGGER.print_var('i');-- 查看源码 SELECT * FROM DBE_PLDEBUGGER.info_code(82965);-- 添加断点 SELECT * FROM DBE_PLDEBUGGER.add_breakpoint(82965,5);-- 执行到断点 SELECT * FROM DBE_PLDEBUGGER.continue();-- 终止调试 SELECT * FROM DBE_PLDEBUGGER.abort();-- 关闭调试 SELECT * FROM DBE_PLDEBUGGER.turn_off(32168);