2021年5月26日 星期三

9.4 Temporary and External Table

Oracle 資料庫的暫時性表格稱作 Global Temporary Table ,用來存放暫時性的資料所用,使用的是 Temporary Tablespace 空間,特性是當前 session 所存放的資料只有自己這個 session 可以看到,其它人的 session 無法看到這些資料,並且在自己 session 登出後這些資料會自動清除。例如左邊 session 所 insert 的一筆資料,右邊重新登入一個 session 是無法查到此資料的:


建立 Global Temporary Table 有兩種模式:

  • on commit preserve rows: Global Temporary Table 中的資料只有在 session 登出後才清除。

  • on commit delete rows (預設): Global Temporary Table 中的資料在進行 commit 之後就把資料清除 。


例如建立一個只有在 session 登出後才清除資料的 Global Temporary Table:

SQL> create global temporary table gtmp (user_id number, user_name varchar2(20))

        on commit preserve rows;


進行 commit 之後資料仍保留:


如果是使用 on commit delete rows ,則資料在 commit 後就會清除:

SQL> create global temporary table gtmp2 (user_id number, user_name varchar2(20))

        on commit delete rows;



Oracle External Table 的特性是將 Table 的資料存放在資料庫之外(放在作業系統上) ,資料型態可以是文字檔(csv格式) 或是 Oracle Datapump 的 dump 檔案,資料庫本身只有存放 Table 的 Meta Data (欄位、資料型態等架構) , 由於資料是存放在外部,所以 External Table 是不會占資料庫 Segement 的空間,對於一些需要時常更新 Table 資料的作業來說是一個很好用的功能,因為只需要更新存放在外部的檔案即可更新資料,不用再花費時間將 Table 重新 Delete 再 Insert 了。


建立 External Table 前必須先於資料庫裡面建立一個 Directory 來指向作業系統的位置,例如建立一個 Directory 為 extdata 指向作業系統的 /home/oracle 目錄:

SQL> create directory extdata as  '/home/oracle';

SQL> grant read, write on directory extdata to hr;


接下來我們就可以建立一個 Extenal Table:


  • 於建立 Table 的語法中加入 organization external 表示建立為 External Table 。

  • type oracle_loader 表示外部資料為文字格式,此範例所使用的文字檔為 emp.txt (右上角) ,內容為逗號分隔的資料格式。

  • default directory extdata 指定外部資料所存放的位置,這個位置是之前所建立的 Directory extdata ,相當於作業系統上的 /home/oracle 目錄。

  • access parameters 用來設定資料庫 Table 與外部檔案資料的對應,這邊設定 fields terminated by ',' 表示外部資料的每個欄位是以逗號來做分隔,然後指定每個逗號分隔欄位是對應於 Table 的哪些欄位。

  • 最後的 location 設定為 'emp.txt' 表示要讀取 emp.txt 這個檔案的資料。


External Table 建立好之後,當我們查詢它,便可以得到與 emp.txt 相同的資料內容:


另一種 External Table 的方式是去讀取 Datapump 的 dump 檔,只需將 type 的設定改為 oracle_datapump 即可:


External Table 的另一種應用方式,既然它可以讀取 dump 檔,那麼我們也可以反過來將資料透過 External Table 匯出成為一個 dump 檔,例如我們利用 create table as 的方式將 regions 這個 Table 的資料匯出成一個 dump 檔:


External Table 所需要注意的是, location 所設定的檔名是固定的,因此在更新外部資料的時候需要注意檔案名稱是否相同,如果不同的話就讀不到資料了,一般來說都是將舊的檔案重新命名,然後再更新相同名稱的新檔案進來。



沒有留言:

張貼留言