ROLLBACK은 COMMIT 과는 정반대로 DB에 가해진 변경사항을 취소시키는 기능을 하는데, 사용법은 다음과 같다.

        ROLLBACK [WORK] [TO [SAVEPOINT] 세이브포인트명];
    

    그럼 COMMIT 대신 ROLLBACK을 입력하고 프로시저를 실행해 보자.

    입력

        CREATE OR REPLACE PROCEDURE iud_ch10_sales_proc
          ( p_sales_month ch10_sales.sales_month%TYPE )
        IS
        BEGIN
        ...
        ...
    
          --COMMIT;
          ROLLBACK;
        END;
    

    결과

        PROCEDURE IUD_CH10_SALES_PROC이(가) 컴파일되었습니다.
    

    입력

    <span class="c1">-- 테이블 초기화</span>
        TRUNCATE TABLE ch10_sales;
    
        EXEC iud_ch10_sales_proc ( '199902');
    

    결과

        익명 블록이 완료되었습니다.
    

    입력

        SELECT COUNT(*)
          FROM ch10_sales ;
         WHERE sales_month ( '199902');
    

    결과

        COUNT(*)
        ----------
           0
    

    작업한 모든 내역을 취소시켰기 때문에 같은 세션에서 조회하든, 다른 세션에서 조회하든 테이블에는 전혀 반영되지 않는다. COMMIT은 작업이 성공했을 때, ROLLBACK은 작업이 실패했을 때 처리하므로 일반적으로 PL/SQL 코드를 작성할 때 디폴트로 실행부 맨 하단에 COMMIT을 명시한다. 이에 반해 ROLLBACK은 앞 절에서 학습했던 예외처리와 함께 사용되어 특정 예외가 발생했을 때 예외처리 구문에 ROLLBACK을 명시하는 식으로 트랜잭션을 처리한다. 그럼 예제를 통해 트랜잭션과 예외처리 로직을 묶어보자. 먼저 다음과 같이 ch10_sales 테이블의 매출월과 국가명, 카테고리, 채널에 PRIMARY KEY를 추가하자.

    입력

        TRUNCATE TABLE ch10_sales;
    
        ALTER TABLE ch10_sales ADD CONSTRAINTS pk_ch10_sales PRIMARY KEY (sales_month, country_name, prod_category, channel_desc);
    

    결과

        table CH10_SALES이(가) 변경되었습니다.
    

    이제 PRIMARY KEY 위반 오류가 발생할 때 처리하는 로직을 추가해 보자.

    입력

        CREATE OR REPLACE PROCEDURE iud_ch10_sales_proc
          ( p_sales_month ch10_sales.sales_month%TYPE )
        IS
    
        BEGIN
          INSERT INTO ch10_sales (sales_month, country_name, prod_category, channel_desc, sales_amt)
          SELECT A.SALES_MONTH,
                 C.COUNTRY_NAME,
                 D.PROD_CATEGORY,
                 E.CHANNEL_DESC,
                 SUM(A.AMOUNT_SOLD)
            FROM SALES A, CUSTOMERS B, COUNTRIES C, PRODUCTS D, CHANNELS E
           WHERE A.SALES_MONTH = p_sales_month
             AND A.CUST_ID = B.CUST_ID
             AND B.COUNTRY_ID = C.COUNTRY_ID
             AND A.PROD_ID = D.PROD_ID
             AND A.CHANNEL_ID = E.CHANNEL_ID
           GROUP BY A.SALES_MONTH,
                 C.COUNTRY_NAME,
                 D.PROD_CATEGORY,
                 E.CHANNEL_DESC;
    
          COMMIT;
    
        EXCEPTION WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE(SQLERRM);
          ROLLBACK;
        END;
    

    결과

        PROCEDURE IUD_CH10_SALES_PROC이(가) 컴파일되었습니다.
    

    입력

        EXEC iud_ch10_sales_proc ( '199901');
    
        SELECT COUNT(*)
          FROM ch10_sales ;
    

    결과

        COUNT(*)
        ----------
               151
    

    동일한 매개변수로 프로시저를 다시 실행해 보자.

    입력

        EXEC iud_ch10_sales_proc ( '199901' );
    

    결과

        ORA-00001: 무결성 제약 조건(ORA_USER.PK_CH10_SALES)에 위배됩니다.
    

    입력

        SELECT COUNT(*)
          FROM ch10_sales ;
    

    결과

        COUNT(*)
        ----------
               151
    

    PRIMARY KEY를 추가했더니 동일한 조건(동일한 매개변수)으로 다시 데이터를 넣으려고 시도할 때 무결성 제약조건을 위반했다는 오류와 함께 ROLLBACK이 실행됐고 데이터는 원상태로 복귀되었다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.