반응형

/*
-- 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;
선택된 없음

 


 

반응형

+ Recent posts