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

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