ストアド・プロシージャおよびデュアル・ループ・カーソルの使用

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();