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回だけ実行します
この問題を解決する方法。私がやること ?問題の解決に役立つ人もいます。私はこのような私のストアドプロシージャを変更した
、私は理由を見つけることができないのです。だから私は単一のカーソルでストアドプロシージャを変更し、いくつかの条件で上記のストアドプロシージャの効果を達成しています。 –
頭の周りの鼻のような感じです。 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; –
テーブルの構造だけでなく、いくつかのテストデータを公開すると、より簡単に役立ちます。 – wchiquito