Я исследовал, пытаясь найти способ получить все строки из результата запроса и обработать их по отдельности. Я написал сценарий, который, как я думал, будет работать, но, по-видимому, нет.
Сценарий:
DECLARE @name char(20);
DECLARE c1 CURSOR READ_ONLY
FOR
SELECT table_name
FROM information_schema.tables WHERE table_schema = 'puslogger' AND UPDATE_TIME < (now() - interval 30 day)
OPEN c1;
FETCH NEXT FROM c1
INTO @table_name
WHILE @@FETCH_STATUS = 0
BEGIN
PREPARE stmt FROM "concat('DROP TABLE IF EXISTS `', @table_name,'`;')"
EXECUTE stmt
DEALLOCTATE stmt
FETCH NEXT FROM c1
INTO @table_name
END
CLOSE c1
DEALLOCATE c1
Скрипт предназначен для удаления всех таблиц старше 30 дней. Хотя это не работает для версии MySQL 5.5.37.
Я новичок в MySQL и использую сервер с MySQL для Windows (XP). Возможно, этот синтаксис для CURSORS не подходит для соответствующей версии сервера? Я не уверен, но я был бы очень рад, если бы кто-нибудь мог мне помочь.
ИЗМЕНИТЬ:
Это сообщение об ошибке возвращается, когда я пытаюсь выполнить скрипт из командной строки SQL:
ОШИБКА 1064 (42000): ошибка в синтаксисе SQL;
проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «DECLARE @name char (20)» в строке 1.
ОШИБКА 1064 (42000): ошибка в синтаксисе SQL;
проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «DECLARE c1 CURSOR READ_ONLY FOR SELECT table_name FROM information_schema.tables» в строке 1
ОШИБКА 1064 (42000): ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «FETCH NEXT FROM c1 INTO @table_name».
ПОКА @@FETCH_STATUS = 0 НАЧАТЬ
ПОДГОТОВЬТЕ ст' в строке 1
ОБНОВЛЕНИЕ:
Я также попробовал этот скрипт (ПРИМЕЧАНИЕ: я намерен создать событие, которое будет выполняться ежедневно для удаления таблиц старше 30 дней):
delimiter |
CREATE EVENT clean_logger
ON SCHEDULE EVERY 1 DAY
DO
BEGIN
DECLARE @name char(20);
DECLARE c1 CURSOR READ_ONLY
FOR
SELECT table_name
FROM information_schema.tables WHERE table_schema = 'puslogger' AND UPDATE_TIME < (now() - interval 30 day);
OPEN c1;
FETCH NEXT FROM c1
INTO @table_name;
WHILE @@FETCH_STATUS = 0
BEGIN
PREPARE stmt FROM "concat('DROP TABLE IF EXISTS `', @table_name,'`;')";
EXECUTE stmt;
DEALLOCTATE stmt;
FETCH NEXT FROM c1
INTO @table_name;
END;
CLOSE c1;
DEALLOCATE c1;
END |
delimiter ;
Запуск этого скрипта в командной строке SQL возвращает:
ОШИБКА 1064 (42000): ошибка в синтаксисе SQL;
проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать, какой правильный синтаксис использовать рядом с '@name char(20); DECLARE c1 CURSOR READ_ONLY FOR SELECT table_name FROM infor' в строке 5
;
) отсутствуют в вашем коде, вы удалили их перед публикацией или они действительно отсутствуют в исходном коде? Кроме того,DECLARE
работает только внутри хранимой процедуры/функции. Вы также удалили заголовки функций/процедур для краткости? - person RandomSeed   schedule 11.04.2014