业务场景:
子站给我们传的配置数据,包含新增的配置数据和修改的配置数据,两种数据混在一起,所以我现在要根据数据库中是否有某条配置数据来判断子站传过来的数据是新增还是修改。
首先创建oracle的序列,查询oracle的序列
select SEQUENCE_OWNER,SEQUENCE_NAME from dba_sequences where sequence_owner='用户名';
查找出来自己项目使用的序列,根据规则进行命名
DROP SEQUENCE SEQ_COAL_DEPARTMENT_LISTID;
CREATE SEQUENCE SEQ_COAL_DEPARTMENT_LISTID
INCREMENT BY 1
START WITH 1
MAXVALUE 1.0E20
MINVALUE 1
NOCYCLE
CACHE 20
NOORDER;
==============本来想的
我们的项目不能用网上说的方法生成ID,可能是mybatis的原因,这里就采用增加1次查一次吧
<select id="getCoalDepartmentId" resultType="java.lang.Long">
select SEQ_COAL_DEPARTMENT_LISTID.nextval from dual
</select>
=============后来做的
使用merge into来做新增还是修改的逻辑判断,
如果按照平常的逻辑先查询数据库是否有这条配置数据 再根据查询的结果再增加,这样代码量也多,性能也不好,所以选择了这个
<insert id="insertCoalDepartment" parameterType="java.util.List">
merge into IDS_COAL_DEPARTMENT_INFO_T t1
using
(
<foreach collection="list" item="item" index="index" separator="union">
select
#{item.coalCode,jdbcType=VARCHAR} coalCode,#{item.teamType,jdbcType=BIGINT} teamType,
#{item.teamCode,jdbcType=VARCHAR} teamCode,#{item.teamName,jdbcType=VARCHAR} teamName,
#{item.workingStation,jdbcType=VARCHAR} workingStation,#{item.parentCode,jdbcType=VARCHAR} parentCode,
#{item.lastModify,jdbcType=BIGINT} lastModify
from dual
</foreach>
) t2
on (t1.COAL_CODE = t2.coalCode and t1.TEAM_CODE = t2.teamCode)
when matched then
update set
t1.TEAM_TYPE = t2.teamType,
t1.TEAM_NAME = t2.teamName,
t1.WORKING_STATION = t2.workingStation,
t1.PARENT_CODE = t2.parentCode,
t1.LAST_MODIFY = t2.lastModify
when not matched then
insert values(GET_SEQUENCE('SEQ_COAL_DEPARTMENT_LISTID'),t2.coalCode,t2.teamType,t2.teamCode,t2.teamName,t2.workingStation,t2.parentCode,t2.lastModify)
</insert>
这里GET_SEQUENCE是写的一个函数,没想到能直接在insert方法里面使用
FUNCTION GET_SEQUENCE(in_seq_name VARCHAR2) RETURN NUMBER IS
next_val NUMBER;
BEGIN
execute immediate 'SELECT '||in_sequence||'.nextval FROM dual' INTO next_val;
RETURN next_val;
END;
创建触发器(题外话) 本来没找到如何在merge into 的insert逻辑怎么插入自增组件的方法,就想着采用触发器,每次插入数据的时候,再进行主键Id增加,但是后来发现,插入操作不传主键值的话会报错,就放弃了这种想法。
CREATE OR REPLACE TRIGGER dept_before_insert
BEFORE INSERT ON IDS_COAL_DEPARTMENT_INFO_T
FOR EACH ROW WHEN (NEW.ID IS NULL)
BEGIN
SELECT dept_seq.NEXTVAL INTO :NEW.ID FROM dual ;
END ;
具体性能还没有做测试,目前先这么做吧,看网上的代码写的乱七八糟,也是很烦,我这只是工作用,记录一下