9i 부터 나온 오라클의 신공 Merge Into.
Merge Into를 사용하면,
커서 돌리며 update하기, insert, update 하기 전 검사 등등을 회피할 수 있습니다.
MERGE INTO [테이블명] USING [조회쿼리 또는 Base 테이블]
ON [위의 조회쿼리 또는 테이블과의 조인조건]
--ON 다음에 명시한 키와 매치되는 경우 Update처리
WHEN MATCHED THEN
UPDATE SET --테이블은 제일 위의 [테이블명]
[컬럼1] = [값1], [컬럼2] = [값2]
DELETE WHERE [추가조건]
--ON 다음에 명시한 키와 매치되지 않는 경우 Insert처리
WHEN NOT MATCHED THEN
INSERT (컬럼1,컬럼2,...) --테이블은 제일 위의 [테이블명]
VALUES(값1,값2,...)
[Sample]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | MERGE INTO t_Target A using ( select key1, key2, value1, value2 from t_Base where key1 = 'abc' /* 또는 select i_key1 as key1, i_key2 as key2 from dual */ ) B ON (A.key1 = B.key1 and A.key2 = B.key2) WHEN MATCHED THEN update set A.value1 = B.value1, A.value2 = B.value2 --(delete는 보통 사용되지는 않지만 필요하면 아래처럼 쓰인다.) delete where i_del_gb = 'D' -- i_del_gb 은 SP의 입력 파라메터 WHEN NOT MATCHED THEN insert (A.key1 , A.key2 , A.value1, A.value2) values (B.key1 , B.key2, B.value1, B.value2) ; | cs |
즉, [조회쿼리 또는 Base 테이블]과 매치되는 행은 수정 또는 삭제(조건에 따라)되고, 매치되지 않는 행은 추가됩니다.
이제까지 조회후 값이 있으면 수정, 삭제, 없으면 추가를 위해 사용되었던 여러개의 쿼리문이
단 하나의 구문에서 처리된다니... 아름답지 않나요? ^^
(10g에서는 When MATCHED Then 만 사용할 수도 있습니다.)
'Oracle' 카테고리의 다른 글
오라클 ORA-01502 에러 : 인덱스 '인덱스명' 또는 인덱스 분할영역은 사용할 수 없은 상태입니다. 해결방법 (0) | 2024.03.19 |
---|---|
오라클 트리 쿼리 START WITH, CONNECT BY PRIOR (0) | 2024.02.22 |
오라클 partition by 간단 설명 및 예제 (1) | 2024.02.16 |
오라클 with 간단 설명 및 예제 (With... Select) (1) | 2024.02.16 |
오라클 ora-01846 에러 : NEXT_DAY 함수 사용시 처리방법 (0) | 2024.02.16 |