存储过程的使用
问题
今天遇到一个场景,user用户表要拆分成user-employee表,user-customer表,user-account表,三个子表的数据均有部分来自于user表,需要从user表中向其他三个字表中导入数据。
解决办法
之前有想到三种办法
-
第一种是在测试用例中操作数据源完成数据的导出导入,但这样有一个缺点,就是我的Entity已经修改了,如果要导出,需要新建dto来接住数据,然后在插入到数据库中,这些新的dto与代码逻辑无关,在项目里会有一定的误导性。
-
第二种是用mysql自带的export和import工具来完成导出导入,这是个笨办法,如果数据量很多的情况下,需要手动调整或在写额外的程序来调整数据,才能插入到库中
-
第三种是用存储过程来完成,只是设计到数据库表结构的维护,以及数据的清洗,用存储过程来做,我认为比较独立也比较好维护
代码
下面是在从user表往user_account表中导数据的存储过程:
declare id_i varchar(32);
declare loginName_i varchar(255);
declare password_i varchar(255);
declare loginToken_i varchar(32);
declare createTime_i bigint(32);
declare creatorId_i varchar(32);
declare modifyTime_i bigint(32);
declare modifierId_i varchar(32);
#用于提示存储过程执行情况
declare str varchar(300);
declare x int;
#用于处理游标到达最后一行的情况
declare s int default 0;
#cur1是一个多行结果集
declare cur1 cursor for select id,loginName,password,loginToken,createTime,creatorId,modifyTime,modifierId from user order by createTime desc;
#设置一个终止标记
declare continue handler for not found set s = 1;
open cur1;
fetch cur1 into id_i,loginName_i,password_i,loginToken_i,createTime_i,creatorId_i,modifyTime_i,modifierId_i;
while s<> 1 do
insert into user_account(id,loginName,password,loginToken,createTime,creatorId,modifyTime,modifierId) values(id_i,loginName_i,password_i,loginToken_i,createTime_i,creatorId_i,modifyTime_i,modifierId_i);
#读取下一行数据
fetch cur1 into id_i,loginName_i,password_i,loginToken_i,createTime_i,creatorId_i,modifyTime_i,modifierId_i;
end while;
close cur1;
select str;