временная таблица не возвращает набор результатов в хранимой процедуре MySQL - PullRequest
1 голос
/ 14 ноября 2011

У меня есть сохраненный процесс, который вставляет строки из представления с рангами во временную таблицу.

Временная таблица создается до того, как я запускаю цикл курсора, который вставил значения, и SELECT'ed после циклаготово.

Однако, когда я вызываю 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 ;

1 Ответ

2 голосов
/ 14 ноября 2011

Похоже, вам не хватает обработчика not found для курсора cur.Это необходимо для установки логического значения done в значение true, если оператор fetch больше не возвращает никаких строк (и, следовательно, вы достигли конца набора данных, возвращенного объявлением курсора).попробуй:

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 ;
...