存储过程和触发器调试

当我们的存储过程或触发器写好,符合语法后,怎么知道运行时里面上下文是正确的呢?

无工具时
  • 回想刚开始学习某种语言时,如java,那时候要知道运行到某一处数据是否正确,除了Assert之外就是print输出来了,输出某个数据看是否符合预期,这是我们最基础的调试方式之一。
  • 当没有其它工具的时候,SQL也可以如此,可以通过select输出来。trigger没有控制台输出,因此我们需要把输出定位到表,这个表就是我们输出调试表。
  • 下面有一个更好通用范例,这里演示的是MySql,Oracle自带DBMS_OUTPUT没有必要使用:
-- 创建debug数据库(方便管理),创建debug数据表。
DROP TABLE IF EXISTS debug.debug;  
CREATE TABLE  debug.debug (
  proc_id varchar(100) default NULL,
  debug_output text,
  line_id int(11) NOT NULL auto_increment,
  PRIMARY KEY  (line_id)
)
-- insert数据到debug表
CREATE PROCEDURE `debug`.`debug_insert`(in p_proc_id varchar(100),in p_debug_info text)
begin
  insert into debug.debug (proc_id,debug_output)
  values (p_proc_id,p_debug_info);
end $$

-- debug开始点记录
DROP PROCEDURE IF EXISTS `debug`.`debug_on` $$
CREATE PROCEDURE `debug`.`debug_on`(in p_proc_id varchar(100))
begin
  call debug.debug_insert(p_proc_id,concat('Debug Started :',now()));
end $$
-- debug结束点记录
CREATE PROCEDURE `debug`.`debug_off`(in p_proc_id varchar(100))
begin
  call debug.debug_insert(p_proc_id,concat('Debug Ended :',now()));
  select debug_output from debug where proc_id = p_proc_id order by line_id;
end $$

-- 实际使用
CREATE PROCEDURE test.test_debug()
begin
declare l_proc_id varchar(100) default 'test_debug';
  call debug.debug_on(l_proc_id);
  call debug.debug_insert(l_proc_id,'Testing Debug');
  call debug.debug_off(l_proc_id);
end $$
mysql> call test.test_debug();
+------------------------------------+
| debug_output                       |
+------------------------------------+
| Debug Started :2006-03-24 16:10:33 |
| Testing Debug                      |
| Debug Ended :2006-03-24 16:10:33   |
+------------------------------------+
3 rows in set (0.20 sec)

Query OK, 3 rows affected (0.23 sec)

使用dbForge studio

dbForge studio是一款很直观的SQL开发工具,我们可以在上面开发运行调试SQL语句。可以很方便的在我们的触发器和存储过程打断点调试。
例如,调试trigger

  • 打开软件,新建连接,打开数据库,到trigger那里,新建trigger,编写trigger后把trigger切换到SQL,在需要的地方打上断点。Ctrl+alt +F7 compile for debuging. 如图在这里插入图片描述
  • 由于trigger没法直接运行,需要新建一个存储过程来触发。简单增加一个存储过程,并在insert时增加断点。如图在这里插入图片描述
  • ctrl + F5, 开始调试,F10单步调试,F11进入。在insert的时候进去,那么就会跳转到trigger里。可以在watch view里查看某个值。如图在这里插入图片描述
  • 这样子实现了trigger的调试,同样的,存储过程,function,sql script等也可以进行调试。详情可以看dbforage官方文档。

参考:
http://gilfster.blogspot.com/2006/03/debugging-stored-procedures-in-mysql.html
https://docs.devart.com/studio-for-mysql/debugging-stored-routine/debugging-stored-function.html
https://docs.devart.com/studio-for-mysql/debugging-stored-routine/debugging-trigger.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值