본문 바로가기
DBMS/ORACLE

[ORACLE] 오라클_MERGE INTO (데이터 여부에 따라 UPDATE / INSERT 처리)

by 썸머워즈 2020. 1. 8.
반응형

MERGE INTO

ORACLE에서 제공하는 MERGE INTO 구문에 대해 알아보자.

 

테이블에 데이터가 이미 있으면 업데이트를 실행하고, 없을 경우 값을 넣어줘야 하는 경우에

MERGE INTO 구문을 사용하지 않는다면, 

 

1. 값이 있는지 확인

2. 있으면 UPDATE

3. 없으면 INSERT

 

이렇게 3개를 선언을 해줘야 한다.

오라클에서는 이런 작업을 한번에 처리를 할 수 있도록 도와주는 구문을 제공하는데 이게 바로 MERGE INTO 구문이다.

 

하나하나 자세히 알아가보도록 하자.


▷ [구문] 

MERGE INTO [TABLE / VIEW] - update 또는 insert할 테이블 혹은 뷰
    USING [TABLE / VIEW / DUAL] - 비교할 대상 테이블 혹은 뷰 (위 테이블과 동일할 경우 DUAL을 사용)
    ON [조건] - UPDATE 와 INSERT 처리할 조건문 (조건이 일치하면 UPDATE / 불일치 시 INSERT)
    WHEN MATCHED THEN 
          UPDATE SET
          [COLUMN1] = [VALUE1],
          [COLUMN2] = [VALUE2],
          ...
          (DELETE [TABLE] WHERE [COLUMN 1] = [VALUE 1] AND ...) - UPDATE 뿐만 아니라 DELETE 구문도 사용 가능
    WHEN NOT MATCHED THEN
         INSERT (COLUMN1, COLUMN2, ...)
         VALUES (VALUE1, VALUE2, ...)

 

구문에 대해 알아봤으니 이제 예제 코드를 통해 접근해보자.

 

예제 1) 서로 다른 테이블 비교 후 MERGE INTO

MERGE INTO employee emp
  USING (SELECT salary, dev, age
      FROM develop
      WHERE emble = '0010') t
  ON (emp.dev = t.dev)
  WHEN MATCHED THEN
  	UPDATE SET emp.emble = '0701' , emp.rog = 'snake'
  WHEN NOT MATCHED THEN
  	INSERT (emp.emble, emp.rog, emp.tag)
  	VALUES (#{emble}, #{rog}, #{tag})

예제 2) 같은 테이블 비교 후 MERGE INTO

MERGE INTO employee
  USING DUAL ON (dev = #{dev} AND rog = #{rog})
  WHEN MATCHED THEN
  	UPDATE SET emble = #{emble} , rog = #{rog}
  WHEN NOT MATCHED THEN
  	INSERT (emp.emble, emp.rog, emp.tag)
  	VALUES (#{emble}, #{rog}, #{tag})

이렇게 두 가지 경우에 대해 예제를 통해 알아봤는데,

MERGE INTO 구문은 개발하다 보면 많이 사용할 테니 알아두면 좋을 것이다.

 

사용하기에 앞서 몇 가지 알아둬야 할 게 있다.

 

해당 MERGE INTO 구문은 오라클 9i 버전 이상부터 사용 가능하며,

ON 조건절에 사용된 컬럼은 UPDATE가 불가능하다.(되도록 PK로만 비교하자)

 

그리고 구문에서 설명한 것처럼 DELETE 구문을 사용할 수 있다고 하였는데, 이는 오라클 10g 버전 이상부터 사용 가능하다.

 

애초에 9i버전은 merge into구문이 불안전하다는 말이 있어 안전하게 10 버전 이상부터 사용을 권장한다.

merge into문을 통해 많은 데이터를 다룰 경우에는 성능이 저하될 수 있으니 잘 사용하자.

 

반응형


댓글

TOP