반응형
/*
-- Title : [Ora21c] 임시테이블 사용법
-- Tag : oracle 오라클 temp table temporary table 임시테이블 임시 테이블
*/
■ 임시 테이블 종류
- 글로벌 임시 테이블
- 데이터베이스 인스턴스 내의 모든 세션에서 접근 가능한 임시 테이블.
- CREATE GLOBAL TEMPORARY TABLE 문을 사용하여 생성. - 로컬 임시 테이블
- 특정 세션에서만 접근 가능한 임시 테이블.
- CREATE GLOBAL TEMPORARY TABLE 문의 ON COMMIT DELETE ROWS 옵션을 생략하거나,
데이터베이스 시스템에서 자동으로 생성하는 방식으로 생성.
■ Data 유지기간
- ON COMMIT PRESERVE ROWS
- SESSION 단위.
- 다른 Session에서 볼 수 없음.
- Session 종료 되면 사라짐. (SQL Server와 유사)
- 세션이 종료되어도 임시테이블이 남아 있음. (SQL Server와 다름) - ON COMMIT DELETE ROWS
- TRANSACTION 단위,
- COMMIT 되는 시점에서 자동으로 Data Delete.
■ 기타 특성
- DML LOCK 불필요
- Redo Log 없음
- INDEX, VIEW, TRIGGER 생성 가능
■ ON COMMIT PRESERVE ROWS 테스트(SQL Server 임시테이블과 유사)
----------------------------------------
-- 세션A) 세션 오픈 ---------------------------------------- SELECT sid FROM v$mystat WHERE rownum = 1; SID| ---+ 58| ---------------------------------------- -- 세션A) 임시 테이블 생성 ---------------------------------------- CREATE GLOBAL TEMPORARY TABLE temp_table ( a numeric , b varchar2(100) ) ON COMMIT PRESERVE ROWS; ---------------------------------------- -- 세션A) 데이터 저장 ---------------------------------------- INSERT INTO temp_table SELECT 111, 'aaa' FROM dual UNION all SELECT 222, 'bbb' FROM dual UNION all SELECT 333, 'ccc' FROM dual; ---------------------------------------- -- 세션A) 데이터 조회 ---------------------------------------- SELECT * FROM temp_table; A |B | ---+---+ 111|aaa| 222|bbb| 333|ccc| ---------------------------------------- -- 세션B) 세션 오픈 ---------------------------------------- SELECT sid FROM v$mystat WHERE rownum = 1; SID| ---+ 128| ----------------------------------------
-- 세션B) 데이터 조회 ---------------------------------------- SELECT * FROM temp_table; ---------------------------------------- -- 세션B) 데이터 입력 ---------------------------------------- INSERT INTO temp_table SELECT 4444, 'aaaa' FROM dual UNION all SELECT 5555, 'bbbb' FROM dual UNION all SELECT 6666, 'cccc' FROM dual; ---------------------------------------- -- 세션B) 데이터 조회 ---------------------------------------- SELECT * FROM temp_table; A |B | ----+----+ 4444|aaaa| 5555|bbbb| 6666|cccc| ---------------------------------------- -- 세션B) 동일 이름 임시 테이블 생성 ---------------------------------------- CREATE GLOBAL TEMPORARY TABLE temp_table ( a numeric , b varchar2(100) ) ON COMMIT PRESERVE ROWS; SQL Error [955] [42000]: ORA-00955: 기존의 객체가 이름을 사용하고 있습니다. |
■ ON COMMIT DELETE ROWS 테스트
----------------------------------------
-- Auto Commit 확인 ---------------------------------------- SQL> show autocommit; autocommit OFF ---------------------------------------- -- 세션A) 세션 오픈 ---------------------------------------- SELECT sid FROM v$mystat WHERE rownum = 1; SID ---------- 152 ---------------------------------------- -- 세션A) 임시 테이블 생성 ---------------------------------------- CREATE GLOBAL TEMPORARY TABLE temp_table2 ( a numeric , b varchar2(100) ) ON COMMIT DELETE ROWS; ---------------------------------------- -- 세션A) 데이터 저장 ---------------------------------------- INSERT INTO temp_table2 SELECT 111, 'aaa' FROM dual UNION all SELECT 222, 'bbb' FROM dual UNION all SELECT 333, 'ccc' FROM dual; ---------------------------------------- -- 세션A) 데이터 조회 ---------------------------------------- SELECT * FROM temp_table2; ---------------------------------------- -- 세션A) Commit 후 조회 ---------------------------------------- COMMIT; 커밋 완료. SELECT * FROM temp_table2; 선택된 행 없음 |
반응형