반응형

 

*Merge문 활용

- MERGE INTO문을 이용하면 하나의 SQL 안에서 INSERT, UPDATE, DELETE 작업을 한번에 처리할 수 있다. 이 기능은 Oracle 9i부터 제공되기 시작했고, DELETE 작업까지 처리할 수 있게 된 것은 10g부터다. SQL Server도 2008 버전부터 이 문장을 지원하기 시작했다.

 - MERGE INTO는 기간계 시스템으로부터 읽어온 신규 및 변경분 데이터를 DW 시스템에 반영하고자 할 때 사용하면 효과적이다. 아래는 MERGE문을 이용해 INSERT, UPDATE를 동시에 처리하는 예다.

 

 

MERGE INTO 고객 T USING 고객변경분 S ON (T.고객번호 = S.고객번호)

 WHEN MATCHED THEN UPDATE

SET T.고객번호 = S.고객번호, T.고객명 =  S.고객명, T.이메일 = S.이메일

WHEN NOT MATCHED THEN INSERT

(고객번호, 고객명, 이메일, 전화번호, 거주지역, 주소, 등록일시) VALUES

(S.고객번호, S.고객명, S.이메일, S.전화번호, S.거주지역, S.주소, S.등록일시)

;

 

*Oracle 10g부터는 아래와 같이 UPDATE와 INSERT를 선택적으로 처리할 수 있다.

 

MERGE INTO 고객 T USING 고객변경분 S ON (T.고객번호 = S.고객번호)

WHEN MATCHED THEN UPDATE

SET T.고객번호 = S.고객번호, T.고객명 = S.고객명, T.이메일 = S.이메일

 ;

 

MERGE INTO 고객 T USING 고객변경분 S ON (T.고객번호 = S.고객번호)

WHEN NOT MATCHED THEN INSERT

(고객번호, 고객명, 이메일, 전화번호, 거주지역, 주소, 등록일시) VALUES

(S.고객번호, S.고객명, S.이메일, S.전화번호, S.거주지역, S.주소, S.등록일시)

;

 


---------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------

 

-- KSEI ACNT NO AND SID UPDATE
MERGE INTO A0T100M D
     USING TMP_ACT@DEV3 S
        ON (
                 (REPLACE(D.KSEI_ACNT_NO, '-', '') = S.KSEI_ACNT_NO)
             AND (D.ACNT_STAT_SECT <> '99')
             AND (S.SSID IS NOT NULL)
           )
      WHEN MATCHED THEN UPDATE
       SET D.NKSEI_ACNT_NO = S.SSID
         , D.SID           = S.SID
         , D.TXRT_CD       = S.TAX1
;

---------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------

 

반응형
반응형

*Merge는 Oracle 9i부터 추가됐다.
9i와 10g에서 Merge의 사용법이 약간 상이한 것 같다.

 

CREATE TABLE em01 AS SELECT *
FROM emp

;

 

CREATE TABLE em02
    AS SELECT *
  FROM emp

;

 

UPDATE em02
    SET job='TEST'
FROM emp
WHERE job='MANAGER'

;


1. 9i에서 Merge
MERGE INTO em01 n1 USING (select ename, job, mgr, hiredate, sal, comm, deptno, empno from em02) e1

 ON ( n1.empno = e1.empno )
WHEN MATCHED THEN UPDATE
     SET n1.ename = e1.ename,
            n1.job = e1.job, 
            n1.mgr = e1.mgr,
            n1.hiredate = e1.hiredate,
            n1.sal = e1.sal,
            n1.comm = e1.comm,
            n1.deptno = e1.deptno
WHEN NOT MATCHED THEN
    INSERT ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
        values ( e1.empno,
                    e1.ename,
                    e1.job, 
                    e1.mgr,
                    e1.hiredate,
                    e1.sal,
                    e1.comm,
                     e1.deptno )

;


2. 10g에서 Merge
MERGE INTO em01 n1 USING em02 e1
    ON ( n1.empno = e1.empno )
WHEN MATCHED THEN UPDATE
    SET n1.empno = e1.empno,
        n1.ename = e1.ename,
        n1.job = e1.job, 
        n1.mgr = e1.mgr,
        n1.hiredate = e1.hiredate,
        n1.sal = e1.sal,
        n1.comm = e1.comm,
        n1.deptno = e1.deptno
WHEN NOT MATCHED THEN
    INSERT ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
        values ( e1.empno,
                e1.ename,
                e1.job, 
                e1.mgr,
                e1.hiredate,
                e1.sal,
                e1.comm,
                e1.deptno )

;


Merge when no data found

https://community.oracle.com/tech/developers/discussion/2595696/merge-when-no-data-found


insert
  into emp
       (
           empno
         , ename
         , job
         , mgr
         , hiredate
         , sal
         , comm
         , deptno
       )
select 1, 's', 's', 23, sysdate, 12, '', 34
  from dual
where not exists
       (
          select null
            from emp
           where empno = 1
        )

반응형