#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. Это допустимое утверждение. Я использую сторонний инструмент, в котором я сохраняю запрос, а затем он выполняется. Но прежде чем этот инструмент позволит мне сохранить его, они выполняют проверку, которая завершается неудачей, и она не позволит мне сохранить ее 🙂