[ORACLE] MERGE INTO

Database 2013.03.08 11:39 Posted by 애플자라

-- MERGE UPDATE
MERGE INTO IFT_FUND_STANDARD_PRICE_RESULT A
USING (
    SELECT TIMS_DATE,FUND_CODE,BM_INDEX,BM_RATE FROM IFT_FUND_STANDARD_PRICE_RESULT
    WHERE FUND_CODE ='10110'
    AND TIMS_DATE > '20130115'
) B
ON (
    A.TIMS_DATE = B.TIMS_DATE
    AND A.FUND_CODE ='10112'
)
WHEN MATCHED THEN
    UPDATE SET A.BM_INDEX = B.BM_INDEX, A.BM_RATE = B.BM_RATE

=============================================================================================

MERGE INTO를 사용하면 INSERT, UPDATE를 각 케이스 별로 처리할 수 있다.

한꺼번에 데이터를 덮어쓰거나 갱신할때 UPDATE와 INSERT가 동시에 처리되어야 할때가 있는데,

그러한 경우에 유용하게 쓸수 있는 구문이다.


MERGE INTO 대상테이블 A

USING (

) B

ON (

-- 매칭 조건

)

WHEN MATCHED THEN

-- 조건에 매칭될 경우 실행

UPDATE 문 (UPDATE SET ...)

WHEN NOT MATCHED THEN

-- 조건에 매칭되지 않을 경우 실행

INSERT 문 (특이한 점은 INSERT INTO가 아니다.)


예제

MERGE INTO TCOGRNTNUM A

USING (

    SELECT '0009' AS GTNO_KD_CD, GTNO_KEY_VAL, MAX(POL_SEQ) AS SEQ

    FROM (

        SELECT PDGP_CD || SUBSTR(TO_CHAR(INS_BGN_DT, 'YYYYMMDD'), 3,2) AS GTNO_KEY_VAL, SUBSTR(POL_NO, 6, 7) POL_SEQ FROM TCTTCOT

        WHERE

            BIZ_SYS_CD = 'CTK'

            AND JNT_TNG_YN = '2'

            AND INS_BGN_DT BETWEEN TO_DATE('20121001', 'YYYYMMDD') AND TO_DATE('20121115', 'YYYYMMDD')

    )

    GROUP BY GTNO_KEY_VAL

) B

ON (

    A.GTNO_KD_CD = B.GTNO_KD_CD

    AND A.GTNO_KEY_VAL = B.GTNO_KEY_VAL

)

WHEN MATCHED THEN

    UPDATE SET A.SEQ = B.SEQ, A.SYS_DEL_DIV_CD = '0', A.INPPE_ORG_ID = '0000000000', A.SYS_OCC_DTM = SYSDATE,

    A.OCC_IP = '0.0.0.0', A.APP_ID = 'MIG', A.DATA_CHNG_DTM = SYSDATE

WHEN NOT MATCHED THEN

    INSERT (A.GTNO_KD_CD, A.GTNO_KEY_VAL, A.SEQ, A.SYS_DEL_DIV_CD, A.INPPE_ORG_ID, A.SYS_OCC_DTM, A.OCC_IP, A.APP_ID, A.DATA_CHNG_DTM)

    VALUES (B.GTNO_KD_CD, B.GTNO_KEY_VAL, B.SEQ, '0', '0000000000', SYSDATE, '0.0.0.0', 'MIG', SYSDATE) 

;

댓글을 달아 주세요