【问题标题】:Cursor in Procedure does not return any values过程中的光标不返回任何值
【发布时间】:2015-05-07 08:14:25
【问题描述】:

我有一个创建临时表的数据库,这些表名是随机生成的并保存在 Checkouts.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

我总是得到“没有数据 - 提取、选择或处理零行”,尽管这些表在那里并且表 Checkouts 不是空的。

【问题讨论】:

    标签: mysql loops cursor procedure


    【解决方案1】:

    你必须添加这样的东西才能结束你的循环:

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET ...;
    

    参见documentation. 中的示例。例如。 ...

    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
    

    否则,一旦到达光标的末尾,就会出现错误。

    【讨论】:

      【解决方案2】:

      我得到了它的工作:

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 2014-05-28
        • 2021-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多