MySQL-预处理语句不返回完整查询

时间:2018-11-27 09:00:38

标签: mysql sql prepared-statement

我在存储过程中使用了prepare语句。

DROP PROCEDURE
IF EXISTS test;
delimiter //
  CREATE PROCEDURE
    test(IN query varchar(100))
  begin     
        SET @query =CONCAT('select * FROM db.',query,' LIMIT  10000;');
        select @query;
        PREPARE arcive_stmt FROM @query;
        EXECUTE arcive_stmt;
   commit;
   DEALLOCATE PREPARE arcive_stmt;
 END //
delimiter ; 

此过程将从用户输入获取表和条件,并运行select查询。

所以我执行了这个:

mysql> call test ('logs where created_date < DATE(Now() - INTERVAL 3 month) and updated_at < DATE(Now() - INTERVAL 3 month');

但是我得到了这个错误:

ERROR 1064 (42000): 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 'LIMIT  10000' at line 1

我使用print @query来调试它。然后它会截断我的输入字符串。

select * FROM db.logs where created_date < DATE(Now() - INTERVAL 3 month) and updated_at < DATE(Now() - INTER LIMIT  10000;

它截断了我的刺痛,直到DATE(Now() - INTER。 有人可以帮助我了解和解决此问题吗?

2 个答案:

答案 0 :(得分:3)

您声明该过程采用100个字符长的字符串

CREATE PROCEDURE
  test(IN query varchar(100)) <-- ONE HUNDRED CHARS LIMIT

答案 1 :(得分:3)

您的IN参数长度仅设置为100。输入的查询字符串远远超过了字符长度100。

将其增加到更大的值,例如:255

DROP PROCEDURE
IF EXISTS test;
delimiter //
  CREATE PROCEDURE
    test(IN query varchar(255))  -- increase to a bigger value
  begin     
        SET @query =CONCAT('select * FROM db.',query,' LIMIT  10000;');
        select @query;
        PREPARE arcive_stmt FROM @query;
        EXECUTE arcive_stmt;
   commit;
   DEALLOCATE PREPARE arcive_stmt;
 END //
delimiter ; 

另一方面,您输入的query字符串未指定ORDER BY子句。请注意,数据以无序方式存储。没有ORDER BY子句,由LIMIT..获得的结果将是不确定的。