我在存储过程中使用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 ;
此过程将从用户输入中获取表和where条件,并运行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条答案
按热度按时间s5a0g9ez1#
您将过程声明为采用100个字符长的字符串
7cjasjjr2#
你的
IN
参数长度仅设置为100。而查询字符串输入的长度远远超过100个字符。把它增加到一个更大的值,比如说:255
另一方面:你的意见
query
字符串未指定ORDER BY
条款。请注意,数据是以无序的方式存储的。没有ORDER BY
条款,通过LIMIT..
不会是决定性的。