2011-11-14 196 views
1

我有一個存儲過程,它將視圖中的行插入到臨時表中。臨時表在MySQL存儲過程中不返回結果集

臨時表是在我運行插入值的遊標循環之前創建的,並且在循環完成後進行SELECT'ed。

但是,當我CALL medianMessagesPerWeek();我得到一個「錯誤代碼:1329沒有數據 - 獲取,選擇或處理零行。」

如果我創建表的MyISAM表,我可以手動選擇表並確認數據已經被插入,但存儲的過程還是會給予我什麼。

我在這裏錯過了什麼嗎?

DELIMITER $$ 

USE `yongopal_metrics`$$ 

DROP PROCEDURE IF EXISTS `medianMessagesPerWeek`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `medianMessagesPerWeek`() 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE tempJoinWeek, tempActiveWeek, rank INT DEFAULT 0; 
    DECLARE joinWeek, activeWeek, memberNo, messages INT; 
    DECLARE cur CURSOR FOR SELECT * FROM cohortMessagesPerMemberPerWeek; 

    DROP TEMPORARY TABLE IF EXISTS medianMessagesPerWeek; 
    CREATE TEMPORARY TABLE medianMessagesPerWeek 
    (
     joinWeek INT, 
     activeWeek INT, 
     memberNo INT, 
     messages INT, 
     rank INT 
    ) ENGINE=MEMORY;  

    OPEN cur; 

    read_loop: LOOP 
     FETCH cur INTO joinWeek, activeWeek, memberNo, messages; 
     IF done THEN 
      LEAVE read_loop; 
     END IF; 

     IF tempJoinWeek = joinWeek AND tempActiveWeek = activeWeek THEN 
      SET rank = rank + 1; 
     ELSE 
      SET tempJoinWeek = joinWeek; 
      SET tempActiveWeek = activeWeek; 
      SET rank = 1; 
     END IF; 
     INSERT INTO medianMessagesPerWeek VALUES (joinWeek, activeWeek, memberNo, messages, rank); 
    END LOOP; 

    CLOSE cur; 

    SELECT * FROM medianMessagesPerWeek; 
    DROP TEMPORARY TABLE IF EXISTS medianMessagesPerWeek; 
    END$$ 

DELIMITER ; 

編輯

這裏是cohortMessagesPerMemberPerWeek樣子

DELIMITER $$ 

USE `yongopal_metrics`$$ 

DROP VIEW IF EXISTS `cohortMessagesPerMemberPerWeek`$$ 

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `cohortMessagesPerMemberPerWeek` AS 
SELECT 
    WEEK(`m`.`regDatetime`,0) AS `joinWeek`, 
    WEEK(`cd`.`sendDate`,0) AS `activeWeek`, 
    `m`.`memberNo` AS `memberNo`, 
    COUNT(0)  AS `messages` 
FROM (`yongopal`.`chatData` `cd` 
    JOIN `yongopal`.`members` `m` 
    ON ((`cd`.`sender` = `m`.`memberNo`))) 
GROUP BY WEEK(`m`.`regDatetime`,0),WEEK(`cd`.`sendDate`,0),`m`.`memberNo` 
ORDER BY WEEK(`m`.`regDatetime`,0),WEEK(`cd`.`sendDate`,0)$$ 

DELIMITER ; 

回答

2

你好像缺少一個not found handlercur光標。當fetch語句不再返回任何行(因此您已達到遊標聲明返回的數據集的末尾)時,將done布爾值設置爲true是必要的。

試試這個:

DELIMITER $$ 

USE `yongopal_metrics`$$ 

DROP PROCEDURE IF EXISTS `medianMessagesPerWeek`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `medianMessagesPerWeek`() 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE tempJoinWeek, tempActiveWeek, rank INT DEFAULT 0; 
    DECLARE joinWeek, activeWeek, memberNo, messages INT; 
    DECLARE cur CURSOR FOR SELECT * FROM cohortMessagesPerMemberPerWeek; 

    declare continue handler for not found set done := true; 

    DROP TEMPORARY TABLE IF EXISTS medianMessagesPerWeek; 
    CREATE TEMPORARY TABLE medianMessagesPerWeek 
    (
     joinWeek INT, 
     activeWeek INT, 
     memberNo INT, 
     messages INT, 
     rank INT 
    ) ENGINE=MEMORY;  

    OPEN cur; 

    read_loop: LOOP 
     FETCH cur INTO joinWeek, activeWeek, memberNo, messages; 
     IF done THEN 
      LEAVE read_loop; 
     END IF; 

     IF tempJoinWeek = joinWeek AND tempActiveWeek = activeWeek THEN 
      SET rank = rank + 1; 
     ELSE 
      SET tempJoinWeek = joinWeek; 
      SET tempActiveWeek = activeWeek; 
      SET rank = 1; 
     END IF; 
     INSERT INTO medianMessagesPerWeek VALUES (joinWeek, activeWeek, memberNo, messages, rank); 
    END LOOP; 

    CLOSE cur; 

    SELECT * FROM medianMessagesPerWeek; 
    DROP TEMPORARY TABLE IF EXISTS medianMessagesPerWeek; 
    END$$ 

DELIMITER ; 
+0

哇,那沒有的伎倆!什麼確切聲明「找不到」呢? –

+0

我猜如果沒有聲明,存儲的過程會在光標結束循環後結束? –

+1

是的。有點。如果你錯過了'找不到'處理程序,那麼proc會將'找不到數據'狀態(即,沒有數據留在從光標讀取的狀態)作爲錯誤處理。添加處理程序告訴proc「如果你得到'找不到數據'狀態不要拋出錯誤 - 只需將我的'done'布爾值設置爲true」。快速閱讀我在答覆中發佈的鏈接,因爲它能夠比我更好地解釋它!很高興幫助。 –

相關問題