我一直在研究试图找到一种从查询结果中获取所有行并单独处理它们的方法。我写了一个我认为可行但显然不行的脚本。
剧本:
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 for Windows (XP) 运行服务器。也许 CURSORS 的这种语法对于相应的服务器版本不正确?我不确定,但如果有人能帮助我,我会很高兴。
编辑:
这是我尝试从 SQL 命令行执行脚本时返回的错误消息:
ERROR 1064 (42000):您的 SQL 语法有错误;
检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“DECLARE @name char(20)”附近使用正确的语法
ERROR 1064 (42000):您的 SQL 语法有错误;
检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“DECLARE c1 CURSOR READ_ONLY FOR SELECT table_name FROM information_schema.tables”附近使用正确的语法
ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'FETCH NEXT FROM c1 INTO @table_name 附近使用的正确语法
而@@FETCH_STATUS = 0 开始
PREPARE st' 在第 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 命令行中运行此脚本会返回:
ERROR 1064 (42000):您的 SQL 语法有错误;
检查与您的 MySQL 服务器版本相对应的手册,以获取在 '@name char(20); 附近使用的正确语法;DECLARE c1 CURSOR READ_ONLY FOR SELECT table_name FROM infor' 在第 5 行