MERGE 문을 활용한 UPSERT – 오라클에서 조건부 INSERT/UPDATE 처리하는 방법

Posted by heoncode
2025. 7. 21. 13:34 오라클 실무 쿼리 튜닝
728x90
반응형
SMALL

데이터를 조건에 따라 삽입하거나 갱신하는 작업은 실무에서 자주 요구되는 패턴입니다. 특히 대상 테이블에 해당 조건의 데이터가 존재하면 UPDATE, 없으면 INSERT하는 작업은 'UPSERT'라고도 불립니다. 오라클에서는 이 작업을 MERGE 문으로 효과적으로 처리할 수 있습니다.

MERGE 문 기본 구조

오라클의 MERGE 문은 USING절을 통해 비교할 대상 데이터를 지정하고, ON절에서 조건을 비교한 뒤, WHEN MATCHED, WHEN NOT MATCHED절을 통해 조건에 따라 UPDATE 또는 INSERT를 수행합니다.

MERGE INTO 대상테이블 A
USING (서브쿼리 또는 임시테이블) B
ON (A.기준컬럼 = B.기준컬럼)
WHEN MATCHED THEN
  UPDATE SET A.컬럼1 = B.컬럼1
WHEN NOT MATCHED THEN
  INSERT (컬럼1, 컬럼2) VALUES (B.컬럼1, B.컬럼2);

실전 예제: 고객 포인트 데이터 갱신

예를 들어 고객 포인트 정보를 업데이트하거나, 신규 고객은 삽입하고 싶을 때 다음과 같은 방식으로 사용할 수 있습니다.

MERGE INTO CUSTOMER_POINT T
USING (
  SELECT 'C101' AS CUST_ID, 150 AS POINT FROM DUAL
) S
ON (T.CUST_ID = S.CUST_ID)
WHEN MATCHED THEN
  UPDATE SET T.POINT = T.POINT + S.POINT
WHEN NOT MATCHED THEN
  INSERT (CUST_ID, POINT) VALUES (S.CUST_ID, S.POINT);

이 쿼리는 고객 ID가 'C101'인 고객이 이미 존재하면 해당 고객의 포인트를 누적 업데이트하고, 존재하지 않으면 새로 삽입합니다.

WHERE 조건으로 세분화하기

WHEN MATCHED 절에는 AND 조건을 추가하여 더욱 세밀하게 UPDATE 조건을 제한할 수 있습니다.

WHEN MATCHED AND T.POINT < 1000 THEN
  UPDATE SET T.POINT = T.POINT + S.POINT

이렇게 하면 포인트가 일정 기준 이하일 때만 갱신되도록 설정할 수 있습니다.

MERGE 문 사용 시 주의사항

  • ON 조건은 중복되지 않도록 고유 식별자가 필요합니다. 중복되면 ORA-30926 에러가 발생할 수 있습니다.
  • USING절은 단일 로우를 보장하거나, 반드시 JOIN 대상이 고유해야 합니다.
  • 트리거가 설정된 테이블에 사용 시, INSERT/UPDATE 트리거가 모두 작동하므로 주의가 필요합니다.
  • DML 성능 튜닝이 필요할 경우, MERGE 문도 힌트 사용이 가능합니다 (/*+ MERGE(...) */ 등).

실무 활용 팁

  • 로그 데이터를 기반으로 특정 조건에 맞게 집계 테이블을 갱신할 때 매우 유용합니다.
  • 대량 배치 처리 시 INSERT와 UPDATE를 분리하는 것보다 MERGE로 통합하는 것이 트랜잭션 관리와 성능 면에서 이점이 있습니다.
  • 반복적인 IF EXISTS → UPDATE ELSE INSERT 패턴을 코드로 구현하는 대신 MERGE로 간결하게 대체 가능합니다.

UPSERT는 단순한 테이블 갱신이지만, 실수 없이 안정적으로 처리하려면 MERGE 구문의 조건 구성과 예외 처리에 신경 써야 합니다. 위 예제를 바탕으로 업무 환경에 맞게 수정하여 적용할 수 있습니다.

#MERGE문 #UPSERT #오라클쿼리 #OracleSQL #조건부갱신 #SQL실무 #SQL튜닝 #INSERTUPDATE

728x90
반응형
LIST