Answers:
我做的事情和你很相似。
通常,我将包含一个默认为false的DEBUG参数,并且可以在运行时将其设置为true。然后将调试语句包装到“ If DEBUG”块中。
我还将日志表与许多工作结合使用,以便我可以查看流程和时间安排。我的调试代码也在那里输出。我包括调用参数名称,简短描述,受影响的行数(如果适用),注释字段和时间戳。
好的调试工具是所有SQL平台的不幸失败之一。
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
select concat('** ', msg) AS '** DEBUG:';
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
INSERT INTO my_log_table (message) VALUES (msg)
函数调用结束后(即:您返回过程中),您可能只能并且可能会检索所有调试消息
是的,有专门的工具可用于此类事情-MySQL Debugger。
如何调试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));
这是一个不错的快速而又肮脏的小记录器,它可以判断出发生了什么。
有一些GUI工具可用于调试 MySQL中的存储过程 /函数和脚本。dbForge Studio for MySQL是一个不错的工具,具有丰富的功能和稳定性。
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;
这里介绍了另一种方法
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
在这里被提及
我参加聚会很晚,但是带了更多啤酒:
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')
将为您提供逐步浏览代码的机会,并“刷新”您的变量,您可以更好地查看代码内部的情况。
重要提示:调试时,也许您会更改(重新创建过程)。重新创建后,执行:$ exit和$ setup,然后执行新的$ debug
这是“插入”和“日志”方法的替代方法。您的代码没有其他“调试”指令。
屏幕截图:
MySQL Connector / Net 6.6具有调试存储过程和函数的功能
安装调试器
要启用存储过程调试器:
- 对于Connector / Net 6.6:安装Connector / Net 6.6并选择Complete选项。
- 对于Connector / Net 6.7和更高版本:安装存储过程调试器所属的产品MySQL for Visual Studio。
启动调试器
要启动调试器,请按照下列步骤操作:
- 在Visual Studio服务器资源管理器中选择一个连接。
- 展开存储过程文件夹。仅存储过程可以直接调试。要调试用户定义的函数,请创建一个存储的
调用该函数过程。- 单击存储过程节点,然后单击鼠标右键,然后从上下文菜单中选择“调试例程”。
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的,你可以从这里挑吧(含调试)https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (仍免费和开源)。
免责声明:我是为MySQL for Visual Studio产品编写存储过程调试器引擎的开发人员。
我曾经使用两种不同的工具来调试过程和功能:
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
蟾蜍mysql。有一个免费版本 http://www.quest.com/toad-for-mysql/
@Brad Parks 对应于此的答案不确定MySQL版本,但是我的版本是5.6,因此需要进行一些调整:
我创建了一个函数debug_msg
,该函数是函数(不是过程)并返回文本(没有字符限制),然后将该函数称为SELECT debug_msg
(参数)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