Mysql 數據遷移引發的sql 雙重 for 循環 存儲過程的編寫 (包含Mysql 5.7 JDBCType 爲 json 的字段的操作 )

這次數據遷移主要涉及的數據爲,從一張表遷移到另一張表,同時將一列 JDBCType JSON (JsonArray)的數據拆分成多個字段,這裏用到了存儲過程,其中用到了雙重循環。

delimiter //                            #定義標識符爲雙斜槓
drop procedure if exists outFor;          #如果存在test存儲過程則刪除
create procedure outFor()                 #創建無參存儲過程,名稱爲outFor
begin
    declare i int;                      #申明變量
        #申明變量
    set i = 0;                          #變量賦值
        set @k = (SELECT count(1)  FROM (select a.app_list from avn_assets a inner join avn_asset_new b on a.id = b.id) c);
    while i < @k do                     #結束循環的條件: 跳出while循環
            # 內層循環
            #--------------------
            set @m = (SELECT json_length(app_list)  FROM (SELECT (@i:=@i+1) sq, c.app_list FROM (select a.app_list from avn_assets a inner join avn_asset_new b on a.id = b.id) c,  (SELECT @i:=-1) as sq) temp WHERE temp.sq = i);
#                                    SELECT concat("i",i,@m);
        set @j = 0;
        WHILE @j < @m DO
            INSERT INTO avn_asset_new_app(uid,app_name,app_sign,created_at,updated_at)
            SELECT  JSON_UNQUOTE(json_extract(app_list,CONCAT('$[',@j,'].uid'))),
             JSON_UNQUOTE(json_extract(app_list,CONCAT('$[',@j,'].app_name'))),
            created_at,updated_at  FROM (SELECT (@i:=@i+1) sq,c.id, c.app_list,c.updated_at  FROM (select a.id,a.app_list,a.created_at, from avn_assets a inner join avn_asset_new b on a.id = b.id) c,  (SELECT @i:=-1) as sq) temp WHERE temp.sq = i;
            set @j = @j + 1;
            END WHILE;                
            #--------------------
    set i = i + 1;                  #循環一次,i加一
    end while;                          #結束while循環
end
//                                      #結束定義語句
call outFor(); 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章