MySQL - Подготовленные операторы не возвращают полный запрос - PullRequest
0 голосов
/ 27 ноября 2018

Я использую оператор подготовки в хранимой процедуре.

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 ; 

Эта процедура получит таблицу и условия из пользовательского ввода и выполнит запрос на выборку.

Итак, я выполнил это:

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 голосов
/ 27 ноября 2018

Длина параметра 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.., не будут детерминированными.

0 голосов
/ 27 ноября 2018

вы объявили процедуру для получения строки длиной 100 символов

CREATE PROCEDURE
  test(IN query varchar(100)) <-- ONE HUNDRED CHARS LIMIT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...