DATABASE

[ORACLE] MERGE문

오래오래 늘 함께 2018. 11. 6. 09:55
  • MERGE INTO 구문
- 조건에 따라서 데이터의 삽입, 갱신, 삭제 작업을 한번에 할 수 있다.
- 해당 행이 존재하는 경우 UPDATE / 새로운 행일경우 INSERT 수행한다.
- 대상 테이블에 대한 UPDATE/INSERT 조건은 ON절에 의해 결정된다.
- MERGE문에서 CLOB 사용시 업데이트할 내용이 2000bytes가 넘을때 ORA-00600오류가 발생하며,
  patch set 11.2.0.2 버전으로 해결가능

  • 문법

MERGE INTO 테이블 A                 --- UPDATE / INSERT할 테이블
USEING 대상테이블/뷰 B      --- 비교대상 테이블 ( 동일 테이블이면 using dual 사용)
ON (조건)                 --- A 와 B의 조인식
WHEN MATCHED THEN    --- ON 조건절에 맞는 ROW(행)이 있을때
    UPDATE SET
    컬럼 1 = 값 1
    컬럼 2 = 값 2
   DELETE WHERE (조건)
WHEN NOT MATCHED THEN    --- ON조건절에 맞는 ROW(행)이 없을때 
         INSERT (
                      컬럼1,
                      컬럼2,
                      ....
         ) 
  VALUES (
                값1,
                값2,
                ...
  )

  • 예시
 MERGE INTO IV_PERSON A
USING (SELECT #apno# apno    --- 해당 apno를 가지고 있는 테이블 B
         FROM DUAL
      ) B
   ON (
          A.apno = B.apno         --- 테이블 A의 apno와 테이블 B의 apno가 같은지
        )
WHEN MATCHED THEN        --- apno가 같으면 UPDATE (기존 행 업데이트)
    UPDATE SET 
a.partcd  = (select partcd from iv_apman where apno = #apno#)
,a.chnnm   = #chnnm# 
,a.country = #country#
,a.address = #address#
...
WHEN NOT MATCHED THEN --- apno가 같지 않다면 INSERT (새로운 행 삽입)
    INSERT
       (
           a.apno  
          ,a.partcd
          ,a.chnnm 
          ,a.country
          ,a.address
    ...
       )
       VALUES
       (
                   #apno#             
                  ,(select partcd from iv_apman where apno = #apno#)                
                  ,#chnnm#
  ,#country#
       ,#address#
...  
       )