2014/04/21

[Oracle] MERGE

[출처] http://blog.naver.com/jadin1/70018086104
제목
오라클 고급쿼리(2) - MERGE
작성자
작성일
2007-05-31
배포
PUBLIC (출처는 밝혀 주세요)
해당 강좌는 오라클 9i에서부터 제공하는 MERGE구문이다.

DB관련 작업을 하다보면, 특정 테이블에 데이터를 입력시, 기존에 존재하는 레코드이면 기존 행을 UPDATE하고, 존재하지않는다면 INSERT하는 로직을 상당수 작성하게된다.

IF 행있다. THEN
       UPDATE..
ELSE
       INSERT...
END IF ;

MS-SQL에 EXISTS 키워드를 아는 독자라면 오라클에는 왜 이러한 키워드가 없을까 하고 궁금해 하는 분도 있으리라 생각한다. 
필자는 이렇게 처리하곤 했었다. 적어도 MERGE를 모르기 전까지는.
SELECT COUNT(*) INTO ROW_CNT FROM TBL_NAME;

이렇게 싱글톤 SELECT 처리후 변수에 레코드 수를 저장한후
IF ROW_CNT > 0 THEN
       UPDATE..
ELSE
       INSERT...
END IF;

이런식으로 처리하곤 했었다.
아~ 자바 자료구조의 put() 메소드가 절실히 생각나지 않는가?
  
하지만 이젠 MERGE구문을 사용하여 고급스러운 쿼리를 구사하자.

MERGE구문은 다섯가지 정도의 절로 구성된다.

MERGE INTO                                    - 병합할 테이블 또는 뷰 정의
USING                                              - 갱신또는 추가될 대상 정의
ON                                                   - 어떤 구문이 추가/갱신될지의 조건정의. 조건이 TRUE이면 갱신, FALSE이면 추가
WHEN MATCHED THEN UPDATE          - 갱신될 열 정의
WHEN NOT MATCHED THEN INSERT     - 추가될 열 정의 
  
바로 예제를 보자.

이번 예제에서는 카테고리의 이름이 기존에 존재하면 CATE_MEMO컬럼에 기존카테고리이름 + '(갱신)' 이라는 이름으로 갱신할 것이고 , 존재 하지않으면 추가할 예정이다.
-----------------------------------------------------------------------------
MERGE INTO PRT_CATE TARGET_TBL
USING
  (
   SELECT * FROM PRT_CATE
   WHERE CATE_NAME = 
'컴퓨터'
  ) SOURCE_TBL
ON
  (SOURCE_TBL.CATE_NAME = TARGET_TBL.CATE_NAME)

WHEN MATCHED THEN
      UPDATE SET TARGET_TBL.CATE_MEMO = TARGET_TBL.CATE_NAME || 
갱신'
WHEN NOT MATCHED THEN
     INSERT VALUES
            (
10 , '컴퓨터(신규)' , 1 , '',0);
-----------------------------------------------------------------------------

결과값>


위와같이 컴퓨터 라는 이름이 존재하므로 UPDATE로직이 수행되었다.
  
물론 EXCEPTION 방어적 프로그래밍을 통해서도 위와 같이 구현할수 있다.
EXCEPTION
 WHEN NO_DATA_FOUNT THEN
    INSERT....;

위와 같이 구현해도 무방하다.

하지만 MERGE구문을 이용하면 같은 기능을 하나의 구문으로 처리할수 있다는 장점이 있다.

또한 웹 솔루션등에서 SELECT -> 결과후 해당 프로시져 호출 -> UPDATE,INSERT 등으로 이어지는

라운드 트립은 비단 DB SERVER 만의 자원뿐 아니라 웹서버의 성능에도 영향을 끼친다는것을 고려할때, 라운드 트립을 줄일 수 있는 방법도 될 수 있겠다.

댓글 없음:

댓글 쓰기