我检查了这里的帖子和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
尝试这种方法(它比 PLSQL 伪代码更多,但只是为了向您展示这个想法)。
SET @q = currentStatement;
PREPARE stmt FROM @q;
IF NOT isRollback THEN
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
IF is_rolback THEN
ROLLBACK;
...
ELSE
COMMIT;
END IF;