728x90

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 조건 |
| 활용도 | 단일 처리 | 초기 데이터 적재 | 데이터 통합 및 동기화 |
참고 출처
- Oracle 공식 문서
- Oracle Merge Tutorial
- 『실전 오라클 SQL 튜닝』, 인사이트 출판사
728x90
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] DELETE() 문법 완전 정리 : 실무에서 자주 쓰는 예제로 배우기 (0) | 2025.06.08 |
|---|---|
| [ORACLE] UPDATE() 기본 문법부터 실전 예제까지 완전 정리 (0) | 2025.06.08 |
| [ORACLE] INSERT() 기초부터 실전까지 : 초보 개발자를 위한 SQL 가이드 (0) | 2025.06.08 |
| [ORACLE] SELECT()로 데이터 조회하기 : 실무에서 자주 쓰는 패턴 (0) | 2025.06.08 |
| [ORACLE] LNNVL() 함수 활용 예제 모음과 실무 적용 법 (0) | 2025.06.07 |