循环和准备语句的存储过程 - 为什么它不起作用?

时间:2011-02-04 01:31:53

标签: mysql

我正在尝试选择性地刷新特定数据库中的一组有限的表 - 经过一些调查(咒骂和诅咒)之后,我已经到达:

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)

然后当我从其中一个缓存表中获取行数时,我得到一个非零结果。

2 个答案:

答案 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%';

现在效果很好。