一、 會話臨時表
--創建會話臨時表
create global temporary table tmp_user_session(user_id int, user_name varchar2(20),user_email varchar2(30))
--這句表示 當事務提交時 保留數據
on commit preserve rows
--向臨時表中插入數據
insert into tmp_user_session(user_id,user_name,user_email) values(1,'孫業寶','948987600@qq.com')
insert into tmp_user_session(user_id,user_name,user_email) values(1,'王麗莎','934560@qq.com')
commit
--查詢 有數據
select * from tmp_user_session
--重新打開 一個sql窗口 再次查詢 則無數據了 select * from tmp_user_session 說明此插入的數據 只為本窗口會話存在
二、創建事務臨時表
--創建事務臨時表
create global temporary table tmp_users_transaction (user_id int,user_name varchar2(20),user_email varchar2(30))
--這句表示 當事務提交時 刪除數據
on commit delete rows
--向臨時表中插入數據
insert into tmp_users_transaction(user_id,user_name,user_email) values(1,'孫業寶','948987600@qq.com');
insert into tmp_users_transaction(user_id,user_name,user_email) values(1,'王麗莎','934560@qq.com')
--查詢 有數據
select * from tmp_users_transaction
--提交下語句 或者回滾事務 rollback 再次查詢 select * from tmp_users_transaction 就沒有數據了 因為事務臨時表 就是在事務提交時 就數據清空了
commit;rollback;
--查看臨時表的表空間,其實他們的表空間為空
select table_name, tablespace_name
from user_tables
where table_name = 'T_USERS'
or table_name = 'TMP_USERS_SESSION'
or table_name = 'TMP_USERS_TRANSACTION'
臨時表的應用場景
1.大表分割
眾所周知,為表創建合適的索引可以在很大程度上提高數據查詢的速度。但是當某個表的數據量相當大,例如數據量為億級時,那么創建索引將會花費大量的時間,而且,查詢大的索引表,與直接查詢數據表相比,在性能上幾乎沒有任何優勢,此時,一個常用的方法就是分割大表,例如:將大表分割為多個小的臨時表,然后對這些小表進行相應操作,最后對所有查詢結果進行綜合處理。
2.解決並行問題
當多個進程同時對某張表進行操作時,往往會出現並行問題。
3.作為數據緩存
在程序段,可能需要對若干數據進行復雜運算。此時,可以創建一個臨時表,並將這些數據存儲在臨時表中。因為可以像操作普通表一樣操作臨時表,這樣,許多函數和sql語句都可以用來處理這些數據。
三、特殊表 dual
特殊表 dual 該表是每個數據庫創建時默認生成的。該表僅有一列一行,在數據庫開發中有着非常特殊的作用。
1.分析dual表 執行
select * from dual可以看出dual 只有一行一列。
2. dual表的應用場景
在oracle數據庫中,dual表實際上是作為一個虛表的概念存在的。也就是說dual表存在的意義並非為了存儲數據。更多的時候,dual表用來作為 from的源表。因為oracle的查詢語句必須滿足 select * from table name 語法格式,其中的from所指向的表是必須的,所以即使某些數據不屬於任何表,也必須有一個強制的表名。dual表即可用做這個強制的虛表。
--查看dual表結構
select * from dual
--查詢數據當前日期
select sysdate from dual
--計算結果
select 3*4-3 as results ,8-9 as plus from dual