oracle GLOBAL TEMPORARY 臨時表

2、詳細介紹
會話級臨時表是指臨時表中的數據只在會話生命週期之中存在,當用戶退出會話結束的時候,Oracle自動清除臨時表中數據。
事務級臨時表是指臨時表中的數據只在事務生命週期中存在。當一個事務結束(commit or rollback),Oracle自動清除臨時表中數據。
3、建立臨時表
臨時表的定義對所有會話SESSION都是可見的,但是表中的數據只對當前的會話或者事務有效.
建立方法:
1) ON COMMIT DELETE ROWS 定義了建立事務級臨時表的方法.
EXAMPLE:
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area
2 (startdate DATE,
3 enddate DATE,
4 class CHAR(20))
5 ON COMMIT DELETE ROWS; -- 事務級別
SQL> create table permernate( a number);
SQL> insert into admin_work_area values(sysdate,sysdate,'temperary table');
SQL> insert into permernate values(1);
SQL> commit; --事務提交
SQL> select * from admin_work_area; -- 從緩存表中查不到數據
SQL> select * from permernate;
A(列名)
----------
1

2)ON COMMIT PRESERVE ROWS
會話1:
SQL> drop table admin_work_area;
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area
2 (startdate DATE,
3 enddate DATE,
4 class CHAR(20))
5 ON COMMIT PRESERVE ROWS;
SQL> insert into permernate values(2);
SQL> insert into admin_work_area values(sysdate,sysdate,'session temperary');
SQL> commit; --提交事務
SQL> select * from permernate;
A(列明)
----------
1(事務性臨時表例子中插入的數據)
2

SQL> select * from admin_work_area; --查詢臨時表有值,因爲還在同一session中

STARTDATE ENDDATE CLASS
---------- ---------- --------------------
17-1?? -03 17-1?? -03 session temperary

會話2:
SQL> select * from permernate;
A
----
1
2
SQL> select * from admin_work_area; -- 每個會話只能看到自身的數據
未選擇行.
會話2看不見會話1中臨時表的數據.

總結:會話或事務性臨時表用來定義會話時臨時表中數據的生命週期。臨時表結構對於每個session來說都可見,而數據是每個session一份,類似於java中的私有變量一樣;
其實不用去特別的記憶,從名字上就可以區分,如下:
ON COMMIT DELETE ROWS : 表明提交的時候刪除數據;
ON COMMIT PRESERVE ROWS :表明提交的時候保存數據;
所以,在一次會話中執行了commit語句後,從事務性臨時表中獲取不到數據,而從會話臨時表中可以獲取到數據,就像上面例子中的演示。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章