繁体   English   中英

你如何调试 MySQL 存储过程?

[英]How do you debug MySQL stored procedures?

我当前调试存储过程的过程非常简单。 我创建了一个名为“调试”的表,在其中插入存储过程运行时的变量值。 这允许我在脚本中的给定点查看任何变量的值,但是有没有更好的方法来调试 MySQL 存储过程?

可以调用以下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

我做了和你非常相似的事情。

我通常会包含一个默认为 false 的 DEBUG 参数,我可以在运行时设置为 true。 然后将调试语句包装到“If DEBUG”块中。

我还对我的许多工作使用了一个日志表,以便我可以查看流程和时间安排。 我的调试代码也在那里得到输出。 我包括调用参数名称、简要说明、受影响的行数(如果适用)、注释字段和时间戳。

好的调试工具是所有 SQL 平台的可悲失败之一。

是的,有一个专门的工具来处理这种事情 - MySQL Debugger
在此处输入图片说明

如何调试 MySQL 存储过程。

可怜的调试器:

  1. 创建一个名为 logtable 的表,其中包含id INTlog VARCHAR(255)两列。

  2. 使 id 列自动递增。

  3. 使用此程序:

     delimiter // DROP PROCEDURE `log_msg`// CREATE PROCEDURE `log_msg`(msg VARCHAR(255)) BEGIN insert into logtable select 0, msg; END
  4. 将此代码放在您想要将消息记录到表的任何位置。

     call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));

这是一个很好的快速和肮脏的小记录器来弄清楚发生了什么。

用于调试MySQL 中的 存储过程/函数和脚本的GUI 工具 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

在这里被提及

如何在 mysql 的触发器和存储过程中捕获任何异常?

我参加聚会迟到了,但带来了更多啤酒:

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

这是“插入”和“记录”方法的替代方法。 您的代码仍然没有额外的“调试”指令。

截屏:

豹猫断点步进

我只是简单地在存储过程的关键区域放置 select 语句来检查数据集的当前状态,然后将它们注释掉 (--select...) 或在生产之前将它们删除。

MySQL Connector/Net 6.6 具有调试存储过程和函数的功能

安装调试器

要启用存储过程调试器:

  • 对于 Connector/Net 6.6:安装 Connector/Net 6.6 并选择 Complete 选项。
  • 对于 Connector/Net 6.7 及更高版本:安装存储过程调试器所属的产品 MySQL for Visual Studio。

启动调试器

要启动调试器,请执行以下步骤:

  • 在 Visual Studio Server Explorer 中选择一个连接。
  • 展开存储过程文件夹。 只有存储过程可以直接调试。 要调试用户定义的函数,请创建一个存储
    调用函数的过程。
  • 单击存储过程节点,然后右键单击并从上下文菜单中选择调试例程。

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

更新:MySql for Visual Studio 从 Connector/NET 拆分成一个单独的产品,您可以从这里选择它(包括调试器) https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (仍然免费和开源)。

免责声明:我是为 Visual Studio 产品编写 MySQL 存储过程调试器引擎的开发人员。

MySQL 的第一个稳定的调试器在 dbForge Studio for MySQL 中

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

我曾使用两种不同的工具来调试程序和函数:

  1. dbForge - 许多功能性的 mysql GUI。
  2. MyDebugger - 专门的调试工具...方便的调试工具。 投票 http://tinyurl.com/voteimg

蟾蜍 mysql。 有一个免费版本http://www.quest.com/toad-for-mysql/

答案对应于由@Brad公园不能确定的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM