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 ;
哇,那沒有的伎倆!什麼確切聲明「找不到」呢? –
我猜如果沒有聲明,存儲的過程會在光標結束循環後結束? –
是的。有點。如果你錯過了'找不到'處理程序,那麼proc會將'找不到數據'狀態(即,沒有數據留在從光標讀取的狀態)作爲錯誤處理。添加處理程序告訴proc「如果你得到'找不到數據'狀態不要拋出錯誤 - 只需將我的'done'布爾值設置爲true」。快速閱讀我在答覆中發佈的鏈接,因爲它能夠比我更好地解釋它!很高興幫助。 –