트랜잭션 GTT
먼저 트랜잭션 GTT의 생성 구문에 대해 살펴 보자. 일반적인 테이블 생성 구문과 거의 흡사하다.
CREATE GLOBAL TEMPORARY TABLE 테이블명 (
컬럼1 데이터타입,
...
... )
[ ON COMMIT DELETE ROWS ] ;
GTT와 일반 테이블 생성 구문과의 차이점은 CREATE 다음에 “GLOBAL TEMPORARY”와 맨 마지막에 “ON COMMIT DELETE ROWS”란 구문이 추가된다는 점이다. “ON COMMIT DELETE ROWS”는 COMMIT 시에 로우를 삭제하라는 의미로, DML로 GTT 테이블에 데이터를 생성, 수정할 당시에는 데이터가 남아 있지만 COMMIT을 실행하면 모든 데이터(로우)가 없어진다는 뜻이다. 트랜잭션이 살아 있는 동안에만 데이터가 유지되므로 트랜잭션 GTT라고 부르는 것이며, 생략이 가능하므로 이 구문을 빼고 GTT를 생성하면 디폴트로 트랜잭션 GTT가 만들어 진다. 그럼 트랜잭션 GTT를 생성해 보자.
입력
CREATE GLOBAL TEMPORARY TABLE ch14_tranc_gtt
(
ids NUMBER,
names VARCHAR2(50),
birth_dt DATE
)
ON COMMIT DELETE ROWS;
결과
global temporary TABLE이(가) 생성되었습니다.
이전 장에서 만들었던 ch13_physicist 테이블과 같은 구조로 GTT를 생성했다. 이제 데이터를 넣고 트랜잭션 내에서 데이터가 유지되는지 알아 보자.
입력
DECLARE
vn_cnt int := 0;
vn_cnt2 int := 0;
BEGIN
-- 데이터를 넣기
INSERT INTO ch14_tranc_gtt
SELECT *
FROM ch13_physicist;
-- COMMIT 전 데이터 건수
SELECT COUNT(*)
INTO vn_cnt
FROM ch14_tranc_gtt;
COMMIT;
-- COMMIT 후 데이터 건수
SELECT COUNT(*)
INTO vn_cnt2
FROM ch14_tranc_gtt;
DBMS_OUTPUT.PUT_LINE('COMMIT 전: ' || vn_cnt);
DBMS_OUTPUT.PUT_LINE('COMMIT 후: ' || vn_cnt2);
END;
결과
COMMIT 전: 4
COMMIT 후: 0
익명 블록 실행 결과를 보면 COMMIT을 기점으로 COMMIT이 완료된 다음에는 이전에 넣었던 모든 데이터가 사라졌음을 알 수 있다.