鷹翔宇空

          學習和生活

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks

          引自:http://www.matrix.org.cn/thread.shtml?topicId=31492&forumId=36

          在Oracle8i或以上版本中,可以創建以下兩種臨時表:
          1。會話特有的臨時表
              CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
              ON COMMIT PRESERVE ROWS;
            
          2。事務特有的臨時表
              CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
              ON COMMIT DELETE ROWS;
             CREATE GLOBAL TEMPORARY TABLE MyTempTable
          所建的臨時表雖然是存在的,但是你試一下insert 一條記錄然后用別的連接登上去select,記錄是空的,明白了吧,我把下面兩句話再貼一下:
          --ON COMMIT DELETE ROWS 說明臨時表是事務指定,每次提交后ORACLE將截斷表(刪除全部行)
          --ON COMMIT PRESERVE ROWS 說明臨時表是會話指定,當中斷會話時ORACLE將截斷表。
          沖突的問題更本不用考慮.
            
          臨時表只是保存當前會話(session)用到的數據,數據只在事務或會話期間存在。
            
          通過CREATE GLOBAL TEMPORARY TABLE命令創建一個臨時表,對于事務類型的臨時表,
          數據只是在事務期間存在,對于會話類型的臨時表,數據在會話期間存在。
            
          會話的數據對于當前會話私有。每個會話只能看到并修改自己的數據。DML鎖不會加到
          臨時表的數據上。下面的語句控制行的存在性。
            
          ● ON COMMIT DELETE ROWS 表名行只是在事務期間可見
          ● ON COMMIT PRESERVE ROWS 表名行在整個會話期間可見
            
          可以對臨時表創建索引,視圖,出發器,可以用export和import工具導入導出表的
          定義,但是不能導出數據。表的定義對所有的會話可見。


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



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

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

          posted on 2006-02-24 12:27 TrampEagle 閱讀(3656) 評論(0)  編輯  收藏 所屬分類: datebase
          主站蜘蛛池模板: 庆安县| 右玉县| 安达市| 泗阳县| 长治市| 鹰潭市| 吉安县| 中方县| 宿州市| 东阳市| 东丽区| 皋兰县| 涟源市| 宁都县| 连山| 灵川县| 昔阳县| 荔波县| 巴马| 甘肃省| 耒阳市| 阿图什市| 兰溪市| 西和县| 成安县| 武隆县| 安塞县| 张掖市| 青阳县| 筠连县| 广汉市| 渝北区| 楚雄市| 晋宁县| 吉木萨尔县| 延庆县| 治多县| 福贡县| 上高县| 和平区| 南阳市|