oracle 臨時(shí)表詳解及實(shí)例
在Oracle8i或以上版本中,可以創(chuàng)建以下兩種臨時(shí)表:
1。會(huì)話特有的臨時(shí)表
CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> )
ON COMMIT PRESERVE ROWS;
2。事務(wù)特有的臨時(shí)表
CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> )
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE MyTempTable
所建的臨時(shí)表雖然是存在的,但是你試一下insert 一條記錄然后用別的連接登上去select,記錄是空的,明白了吧,我把下面兩句話再貼一下:
--ON COMMIT DELETE ROWS 說(shuō)明臨時(shí)表是事務(wù)指定,每次提交后ORACLE將截?cái)啾恚▌h除全部行)
--ON COMMIT PRESERVE ROWS 說(shuō)明臨時(shí)表是會(huì)話指定,當(dāng)中斷會(huì)話時(shí)ORACLE將截?cái)啾怼?
沖突的問(wèn)題更本不用考慮.
臨時(shí)表只是保存當(dāng)前會(huì)話(session)用到的數(shù)據(jù),數(shù)據(jù)只在事務(wù)或會(huì)話期間存在。
通過(guò)CREATE GLOBAL TEMPORARY TABLE命令創(chuàng)建一個(gè)臨時(shí)表,對(duì)于事務(wù)類型的臨時(shí)表, 數(shù)據(jù)只是在事務(wù)期間存在,對(duì)于會(huì)話類型的臨時(shí)表,數(shù)據(jù)在會(huì)話期間存在。
會(huì)話的數(shù)據(jù)對(duì)于當(dāng)前會(huì)話私有。每個(gè)會(huì)話只能看到并修改自己的數(shù)據(jù)。DML鎖不會(huì)加到 臨時(shí)表的數(shù)據(jù)上。下面的語(yǔ)句控制行的存在性。
● ON COMMIT DELETE ROWS 表名行只是在事務(wù)期間可見(jiàn)
● ON COMMIT PRESERVE ROWS 表名行在整個(gè)會(huì)話期間可見(jiàn)
可以對(duì)臨時(shí)表創(chuàng)建索引,視圖,出發(fā)器,可以用export和import工具導(dǎo)入導(dǎo)出表的 定義,但是不能導(dǎo)出數(shù)據(jù)。表的定義對(duì)所有的會(huì)話可見(jiàn)。
Temporary Tables臨時(shí)表
1簡(jiǎn)介
ORACLE數(shù)據(jù)庫(kù)除了可以保存永久表外,還可以建立臨時(shí)表temporary tables。這些臨時(shí)表用來(lái)保存一個(gè)會(huì)話SESSION的數(shù)據(jù),
或者保存在一個(gè)事務(wù)中需要的數(shù)據(jù)。當(dāng)會(huì)話退出或者用戶提交commit和回滾rollback事務(wù)的時(shí)候,臨時(shí)表的數(shù)據(jù)自動(dòng)清空,
但是臨時(shí)表的結(jié)構(gòu)以及元數(shù)據(jù)還存儲(chǔ)在用戶的數(shù)據(jù)字典中。
臨時(shí)表只在oracle8i以及以上產(chǎn)品中支持。
2詳細(xì)介紹
Oracle臨時(shí)表分為 會(huì)話級(jí)臨時(shí)表 和 事務(wù)級(jí)臨時(shí)表。
會(huì)話級(jí)臨時(shí)表是指臨時(shí)表中的數(shù)據(jù)只在會(huì)話生命周期之中存在,當(dāng)用戶退出會(huì)話結(jié)束的時(shí)候,Oracle自動(dòng)清除臨時(shí)表中數(shù)據(jù)。
事務(wù)級(jí)臨時(shí)表是指臨時(shí)表中的數(shù)據(jù)只在事務(wù)生命周期中存在。當(dāng)一個(gè)事務(wù)結(jié)束(commit or rollback),Oracle自動(dòng)清除臨時(shí)表中數(shù)據(jù)。
臨時(shí)表中的數(shù)據(jù)只對(duì)當(dāng)前Session有效,每個(gè)Session都有自己的臨時(shí)數(shù)據(jù),并且不能訪問(wèn)其它Session的臨時(shí)表中的數(shù)據(jù)。因此,
臨時(shí)表不需要DML鎖.當(dāng)一個(gè)會(huì)話結(jié)束(用戶正常退出 用戶不正常退出 ORACLE實(shí)例崩潰)或者一個(gè)事務(wù)結(jié)束的時(shí)候,Oracle對(duì)這個(gè)會(huì)話的
表執(zhí)行 TRUNCATE 語(yǔ)句清空臨時(shí)表數(shù)據(jù).但不會(huì)清空其它會(huì)話臨時(shí)表中的數(shù)據(jù).
你可以索引臨時(shí)表和在臨時(shí)表基礎(chǔ)上建立視圖.同樣,建立在臨時(shí)表上的索引也是臨時(shí)的,也是只對(duì)當(dāng)前會(huì)話或者事務(wù)有效.
臨時(shí)表可以擁有觸發(fā)器.
3建立臨時(shí)表
臨時(shí)表的定義對(duì)所有會(huì)話SESSION都是可見(jiàn)的,但是表中的數(shù)據(jù)只對(duì)當(dāng)前的會(huì)話或者事務(wù)有效.
建立方法:
1) ON COMMIT DELETE ROWS 定義了建立事務(wù)級(jí)臨時(shí)表的方法.
CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT DELETE ROWS;
EXAMPLE:
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) 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 定義了創(chuàng)建會(huì)話級(jí)臨時(shí)表的方法.
CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT PRESERVE ROWS; EXAMPLE:
會(huì)話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; STARTDATE ENDDATE CLASS ---------- ---------- -------------------- 17-1?? -03 17-1?? -03 session temperary
會(huì)話2:
SQL> select * from permernate; A ---------- 1 2 SQL> select * from admin_work_area;
未選擇行.
會(huì)話2看不見(jiàn)會(huì)話1中臨時(shí)表的數(shù)據(jù).
4 ORACLE臨時(shí)表和SQLSERVER臨時(shí)表異同
SQL SERVER臨時(shí)表
也可以創(chuàng)建臨時(shí)表。臨時(shí)表與永久表相似,但臨時(shí)表存儲(chǔ)在 tempdb 中,當(dāng)不再使用時(shí)會(huì)自動(dòng)刪除。
有本地和全局兩種類型的臨時(shí)表,二者在名稱、可見(jiàn)性和可用性上均不相同。本地臨時(shí)表的名稱以單個(gè)數(shù)字符號(hào) (#) 打頭;
它們僅對(duì)當(dāng)前的用戶連接是可見(jiàn)的;當(dāng)用戶從 Microsoft? SQL Server? 2000 實(shí)例斷開(kāi)連接時(shí)被刪除。全局臨時(shí)表的名稱以數(shù)學(xué)符號(hào)
(##) 打頭,創(chuàng)建后對(duì)任何用戶都是可見(jiàn)的,當(dāng)所有引用該表的用戶從 SQL Server 斷開(kāi)連接時(shí)被刪除。
例如,如果創(chuàng)建名為 employees 的表,則任何人只要在數(shù)據(jù)庫(kù)中有使用該表的安全權(quán)限就可以使用該表,除非它已刪除。
如果創(chuàng)建名為 #employees 的本地臨時(shí)表,只有您能對(duì)該表執(zhí)行操作且在斷開(kāi)連接時(shí)該表刪除。如果創(chuàng)建名為 ##employees 的全局臨時(shí)表
數(shù)據(jù)表中的任何用戶均可對(duì)該表執(zhí)行操作。如果該表在您創(chuàng)建后沒(méi)有其他用戶使用,則當(dāng)您斷開(kāi)連接時(shí)該表刪除。如果該表在您創(chuàng)建
后有其他用戶使用,則 SQL Server在所有用戶斷開(kāi)連接后刪除該表
不同:
1. SQL SERVER臨時(shí)表是一種”內(nèi)存表”,表是存儲(chǔ)在內(nèi)存中的.ORACLE臨時(shí)表除非執(zhí)行DROP TABLE,否則表定義會(huì)保留在數(shù)據(jù)字典中.
2. SQL SERVER臨時(shí)表不存在類似ORACLE臨時(shí)表 事務(wù)級(jí)別 上的功能.
3 SQL SERVER本地臨時(shí)表(#) 與 ORACLE的會(huì)話級(jí)別臨時(shí)表類似,但是在會(huì)話退出的時(shí)候,ORACLE不會(huì)刪除表.
4 SQL SERVER的全局臨時(shí)表(##) 是指多個(gè)連接共享同一片內(nèi)存.當(dāng)沒(méi)有指針引用該內(nèi)存區(qū)域時(shí),SQL SERVER自動(dòng)釋放全局臨時(shí)表.
5 由于ORACLE不是一種 內(nèi)存中的數(shù)據(jù)庫(kù). 所以如果ORACLE類似SQL SERVER 頻繁的對(duì)臨時(shí)表進(jìn)行建立和刪除,必定會(huì)影響性能.
所以O(shè)RACLE會(huì)保留臨時(shí)表的定義直到用戶DROP TABLE.
6 在ORACLE中,如果需要多個(gè)用戶共享一個(gè)表(類似SQL SERVER的全局臨時(shí)表##).則可以利用永久表,
并且在表中添加一些可以唯一標(biāo)識(shí)用戶的列.利用觸發(fā)器和視圖.當(dāng)用戶退出的時(shí)候,根據(jù)該登陸用戶的唯一信息刪除相應(yīng)的表中的數(shù)據(jù).
這種方法給ORACLE帶來(lái)了一定量的負(fù)載.
以上就是對(duì)oracle 臨時(shí)表 的資料整理,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!
相關(guān)文章
oracle數(shù)據(jù)庫(kù)定時(shí)任務(wù)dbms_job的用法詳解
這篇文章給大家詳細(xì)介紹了dbms_job的用法,用于安排和管理作業(yè)隊(duì)列,通過(guò)使用作業(yè),可以使ORACLE數(shù)據(jù)庫(kù)定期執(zhí)行特定的任務(wù)。有需要的朋友們可以參考借鑒。2016-09-09Oracle創(chuàng)建Database Link的兩種方式詳解
Oracle數(shù)據(jù)庫(kù)如何創(chuàng)建Database Link呢?本文我們主要就介紹一下這部分內(nèi)容,Oracle數(shù)據(jù)庫(kù)創(chuàng)建Database Link有兩種方式,一種是通過(guò)菜單,一種是通過(guò)SQL2016-02-02關(guān)于Oracle12C默認(rèn)用戶名system密碼不正確的解決方案
這篇文章主要介紹了關(guān)于Oracle12C默認(rèn)用戶名system密碼不正確的解決方案 ,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10Oracle 11g Release (11.1) 索引底層的數(shù)據(jù)結(jié)構(gòu)
本文介紹關(guān)于 Oracle 索引的結(jié)構(gòu)。大概了解 Oracle 索引底層的數(shù)據(jù)結(jié)構(gòu),從而更好地理解 Oracle 索引對(duì)增、刪、改、查的性能2012-11-11Oracle數(shù)據(jù)庫(kù)創(chuàng)建用戶與數(shù)據(jù)庫(kù)備份小結(jié)(必看篇)
下面小編就為大家推薦一篇Oracle數(shù)據(jù)庫(kù)創(chuàng)建用戶與數(shù)據(jù)庫(kù)備份小結(jié)。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02ORACLE隨機(jī)數(shù)DBMS_RANDOM包
這篇文章主要介紹了ORACLE隨機(jī)數(shù)DBMS_RANDOM包,通過(guò)dbms_random包調(diào)用隨機(jī)數(shù)的方法大致有4種,具體哪4種請(qǐng)看本篇文章吧2015-09-09Oracle開(kāi)發(fā)之分析函數(shù)總結(jié)
本文是對(duì)Oracle中分析函數(shù)做的總結(jié),主要總結(jié)了前幾篇關(guān)于分析函數(shù)、窗口函數(shù)、報(bào)表函數(shù)文章的內(nèi)容,需要的朋友可以參考下。2016-05-05