首页 > 解决方案 > mariadb 已报告“end if”错误

问题描述

我有一条SQL语句一直报1064错误,请大家帮忙!

UPDATE `MessageQueue`
SET `Status`= 0, `RetryCount`= `RetryCount`+ '1', `LastRetryTime` = NOW(), `CanBeRemoved`=1
WHERE `MsgHash`= 1 AND `Status`=0;
SET @retVal = ROW_COUNT();
IF (@retVal = 0) THEN
    UPDATE `MessageQueue` SET `Status`= 5 WHERE `MsgHash`= 1;
    END IF;
SELECT @retVal;

这是在执行之后:(受影响的 1 行)执行时间:00:00:00:000 传输时间:00:00:00:016 总时间:00:00:00:016

(0 行受影响)执行时间:00:00:00:000 传输时间:00:00:00:015 总时间:00:00:00:015

错误:1064 您的 SQL 码语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以获取正确的语法,以便在第 2 行的 '' 附近使用 ------- 如果删除“;” 在“更新MessageQueueStatus= 5 WHERE MsgHash= 1;” 此错误将消失 -------- 执行时间:00:00:00:000 传输时间:00:00:00:000 总时间:00:00:00:000

错误:1064 您的 SQL 码语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在第 1 行的“end if”附近使用的正确语法

执行时间:00:00:00:000 传输时间:00:00:00:000 总时间:00:00:00:000

(返回 1 行) 执行时间:00:00:00:000 传输时间:00:00:00:000 总时间:00:00:00:000

标签: mysqlmariadb

解决方案


几个问题:

  • 您使用的是什么版本的 MariaDB?
  • 您是从存储过程还是匿名块(BEGIN NOT ATOMIC)中调用句子?

我无法从匿名块中重现问题:

BEGIN NOT ATOMIC
  UPDATE `MessageQueue`
  SET `LastRetryTime` = NOW()
  WHERE `Status` = 1;

  SET @`retVal` := ROW_COUNT();

  IF (@`retVal` = 0) THEN
    UPDATE `MessageQueue`
    SET `Status`= 5
    WHERE `Status`= 0;
  END IF;
END;

请参阅dbfiddle


推荐阅读