在MySQL存储过程中记录异常信息

时间:2011-12-23 12:40:54

标签: mysql stored-procedures exception-handling

据我所知,我可以在MySQL存储过程中定义异常处理程序,但似乎我无法在处理程序中捕获异常消息并在表中写入日志以进行调试。我只想知道是否有在MySQL存储过程中记录异常代码和消息的方法?

3 个答案:

答案 0 :(得分:1)

您无法捕获消息,但可以捕获错误代码。

以下是处理“重复条目”(PK,UK约束)的示例:

CREATE PROCEDURE sp_do_insert(
   IN in_param1    int,
   IN in_param2    int,
   OUT out_status  tinyint
)
BEGIN
   DECLARE CONTINUE HANDLER FOR 1062 SET out_status = 1;

   SET out_status = 0;

   INSERT INTO tbl(field1, fiel2)
   VALUES (in_param1, in_param2); 
END;

如果tbl对field1有UK限制,您将尝试再次插入现有值,您将不会收到错误。什么都不会插入,状态将等于1.

您还可以为其他错误代码添加其他处理程序。而且你总是会因为out_status的值而知道错误是什么,因为error_code(在处理程序中)你会知道“错误信息”。

如果show warnings,您可以尝试使用out_status <> 0(它显示上次查询的错误/警告)。

希望它有所帮助。

答案 1 :(得分:1)

您可以使用GET DIAGNOSTICS语句在5.6.4中捕获消息,错误代码,sql状态......

请参阅 http://dev.mysql.com/doc/refman/5.6/en/get-diagnostics.html

答案 2 :(得分:0)

我不记得我从中复制了什么教程。但是,它在5.6之前的MySQL版本中有很大帮助。感谢我从中学到的任何人!

步骤1:创建debug_log表。这将包含你写的一切。

    CREATE TABLE `debug_log` (
        `debug_log_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `msg` varchar(512) NOT NULL,
        `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (`debug_log_id`)
    ) ENGINE=MyISAM

步骤2:创建用于将信息添加到debug_log表的存储过程。

    DELIMITER $$

    USE `your_db_name_here`$$

    DROP PROCEDURE IF EXISTS `log_debug`$$

    CREATE DEFINER=`ss7admin`@`%` PROCEDURE `log_debug`(IN lastMsg VARCHAR(512))

    BEGIN
        INSERT INTO debug_log (msg)  VALUES (lastMsg);
    END$$

    DELIMITER ;

步骤3:在真实存储过程中添加处理程序。

    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        CALL log_debug( 
            CONCAT
            (
                now(),
                ' : Something went horribly wrong!',
                '.'
            )
        );

        CALL log_debug('Exiting now');

        SET outReturnCode = 1;
    END;