1.介紹
Oracle數據庫不僅可以保存永久表,還可以建立臨時表。這些臨時表用於保存會話數據或事務中需要的數據。當會話退出或用戶提交commit和rollback事務時,臨時表的數據會自動清空,但臨時表的結構和元數據仍然存儲在用戶的數據字典中。
詳細介紹
Oracle臨時表分為會話級臨時表和事務級臨時表。
會話級臨時表意味著臨時表中的數據只存在於會話的生命周期中。當用戶退出會話時,Oracle將自動清除臨時表中的數據。
事務級臨時表是指臨時表中的數據只存在於事務生命周期中。提交或回滾事務時,Oracle會自動清除臨時表中的數據。
臨時表中的數據只對當前會話有效,每個會話都有自己的臨時數據,其他會話的臨時表中的數據無法訪問。因此,臨時表不需要DML鎖。
當會話結束(用戶正常退出,Oracle實例異常崩潰)或事務結束時,ORACLE執行TRUNCATE語句清除該會話臨時表中的數據,但不會清除其他會話臨時表中的數據。
您可以索引臨時表並基於臨時表構建視圖。同樣,建立在臨時表上的索引也是臨時的,只對當前會話或事務有效。臨時表可以有觸發器。
3.建立壹個臨時表
臨時表的定義對所有會話都可見,但表中的數據只對當前會話或事務有效。
建立方法:
1)定義了建立事務級臨時表的方法。在提交刪除行時創建全局臨時表admin _ work _ area(開始日期date,結束日期date,class char(20));示例:SQL & gt在提交刪除行時創建全局臨時表admin_work_area 2 (startdate DATE,3 enddate DATE,4 class CHAR(20))5;SQL & gt創建permernate表(壹個數字);SQL & gt插入admin_work_area值(sysdate,sysdate,'臨時表');SQL & gt插入永久值(1);SQL & gt提交;SQL & gtselect * from admin _ work _ areaSQL & gtselect * from permernate1 2)ON COMMIT PRESERVE ROWS定義了創建會話級臨時表的方法。在提交保留行時創建全局臨時表admin _ work _ area (start date,end date,class char(20));示例:
會話1:
SQL & gt刪除表admin _ work _ areaSQL & gt在提交保留行上創建全局臨時表admin_work_area 2 (startdate DATE,3 enddate DATE,4 class CHAR(20))5;SQL & gt插入到永久值(2);SQL & gt插入admin_work_area值(sysdate,sysdate,'會話臨時');SQL & gt提交;SQL & gtselect * from permernatea-1 2 SQL & gt;select * from admin _ work _ area開始日期結束日期類- - - 17-1。-03 17-1?-03會議臨時
第二場會議:
SQL & gtselect * from permernatea-1 2 SQL & gt;select * from admin _ work _ area未選擇任何行。
會話2看不到會話1中臨時表的數據。
4.4之間的異同。Oracle臨時表和SQL Server臨時表。
SQL Server也可以創建臨時表。臨時表類似於永久表,但它們存儲在tempdb中,不再使用時會自動刪除。
有兩種類型的臨時表,本地和全局,它們在名稱、可見性和可用性上是不同的。本地臨時表的名稱以壹個數字符號(#)開頭;它們僅對當前用戶連接可見;當用戶與Microsoft SQL Server實例斷開連接時,他們將被刪除。全局臨時表的名稱以數學符號(# #)開頭,該符號在創建後對任何用戶都可見,當引用該表的所有用戶與SQL Server斷開連接時,該符號將被刪除。
SQL語句使用CREATE TABLE語句中為table_name指定的名稱來引用臨時表:
創建表#MyTempTable (cola INT主鍵)插入到#MyTempTable值(1)中
如果本地臨時表是由存儲過程或由多個用戶同時執行的應用程序創建的,SQL Server必須能夠區分不同用戶創建的表。為此,SQL Server會在每個本地臨時表的表名後面附加壹個數字後綴。存儲在tempdb數據庫的sysobjects表中的臨時表的全名由CREATE TABLE語句中指定的表名和系統生成的數字後綴組成。為了允許後綴,為本地臨時表指定的表名table_name不能超過116個字符。
除非使用DROP TABLE語句顯式刪除臨時表,否則臨時表將在退出其作用域時被系統自動刪除:
當存儲過程完成時,在存儲過程中創建的本地臨時表將被自動刪除。創建該表的存儲過程所執行的所有嵌套存儲過程都可以引用該表。但是,調用創建該表的存儲過程的進程不能引用該表。
在當前會話結束時,所有其他本地臨時表都將被自動刪除。
當創建該表的會話結束並且其他任務停止引用該表時,全局臨時表將被自動刪除。任務和表之間的關聯僅在單個Transact-SQL語句的生命周期內維護。換句話說,當創建全局臨時表的會話結束時,該表將在引用該表的最後壹條Transact-SQL語句完成後自動刪除。
例如,如果您創建了壹個名為employees的表,則任何擁有使用數據庫中該表的安全權限的人都可以使用該表,除非該表已被刪除。如果您創建壹個名為#employees的本地臨時表,只有您可以對該表執行操作,並且該表將在您斷開連接時被刪除。如果創建名為##employees的全局臨時表,數據庫中的任何用戶都可以對該表執行操作。如果在您創建該表後,其他用戶沒有使用它,當您斷開連接時,它將被刪除。如果該表在創建後被其他用戶使用,SQL Server將在所有用戶斷開連接後刪除該表。
在存儲過程或觸發器中創建的本地臨時表不同於在調用存儲過程或觸發器之前創建的同名臨時表。如果查詢引用了壹個臨時表,並且有兩個臨時表具有相同的名稱,則沒有定義要對哪個表進行查詢。嵌套存儲過程還可以創建與調用它的存儲過程所創建的臨時表同名的臨時表。嵌套存儲過程中對表名的所有引用都被解釋為為嵌套過程創建的表,例如:
創建過程Test2 AS CREATE TABLE # t(x INT PRIMARY KEY)INSERT INTO # t VALUES(2)SELECT Test2 col = x FROM # t GO創建過程test 1 AS CREATE TABLE # t(x INT PRIMARY KEY)INSERT INTO # t VALUES(1)SELECT test 1 col = x FROM # t EXEC Test2 GO創建TABLE # t(x INT PRIMARY KEY)INSERT INTO # t VALUES(99)GO EXEC test 1 GO
以下是結果集:
(1行受影響)Test1Col - 1 (1行受影響)Test2Col - 2
創建本地或全局臨時表時,CREATE TABLE語法支持除外鍵約束之外的所有約束定義。如果在臨時表中指定了外鍵約束,該語句將返回壹條警告消息,指出該約束已被忽略,並且仍將創建沒有外鍵約束的表。不能在外鍵約束中引用臨時表。
考慮使用表變量而不是臨時表。當需要在臨時表上顯式創建索引時,或者當多個存儲過程或函數需要使用表值時,臨時表非常有用。通常,表變量提供更有效的查詢處理。
與Oracle的區別:
1.SQL Server臨時表是壹種“內存中表”,表存儲在內存中。除非執行DROP TABLE,否則ORACLE臨時表將在數據字典中保留表定義。
2.SQL Server臨時表在事務級別沒有類似於ORACLE臨時表的功能。
3.SQL Server本地臨時表(#)類似於ORACLE的會話級臨時表,但是當會話退出時,ORACLE不會刪除該表。
4.SQL Server的全局臨時表(# #)意味著多個連接* * *共享同壹塊內存。當沒有指針引用內存區域時,SQL Server會自動釋放全局臨時表。
5.因為Oracle不是內存數據庫,如果Oracle像SQL Server壹樣頻繁地創建和刪除臨時表,肯定會影響性能。因此,Oracle將保留臨時表的定義,直到用戶刪除該表。
6.在Oracle中,如果需要多個用戶共享壹個表(類似於SQL Server的全局臨時表# #),可以使用永久表,並在表中添加壹些可以唯壹標識用戶的列。當用戶退出時,根據登錄用戶的唯壹信息刪除相應表格中的數據。這種方法給Oracle帶來了壹定的負載。
以上就是關於Oracle臨時表和SQL Server臨時表之間的區別的知識。希望這個介紹對妳有用!