더북(TheBook)

세션 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이다.

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