Mysql 带循环和准备语句的存储过程-为什么不工作?
我试图有选择地刷新特定数据库中有限的一组表——经过一番调查(咒骂和诅咒),我得出了以下结论:Mysql 带循环和准备语句的存储过程-为什么不工作?,mysql,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 inf
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)
然后,当我从一个缓存表中获取行计数时,我会得到一个非零结果。由于您在第一行将分隔符设置为
$
,因此需要将第二行的分号改为$
。因为您在第一行将分隔符设置为$
,您需要将第二行的分号改为$$
。午休后-问题是过程中select的查询参数:
DECLARE crsr CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema=database() AND table_name LIKE 'cache_%';
我正在测试的表实际上被称为缓存
——因此这显然与上面的参数不匹配。这条线实际上需要:
DECLARE crsr CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema=database() AND table_name LIKE 'cache%';
现在这很有效。午休后-问题最终是过程中select的查询参数:
DECLARE crsr CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema=database() AND table_name LIKE 'cache_%';
我正在测试的表实际上被称为缓存
——因此这显然与上面的参数不匹配。这条线实际上需要:
DECLARE crsr CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema=database() AND table_name LIKE 'cache%';
这很好。好的一点-我已经修复了错误放置的放置,但这不是问题的实际原因…@horuskol我在我的机器上测试了这个过程,它工作正常。@horuskol尝试运行游标中使用的
选择
,你的所有缓存表都在结果集中吗?@Scrum事后来看,那就省去了我一点点的麻烦;)很好的一点-我已经修复了错误的放置,但这不是问题的真正原因…@horuskol我在我的机器上测试了这个过程,它工作正常。@horuskol尝试运行游标中使用的SELECT
,你的所有缓存表都在结果集中吗?@Scrum事后来看,那就省去了我一点点的麻烦;)