Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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_Loops_Cursor_Procedure - Fatal编程技术网

Mysql 过程中的游标不返回任何值

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

我有一个创建临时表的数据库,这些表名随机生成并保存在checkout.unid中。我想删除所有这些表并截断表签出。我认为最漂亮的解决方案是一个程序,但它不会起作用:

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;