我正在尝试选择性地刷新特定数据库中的一组有限的表 - 经过一些调查(咒骂和诅咒)之后,我已经到达:
DROP PROCEDURE IF EXISTS local_flush_cache;
DELIMITER $$
CREATE PROCEDURE local_flush_cache()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a VARCHAR(64);
DECLARE crsr CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema=database() AND table_name LIKE 'cache_%';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN crsr;
read_loop: LOOP
FETCH crsr INTO a;
IF done THEN
LEAVE read_loop;
END IF;
SET @s = CONCAT('DELETE FROM ', a);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE crsr;
END$$
DELIMITER ;
唯一的事情是 - 它似乎没有起作用。当我检查缓存表的内容时,它们尚未被清除。
当我调用该程序时,我得到的唯一输出是:
mysql> call local_flush_cache();
Query OK, 0 rows affected (0.00 sec)
然后当我从其中一个缓存表中获取行数时,我得到一个非零结果。
答案 0 :(得分:1)
由于您要在第一行将分隔符设置为$$
,因此您需要将第二行行上的分号更改为$$
。
答案 1 :(得分:0)
午休后 - 问题最终成为程序中select的查询参数:
DECLARE crsr CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema=database() AND table_name LIKE 'cache_%';
我正在测试的表实际上被称为cache
- 因此显然不会与上面的参数匹配。该行实际上需要:
DECLARE crsr CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema=database() AND table_name LIKE 'cache%';
现在效果很好。