mdm_organization(源表)与mdm_zn_organiztaion(目标表)之间进行增量同步,同步规则:先查询目标表中数据的最大的最后修改时间,根据最大的最后修改时间在源表中进行过滤查询。查询结果与目标表进行合并(使用merge into)
查询表中数据的最大的最后修改时间
select nvl(max(org_last_modified_time),to_date(‘1900‘,‘yyyy‘)) from mdm_zn_organization
根据最大的最后修改时间在源表中进行过滤
select * from mdm_organization o where o.org_last_modified_time > (select nvl(max(org_last_modified_time),to_date(‘1900‘,‘yyyy‘)) from mdm_zn_organization)
这种错误表示两个时间比较时类型要一致,都转为Date类型。修改如下
select * from mdm_organization o where o.org_last_modified_time > to_date((select nvl(max(org_last_modified_time),to_date(‘1900‘,‘yyyy‘)) from mdm_zn_organization),‘yyyy-mm-dd hh24:mi:ss‘)
这种错误表示传入的时间格式为:2017-11-18 00:31:08.0,共21位,而‘yyyy-mm-dd hh24:mi:ss‘格式需要19位。
所以先用substr 将时间截取前19位,修改如下:
select * from mdm_organization o where o.org_last_modified_time > to_date(substr((select nvl(max(org_last_modified_time),to_date(‘1900‘,‘yyyy‘)) from mdm_zn_organization),1,19),‘yyyy-mm-dd hh24:mi:ss‘)
另一种写法如下:
select * from mdm_organization o where o.org_last_modified_time > (select nvl(max(to_date(substr(org_last_modified_time,1,19),‘yyyy-mm-dd hh24:mi:ss‘)),to_date(‘1900‘,‘yyyy‘)) from mdm_zn_organization)
查询结果与上面一样。
根据mapper下的queryAll方法查询出大于最大的最后修改时间的数据,返回list,代码如下:
List<Map<String,String>> list = OrganizationMapper.queryAll(); for (Map<String,String> org_map : list) { UUID random = UUID.randomUUID(); String str = random.toString(); String newStr = str.replace("-", ""); org_map.put("ID", newStr); OrganizationMapper.insertOrg(org_map); }
接下来执行merge into操作,使用mybatis的自动生成sql语句,如下
<insert id="insertOrg" parameterType="java.util.Map"> MERGE INTO mdm_zn_organization T1 USING (SELECT <foreach collection="map.keys" item="k" index="index" open="" separator="," close=" "> ‘${map.get(k)}‘ ${k} </foreach> FROM DUAL) T2 ON (T1.CODE = T2.ORG_CODE) WHEN MATCHED THEN UPDATE SET T1.ORG_PARENT_CODE = T2.ORG_PARENT_CODE, T1.ORG_COMPANY_CODE = T2.ORG_COMPANY_CODE, T1.ORG_LAST_MODIFIED_TIME = T2.ORG_LAST_MODIFIED_TIME WHEN NOT MATCHED THEN INSERT (T1.ID, T1.CODE, T1.ORG_PARENT_CODE, T1.ORG_COMPANY_CODE, T1.ORG_LAST_MODIFIED_TIME) VALUES (T2.ID, T2.ORG_CODE, T2.ORG_PARENT_CODE, T2.ORG_COMPANY_CODE, T2.ORG_LAST_MODIFIED_TIME) </insert>
接下来配置spring quartz定时器。定时执行增量同步操作。
到此增量同步完成。
原文地址:https://www.cnblogs.com/lirun/p/9116796.html
时间: 2024-10-08 22:49:21