3

在 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 ERRORSorSHOW 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()or看到异常Exception.printStackTrace()。MySQL中是否有类似的功能?

4

1 回答 1

2

当您为 声明处理程序时SQLEXCEPTION,会消耗异常 - 它被视为“已处理”,因此不再存在“异常”。

如果您的存储过程流依赖于特定异常,则必须为特定SQLSTATE 错误代码声明处理程序,例如

DECLARE EXIT HANDLER FOR SQLSTATE `23000`

实际上,所有的处理程序实际上都是这种形式,因为:

  • SQLEXCEPTIONSQLSTATE是不以 、 或 开头的值'00''01'的简写'02'
  • SQLWARNINGSQLSTATE是开头的值类的简写'01'
  • NOT FOUNDSQLSTATE是开头的值类的简写'02'
于 2012-11-16T19:38:38.007 回答