본문 바로가기
[개발] Programming/Database

오라클 MERGE INTO, INSERT와 UPDATE 한 번에 실행

by eatyourKimchi 2019. 8. 2.

 

 

MERGE INTO

 

 개발을 하다 보면 수시로 INSERT와 UPDATE를 할 일이 발생합니다. 이때 오라클의 MERGE INTO 구문을 활용하면 조건에 해당되는 값이 있으면 UPDATE 없으면 INSERT를 한 구문으로 처리할 수 있습니다.

 각각 중복 체크를 하고 INSERT나 UPDATE를 하는 것과 비교하면 상당히 유용한 구문이라고 할 수 있죠. 그럼 여러 예제를 통해 MERGE INTO를 사용하는 방법을 소개하겠습니다.

 

 

 

1. 테이블에서 조회하여 비교 후 저장

 

 다음과 같은 테이블이 (TARGET_TABLE, DATA_TABLE) 있다고 가정하고 DATA_TABLE에서 조회하여 TARGET_TABLE에 입력하는 예시입니다. 데이터를 비교할 컬럼은 'COL_KEY', 입력할 컬럼은 'COL_VAL'로 하겠습니다.

 

1
2
3
4
5
6
7
8
9
MERGE INTO TARGET_TABLE A 
 USING DATA_TABLE B 
   ON( A.COL_KEY = B.COL_KEY ) 
 WHEN MATCHED THEN 
   UPDATE SET A.COL_VAL = B.COL_VAL 
 WHEN NOT MATCHED THEN 
   INSERT ( A.COL_KEY, A.COL_VAL ) 
   VALUES ( B.COL_KEY, B.COL_VAL ) 
;
cs

 

 

 

2. 조회 없이, 직접 값(파라미터)을 넘겨주는 경우

 

'TARGET_TABLE'에 파라미터를 직접(조회하지 않고) 입력하는 예시입니다.
이때 USING에 'DUAL'을 이용하면 됩니다.

 

1
2
3
4
5
6
7
MERGE INTO TARGET_TABLE A 
 USING DUAL B 
   ON ( A.COL_KEY = :param1 ) 
WHEN MATCHED THEN
UPDATE SET A.COL_VAL = :param2
 WHEN NOT MATCHED THEN 
   INSERT A.COL_VAL = :param2 
VALUES ( :param1, :param2 ) 
;
cs

 

 

 

3. UPDATE 또는 INSERT하는 조건 제외

 

MERGE INTO 구문을 조금 변형해서 사용할 수도 있습니다.

 

'WHEN MATCHED THEN'을 제외하거나

 

1
2
3
4
5
6
7
-- 일치하지 않을때만 INSERT 
MERGE INTO TARGET_TABLE A 
 USING DUAL B 
   ON ( A.COL_KEY = :param1 ) 
 WHEN NOT MATCHED THEN 
   INSERT ( A.COL_KEY, A.COL_VAL ) 
VALUES ( :param1, :param2 ) 
;
cs

 

'WHEN NOT MATCHED THEN'을 제외하고도 사용할 수 있습니다.

 

1
2
3
4
5
6
7
-- 일치하는 경우에만 UPDATE 
MERGE INTO TARGET_TABLE A 
 USING DUAL B 
   ON ( A.COL_KEY = :param1 ) 
 WHEN MATCHED THEN 
   UPDATE SET A.COL_VAL = :param2 
;
cs

 

 

 

* 참고

 

 비교 조건을 추가하고 싶은 경우 AND나 OR을 ON 안에 넣어줍니다.
단, 주의사항은 비교 값은 고유의 값이 되어야 중복이 발생하지 않습니다.

 

 

 

삼다수 50개 초특가 제주 삼다수, 2L...

 

댓글