MySQL - 准备好的语句未返回完整查询
MySQL - Prepared statements not returning full query
我在存储过程中使用 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 查询中获取 table 和 where 条件。
所以我执行了这个:
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 来调试它。然后它 t运行cating 我的输入字符串。
select * FROM db.logs where created_date < DATE(Now() - INTERVAL 3 month) and updated_at < DATE(Now() - INTER LIMIT 10000;
它 运行 满足了我的需求,直到 DATE(Now() - INTER
。
有人可以帮助我理解和解决这个问题吗?
您声明了该过程以获取长度为 100 个字符的字符串
CREATE PROCEDURE
test(IN query varchar(100)) <-- ONE HUNDRED CHARS LIMIT
您的 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..
获得的结果将不是确定性的。
我在存储过程中使用 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 查询中获取 table 和 where 条件。
所以我执行了这个:
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 来调试它。然后它 t运行cating 我的输入字符串。
select * FROM db.logs where created_date < DATE(Now() - INTERVAL 3 month) and updated_at < DATE(Now() - INTER LIMIT 10000;
它 运行 满足了我的需求,直到 DATE(Now() - INTER
。
有人可以帮助我理解和解决这个问题吗?
您声明了该过程以获取长度为 100 个字符的字符串
CREATE PROCEDURE
test(IN query varchar(100)) <-- ONE HUNDRED CHARS LIMIT
您的 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..
获得的结果将不是确定性的。