반응형

이번글은 MERGE 문을 이용해 데이터를 이동시켜보는 방법에 대해서 알아보겠습니다.

MERGE 문은 오라클 9i 버전부터 사용하실 수 있습니다.

MERGE문은 언제 쓰면 될까요?



위의 그림처럼 테이블1의 데이터를 테이블2로 복사하려고 합니다.

그런데 테이블1의 내용 중 몇개가 테이블2에 들어있기때문에 INSERT를 하려면 에러가 발생하게 되어 UPDATE 문으로 처리를 해주어야합니다.

하지만 MERGE문을 이용하면 테이블1과 테이블2를 비교하여 테이블1의 내용이 테이블2에 존재하면 UPDATE 존재하지않으면 INSERT 시켜줄 수 있습니다.
(프로그래밍 언어의 IF ~ ELSE ~ 문과 비슷합니다.)

그럼 이제 사용법을 알아보겠습니다.

일단 2개의 테이블을 만들었습니다. 두 테이블에는 NO, NAME, AGE 3개의 컬럼을 가지고 있습니다.

 


일단 1번 테이블 TEMP_TAB_1 테이블에 데이터를 입력했습니다.

DECLARE ~ BEGIN ~ END; 는 PL/SQL 문법으로 아직 설명한적은 없지만 INSERT INTO를 9번 실행하기가 귀찮아서 그냥 썼습니다.

지금 중요한건 이게 아니니까 사용법만 알려드리겠습니다.

ed or edit 명령어를 이용해서 버퍼(이곳에는 바로전에 사용되어진 명령어가 저장되어있습니다.)를 불러와서 다음과 같이 입력합니다.
(아래의 내용은 이 글 처음의 MERGE 예제 텍스트 파일에 첨부되어있습니다. )

 


 ※ ED or EDIT 명령어를 사용했는데 아래와 같이 나올경우는 버퍼에 아무런 내용이 안들어있기 때문입니다.
    이때에는 select 1 from dual; 같은 명령어를 한번 입력하고 불러오시면 됩니다.

 


입력한 후에 R 또는 RUN 명령어를 사용하여 버퍼에 기록되어진 쿼리를 실행합니다.

그럼 테이블1에 데이터입력 끝!

 


테이블 2에는 테이블1의 일부내용만 입력합시다.


이제 극단적인 예를 들어보겠습니다.

 사장님이 TEMP_TAB_2 에 TEMP_TAB_1의 내용을 복사해서 다 집어넣으라고 하시는군요?

거기다가 이름앞에는 소녀시대_ 를 집어넣고 나이는 해가 지났으니 1살씩 더 추가하라고 하십니다. 어찌해야할까요..

사장님이 이렇게 쉬운문제를 줄리는 없지만 이럴때 MERGE 문을 사용하면 됩니다.

다음이 MERGE문의 사용방법입니다.


MERGE INTO 복사당할테이블명 테이블별칭
   USING 복사할테이블명 테이블별칭
   ON (JOIN 조건)
WHEN MATCHED THEN                                       --복사당할 테이블에 복사할 테이블 데이터가 들어있을경우
   UPDATE SET
            t2.name      = '소녀시대_' || t1.name
           ,t2.age         = t1.age + 1
WHEN NOT MATCHED THEN                               --복사당할 테이블에 복사할 테이블 데이터가 없을경우
   INSERT VALUES(
             t1.no
           , '소녀시대_' || t1.name
           , t1.age + 1
   )

※ INSERT(컬럼명1, 컬럼명2, ...) VALUE(컬럼1내용, 컬럼2내용, ..) 처럼 일부컬럼에만 INSERT 할 수도 있습니다.
※ USING ON은 이전글인 [Oracle] Join 방법에 대해 알아봅시다 에서 4번 JOIN-ON 과 같은 형식입니다.

다음은 실행결과입니다. 테이블1의 내용이 테이블2로 정상적으로 복사된것을 보실 수 있습니다.


http://breadshuttle.tistory.com/ 퍼옴.

반응형

+ Recent posts