더북(TheBook)

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이 실행됐고 데이터는 원상태로 복귀되었다.

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