在MySQL存储过程中,我使用以下方法处理SQL异常:
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT "SQL exception occured." AS "SQL Exception";
SHOW ERRORS;
SHOW WARNINGS;
ROLLBACK;
END;
我知道正在抛出异常,因为正在显示SQL exception occured
消息并且事务被回滚。但是,SHOW ERRORS
或SHOW WARNINGS
表中没有填充任何内容。为什么会这样,我怎么知道抛出了哪个SQL异常?
这是导致神秘异常的SQL语句:
SELECT IF(count(*) = 0, TRUE, FALSE)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='myDatabase'
AND TABLE_NAME='exam';
编辑:
Bohemian告诉我,处理程序正在吞噬异常。那么如何找出异常是什么并仍然回滚?在java catch块中,我可以使用Exception.getMessage()
或Exception.printStackTrace()
来查看异常。 MySQL中有类似的功能吗?
答案 0 :(得分:2)
当您为SQLEXCEPTION
声明处理程序时,会消耗该异常 - 它被视为“已处理”,因此不再存在“异常”。
如果存储过程流取决于特定异常,则必须为特定SQLSTATE error code声明处理程序,例如
DECLARE EXIT HANDLER FOR SQLSTATE `23000`
实际上,所有处理程序实际上都是这种形式,因为:
SQLEXCEPTION
是不以SQLSTATE
,'00'
或'01'
'02'
值类的简写
SQLWARNING
是以SQLSTATE
'01'
值类的简写
NOT FOUND
是以SQLSTATE
'02'
值类的简写