오라클 MERGE 문 간단한 예제로 한번에 INSERT, UPDATE 처리
UPDATE INSERT 를 동시에 처리하고 싶은 경우가 간혹 존재하는데
이럴 경우 과거 CURSOR 를 사용하거나 UPDATE 를 먼저 처리하고 INSERT 를 처리한 경우가 있습니다.
이제 MERGE 문을 사용하면 SELECT ~ INSERT 시 원하는 조건에 맞는 행은 UPDATE 를, 조건에 맞지 않는 행은 INSERT 를 할 수 있게 되었습니다.
즉,
이미 존재하는 값은 UPDATE
신규로 입력된 값은 INSERT
이 처리가 한번에 가능합니다.
그것도 다수의 행을 UPDATE, INSERT 가 가능합니다.
일명 UPSERT 라고도 부르기도 하죠.
오라클에서 제공하는 문법은 아래와 같습니다.
MERGE 문법
이렇게 보시면 복잡하지만 아래예제와 설명을 보면 간단하게 알 수 있습니다!
MERGE INTO 예제
MERGE INTO CUSTOMER C USING ( SELECT USERNO , USERNAME , ADDRESS , PHONE FROM NEW_JOIN WHERE INPUT_DATE = '20170724' ) N ON ( C.USERNO = N.USERNO) WHEN MATCHED THEN UPDATE SET C.USERNAME = N.USERNAME , C.ADDRESS = N.ADDRESS , C.PHONE = N.PHONE WHEN NOT MATCHED THEN INSERT ( USERNO , USERNAME , ADDRESS , PHONE ) VALUES ( N.USERNO , N.USERNAME , N.ADDRESS , N.PHONE )
위의 간단한 예제는 신규고객이 들어왔을 때 기존 고객테이블에 데이터를 입력하는 업무입니다.
하나씩 문법을 살펴보겠습니다.
MERGE INTO CUSTOMER C : INSERT 또는 UPDATE 할 테이블과 테이블의 ALIAS 를 지정해줍니다.
USING : 원하는 결과를 추출하기 위한 SELECT 문입니다. 이 SELECT 문에서 나온 결과를 INSERT 또는 UPDATE 할 예정입니다.
ON : SELECT 한 결과와 입력하고 싶은 테이블의 UNIQUE 한 값을 매칭하는 연결고리입니다. ( 주로 KEY 값을 사용 )
WHEN MATCHED THEN : SELECT 의 결과가 INSERT 할 테이블에 값이 이미 존재하는 경우 UPDATE 를 실행합니다.
WHEN NOT MATCHED THEN : SELECT 의 결과가 INSERT 할 테이블에 값이 없는 경우 INSERT 를 실행합니다.
업데이트만 하고 싶은 경우에는 아래 WHEN NOT MATCHED THEN 이하 문장을 제거하면 됩니다.
MERGE UPDATE 예제
MERGE INTO CUSTOMER C USING ( SELECT USERNO , USERNAME , ADDRESS , PHONE FROM NEW_JOIN WHERE INPUT_DATE = '20170724' ) N ON ( C.USERNO = N.USERNO) WHEN MATCHED THEN UPDATE SET C.USERNAME = N.USERNAME , C.ADDRESS = N.ADDRESS , C.PHONE = N.PHONE
또한 오라클 10g 이후로는 SELECT 한 결과를 UPDATE 뿐 아니라 DELETE 도 처리할 수 있습니다.
MERGE UPDATE DELETE 예제
MERGE INTO CUSTOMER C USING ( SELECT USERNO , USERNAME , ADDRESS , PHONE FROM NEW_JOIN WHERE INPUT_DATE = '20170724' ) N ON ( C.USERNO = N.USERNO) WHEN MATCHED THEN UPDATE SET C.USERNAME = N.USERNAME , C.ADDRESS = N.ADDRESS , C.PHONE = N.PHONE DELETE WHERE SAL >= 3000
이 MERGE 문은 DML 의 문장으로 트랜잭션(TRANSACTION) 단위로 실행되기 때문에 COMMIT, ROLLBACK 을 처리해야 완전한 반영이 됩니다.
이 외에 궁금하신점은 댓글로 문의주시면 답변 달아드리겠습니다.
감사합니다.
'IT > Oracle' 카테고리의 다른 글
오라클 KEEP , FIRST , LAST 예제로 확인하는 사용법 (3) | 2017.09.04 |
---|---|
오라클 파티션 테이블 샘플(생성 수정 삭제) 및 주의사항 (4) | 2017.07.25 |
오라클 SUBSTR 함수 문법과 예제로 마스터하기 (0) | 2017.07.13 |
오라클 다양한 INSERT INTO 방법 (0) | 2017.07.03 |
오라클 LOCK 걸린 개체 확인 및 LOCK 해제 (10) | 2017.06.25 |