[摘錄]Temporary Tables臨時表


          摘錄地址:

          Temporary Tables臨時表
          1簡介
             ORACLE數(shù)據(jù)庫除了可以保存永久表外,還可以建立臨時表temporary tables。這些臨時表用來保存一個會話SESSION的數(shù)據(jù),或者保存在一個事務(wù)中需要的數(shù)據(jù)。當(dāng)會話退出或者用戶提交commit和回滾rollback事務(wù)的時候,臨時表的數(shù)據(jù)自動清空,但是臨時表的結(jié)構(gòu)以及元數(shù)據(jù)還存儲在用戶的數(shù)據(jù)字典中。
             臨時表只在oracle8i以及以上產(chǎn)品中支持。
          2詳細(xì)介紹
             Oracle臨時表分為 會話級臨時表 和 事務(wù)級臨時表。
          會話級臨時表是指臨時表中的數(shù)據(jù)只在會話生命周期之中存在,當(dāng)用戶退出會話結(jié)束的時候,Oracle自動清除臨時表中數(shù)據(jù)。
          事務(wù)級臨時表是指臨時表中的數(shù)據(jù)只在事務(wù)生命周期中存在。當(dāng)一個事務(wù)結(jié)束(commit or rollback),Oracle自動清除臨時表中數(shù)據(jù)。
          臨時表中的數(shù)據(jù)只對當(dāng)前Session有效,每個Session都有自己的臨時數(shù)據(jù),并且不能訪問其它Session的臨時表中的數(shù)據(jù)。因此,臨時表不需要DML鎖。
             當(dāng)一個會話結(jié)束(用戶正常退出 用戶不正常退出 ORACLE實例崩潰)或者一個事務(wù)結(jié)束的時候,Oracle對這個會話的表執(zhí)行 TRUNCATE 語句清空臨時表數(shù)據(jù).但不會清空其它會話臨時表中的數(shù)據(jù).
          你可以索引臨時表和在臨時表基礎(chǔ)上建立視圖.同樣,建立在臨時表上的索引也是臨時的,也是只對當(dāng)前會話或者事務(wù)有效.   臨時表可以擁有觸發(fā)器.
          3建立臨時表
             臨時表的定義對所有會話SESSION都是可見的,但是表中的數(shù)據(jù)只對當(dāng)前的會話或者事務(wù)有效.
             建立方法:
          1) ON COMMIT DELETE ROWS 定義了建立事務(wù)級臨時表的方法.
          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
            2          (startdate DATE,
            3           enddate DATE,
            4           class CHAR(20))
            5        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)建會話級臨時表的方法.
          CREATE GLOBAL TEMPORARY TABLE admin_work_area
                  (startdate DATE,
                   enddate DATE,
                   class CHAR(20))
               ON COMMIT PRESERVE ROWS;
          EXAMPLE:

          會話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

          會話2:

          SQL> select * from permernate;

                   A
          ----------
                   1
                   2

          SQL> select * from admin_work_area;

          未選擇行.

          會話2看不見會話1中臨時表的數(shù)據(jù).

           

          4 ORACLE臨時表和SQLSERVER臨時表異同

          SQL SERVER臨時表
          也可以創(chuàng)建臨時表。臨時表與永久表相似,但臨時表存儲在 tempdb 中,當(dāng)不再使用時會自動刪除。
          有本地和全局兩種類型的臨時表,二者在名稱、可見性和可用性上均不相同。本地臨時表的名稱以單個數(shù)字符號 (#) 打頭;它們僅對當(dāng)前的用戶連接是可見的;當(dāng)用戶從 Microsoft® SQL Server™ 2000 實例斷開連接時被刪除。全局臨時表的名稱以數(shù)學(xué)符號 (##) 打頭,創(chuàng)建后對任何用戶都是可見的,當(dāng)所有引用該表的用戶從 SQL Server 斷開連接時被刪除。
          例如,如果創(chuàng)建名為 employees 的表,則任何人只要在數(shù)據(jù)庫中有使用該表的安全權(quán)限就可以使用該表,除非它已刪除。如果創(chuàng)建名為 #employees 的本地臨時表,只有您能對該表執(zhí)行操作且在斷開連接時該表刪除。如果創(chuàng)建名為 ##employees 的全局臨時表,數(shù)據(jù)表中的任何用戶均可對該表執(zhí)行操作。如果該表在您創(chuàng)建后沒有其他用戶使用,則當(dāng)您斷開連接時該表刪除。如果該表在您創(chuàng)建后有其他用戶使用,則 SQL Server在所有用戶斷開連接后刪除該表
          不同:
          1.        SQL SERVER臨時表是一種”內(nèi)存表”,表是存儲在內(nèi)存中的.ORACLE臨時表除非執(zhí)行DROP TABLE,否則表定義會保留在數(shù)據(jù)字典中.
          2.        SQL SERVER臨時表不存在類似ORACLE臨時表 事務(wù)級別 上的功能.
          3        SQL SERVER本地臨時表(#) 與 ORACLE的會話級別臨時表類似,但是在會話退出的時候,ORACLE不會刪除表.
          4        SQL SERVER的全局臨時表(##) 是指多個連接共享同一片內(nèi)存.當(dāng)沒有指針引用該內(nèi)存區(qū)域時,SQL SERVER自動釋放全局臨時表.
          5        由于ORACLE不是一種 內(nèi)存中的數(shù)據(jù)庫. 所以如果ORACLE類似SQL SERVER 頻繁的對臨時表進(jìn)行建立和刪除,必定會影響性能.所以O(shè)RACLE會保留臨時表的定義直到用戶DROP TABLE.
          6        在ORACLE中,如果需要多個用戶共享一個表(類似SQL SERVER的全局臨時表##).則可以利用永久表,并且在表中添加一些可以唯一標(biāo)識用戶的列.利用觸發(fā)器和視圖.當(dāng)用戶退出的時候,根據(jù)該登陸用戶的唯一信息刪除相應(yīng)的表中的數(shù)據(jù). 這種方法給ORACLE帶來了一定量的負(fù)載.



          歡迎大家訪問我的個人網(wǎng)站 萌萌的IT人

          posted on 2007-06-27 10:41 見酒就暈 閱讀(153) 評論(0)  編輯  收藏 所屬分類: DB

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(3)

          我參與的團(tuán)隊

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          BLOG

          FRIENDS

          LIFE

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 德保县| 涞源县| 迁西县| 东宁县| 通山县| 嘉善县| 罗甸县| 周宁县| 咸丰县| 大荔县| 双江| 肥西县| 湟中县| 怀柔区| 武清区| 闽清县| 镶黄旗| 富蕴县| 庆城县| 灌阳县| 宿州市| 磴口县| 达孜县| 三明市| 贺兰县| 肇庆市| 南开区| 红原县| 泽州县| 中江县| 收藏| 江西省| 绥阳县| 昌平区| 大田县| 三门峡市| 酉阳| 高尔夫| 保定市| 襄汾县| 公主岭市|