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