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>
本文来自博客园,作者:Cn_FallTime,转载请注明原文链接:https://www.cnblogs.com/CnFallTime/p/16381420.html