SQL - MERGE, DELETE문의 사용

    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

    댓글