据我所知,我可以在MySQL存储过程中定义异常处理程序,但似乎我无法在处理程序中捕获异常消息并在表中写入日志以进行调试。我只想知道是否有方法可以在MySQL存储过程中记录异常代码和消息?
您可以在 5.6.4 中使用 GET DIAGNOSTICS 语句捕获消息、错误代码、sql 状态等 ...。
看http://dev.mysql.com/doc/refman/5.6/en/get-diagnostics.html
我不记得我从哪个教程中复制了这个。 但是,它在5.6之前的MySQL版本中提供了极大的帮助。 感谢我从谁那里学到的!
步骤 1:创建debug_log表。 这将保存您写入的所有内容。
创建表"debug_log"( 'debug_log_id' int(10( 无符号 NOT NULL AUTO_INCREMENT, 'msg' varchar(512( 不为空, "创建"时间戳不为空默认CURRENT_TIMESTAMP, 主键("debug_log_id"( ( 引擎=MyISAM
步骤 2:创建用于向debug_log表添加信息的存储过程。
分隔符 $$ 使用"your_db_name_here"$$ 删除过程(如果存在'log_debug'$$ CREATE DEFINER='ss7admin'@'%' PROCEDURE 'log_debug'(IN lastMsg VARCHAR(512(( 开始 插入到debug_log(味精(值(最后Msg(; END$$ 定界符;
步骤 3 :在实际存储过程中添加处理程序。
声明 SQLEXCEPTION 的退出处理程序 开始 呼叫log_debug( 康卡特 ( 现在((, ' : 出了大问题! '.' ) ); 呼叫log_debug("立即退出"(; 设置返回代码 = 1; 结束;
您无法捕获消息,但可以捕获错误代码。
以下是如何处理"重复条目"(PK,英国约束(的示例:
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(在处理程序中(的"错误消息"。
您可以尝试使用show warnings
(它显示上次查询的错误/警告(,以防万一out_status <> 0
.
希望对您有所帮助。