2016-12-24 5 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 

$$ 

Проблема Innerloop в первый раз выполняется хорошо после того, как block_finished всегда будет 1 так. всегда он выходит из внутреннего блока.MySQL Внутренний курсор выполняется только один раз

Как решить эту проблему. Что я делаю ? Кто-то помогает мне решить проблему.

+0

Тем не менее, я не могу найти причину. Поэтому я изменил хранимую процедуру с помощью одного курсора и выполнил действие вышеупомянутой хранимой процедуры с некоторыми условиями. –

+0

Как прикосновение носа вокруг головы. DECLARE scheduleDuplicate CURSOR FOR SELECT game_pk, id FROM schedule, где game_pk в (SELECT game_pk FROM schedule, где is_active = 1 group by game_pk, home_team_id, away_team_id, место_соединения со счетом (game_pk)> 1) и is_active = 1 order by game_pk; DECLARE CONTINUE HANDLER ДЛЯ НЕ НАЙДЕННОГО КОМПЛЕКТА завершено = 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 ; 
Смежные вопросы