【问题标题】:MySQL 1064 Syntax error when there isn't a syntax error没有语法错误时的 MySQL 1064 语法错误
【发布时间】:2011-08-30 20:29:09
【问题描述】:

为了保护我的工作,更改了一些名称和内容。

DELIMITER //
CREATE PROCEDURE glt(IN howMany INT)
BEGIN

  DECLARE f VARCHAR(32);
  DECLARE done INT DEFAULT 0;
  DECLARE curs CURSOR FOR SELECT DISTINCT id FROM tpd;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  OPEN curs;

  DROP TABLE IF EXISTS lt;
  CREATE TEMPORARY TABLE lt LIKE tpd;

  REPEAT
    FETCH curs INTO f;
    IF NOT done THEN
      INSERT INTO lt SELECT * FROM tpd WHERE id = f ORDER BY TIME DESC LIMIT howMany;
    END IF;
  UNTIL done END REPEAT;
  CLOSE curs;
END

上面的代码在 linux 机器上给出了以下错误,但在 mac 机器上却没有,尽管它们都是区分大小写的文件系统并且具有相同的 MySQL 版本:

ERROR 1064 (42000) at line 172: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'howMany;
    END IF;
  UNTIL done END REPEAT;
  CLOSE curs;
END' at line 16
Bye

【问题讨论】:

    标签: mysql sql database stored-procedures syntax-error


    【解决方案1】:

    尝试使用 Prepare 语句进行 INSERT 查询。 看http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html

    看起来应该是这样的:

    PREPARE stmt FROM 'INSERT INTO lt SELECT * FROM tpd WHERE id = f ORDER BY TIME DESC LIMIT ?';
    EXECUTE stmt USING howMany;
    

    【讨论】:

    • 谢谢好心的先生!这是一个奇怪的行为......特别是因为代码在 mac 上的 mysql 上运行没有问题。只是在linux上不起作用......
    【解决方案2】:

    您不能在此处的limit 子句中使用参数。
    您只能在使用 PDO 时这样做。在这种情况下,这是一个语法错误。

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 2015-04-25
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 2016-09-29
      • 2012-10-10
      • 1970-01-01
      • 2023-02-24
      相关资源
      最近更新 更多