mysql - 为什么 SHOW ERRORS 不记录在 MySQL 存储过程中抛出的 SQL 异常?

标签 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 occurred 消息并且事务被回滚。但是,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 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/

相关文章:

SQL Server - 显示人员及其银行名称的查询是单行吗?

sql - 如何在查询中使用 SQL 变量(SQL Server)?

sql - 如何在 SQL Server 存储过程/函数中声明输入输出参数?

sql - 用多个分隔符分割字符串

python - MySQL 中存储过程链式调用的有趣行为

php - 使用-PHP在同一个表中混合来自mysql的数据

mysql - 如何消除 GROUP BY 中使用的 SELECT 子句标签的歧义?

php - SQL 数组语句

php - 在 eloquent LARAVEL 5.2.29 上进行子查询

sql - 设置外键时的奇怪问题