Mysql 过程中的游标不返回任何值
我有一个创建临时表的数据库,这些表名随机生成并保存在checkout.unid中。我想删除所有这些表并截断表签出。我认为最漂亮的解决方案是一个程序,但它不会起作用:Mysql 过程中的游标不返回任何值,mysql,loops,cursor,procedure,Mysql,Loops,Cursor,Procedure,我有一个创建临时表的数据库,这些表名随机生成并保存在checkout.unid中。我想删除所有这些表并截断表签出。我认为最漂亮的解决方案是一个程序,但它不会起作用: DROP PROCEDURE IF EXISTS `spCheckoutsCleanup`; CREATE PROCEDURE `spCheckoutsCleanup` () SQL SECURITY INVOKER BEGIN DECLARE `t` VARCHAR(64); DECLARE `ch` CURS
DROP PROCEDURE IF EXISTS `spCheckoutsCleanup`;
CREATE PROCEDURE `spCheckoutsCleanup` ()
SQL SECURITY INVOKER
BEGIN
DECLARE `t` VARCHAR(64);
DECLARE `ch` CURSOR FOR SELECT `unid` FROM `Checkouts`;
OPEN `ch`;
drop_tables: LOOP
FETCH `ch` INTO `t`;
DROP TABLE IF EXISTS `t`;
END LOOP;
CLOSE `ch`;
TRUNCATE TABLE `Checkouts`;
END
我总是不获取数据-获取、选择或处理的行数为零,尽管这些表在那里,而且表签出也不是空的。为了结束循环,您必须添加以下内容:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET ...;
请参见中的示例。例如
DROP PROCEDURE IF EXISTS `spCheckoutsCleanup`;
CREATE PROCEDURE `spCheckoutsCleanup` ()
SQL SECURITY INVOKER
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE `t` VARCHAR(64);
DECLARE `ch` CURSOR FOR SELECT `unid` FROM `Checkouts`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN `ch`;
drop_tables: LOOP
FETCH `ch` INTO `t`;
IF done THEN
LEAVE drop_tables;
END IF;
DROP TABLE IF EXISTS `t`;
END LOOP;
CLOSE `ch`;
TRUNCATE TABLE `Checkouts`;
END
否则,一旦到达光标的末端,就会出现错误。我用以下方法处理它:
DROP PROCEDURE IF EXISTS `spCheckoutsCleanup`;
CREATE PROCEDURE `spCheckoutsCleanup` ()
SQL SECURITY INVOKER
BEGIN
DECLARE done int DEFAULT 0;
DECLARE t CHAR(64);
DECLARE ch CURSOR FOR SELECT `unid` FROM `Checkouts`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN ch;
drop_table: LOOP
FETCH ch INTO t;
IF done = 1 THEN
LEAVE drop_table;
END IF;
SET @sql := CONCAT('DROP TABLE IF EXISTS `', t, '`');
PREPARE dropt FROM @sql;
EXECUTE dropt;
END LOOP;
CLOSE ch;
TRUNCATE TABLE `Checkouts`;
END;
CALL spCheckoutsCleanup;