본문 바로가기

DB

있으면 UPDATE, 없으면 INSERT (Oracle)

UPSERT라고 불리는 MERGE는 기본적으로 2개의 테이블을 비교하여 한쪽으로 MERGE하는
기능을 수행한다.  예를 들어

  MERGE INTO TEMP_MERGE1 A
    USING TEMP_MERGE2 B ON ( A.EMP_NO = B.EMP_NO )
  WHEN MATCHED THEN
    UPDATE SET A.EMP_NM = B.EMP_NM
  WHEN NOT MATCHED THEN
    INSERT (EMP_NO, EMP_NM) VALUES ( B.EMP_NO, B.EMP_NM);

위 SQL문은 TEMP_MERGE1에 TEMP_MERGE2.EMP_NO가 있을 경우 TEMP_MERGE1의 EMP_NM을 TEMP_MERGE2.EMP_NM으로
UPDATE 하고, 없을 경우, TEMP_MERGE2의 값을 INSERT하는 문장이다.

그러나, 실제로는 이렇게 두개의 테이블을 사용하는 경우보다는
하나의 테이블에 새로운 데이타를 입력하고자 할 때, 있으면 UPDATE, 없으면 INSERT하려는 경우가
많다는 것이다. 이런 경우는 어떻게 처리하는지 살펴본다.

  MERGE INTO TEMP_MERGE1 A
    USING  (SELECT :empNo, :empNm FROM DUAL) B ON (A.EMP_NO = B.EMP_NO)
  WHEN MATCHED THEN
    UPDATE SET EMP_NM = B.EMP_NM
  WHEN NOT MATCHED THEN
    INSERT (EMP_NO, EMP_NM) VALUES ( B.EMP_NO, B.EMP_NM);

위와 같이, 입력하고자 하는 값으로 DUAL을 이용해 가상테이블을 만들어 사용하면
간단히 해결할 수 있다.