2011-08-30 170 views
1

更改了一些名称和内容以保护我的工作。MySQL 1064没有语法错误时出现语法错误

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 

回答

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; 
+0

感谢那种先生!这是一个奇怪的行为...特别是因为代码在Mac上运行mysql没有问题。只是不能在Linux上工作... –

0

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