會話與事務級臨時表和dual表

hd_system發表於2016-11-28

一、 會話臨時表

--建立會話臨時表
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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29209863/viewspace-2129183/,如需轉載,請註明出處,否則將追究法律責任。

相關文章