我在存储过程中使用了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
。
有人可以帮助我了解和解决此问题吗?
答案 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..
获得的结果将是不确定的。