我需要一些有关下面MySQL存储过程的帮助,当第一个If else语句执行并且第二个错误时,它显示我在ELSE语句中输入的错误消息,但我想回滚第一个If如果第二个错误出现,则执行 else 语句。我该怎么做?
DELIMITER $$
CREATE PROCEDURE sp_Example()
BEGIN
SET @countOfTable = (select count(*) from Db1.tbl1);
IF @countOfTable > 0
THEN
INSERT INTO db1.tblLog
(
BatchStoreId,
Origin
)
SELECT
(SELECT DISTINCT SomeID FROM db1.tbl1) as SomeId,
(SELECT Origin FROM db1.tblKey WHERE Origin = 'ThisText') as Origin;
ELSE
SELECT 'table is empty!' as ErrorMessage;
End if;
SET @countOpp = (SELECT count(*) FROM db1.tbl2),
@MR = (SELECT DISTINCT SomeID FROM db1.tbl1),
@Opp = (SELECT DISTINCT OtherIDFROM db1.tbl2);
IF @countOpp > 0 and @MR = @Opp
THEN
INSERT INTO db1.tbllog
(
SomeID,
Origin
)
SELECT
(SELECT DISTINCT SomeID FROM db1.tbl2) as SomeID,
(SELECT Origin FROM db1.tblkey WHERE Origin = 'Secondary Text') as Origin;
ELSE
SELECT 'SomeID's Do Not Match in tables db1.tbl1 and db1.tbl2' as ErrorMessage;
End if;
END;
最佳答案
您应该使用START TRANSACTION;
,然后在 else 语句中使用ROLLBACK
,然后在过程结束时执行commit
。我做了一个简单的示例来说明它应该是什么样子:
DELIMITER $$
CREATE PROCEDURE sp_example()
BEGIN
-- Starting the transaction
START TRANSACTION;
INSERT INTO `test`.`owner` (`name`) VALUES ('Insert Cubias');
IF 1 > 2 THEN
INSERT INTO `test`.`owner` (`name`) VALUES ('McCubo');
ELSE
SELECT 'Rollback transaction' as ErrorMessage;
-- No records will be inserted
ROLLBACK;
End if;
-- commit changes to database
COMMIT;
END;
$$
你应该看看官方文档:https://dev.mysql.com/doc/refman/5.7/en/commit.html欲了解更多信息。
干杯!
关于如果第二个 if-else 语句失败,MySQL 存储过程在第一个 If-else 语句上回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49680754/