세션 GTT
트랜잭션 GTT와는 달리 세션 GTT는 세션 내에서 유지되는데 생성 구문은 다음과 같다.
CREATE GLOBAL TEMPORARY TABLE 테이블명 (
컬럼1 데이터타입,
...
... )
ON COMMIT PRESERVE ROWS;
마지막에 있는 “ON COMMIT PRESERVE ROWS”는 COMMIT을 실행한 후에도 데이터(로우)를 보존하라는 뜻이며 같은 세션 내에 있는 한 데이터가 유지된다. 마찬가지로 세션 GTT를 만들어 보자.
입력
CREATE GLOBAL TEMPORARY TABLE ch14_sess_gtt
(
ids NUMBER,
names VARCHAR2(50),
birth_dt DATE
)
ON COMMIT PRESERVE ROWS;
결과
global temporary TABLE이(가) 생성되었습니다.
이번에도 트랜잭션 GTT처럼 COMMIT 전과 후의 데이터를 비교해 보자.
입력
DECLARE
vn_cnt int := 0;
vn_cnt2 int := 0;
BEGIN
-- 데이터를 넣기
INSERT INTO ch14_sess_gtt
SELECT *
FROM ch13_physicist;
-- COMMIT 전 데이터 건수
SELECT COUNT(*)
INTO vn_cnt
FROM ch14_sess_gtt;
COMMIT;
-- COMMIT 후 데이터 건수
SELECT COUNT(*)
INTO vn_cnt2
FROM ch14_sess_gtt;
DBMS_OUTPUT.PUT_LINE('COMMIT 전: ' || vn_cnt);
DBMS_OUTPUT.PUT_LINE('COMMIT 후: ' || vn_cnt2);
END;
결과
COMMIT 전: 4
COMMIT 후: 4
트랜잭션 GTT와는 달리 COMMIT 전과 후의 데이터에 변화가 없다. 세션 GTT는 COMMIT 여부에 상관없이 같은 세션에서 데이터가 보존된다(물론 COMMIT 대신 ROLLBACK을 실행하면 데이터는 사라진다). 하지만 다른 세션에 있는 사용자는 이 데이터를 공유할 수 없다. 정리하면 세션 GTT는 COMMIT을 하더라도 같은 세션에서만 데이터가 공유되며, 세션을 종료하면 데이터는 깨끗이 사라져 버린다. 예를 들어, A란 사용자가 로그인해 GTT에 데이터를 넣었더라도, 다른 세션으로 로그인한 B 사용자는 A 사용자가 조작한 데이터를 전혀 볼 수 없다. B 사용자 입장에서는 같은 GTT를 조회하더라도 반환되는 결과 로우 수는 0이다. 그 반대도 마찬가지다. 앞에서 언급했던 테이블 이름 앞에 ‘#’이 붙는 MSSQL의 임시 테이블과 같은 특성을 가진 것이 바로 세션 GTT이다.