MySQL 错误处理返回第一个错误

问题描述 投票:0回答:1

我检查了这里的帖子和MySQL手册,我得到了部分答案。

问题: 我有一些可能导致错误的查询,我想处理它们并收到一条关于发生的第一个错误的消息+行号+回滚(如果有错误)。

我的答案部分:

  • 返回代码和错误消息。
  • 如果出现错误,则回滚所有查询。

我没有的答案部分

  • 第一个错误(代码返回最后一个错误)。
  • 行号。

我知道代码中存在一些错误,因为我从一个站点获取了每个部分并将它们混合在一起,哈哈

代码:

DELIMITER $$

CREATE PROCEDURE prod()
BEGIN
    DECLARE is_rolback BOOL DEFAULT 0;
    DECLARE resultError TEXT;
    DECLARE errorCode CHAR(5) DEFAULT '00000';
    DECLARE errorMsg TEXT;
    DECLARE ErrorRows INT;

    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
        GET DIAGNOSTICS CONDITION 1
        errorCode = RETURNED_SQLSTATE, errorMsg = MESSAGE_TEXT;
        SET is_rolback = 1;
    END;


    START TRANSACTION;
    SET autocommit = 0;


-- The codes for checking the errors possible
-- Start
    insert into table1 values (2, 'B'); -- Correct
    insert into table1 values (1, 'A'); -- Error id 1 is already in database;
    insert into table1 values ('C');    -- Error should pass also the ID
-- End  

    IF is_rolback THEN
        ROLLBACK;
        GET DIAGNOSTICS ErrorRows = ROW_COUNT;
        SET resultError = CONCAT('Failed, error = ',errorCode,', line = ', ErrorRows, ', message = ',errorMsg);
        select resultError;

        select * from table1;
    ELSE
        COMMIT;
    END IF;
END$$

DELIMITER ;

CALL prod();

DROP PROCEDURE IF EXISTS prod;

输出:

Failed, error = 21S01, line = 0, message = Column count doesn't match value count at row 1
id      name
1       A
mysql stored-procedures error-handling rollback
1个回答
0
投票

尝试这种方法(它比 PLSQL 伪代码更多,但只是为了向您展示这个想法)。

  • 将插入语句放入 varchar 或mediumtexts 数组中(也许从 sql 文件中读取?)
  • 保持 HANDLER FOR SQLEXCEPTION 不变并启动事务
  • 对于数组中的每个语句并且 isRolback = 0:
    SET @q = currentStatement;
    PREPARE stmt FROM @q;
    IF NOT isRollback THEN
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END IF;
  • 在循环之外保留已有的 if 块
    IF is_rolback THEN
        ROLLBACK;
        ...
    ELSE
        COMMIT;
    END IF;
© www.soinside.com 2019 - 2024. All rights reserved.