当我们的存储过程或触发器写好,符合语法后,怎么知道运行时里面上下文是正确的呢?
无工具时
- 回想刚开始学习某种语言时,如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