Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 带循环和准备语句的存储过程-为什么不工作?_Mysql - Fatal编程技术网

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事后来看,那就省去了我一点点的麻烦;)