为什么SHOW ERRORS没有记录MySQL存储过程中抛出的SQL异常?

时间:2012-11-16 19:26:55

标签: mysql sql stored-procedures exception-handling

在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 ERRORSSHOW 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中有类似的功能吗?

1 个答案:

答案 0 :(得分:2)

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

如果存储过程流取决于特定异常,则必须为特定SQLSTATE error code声明处理程序,例如

DECLARE EXIT HANDLER FOR SQLSTATE `23000`

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

  • SQLEXCEPTION是不以SQLSTATE'00''01'
  • 开头的'02'值类的简写
  • SQLWARNING是以SQLSTATE
  • 开头的'01'值类的简写
  • NOT FOUND是以SQLSTATE
  • 开头的'02'值类的简写