Where The Streets Have No Name

Oracle - GLOBAL TEMPORARY TABLE 본문

Developement/DataBase

Oracle - GLOBAL TEMPORARY TABLE

highheat 2006. 10. 24. 15:29
1. Oracle8i 이상 버전을 사용할 경우에는 세션이 끝날 때까지만 존재하는
테이블을 만들 수 있습니다. Oracle8i New Features 중 하나인 TEMPORARY TABLE을
이용하시면 됩니다. 테이블을 만드는 명령문은 아래와 같습니다.

CREATE GLOBAL TEMPORARY TABLE
(...컬럼 및 제약조건 정의 등의 문법은 일반 테이블과 동일합니다...)
[ON COMMIT DELETE ROWS | ON COMMIT PRESERVE ROWS];

ON COMMIT DELETE ROWS 절을 이용하여 생성한 테이블은 트랜잭션 끝까지, ON
COMMIT PRESERVE ROWS 절을 사용하여 만든 테이블은 세션 끝까지만 데이터가
저장됩니다. 그리고 해당 트랜잭션, 또는 세션 동안 이 테이블에 데이터를
등록/수정/삭제하는 작업도 물론 가능합니다.

단, 오라클의 temporary table은 테이블의 정의는 DROP TABLE 문장으로 테이블을
삭제할 때까지 영구적으로 데이터베이스에 저장됩니다. 즉, 저장된 데이터의
유효기간이 트랜잭션 또는 세션 동안인 것이며 테이블 정의는 여전히
데이터베이스에 남아있기 때문에 다른 트랜잭션 또는 세션에서 또 그 테이블을
사용할 수 있습니다.

2. Temporary table의 저장공간은 트랜잭션이나 세션 동안만 임시로 사용될
공간이기 때문에 데이터 정렬시에 사용되는 temporary segment 와 동일한 형태로
만들어집니다. 따라서 사용자에게 temporary tablespace로 지정되어 있는
테이블스페이스에 만들어지며 이 테이블스페이스의 종류는 permenent일 수도 있고
temporary일 수도 있습니다.

sample script

CREATE GLOBAL TEMPORARY TABLE TEMP_TABLE  -- 템프테이블 생성
(
  EMP   VARCHAR2(60),
  SU    NUMBER
)
ON COMMIT PRESERVE ROWS;

CREATE OR REPLACE PROCEDURE TEMP_TABLE_PROC   IS
BEGIN
  
   --java에서 connection pool을 사용시 session이 유지되므로 delete로 이전 자료삭제
   delete from temp_table;
   
   INSERT INTO TEMP_TABLE (EMP, SU)
     VALUES('테스트1', 99);
   INSERT INTO TEMP_TABLE (EMP, SU)
     VALUES('테스트2', 99);
   INSERT INTO TEMP_TABLE (EMP, SU)
     VALUES('테스트3', 99);
END;

--java source code
 CallableStatement cs = con.prepareCall("{call TEMP_TABLE_PROC}");
 cs.execute();
 Statement stmt = con.createStatement();
 String query = "SELECT emp,su from temp_table ";
 ResultSet rset = stmt.executeQuery (query);
 while (rset.next()) {
     out.println(rset.getString(1)+"<br>");
 }