create table M_CUS_CUD_TEST AS
select * from M_CUS t1;
alter table M_CUS_CUD_TEST
ADD constraint PK_M_CUS_CUD_TEST PRIMARY KEY (CUS_ID) using INDEX;
- M_CUS_CUD_TEST에 고객을 입력하거나 변경하는 프로세스가 있다고 가정
- 고객ID와 고객정보를 외부에서 입력 변수로 받는다
이때 같은 고객ID가 있으면 고객 정보를 업데이트 하고, 같은 고객 ID가 없으면 신규고객으로 등록을 한다.
* PL/SQL 작성
1. SET SERVEROUTPUT ON;
만약 블록 내에서 DBMS_OUTPUT.PUT_LINE을 사용하여 메시지를 출력했다면, 실행 전에 해당 세션에서 출력 기능을 활성화해야 합니다.
2. 저장 프로시저(Stored Procedure)로 만들어 실행
CREATE OR REPLACE PROCEDURE P_CUS_CUD_TEST
IS
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', 'B');
DBMS_OUTPUT.PUT_LINE('INSERT NEW CUST');
ELSE
UPDATE M_CUS_CUD_TEST T1
SET T1.CUS_NM='NAME_0090', T1.CUS_GD='B'
WHERE CUS_ID='CUS_0090';
DBMS_OUTPUT.PUT_LINE('UPDATE OLD CUST');
END IF;
COMMIT;
END;
/ -- **이 슬래시가 실행 명령입니다!**
3. 프로시저를 생성한 후에는 EXECUTE 명령어로 간단하게 실행할 수 있습니다.
EXECUTE 내_프로시저_이름;
-- 또는
EXEC 내_프로시저_이름;
4. parameter를 받아서 처리하는 프로시저
CREATE OR REPLACE PROCEDURE P_CUS_CUD_TEST (
p_CUS_ID IN VARCHAR2, -- 1. 입력할 고객 ID
p_CUS_NM IN VARCHAR2, -- 2. 입력할 고객 이름
p_CUS_GD IN VARCHAR2 -- 3. 입력할 고객 등급
)
IS
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=p_CUS_ID
);
IF v_EXISTS_YN='N' THEN
INSERT INTO M_CUS_CUD_TEST (CUS_ID, CUS_NM, CUS_GD)
VALUES (p_CUS_ID, p_CUS_NM, p_CUS_GD);
DBMS_OUTPUT.PUT_LINE('INSERT NEW CUST');
ELSE
UPDATE M_CUS_CUD_TEST T1
SET T1.CUS_NM=p_CUS_NM, T1.CUS_GD=p_CUS_GD
WHERE CUS_ID=p_CUS_ID;
DBMS_OUTPUT.PUT_LINE('UPDATE OLD CUST');
END IF;
COMMIT;
END;
/
-- 실행예)
exec P_CUS_CUD_TEST('CUS_0091', 'NAME_0091', 'D');
5. MERGE SQL
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);
