Откат хранимой процедуры MySQL при первом операторе If-else, если второй оператор if-else завершается неудачно

0

Мне нужна некоторая помощь в MySQL Хранимой процедуре ниже, Когда первая инструкция If else проходит, а вторая - ошибку, она показывает сообщение об ошибке, которое я вводил в инструкции ELSE, но я хотел бы отменить первый оператор If else if вторая ошибка. Как мне это сделать?

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 Do Not Match in tables db1.tbl1 and db1.tbl2' as ErrorMessage;
  End if;
END;
  • 0
    Начать транзакцию. Зафиксируйте, если все удастся, откатите, если есть ошибка.
  • 0
    Я бы ввел стартовую транзакцию после BEGIN и ROLLBACK до End If или после и чем COMMIT?
Теги:
stored-procedures

1 ответ

0
Лучший ответ

Вы должны использовать 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.

Ура!

  • 0
    Спасибо!! Я понял!! БЛАГОДАРЮ ВАС! Я добавил откат в else для операторов if else и получил желаемый результат. Спасибо @barmar также!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню