2011-08-30 151 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時做到這一點。在這種情況下,這是一個語法錯誤。