代码之家  ›  专栏  ›  技术社区  ›  Cory House

如何调试MySQL存储过程?

  •  107
  • Cory House  · 技术社区  · 16 年前

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

    15 回复  |  直到 15 年前
        1
  •  75
  •   stenix Khalil    5 年前

    以下 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
    
        2
  •  46
  •   Bob Probst    16 年前

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

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

    好的调试工具是所有SQL平台的致命缺陷之一。

        3
  •  30
  •   George    12 年前

    是的,这类东西有专门的工具- MySQL Debugger .
    enter image description here

        4
  •  29
  •   Eric Leschinski Mr. Napik    11 年前

    如何调试MySQL存储过程。

    1. 创建一个名为logtable的表,其中包含两列, id INT log 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));
      

    这是一个很好的快速和肮脏的小记录器,以找出发生了什么。

        5
  •  21
  •   Josef Miran    14 年前

    GUI tools for debugging stored procedures /MySQL中的函数和脚本。dbforgestudioformysql是一个不错的工具,具有丰富的功能和稳定性。

        6
  •  12
  •   Tone Å koda    10 年前

    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
  •  10
  •   Community CDub    8 年前

    这里介绍了另一种方法

    http://gilfster.blogspot.co.at/2006/03/debugging-stored-procedures-in-mysql.html

    使用自定义调试mySql过程和日志记录表。

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

    SELECT 'Message Text' AS `Title`; 
    

    这个主意是我从

    http://forums.mysql.com/read.php?99,78155,78225#msg-78225

    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?

        8
  •  8
  •   Marcelo Amorim    9 年前

    我来晚了,但带了更多的啤酒:

    http://ocelot.ca/blog/blog/2015/03/02/the-ocelotgui-debugger/ https://github.com/ocelot-inc/ocelotgui

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

    它不是一个完整的套件(只有4,1MB),但对我帮助很大!

    工作原理: 它与您的mysql客户端集成(我使用的是Ubuntu 14.04),执行后:

    $install
    $setup yourFunctionName
    

    它会在服务器上安装一个新的数据库,用于控制调试过程。因此:

    $debug yourFunctionName('yourParameter')
    

    这将使您有机会一步一步地遍历代码,并“刷新”变量,这样您可以更好地查看代码内部的情况。

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

    截图:

    ocelot breakpoint stepping

        9
  •  7
  •   Ash Machine    16 年前

        10
  •  6
  •   Community CDub    4 年前

    MySQL Connector/Net 6.6具有 Debug Stored Procedures and Functions

    启动调试器

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

    • 在Visual Studio服务器资源管理器中选择一个连接。
    • 展开存储过程文件夹。只能直接调试存储过程。要调试用户定义的函数,请创建存储
    • 单击存储过程节点,然后单击鼠标右键,然后从关联菜单中选择“调试例程”。
        11
  •  5
  •   Fernando Gonzalez Sanchez    6 年前

    MySql Connector/NET还包括一个从6.6版开始集成在visual studio中的存储过程调试器, 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

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

        12
  •  4
  •   Zoitc2014    14 年前

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

        13
  •  3
  •   GeoGo    13 年前

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

    1. vote http://tinyurl.com/voteimg
        14
  •  3
  •   clarkttfu    5 年前

    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
    
        15
  •  2
  •   Joyce    14 年前

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

        16
  •  1
  •   aniruddha    7 年前

    对应于 this 作者@Brad Parks

    我创建了一个函数 debug_msg 这是一个函数(不是过程),返回文本(无字符限制),然后以SELECT调用函数 (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