MERGE

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;