MySQL — Запрос не прошел проверку

#mysql

#mysql

Вопрос:

У меня есть этот запрос:

 SELECT CONCAT('SELECT `user_id` FROM task_schedule WHERE `',DAYNAME(NOW()),'` = TRUE')
INTO @task;
PREPARE statement FROM @task;
EXECUTE statement;
DEALLOCATE PREPARE statement;
  

Он используется для запроса этой таблицы:

 CREATE TABLE `task_schedule` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NOT NULL,
  `program_id` int(11) NOT NULL,
  `sunday` tinyint(2) DEFAULT NULL,
  `monday` tinyint(2) DEFAULT NULL,
  `tuesday` tinyint(2) DEFAULT NULL,
  `wednesday` tinyint(2) DEFAULT NULL,
  `thursday` tinyint(2) DEFAULT NULL,
  `friday` tinyint(2) DEFAULT NULL,
  `saturday` tinyint(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  

Запрос работает так, как ожидалось. Я использовал инструмент MySQL Workbench, JetBrains Datagrip, также в командной строке он работает.
Но каждая онлайн-проверка синтаксиса mysql завершается ошибкой запроса со следующей ошибкой:

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с «ПОДГОТОВИТЬ stmt ИЗ @query ВЫПОЛНИТЬ stmt; ОСВОБОДИТЬ PREPARE stmt» в строке 3

Это проблема для меня, поскольку я использую сторонний инструмент компании, который будет использовать этот запрос к нашей базе данных, и они также сообщают о той же ошибке. По-видимому, они используют аналогичную или одинаковую проверку синтаксиса.

Что не так с этим запросом?

Подробная информация:

Кажется, с его запросом все в порядке. Что-то не так с валидаторами.

Этот запрос:

 PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2)   POW(?,2)) AS hypotenuse';
 SET @a = 3;
 SET @b = 4;
 EXECUTE stmt1 USING @a, @b;

 DEALLOCATE PREPARE stmt1;
  

Работает везде, кроме валидаторов и в моем случае. Это взято из официальной документации

Похоже, что валидаторы не поддерживают ПОДГОТОВЛЕННЫЕ операторы.

Комментарии:

1. У меня есть этот запрос: это 4 отдельных запроса (точнее — заявления). Либо включите множественный запрос в настройках вашего клиента (если это возможно), либо поместите эти инструкции в хранимую процедуру.

2. Не могу использовать процедуру, у меня нет к ней доступа. Но все же загадка остается. Почему валидаторы терпят неудачу? Я обновил исходный вопрос дополнительной информацией.

3. Никто не может проконсультироваться с вами по поводу неуказанной проблемы с онлайн-инструментом проверки. За исключением его команды поддержки, если она существует.

4. Эти, например: — en.rakko. инструменты /tools/36 eversql.com/sql-syntax-check-validator и другие. То же поведение. Они не проверяют даже официальный пример, который сейчас находится в моем вопросе.

5. Сначала нет никакой документации. Второй требует авторизации.

Ответ №1:

Удалите эту строку: ОСВОБОДИТЬ оператор PREPARE; Он отменяет запрос до его запуска!

Редактировать: это работает с примером базы данных Mysql (sakila)

 SELECT CONCAT('SELECT * FROM actor WHERE actor_id = 1')
INTO @task;
PREPARE statement FROM @task;
EXECUTE statement;
DEALLOCATE PREPARE statement;
  

Комментарии:

1. Это утверждение существует по определенной причине. Кроме того, даже без этого, это все та же проблема.

2. Хорошо, я попробовал это сейчас, включив последнюю строку. Он снова работает. Я думаю, что проблема связана с вашим запросом select.

3. Например, этот валидатор (один из многих), en.rakko. tools / tools /36 Он ПРОВЕРИТ оператор «INTO». Но это приведет к сбою проверки всего, что находится после этой строки.

4. Почему вас волнует, работает ли он на вашем сервере и не работает на онлайн-валидаторах? Кто знает, что они делают?

5. Это допустимое утверждение. Я использую сторонний инструмент, в котором я сохраняю запрос, а затем он выполняется. Но прежде чем этот инструмент позволит мне сохранить его, они выполняют проверку, которая завершается неудачей, и она не позволит мне сохранить ее 🙂