2011-12-23 63 views
1

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

回答

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,你会尝试再次,你不会得到插入现有的值错误。不会插入任何内容,并且状态将等于1.

您还可以为其他错误代码添加其他处理程序。并且由于out_status的值,您将始终知道错误是什么,并且由于error_code(处理程序中),您将知道“错误消息”。

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

希望它有帮助。

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;