這次數據遷移主要涉及的數據爲,從一張表遷移到另一張表,同時將一列 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();