mysql-prepared语句不返回完整查询

fhg3lkii  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(312)

我在存储过程中使用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 . 有人能帮我理解并解决这个问题吗?

s5a0g9ez

s5a0g9ez1#

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

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

7cjasjjr2#

你的 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.. 不会是决定性的。

相关问题