MERGE문 사용
UPSERT(UPDATE + INSERT)라고도 불리는데 INSERT문과 UPDATE문을 결합하여 조건에 해당하는 데이터가 존재하지 않을 시에는 INSERT문을 실행하고 존재하는 경우에는 UPDATE문과 부가적으로 DELETE문을 실행할 수 있도록 하는 SQL문
-- 간단한 MERGE문
BEGIN
MERGE INTO emp a
USING DUAL
ON (a.empno = 9000)
WHEN MATCHED THEN -- 사번이 9000인 로우 존재 시
UPDATE
SET a.comm = a.comm * 1.1
WHEN NOT MATCHED THEN -- 사번이 9000인 로우 존재하지 않을 시
INSERT(empno, ename, job, hiredate, sal, deptno)
VALUES(9000, '홍길동', 'CLERK', SYSDATE, 3000, 10);
DBMS_OUTPUT_PUT_LINE('MERGE 건수: '||SQL%ROWCOUNT); -- 변경된 건수 출력
COMMIT;
END;
MERGE문에서도 PL/SQL 변수를 사용할 수 있다.
앞의 포스트를 참고하여 한 번 프로그램을 짜보아라.
MERGE문에서도 레코드변수를 사용할 수 있다. 그러나 레코드를 사용할 수 있는 곳은 MERGE문의 INSERT절만이다.
UPDATE문이나 DELETE절에는 레코드를 사용할 수 없다.
DECLARE
v_emprec emp%ROWTYPE;
BEGIN
-- 테스트용 데이터 한 건 추출
SELECT * INTO v_emprec FROM emp WHERE empno = 7788;
v_emprec.empno := 9000; -- 사번 변경
v_emprec.ename := '홍길동'; -- 이름 변경
--MERGE문에 사용
MERGE INTO emp a
USING DUAL
ON (a.empno = v_emprec.empno)
WHEN MATCHED THEN -- 사번이 9000인 로우 존재 시 커미션을 10% 증가
UPDATE
SET a.comm = a.comm*1.1
WHEN NOT MATCHED THEN --사번이 9000인 로우 미존재 시 로우 추가
INSERT
VALUES v_emprec; --MERGE문의 INSERT절에는 레코드변수 사용할 수 있다.
DBMS_OUTPUT_PUT_LINE('MERGE 건수: '||SQL%ROWCOUNT); -- 변경된 건수 출력
COMMIT;
END;
MERGE문도 역시 키워드나 테이블명, SET의 대상이 되는 컬럼명, INSERT 대상으로 나열되는 컬럼명에는 변수를 사용할 수 없다. MERGE문에 배열 처리를 사용하기 위해서는 역시 FORALL문을 사용해야 한다.
DELETE문 사용
DECLARE
DELETE FROM emp
WHERE empno = 9000;
DBMS_OUTPUT_PUT_LINE('INSERT 건수: '||SQL%ROWCOUNT); -- 변경된 건수 출력
COMMIT;
END;
DELETE문도 PL/SQL 변수 사용가능하다.
DELETE문도 역시 키워드나 테이블명에는 변수를 사용할 수 없다
DELETE문에 배열 처리를 사용하기 위해서는 역시 FORALL문을 사용해야 한다.
'DATABASE > SQL, PL-SQL' 카테고리의 다른 글
CLOB (0) | 2021.01.27 |
---|---|
트랜잭션(Transaction) 제어 (0) | 2021.01.27 |
SQL - SELECT, INSERT, UPDATE 사용 (0) | 2021.01.25 |
표현식 - 2 (0) | 2021.01.24 |
표현식 - 1 (0) | 2021.01.24 |
댓글