如果第二个 if-else 语句失败,MySQL 存储过程在第一个 If-else 语句上回滚

标签 mysql stored-procedures

我需要一些有关下面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/

相关文章:

php - 将 WooCommerce 自定义产品属性转换为定义的产品属性

mysql - 分隔符在 MySQL 5.1 上不起作用

mysql - 想要从 2 个不同的表中获取 2 个不同列的总和并想要显示最终总和

SQL存储过程临时表内存问题

Mysql - 仅运行一个从计划事件内部调用的存储过程实例

mysql - 存储过程中的案例语句 - 未知系统变量

mysql - 从 codeigniter 调用存储过程不起作用

java - 我的 Like Query JDBC(Derby) 有什么问题

Java - 在 JTextArea 中显示来自数据库的信息

mysql - 将以下内容更改为带条件的参数化查询