2015. 1. 12. 21:55

[Oracle] MERGE INTO

MERGE INTO 구문

 

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

 

 

◆ 문법

 

MERGE INTO 테이블 a               -- update또는 insert할 테이블

       USING 대상테이블/뷰 b      -- 비교대상 (동일 테이블이라면 using dual 사용)

           ON (조건)                   -- a와 b의 조인식

        WHEN MATCHED THEN

                  UPDATE SET

                              컬럼1 = 값1

                              컬럼2 = 값2

                  DELETE WHERE (조건)

        WHEN NOT MATCHED THEN

                  INSERT(컬럼1, 컬럼2...)

                  VALUES(값1, 값2...)

 

 - INTO : DATA가 UPDATE되거나 INSERT 될 테이블 또는 뷰를 지정.
 - USING : 비교할 SOURCE 테이블 또는 뷰나 서브쿼리를 지정, INTO절의 테이블과 동일하거나 다를 수 있다.
 - ON : UPDATE나 INSERT를 하게 될 조건으로, 해당 조건을 만족하는 DATA가 있으면 WHEN MATCHED 절을 실행하게 되고, 없으면 WHEN NOT MATCHED 이하를 실행하게 된다.
 - WHEN MATCHED : ON 조건절이 TRUE인 ROW에 수행 할 내용 (UPDATE, DELETE포함 될 수 있음)
 - WHEN NOT MATCHED : ON 조건절에 맞는 ROW가 없을 때 수행할 내용 (INSERT)

 

※ 오라클 9버전이상에서 사용가능하다.

 

 

◆ SAMPLE

 

MERGE INTO STO_TEMP1 T1
     USING (SELECT EBELN, EBELP
              FROM STO_TEMP
             WHERE EBELN = '4501134859' AND EBELP = '00010') T
        ON (T1.EBELN = T.EBELN AND T1.EBELP = T.EBELP)
WHEN MATCHED
THEN
   UPDATE SET T1.MBLNR = T.MBLNR, T1.BUDAT = T.BUDAT
   DELETE
           WHERE T1.MBLNR = '4926768928'
WHEN NOT MATCHED
THEN
   INSERT     (T1.EBELN,
               T1.EBELP,
               T1.MBLNR,
               T1.BUDAT)
       VALUES (T.EBELN,
               T.EBELP,
               T.MBLNR,
               T.BUDAT)