2016-12-24 6 views
1
DELIMITER $$ 

CREATE PROCEDURE `remove_schedule_duplicate`() 
BEGIN 
    BLOCK1 : BEGIN 

    DECLARE finished INTEGER DEFAULT 0; 
    DECLARE schedule_id CHAR(36); 
    DECLARE gamePk INTEGER; 
    DECLARE keep_entry TINYINT(1); 
    DECLARE scheduleDuplicate CURSOR FOR SELECT game_pk FROM schedule where is_active = 1 group by game_pk,home_team_id,away_team_id,venue_id having count(game_pk) > 1 limit 2; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; 

    OPEN scheduleDuplicate; 

    get_schedule_duplicate: LOOP 

    FETCH scheduleDuplicate INTO gamePk; 

    IF finished = 1 THEN 
     LEAVE get_schedule_duplicate; 
      END IF; 

      **BLOCK2 : BEGIN 

      DECLARE block_finished INTEGER DEFAULT 0; 
      DECLARE blockDuplicate CURSOR FOR SELECT id FROM schedule where game_pk = gamePk and is_active = 1; 
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET block_finished = 1; 

      OPEN blockDuplicate; 

      block_schedule_duplicate: LOOP 

      FETCH blockDuplicate INTO schedule_id; 

      IF block_finished = 1 THEN 
       LEAVE block_schedule_duplicate; 
         END IF; 

         IF keep_entry = 0 THEN 
          UPDATE schedule set is_active = 0 where id = schedule_id; 
         END IF; 

        END LOOP block_schedule_duplicate; 

        CLOSE blockDuplicate; 

      END BLOCK2;** 

     END LOOP get_schedule_duplicate; 

     CLOSE scheduleDuplicate; 

END BLOCK1; 

END 

$$ 

問題は、内部ループが最初に実行された後、そのブロック完了が常に1になることです。常に内側のブロックを終了します。MySQLインナーカーソルは1回だけ実行します

この問題を解決する方法。私がやること ?問題の解決に役立つ人もいます。私はこのような私のストアドプロシージャを変更した

+0

、私は理由を見つけることができないのです。だから私は単一のカーソルでストアドプロシージャを変更し、いくつかの条件で上記のストアドプロシージャの効果を達成しています。 –

+0

頭の周りの鼻のような感じです。 DECLARE scheduleDisk_pk、id FROM schedule game_pk in(select game_pk FROM scheduleは、game_pk、home_team_id、away_team_id、countue(game_pk)> 1のvenue_idでis_active = 1グループ、game_pkではis_active = 1オーダーです。 DECLARE CONTINUE HANDLER NOT FOUND SETが完了しました= 1; –

+0

テーブルの構造だけでなく、いくつかのテストデータを公開すると、より簡単に役立ちます。 – wchiquito

答えて

0

は:まだ

DELIMITER $$ 
CREATE PROCEDURE `remove_schedule_duplicate`() 
BEGIN 
    DECLARE finished INTEGER DEFAULT 0; 
    DECLARE schedule_id,temp CHAR(36) DEFAULT NULL; 
    DECLARE gamePk INTEGER; 
    DECLARE keep_entry TINYINT(1); 
    DECLARE scheduleDuplicate CURSOR FOR SELECT game_pk,id FROM schedule where game_pk in (SELECT game_pk FROM schedule where is_active = 1 group by game_pk,home_team_id,away_team_id,venue_id having count(game_pk) > 1) and is_active = 1 order by game_pk; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; 

    OPEN scheduleDuplicate; 

     get_schedule_duplicate: LOOP 

     FETCH scheduleDuplicate INTO gamePk,schedule_id; 

     IF finished = 1 THEN 
      LEAVE get_schedule_duplicate; 
     END IF; 

     IF ((temp IS NULL) AND (gamePk IS NOT NULL)) OR ((temp IS NOT NULL) AND (temp <> gamePk)) THEN 
      SET temp = gamePk; 
      SET keep_entry = 1; 
     #ELSE IF temp IS NOT NULL AND temp = gamePk THEN 
     ELSE 
      SET keep_entry = 0; 
     END IF; 

     IF keep_entry = 0 THEN 
       UPDATE schedule set is_active = 0 where id = schedule_id; 
     END IF; 

     END LOOP get_schedule_duplicate; 

    CLOSE scheduleDuplicate; 

END$$ 
DELIMITER ; 
関連する問題