Loading

Oracle 批量插入解决主键冲突方案

代码案例

MERGE INTO table_a t 
USING (
	SELECT	值1 别名1,	值2 别名2,	值3 别名3 FROM	DUAL 
	UNION ALL 
	SELECT	值1 别名1,	值2 别名2,	值3 别名3 FROM	DUAL  ) t1 
ON ( t.列1 = t1.别名1 AND t.列2= t1.别名2 ) 
	WHEN MATCHED THEN
UPDATE 
	SET t.列1= t1.别名1,
	t.列2 = t1.别名2,
	t.列3 = t1.别名3
	WHEN NOT MATCHED THEN
	INSERT ( 列1, 列2, 列3 )
VALUES
	(
	t1.别名1,
	t1.别名2,
	t1.别名3
	)

实际案例

<insert id="save" parameterType="****Qs.***">
        merge into S***E t
        <!-- insert 和update中所有的数据都需要从using中获取 -->
        using(
        <!-- item:list中的具体对象 -->
        <foreach collection="qs**.lines"  item="item" open="" close="" separator="union">
            select
            #{item.HeaderId} Hid, #{item.LineId} Lid, #{item.s**r} Sn,
            #{item.i***e} En, #{item.i**e} Zn, #{item.n***r} Nn,
            #{item.u**t} Uc, #{item.c***s} Cd, #{item.p**ow} Vl,
            #{item.p**h} Vh, #{q**q.l***e} Lud, #{q***q.l***y} Lub,
            #{q**q.c**e} Da, #{q***q.c***y} Ba
            from DUAL
        </foreach>
        ) tmp
        <!-- on后面的括弧不能省 -->
        on ( t.Q***D = tmp.Lid)
        when matched THEN
        update set
        <!-- ORA-38104: 在on条件中的列是不可以更新的 t.ID = tmp.ID -->
        t.Q***D = tmp.Hid,t.S***R = tmp.Sn
        ,t.I***E = tmp.En,t.I***E = tmp.Zn,t.NA***R = tmp.Nn
        ,t.U***NT = tmp.Uc,t.C***S = tmp.Cd,t.PR***W = tmp.Vl
        ,t.P***H = tmp.Vh,t.L***E = tmp.Lud,t.L***Y = tmp.Lub
        ,t.C***E=tmp.Da,t.C***Y=tmp.Ba
        when not matched THEN
        insert
        <trim prefix="(" suffix=")" suffixOverrides=",">
            t.Q***D, t.Q***D, t.S***R,
            t.I***E, t.I***E, t.N***R,U***T, t.C***S, t.P***W,
            t.P**H, t.L***E, t.L***Y, t.C***E, t.C***Y
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            tmp.Hid, tmp.Lid, tmp.Sn,
            tmp.En, tmp.Zn, tmp.Nn,tmp.Uc, tmp.Cd, tmp.Vl,
            tmp.Vh, tmp.Lud, tmp.Lub, tmp.Da, tmp.Ba
        </trim>
    </insert>
posted @ 2022-06-16 11:38  Cn_FallTime  阅读(420)  评论(0编辑  收藏  举报