매개변수로 들어온 월과 국가에 대해 ch10_sales 테이블에 INSERT를 하고, 현재 시간 중 초를 숫자로 변환한 값에 10을 곱한 금액으로 갱신하고 있다. 이렇게 한 이유는 SAVEPOINT 테스트를 하기 위함이다. 먼저 ch10_sales 테이블을 깨끗이 비운 다음, 1999년 01월 이탈리아에 대해 프로시저를 실행해 보자.
입력
TRUNCATE TABLE ch10_sales;
EXEC iud_ch10_sales_proc ( '199901', 'Italy');
결과
table CH10_SALES이(가) 잘렸습니다.
익명 블록이 완료되었습니다.
첫 번째 실행은 성공적으로 수행되었다. ch10_sales 테이블의 금액을 확인해 보자.
입력
SELECT DISTINCT sales_amt
FROM ch10_sales;
결과
SALES_AMT
----------
220
프로시저를 다시 실행하면 ch10_country_month_sales 테이블에 INSERT 할 때 오류가 발생할 것이다.
입력
EXEC iud_ch10_sales_proc ( '199901', 'Italy');
결과
ORA-00001: 무결성 제약 조건(ORA_USER.SYS_C0011309)에 위배됩니다
예상대로 오류가 발생했다. 하지만 SAVEPOINT를 명시하였으므로 ch10_sales 테이블의 매출액은220이 아닌 새로운 값(현재 시간 중 초를 숫자로 환산한 다음 10을 곱한 금액)으로 갱신되었을 것이다.
입력
SELECT DISTINCT sales_amt
FROM ch10_sales;
결과
SALES_AMT
--------------
110
만약 SAVEPOINT를 지정하지 않았다면 ch10_sales 테이블에 가한 DELETE, INSERT, UPDATE작업이 모두 취소되어 ch10_sales 테이블의 sales_amt 값은 최초에 갱신했던 220으로 남아 있었겠지만 SAVEPOINT 지점에서 ROLLBACK을 했으므로 ch10_sales 테이블에 가해진 DELETE, INSERT, UPDATE는 모두 수행된 것이다. 또 주의할 점은 EXCEPTION 절에서 “ROLLBACK TO SAVEPOINT;” 다음에 “COMMIT;”을 명시해야 SAVEPOINT 이전에 수행한 작업이 DB에 반영된다. 이처럼 SAVEPOINT를 사용하면 특정 지점까지 트랜잭션을 제어할 수 있다.