ストアド・プロシージャおよびデュアル・ループ・カーソルの使用
1859 ワード
問題が発生しました.テーブルがあります.外層サイクル 内層サイクル はその後、
ストレージ・プロシージャの実装
idx
の列を追加し、collectionId
パケットに基づいてデータを問合せ、idx
に値を割り当てます.分割するのは実は2つのサイクルです.SELECT DISTINCT collectionId FROM collection_item
.SELECT id FROM collection_item WHERE collectionId = collection_id
.UPDATE collection_item SET idx = i WHERE id = item_id
を更新する.ストレージ・プロシージャの実装
--
DELIMITER $$
CREATE PROCEDURE update_collection_item()
begin
--
DECLARE collection_id BIGINT;
DECLARE item_id BIGINT;
DECLARE i INT;
DECLARE done INT DEFAULT TRUE;
--
DECLARE cur1 CURSOR FOR SELECT DISTINCT collectionId FROM collection_item;
-- , collection_id (collection_id )
DECLARE cur2 CURSOR FOR SELECT id FROM collection_item WHERE collectionId = collection_id ORDER BY createTime;
--
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = FALSE;
--
OPEN cur1;
-- done == true
WHILE done DO
-- collection_id
-- FETCH cur1 INTO (val1,val2);
FETCH cur1 INTO collection_id;
--
IF done = TRUE THEN
SET i = 1;
--
OPEN cur2;
-- done == true
WHILE done DO
-- item_id
FETCH cur2 INTO item_id;
--
IF DONE = TRUE THEN
--
UPDATE collection_item SET idx = i WHERE id = item_id;
SET i = i + 1;
--
COMMIT;
END IF;
END WHILE;
CLOSE cur2;
-- done FALSE, ,
SET done = TRUE;
END IF;
END WHILE;
CLOSE cur1;
END;$$
DELIMITER ;
--
CALL update_collection_item();