MySQL 1064 Синтаксическая ошибка, когда нет синтаксической ошибки - PullRequest
1 голос
/ 31 августа 2011

Некоторые имена и материалы изменены, чтобы защитить мою работу.

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

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Попробуйте использовать оператор 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;
0 голосов
/ 31 августа 2011

Здесь нельзя использовать параметр в предложении limit.
Вы можете сделать это только при использовании PDO. В этом контексте это синтаксическая ошибка.

...