【问题标题】:MySQL not catching errorMySQL没有捕获错误
【发布时间】:2013-03-14 10:58:15
【问题描述】:

为什么当我尝试删除不存在的行时,这段代码没有捕捉到错误?无论我传入什么参数作为行的名称,它总是返回“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');

【问题讨论】:

    标签: mysql sql exception-handling exit-code


    【解决方案1】:

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

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

    另外,请尝试查找 NOT FOUNDSQLException

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

    所以你的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;
    

    【讨论】:

    • 感谢您的回复。我尝试使用 NOT FOUND 以及错误代码 1011、1017、1032、1065 和 1329 进行此操作。当我将退出处理程序放在外部 BEGIN/END(而不是嵌套的 BEGIN/END)中时,该过程不起作用完全不考虑行是否存在。
    猜你喜欢
    • 2017-02-05
    • 2011-05-21
    • 1970-01-01
    • 2020-10-27
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多