[Oracle] MERGE INTO
◆ MERGE INTO 구문
- MERGE문은 조건에 따라서 데이터의 삽입,갱신,삭제 작업을 한번에 할 수 있다.
- 해당 행이 존재하는 경우 UPDATE(DELETE포함 할 수 있음)를 수행하고, 새로운 행일경우 INSERT를 수행한다.
- 대상 테이블에 대한 UPDATE/INSERT 조건은 ON절에 의해 결정된다.
- MERGE문에서 CLOB 사용시 업데이트 할 내용이 2000bytes가 넘을때 ORA-00600 오류가 발생하며, patch set 11.2.0.2 버전으로 해결할 수 있다.
◆ 문법
MERGE INTO 테이블 a -- update또는 insert할 테이블
USING 대상테이블/뷰 b -- 비교대상 (동일 테이블이라면 using dual 사용)
ON (조건) -- a와 b의 조인식
WHEN MATCHED THEN
UPDATE SET
컬럼1 = 값1
컬럼2 = 값2
DELETE WHERE (조건)
WHEN NOT MATCHED THEN
INSERT(컬럼1, 컬럼2...)
VALUES(값1, 값2...)
- INTO : DATA가 UPDATE되거나 INSERT 될 테이블 또는 뷰를 지정.
- USING : 비교할 SOURCE 테이블 또는 뷰나 서브쿼리를 지정, INTO절의 테이블과 동일하거나 다를 수 있다.
- ON : UPDATE나 INSERT를 하게 될 조건으로, 해당 조건을 만족하는 DATA가 있으면 WHEN MATCHED 절을 실행하게 되고, 없으면 WHEN NOT MATCHED 이하를 실행하게 된다.
- WHEN MATCHED : ON 조건절이 TRUE인 ROW에 수행 할 내용 (UPDATE, DELETE포함 될 수 있음)
- WHEN NOT MATCHED : ON 조건절에 맞는 ROW가 없을 때 수행할 내용 (INSERT)
※ 오라클 9버전이상에서 사용가능하다.
◆ SAMPLE
MERGE INTO STO_TEMP1 T1
USING (SELECT EBELN, EBELP
FROM STO_TEMP
WHERE EBELN = '4501134859' AND EBELP = '00010') T
ON (T1.EBELN = T.EBELN AND T1.EBELP = T.EBELP)
WHEN MATCHED
THEN
UPDATE SET T1.MBLNR = T.MBLNR, T1.BUDAT = T.BUDAT
DELETE
WHERE T1.MBLNR = '4926768928'
WHEN NOT MATCHED
THEN
INSERT (T1.EBELN,
T1.EBELP,
T1.MBLNR,
T1.BUDAT)
VALUES (T.EBELN,
T.EBELP,
T.MBLNR,
T.BUDAT)
'Database / Sql' 카테고리의 다른 글
[Oracle] Procedure 예외처리 (SQLCODE, SQLERM) (0) | 2015.05.26 |
---|---|
[Oracle] 16진수 <-> 10진수 변환 (0) | 2014.09.18 |
[Oracle] IO를 많이 발생시키는 쿼리 찾기 (0) | 2014.09.02 |
[Oracle] 각 테이블/인덱스 사이즈 조회 쿼리 (0) | 2014.03.06 |
[Oracle] 테이블 스페이스 용량/사용량 산출 (0) | 2014.03.04 |