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