본문 바로가기
Database/Oracle

[ORACLE] MERGE() 문법 완전 정리 : INSERT와 UPDATE를 동시에 처리하기

by Papa Martino V 2025. 6. 8.
728x90

오라클 MERGE() 문법 완전 정리: INSERT와 UPDATE를 동시에 처리하기
[Oracle] MERGE

 

 

 

Oracle SQL에서 MERGE 문은 데이터베이스 테이블 간의 데이터를 조건에 따라 삽입하거나 수정(UPSERT)할 수 있는 매우 강력한 기능입니다. 특히 데이터 마이그레이션, 데이터 동기화, 배치 작업 등에서 필수적으로 사용됩니다. 이 글에서는 MERGE 문을 실무 예제 중심으로 깊이 있게 설명합니다.

1. MERGE 문이란?

MERGE는 하나의 SQL 문으로 INSERT 또는 UPDATE를 동시에 수행할 수 있도록 도와주는 DML 구문입니다. 조건에 따라 해당 데이터가 존재하면 UPDATE, 존재하지 않으면 INSERT를 수행합니다.

기본 문법

MERGE INTO 대상테이블 별칭1
USING 소스테이블 별칭2
ON (조건)
WHEN MATCHED THEN
  UPDATE SET 컬럼 = 값
WHEN NOT MATCHED THEN
  INSERT (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);

2. 기본 예제: 직원 테이블 동기화

MERGE INTO employees e
USING new_employees n
ON (e.employee_id = n.employee_id)
WHEN MATCHED THEN
  UPDATE SET e.salary = n.salary, e.department_id = n.department_id
WHEN NOT MATCHED THEN
  INSERT (employee_id, first_name, last_name, salary, department_id)
  VALUES (n.employee_id, n.first_name, n.last_name, n.salary, n.department_id);

신규 직원 테이블의 데이터를 기준으로 기존 직원 테이블을 동기화합니다.

3. WHEN MATCHED 절만 사용하는 경우

데이터가 존재할 경우에만 수정하고, 새 데이터는 삽입하지 않으려면 다음과 같이 작성합니다.

MERGE INTO employees e
USING temp_employees t
ON (e.employee_id = t.employee_id)
WHEN MATCHED THEN
  UPDATE SET e.salary = t.salary;

4. WHEN NOT MATCHED 절만 사용하는 경우

기존에 존재하지 않는 데이터만 삽입하려면 다음과 같이 작성합니다.

MERGE INTO employees e
USING temp_employees t
ON (e.employee_id = t.employee_id)
WHEN NOT MATCHED THEN
  INSERT (employee_id, first_name, salary)
  VALUES (t.employee_id, t.first_name, t.salary);

5. 조건부 UPDATE 예제

조건에 따라 특정 데이터만 UPDATE 하려면 WHERE 절을 추가할 수 있습니다.

MERGE INTO employees e
USING temp_employees t
ON (e.employee_id = t.employee_id)
WHEN MATCHED THEN
  UPDATE SET e.salary = t.salary
  WHERE e.salary < t.salary;

급여가 낮은 경우에만 업데이트합니다.

6. MERGE 성능 팁

  • MERGE 대상 테이블과 소스 테이블 모두에 인덱스를 걸어 조건 검색 성능 향상
  • 대량 병합 시 PARALLEL 힌트 사용 가능
  • MERGE 전에 ANALYZE 또는 DBMS_STATS로 통계 최신화 권장

7. MERGE 문에서 발생할 수 있는 오류

  • ORA-30926: ON 조건에 의해 하나 이상의 행이 매칭됨 → UNIQUE 조건 확인 필요
  • ORA-00001: 중복된 값 → INSERT 시 제약 조건 위반
  • ORA-00904: 칼럼명 오류 → 오타 또는 칼럼 존재 여부 확인

8. MERGE 문과 트랜잭션

MERGE도 INSERT, UPDATE처럼 트랜잭션이 적용되므로 다음과 같은 구문이 가능합니다.

MERGE INTO employees e
USING new_employees n
ON (e.employee_id = n.employee_id)
WHEN MATCHED THEN UPDATE SET e.salary = n.salary;

COMMIT; -- 또는 ROLLBACK;

9. MERGE 문과 RETURNING INTO

Oracle 12c부터 MERGE RETURNING INTO 구문이 가능해졌습니다.

DECLARE
  v_updated_rows NUMBER;
BEGIN
  MERGE INTO employees e
  USING temp_employees t
  ON (e.employee_id = t.employee_id)
  WHEN MATCHED THEN
    UPDATE SET e.salary = t.salary
  RETURNING COUNT(*) INTO v_updated_rows;
END;

10. MERGE 문과 비교: UPDATE vs INSERT vs MERGE

항목 UPDATE INSERT MERGE
기능 기존 데이터 수정 새로운 데이터 삽입 존재 시 수정, 없으면 삽입
조건 WHERE 항상 삽입 ON 조건
활용도 단일 처리 초기 데이터 적재 데이터 통합 및 동기화

참고 출처

728x90