영보의 SystemOut.log

[Oracle] 오라클 MERGE INTO 사용 (MySQL: ON DUPLICATE KEY) 변환하기 본문

Database/Oracle

[Oracle] 오라클 MERGE INTO 사용 (MySQL: ON DUPLICATE KEY) 변환하기

영보로그 2021. 6. 5. 21:04
반응형

 MySQL 코드 (ON DUPLICATE KEY)

insert into cms_main
			(
			siteid, maintype, rollyn, rolltime, insertdate, insertuser,
			insertip, modifydate, modifyuser, modifyip, delyn
			)
		values
			(
			#{siteid},#{maintype},#{rollyn},#{rolltime},
			#{insertdate},#{insertuser},#{insertip},
			#{modifydate},#{modifyuser},#{modifyip},#{delyn}
			)
		on duplicate key update
		rollyn=values(rollyn),
		rolltime=values(rolltime),
		modifydate=values(modifydate),
		modifyuser=values(modifyuser),
		modifyip=values(modifyip),
		delyn=values(delyn)
	</insert>

 위의 코드는 기존에 INSERT문과 비슷하나 중간에 ON DUPLICATE KEY 문이 핵심이다.

만약 INSERT하려는 테이블에 VALUES값들이 이미 존재하고 있으면

ON DUPLICATE KEY를 이용하여 INSERT하지 않고, UPDATE 해준다.

 

 

 

 Oracle 코드 (MERGE INTO)

<insert id="mainInsert">

		MERGE INTO cms_main
		USING DUAL
		ON (siteid = #{siteid} AND maintype = #{maintype} AND rollyn = #{rollyn} AND rolltime = #{rolltime}
			AND insertdate = #{insertdate} AND insertuser = #{insertuser} AND insertip = #{insertip} AND modifydate = #{modifydate}
			AND modifyuser = #{modifyuser} AND modifyip = #{modifyip} AND  delyn =#{delyn}
		)
		WHEN MATCHED THEN
		UPDATE SET
		rollyn= #{rollyn},
		rolltime= #{rolltime},
		modifydate= #{modifydate},
		modifyuser= #{modifyuser},
		modifyip= #{modifyip},
		delyn= #{delyn)
	</insert>

위의 MySQL 코드를 Oracle로 변환한 건 좀 더 복잡하다.

 

DUAL사용할 테이블이 하나라는 뜻이고, ON 옆에는 비교연산을 해야한다.
INSERT 값과 VALUES의 파라미터 값을 비교하여 두 비교 연산이 같으면 ,
WHEN MATCHED THEN에서 규정한 값으로 UPDATE SET 해준다

 

반응형