Oracle 臨時表詳解(temporary table)


文章目錄

1 概述

2.2 會話級臨時表
1 概述
1. 作用:用來 '臨時' 存儲數據
(1) 當一個事務或會話結束的時候,這個臨時表中的 '數據' 會被數據庫自動清空
(2) 但 '表結構' 依舊保留

2. 分類: '生命周期的不同'
(1) 事務級臨時表: on commit delete rows; commit 時 '刪除' 記錄(默認)
(2) 會話級臨時表: on commit preserve rows; commit 時 '保存' 記錄,結束會話時 '刪除' 記錄

3. 注意
(1) 臨時表處理的效率高於普通表
<1> 不記錄 '日志'
<2> 只能當前用戶使用,不會產生 '鎖'
(2) 和普通表操作方式一樣

4. 以下測試中,創建臨時表后,信息查詢
select t.owner,
t.table_name,
t.tablespace_name, -- 所屬表空間
t.logging, -- 是否記錄日志
t.duration --生命周期
from dba_tables t
where t.owner = 'SCOTT'
and t.table_name in ('TRANSACTION_TEMP', 'SESSION_TEMP');

2 分類
2.1 事務級臨時表
create global temporary table transaction_temp (
tid number(3),
tname varchar2(30)
) on commit delete rows; -- on commit delete rows 可省略(默認)

驗證:事務中,數據可以查詢,事務結束后(commit、rollback)后,數據被清空

insert into transaction_temp(tid, tname) values(1, 'a');
insert into transaction_temp(tid, tname) values(2, 'b');
-- commit;

select * from transaction_temp;

查詢截圖:

2.2 會話級臨時表
create global temporary table session_temp (
tid number(3),
tname varchar2(30)
) on commit preserve rows;

驗證:commit 時,保存數據至表中,會話結束后,數據被清空

insert into session_temp(tid, tname) values(1, 'a');
insert into session_temp(tid, tname) values(2, 'b');
commit;

select * from session_temp;

結束會話有以下辦法:(上述測試,立馬就結束了,執行很快哦)

1. 自然結束(執行完成) -- sql_text => begin :id := sys.dbms_transaction.local_transaction_id; end;
select t1.sid, t1.serial#, t2.sql_text, t2.action
from v$session t1, v$sql t2
where t2.sql_id = t1.prev_sql_id
and t1.username = 'SCOTT';

2. 手動刪除
(1) alter system kill session 'sid,serial#';

再新建一個會話,查詢:數據被清空了

 一個用戶,刪除表的時候,會把表的數據都刪除,進而影響了其他用戶對該表的使用

 
樓上說的在點子上,真正的臨時表都是session隔離的,所以多用戶並發理論上來說是沒有問題的。 如果lz使用普通表來代替了oracle的臨時表即建立lz所謂的臨時表時沒有加temporary 等關鍵字,就會出現並發問題
 
 
樓主的臨時表示普通的表吧? 建議根據你的實際情況,建臨時表解決這個問題,下面是關於臨時表的介紹等,希望可以幫到你。 臨時表顧名思義就是一個臨時的表,不僅可以在commit或者session退出之后對數據進行高效清理數據,而且對於不同的回話都是獨立的,也就是說a用戶登錄對全局臨時表進行操作后,這時候b用戶登錄查看全局臨時表,根本不會看到任何記錄,是不是很神奇,這點可以自行測試哈。 創建語句: create global temporary table tt2(t number) on commit delete/preserve rows;(順便加一句,oracle過程中使用臨時表要用基於session的,因為插入數據會自動隱式提交,而且過程里面不能使用commit,要不然數據會重復) 臨時表的使用場合就不用我多說了,基於commit的全局臨時表,無論commit或者關閉會話都會清空;而基於session的全局臨時表,關閉會話會清空,是不是方便,而且產生的log非常少哦,自己動手試試吧。
 

Oracle臨時表分為 會話級臨時表 和 事務級臨時表。

會話級臨時表是指臨時表中的數據只在會話生命周期之中存在,當用戶退出會話結束的時候,Oracle自動清除臨時表中數據。

事務級臨時表是指臨時表中的數據只在事務生命周期中存在。當一個事務結束(commit orrollback),Oracle自動清除臨時表中數據。

臨時表中的數據只對當前Session有效,每個Session都有自己的臨時數據,並且不能訪問其它Session的臨時表中的數據。因此,臨時表不需要DML鎖。

DML操作的臨時表不產生redo log重作日志,但會產生回滾日志Undo log;Undo的產生(rollback segment)會產生Redo log。

當一個會話結束(用戶正常退出 用戶不正常退出 ORACLE實例崩潰)或者一個事務結束的時候,Oracle對這個會話的表執行 TRUNCATE 語句清空臨時表數據.但不會清空其它會話臨時表中的數據.

3建立臨時表

臨時表的定義對所有會話SESSION都是可見的,但是表中的數據只對當前的會話或者事務有效.

你可以索引臨時表和在臨時表基礎上建立視圖.同樣,建立在臨時表上的索引也是臨時的,也是只對當前會話或者事務有效.臨時表可以擁有觸發器.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM