MERGE
- MySQL의
insert ~ on duplicate key update {컬럼} = {새로운값} 과 동일기능
4.2.1 MERGE
step1. 테스트테이블 생성
-- MERGE 문을 위한 테스트 테이블 생성
-- WHERE절이 없으니(참) 데이터까지도 복사되어 INSERT된다.
CREATE TABLE M_CUS_CUD_TEST AS
SELECT *
FROM M_CUS T1;
-- PK 인덱스생성
ALTER TABLE M_CUS_CUD_TEST
ADD CONSTRAINT PK_M_CUS_CUD_TEST PRIMARY KEY(CUS_ID) USING INDEX;
step2. MERGE문이 없을 때는 PL/SQL로 어렵게 구현했다
-- CUS_0090 고객을 입력하거나 변경하는 PL/SQL
DECLARE v_EXISTS_YN varchar2(1);
BEGIN
SELECT NVL(MAX('Y'),'N')
INTO v_EXISTS_YN
FROM DUAL A
WHERE EXISTS(
SELECT *
FROM M_CUS_CUD_TEST T1
WHERE T1.CUS_ID = 'CUS_0090'
);
IF v_EXISTS_YN = 'N' THEN
INSERT INTO M_CUS_CUD_TEST (CUS_ID ,CUS_NM ,CUS_GD)
VALUES ('CUS_0090' ,'NAME_0090' ,'A');
DBMS_OUTPUT.PUT_LINE('INSERT NEW CUST');
ELSE
UPDATE M_CUS_CUD_TEST T1
SET T1.CUS_NM = 'NAME_0090'
,T1.CUS_GD = 'A'
WHERE CUS_ID = 'CUS_0090'
;
DBMS_OUTPUT.PUT_LINE('UPDATE OLD CUST');
END IF;
COMMIT;
END;
step3. MERGE문으로 단순화 시킬 수 있다
-- 고객을 입력하거나 변경하는 SQL – MERGE 문으로 처리
MERGE INTO **M_CUS_CUD_TEST** T1
USING **(
SELECT 'CUS_0090' CUS_ID
,'NAME_0090' CUS_NM
,'A' CUS_GD
FROM DUAL
)** T2
**ON (T1.CUS_ID = T2.CUS_ID)**
WHEN MATCHED THEN UPDATE SET T1.CUS_NM = T2.CUS_NM
,T1.CUS_GD = T2.CUS_GD
WHEN NOT MATCHED THEN INSERT (T1.CUS_ID ,T1.CUS_NM ,T1.CUS_GD)
VALUES(T2.CUS_ID ,T2.CUS_NM ,T2.CUS_GD)
;
COMMIT;
- MERGE 대상 : M_CUS_CUD_TEST
- 비교대상: 인라인뷰