English 中文(简体)
你如何调试MySQL存储过程?
原标题:
  • 时间:2008-11-07 19:58:12
  •  标签:

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

最佳回答

我做的事情非常类似于你。

通常我会包含一个DEBUG参数,默认值为false,我可以在运行时将其设置为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

如何调试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));
    

这是一个不错的快速且简单的记录器,用于了解正在发生的事情。

Yes, there is a specialized tools for this kind of thing - MySQL Debugger.
enter image description here

在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 http://gilfster.blogspot.co.at/2006/03/debugging-stored-procedures-in-mysql.html

使用自定义的debug MySql过程和日志表。

你也可以在你的代码中放置一个简单的select,看看它是否被执行。

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/ and https://github.com/ocelot-inc/ocelotgui

我试过了,它看起来很稳定,支持断点和变量检查。

这不是一个完整的套件(只有4.1 MB),但是它帮了我很多忙!

How it works: It integrates with your mysql client (I m using Ubuntu 14.04), and after you execute:

$install
$setup yourFunctionName

它在您的服务器上安装了一个新的数据库,用于控制调试过程。所以:

$debug yourFunctionName( yourParameter )

将会给你一个机会逐步地走过你的代码,并且“刷新”你的变量,你可以更好地查看你代码内部发生了什么。

重要提示:在调试时,您可能需要更改(重新创建)过程。重新创建后,在新的$debug之前先执行:$exit和$setup。

This is an alternative to "insert" and "log" methods. Your code remains free of additional "debug" instructions.

屏幕截图:

转换成中文:ocelot breakpoint stepping

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

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

安装调试器。

启用存储过程调试器:

  • For Connector/Net 6.6: Install Connector/Net 6.6 and choose the Complete option.
  • For Connector/Net 6.7 and later: Install the product MySQL for Visual Studio, to which the stored procedure debugger belongs.

启动调试器

要启动调试器,请按照以下步骤进行:

  • Choose a connection in the Visual Studio Server Explorer.
  • Expand the Stored Procedures folder. Only stored procedures can be debugged directly. To debug a user-defined function, create a stored
    procedure that calls the function.
  • Click on a stored procedure node, then right-click and from the context menu choose Debug Routine.

MySql Connector/NET also includes a stored procedure debugger integrated in visual studio as of version 6.6, You can get the installer and the source here: http://dev.mysql.com/downloads/connector/net/

Some documentation / screenshots: https://dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html

You can follow the annoucements here: 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中。

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

  1. dbForge - many functional mysql GUI.
  2. MyDebugger - specialized tool for debugging ... handy tool for debugging.vote http://tinyurl.com/voteimg

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

Toad mysql. There is a freeware version http://www.quest.com/toad-for-mysql/

Answer corresponding to this by @Brad Parks Not sure about the MySQL version, but mine was 5.6, hence a little bit tweaking works:

我创建了一个名为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




相关问题
热门标签