我当前调试存储过程的过程非常简单。我创建了一个名为“debug”的表,我在运行时从存储过程中插入变量值。这允许我在脚本中的给定点看到任何变量的值,但是有更好的方法来调试MySQL存储过程吗?
答案 0 :(得分:57)
可以调用以下debug_msg
过程来简单地将调试消息输出到控制台:
DELIMITER $$
DROP PROCEDURE IF EXISTS `debug_msg`$$
DROP PROCEDURE IF EXISTS `test_procedure`$$
CREATE PROCEDURE debug_msg(enabled INTEGER, msg VARCHAR(255))
BEGIN
IF enabled THEN BEGIN
select concat("** ", msg) AS '** DEBUG:';
END; END IF;
END $$
CREATE PROCEDURE test_procedure(arg1 INTEGER, arg2 INTEGER)
BEGIN
SET @enabled = TRUE;
call debug_msg(@enabled, "my first debug message");
call debug_msg(@enabled, (select concat_ws('',"arg1:", arg1)));
call debug_msg(TRUE, "This message always shows up");
call debug_msg(FALSE, "This message will never show up");
END $$
DELIMITER ;
然后像这样运行测试:
CALL test_procedure(1,2)
将产生以下输出:
** DEBUG:
** my first debug message
** DEBUG:
** arg1:1
** DEBUG:
** This message always shows up
答案 1 :(得分:40)
我做的事和你非常相似。
我通常会包含一个默认为false的DEBUG参数,我可以在运行时设置为true。然后将调试语句包装到“If DEBUG”块中。
我还使用包含许多作业的日志记录表,以便我可以查看进程和时间。我的调试代码也在那里输出。我包括调用param名称,简要描述,受影响的行数(如果适用),注释字段和时间戳。
良好的调试工具是所有SQL平台的悲惨失败之一。
答案 2 :(得分:28)
答案 3 :(得分:21)
MySQL中有GUI tools for debugging stored procedures个/函数和脚本。 dbForge Studio for MySQL的一个不错的工具,具有丰富的功能和稳定性。
答案 4 :(得分:19)
如何调试MySQL存储过程。
糟糕的调试器:
创建一个名为logtable的表,其中包含两列id INT
和log VARCHAR(255)
。
使id列自动增量。
使用此程序:
delimiter //
DROP PROCEDURE `log_msg`//
CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
BEGIN
insert into logtable select 0, msg;
END
将此代码放在您要将消息记录到表格的任何位置。
call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));
这是一个很好的快速和肮脏的小记录器,可以弄清楚发生了什么。
答案 5 :(得分:8)
这里介绍另一种方式
http://gilfster.blogspot.co.at/2006/03/debugging-stored-procedures-in-mysql.html
使用自定义调试mySql过程和日志记录表。
您也可以在代码中放置一个简单的选择,看看它是否已执行。
SELECT 'Message Text' AS `Title`;
我从
得到了这个想法http://forums.mysql.com/read.php?99,78155,78225#msg-78225
还有人为GitHub上的自定义调试程序创建了一个模板。
见这里
http://www.bluegecko.net/mysql/debugging-stored-procedures/ https://github.com/CaptTofu/Stored-procedure-debugging-routines
这里提到了
How to catch any exception in triggers and store procedures for mysql?
答案 6 :(得分:8)
mysql的调试器很好,但它不是免费的。这就是我现在使用的:
DELIMITER GO$
DROP PROCEDURE IF EXISTS resetLog
GO$
Create Procedure resetLog()
BEGIN
create table if not exists log (ts timestamp default current_timestamp, msg varchar(2048)) engine = myisam;
truncate table log;
END;
GO$
DROP PROCEDURE IF EXISTS doLog
GO$
Create Procedure doLog(in logMsg nvarchar(2048))
BEGIN
insert into log (msg) values(logMsg);
END;
GO$
存储过程中的用法:
call dolog(concat_ws(': ','@simple_term_taxonomy_id', @simple_term_taxonomy_id));
存储过程的使用:
call resetLog ();
call stored_proc();
select * from log;
答案 7 :(得分:7)
我只是简单地将select语句放在存储过程的关键区域中,以检查数据集的当前状态,然后将它们注释掉( - 选择...)或在生产之前删除它们。
答案 8 :(得分:6)
MySQL Connector / Net 6.6具有Debug Stored Procedures and Functions
的功能安装调试程序
启用存储过程调试器:
- 对于Connector / Net 6.6:安装Connector / Net 6.6并选择Complete选项。
- 对于Connector / Net 6.7及更高版本:安装存储过程调试器所属的Visual Studio产品MySQL。
启动调试器
要启动调试器,请执行以下步骤:
- 在Visual Studio Server Explorer中选择一个连接。
- 展开“存储过程”文件夹。只能直接调试存储过程。要调试用户定义的函数,请创建存储的
调用函数的过程。- 单击存储过程节点,然后右键单击并从上下文菜单中选择Debug Routine。
答案 9 :(得分:6)
我迟到了,但带来了更多啤酒:
http://ocelot.ca/blog/blog/2015/03/02/the-ocelotgui-debugger/ 和 https://github.com/ocelot-inc/ocelotgui
我试过,看起来非常稳定,支持断点和变量检查。
这不是一个完整的套件(仅仅4,1 Mb),但对我帮助很大!
工作原理: 它集成了你的mysql客户端(我正在使用Ubuntu 14.04),并在你执行之后:
$install
$setup yourFunctionName
它在您的服务器上安装一个新数据库,用于控制调试过程。所以:
$debug yourFunctionName('yourParameter')
将为您提供逐步遍历代码的机会,并“刷新”您的变量,以便更好地查看代码中的内容。
重要提示:在调试时,您可能会更改(重新创建过程)。重新创建后,在新的$ debug
之前执行:$ exit和$ setup这是“插入”和“日志”方法的替代方法。 您的代码仍然没有其他“调试”指令。
截图:
答案 10 :(得分:4)
MySQL的第一个稳定的调试器位于dbForge Studio for MySQL
中答案 11 :(得分:4)
MySql Connector / NET还包括从Visual Studio 6.6版开始集成的存储过程调试器, 您可以在此处获取安装程序和源代码: http://dev.mysql.com/downloads/connector/net/
一些文档/截图: https://dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html
您可以点击此处的公告: http://forums.mysql.com/read.php?38,561817,561817#msg-561817
更新:Visual Studio的MySql从Connector / NET拆分为单独的产品,您可以从这里https://dev.mysql.com/downloads/windows/visualstudio/1.2.html(仍然是免费和开源)中选择它(包括调试器)。
免责声明:我是为Visual Studio产品编写MySQL存储过程调试器引擎的开发人员。
答案 12 :(得分:3)
我使用了两种不同的工具来调试程序和功能:
答案 13 :(得分:2)
MySQL用户定义的变量(在会话中共享)可以用作日志记录输出:
DELIMITER ;;
CREATE PROCEDURE Foo(tableName VARCHAR(128))
BEGIN
SET @stmt = CONCAT('SELECT * FROM ', tableName);
PREPARE pStmt FROM @stmt;
EXECUTE pStmt;
DEALLOCATE PREPARE pStmt;
-- uncomment after debugging to cleanup
-- SET @stmt = null;
END;;
DELIMITER ;
call Foo('foo');
select @stmt;
将输出:
SELECT * FROM foo
答案 14 :(得分:1)
Toad mysql。有一个免费版本 http://www.quest.com/toad-for-mysql/
答案 15 :(得分:1)
@Brad Parks对应this的回答 不确定MySQL的版本,但是我的版本是5.6,因此有一点调整工作:
我创建了一个函数debug_msg
,它是函数(不是过程)并返回文本(没有字符限制),然后将函数调用为SELECT debug_msg
(params)AS my_res_set
,代码如下:
CREATE DEFINER=`root`@`localhost` FUNCTION `debug_msg`(`enabled` INT(11), `msg` TEXT) RETURNS text CHARSET latin1
READS SQL DATA
BEGIN
IF enabled=1 THEN
return concat('** DEBUG:', "** ", msg);
END IF;
END
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_func_call`(
IN RegionID VARCHAR(20),
IN RepCurrency INT(11),
IN MGID INT(11),
IN VNC VARCHAR(255)
)
BEGIN
SET @enabled = TRUE;
SET @mainQuery = "SELECT * FROM Users u";
SELECT `debug_msg`(@enabled, @mainQuery) AS `debug_msg1`;
SET @lastQuery = CONCAT(@mainQuery, " WHERE u.age>30);
SELECT `debug_msg`(@enabled, @lastQuery) AS `debug_msg2`;
END $$
DELIMITER