2015-05-07 27 views
0

我有一個數據庫,其中創建臨時表,這些表名隨機生成並保存在Checkouts.unid中。我想放棄所有這些表格並截斷表格Checkout。我以爲niftiest解決方案將是一個過程,但它不會工作:程序中的光標不返回任何值

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 

我總是得到「沒有任何數據 - 零行獲取,選擇,或加工」,雖然這些表在那裏,該表簽出不雖然空了。

回答

0

您必須添加這樣的事情,以結束循環:

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 

否則,一旦您達到遊標末尾,您將收到錯誤。

0

我得到了它這方面的工作:

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;