2011-11-14 5 views
1

나는 랭크가있는 뷰의 행을 임시 테이블에 삽입하는 저장된 proc를가집니다.임시 테이블이 MySQL에 저장된 결과 집합을 반환하지 않습니다

임시 테이블은 값을 삽입 한 커서 루프를 실행하고 루프가 완료된 후 SELECT를 실행하기 전에 만들어집니다.

그러나 내가 medianMessagesPerWeek()를 호출하면; "오류 코드 : 1329 데이터가 없습니다 - 행을 가져 오거나 선택했거나 처리했습니다."

테이블을 MYISAM 테이블로 만들면 수동으로 테이블을 선택하고 데이터가 삽입되었지만 저장된 proc이 아무 것도주지 않음을 확인할 수 있습니다.

여기에 뭔가가 있습니까?

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 ; 

EDIT 여기

당신이 당신의 cur 커서에 대한 not found handler 누락있는 것처럼

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

이 보이는 것처럼 cohortMessagesPerMemberPerWeek 보이는 것입니다. 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

그 선언하지 않으면 커서가 루핑 완료 후 저장된 proc 그냥 끝날 것 같아요? –

+1

예. 일종의. '발견되지 않음'핸들러가 누락 된 경우 proc은 '데이터 없음'상태 (즉, 커서에서 페치 할 데이터가없는 상태)를 오류로 처리합니다. 처리기를 추가하면 proc에 "데이터가 없습니다 '상태가되면 오류가 발생하지 않습니다. 단지'done' 부울을 true로 설정하십시오." 가능한 한 더 잘 설명 할 수있을 것이므로 내 답변에 게시 된 링크를 빠르게 읽으십시오! 기쁜 데 도움이되었습니다. –

관련 문제