在 MySQL 存储过程中,我正在处理 SQL 异常:
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT "SQL exception occured." AS "SQL Exception";
SHOW ERRORS;
SHOW WARNINGS;
ROLLBACK;
END;
我知道正在抛出异常,因为正在显示 SQL exception occurred
消息并且事务被回滚。但是,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 block 中,我可以使用 Exception.getMessage()
或 Exception.printStackTrace()
查看异常。 MySQL 中有类似的功能吗?
最佳答案
当您为 SQLEXCEPTION
声明处理程序时,异常被消耗 - 它被认为是“已处理”,因此不再有“异常”。
如果您的存储过程流依赖于特定的异常,您必须为特定的 SQLSTATE error code 声明一个处理程序, 例如
DECLARE EXIT HANDLER FOR SQLSTATE `23000`
其实所有的handler其实都是这种形式的,因为:
-
SQLEXCEPTION
是类SQLSTATE
的简写不以'00'
开头的值,'01'
, 或'02'
-
SQLWARNING
是类SQLSTATE
的简写以'01'
开头的值 -
NOT FOUND
是类SQLSTATE
的简写以'02'
开头的值
关于mysql - 为什么 SHOW ERRORS 不记录在 MySQL 存储过程中抛出的 SQL 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13423103/