MySQL 没有捕捉到错误

标签 mysql sql exception exit-code

当我尝试删除不存在的行时,为什么这段代码没有捕捉到错误?无论我将什么参数作为行名传入,它总是返回“1 行已删除”并且不使用退出处理程序。应该只捕获这种类型的错误。

USE yoga;

DROP PROCEDURE IF EXISTS delete_warmup;

DELIMITER //

CREATE PROCEDURE delete_warmup 
(
    warmup_name_param               VARCHAR(100)
)
BEGIN
DECLARE row_not_found       TINYINT DEFAULT FALSE;
DECLARE sql_exception       TINYINT DEFAULT FALSE;

BEGIN
    DECLARE EXIT HANDLER FOR 1329
        SET row_not_found = TRUE;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
        SET sql_exception = TRUE;

    DELETE FROM warmup
    WHERE warmup_name = warmup_name_param;

    SELECT '1 row was deleted.' AS message;
END;

IF row_not_found = TRUE THEN
    SELECT 'Row not deleted - row not found' AS message;
ELSEIF sql_exception = TRUE THEN
    SHOW ERRORS;
END IF;

END//

DELIMITER ;

CALL delete_warmup ('Monkey business');

最佳答案

您正在为重复参数使用退出处理程序:http://www.briandunning.com/errors/596这是你指定的 1329

也许您应该尝试错误代码 1011:http://www.briandunning.com/errors/278

此外,尝试查找 NOT FOUND 以及 SQLException

此外,尝试将退出处理程序放在开始/结束子句之外。

因此您的BEGINEND 子句将是

DECLARE EXIT HANDLER FOR 1011
DECLARE EXIT HANDLER FOR SQLEXCEPTION, NOT FOUND
BEGIN
        SET row_not_found = TRUE;
        SET sql_exception = TRUE;

    DELETE FROM warmup
    WHERE warmup_name = warmup_name_param;

    SELECT '1 row was deleted.' AS message; 
END;

关于MySQL 没有捕捉到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15606723/

相关文章:

mysql - 从多个表中获取不同的结果

mysql - 在单个表上使用左外连接比较第三个表 MySQL 的值

python - 插入数百万行的性能

php - 自定义 virtuemart 购物车

c++ - 使用 C++ 在 SQL Server 中执行创建表

sql - 在 MySQL 中归档父/子表层次结构

php - PHP 7 中 Error 和 ErrorException 的区别

java - 是什么导致 BigDecimal.divide 出现 "Non-terminating decimal expansion"异常?

c# - 在 Web API 中从存储库级别返回错误的好方法

mysql - 用于过滤的 SQL