使用Preprocessor前處理器語句對外部表進行介入處理

realkid4發表於2016-10-13

 

Oracle外部表External Table是一項比較傳統方便的工具。使用獨立在檔案系統中的文字檔案為載體,透過Directory物件建立起虛擬資料表(External Table)和資料檔案資料之間的關係。同時,透過直接載入等技術提高資料匯入過程速度,讓使用者使用起來可以得到同資料庫表相同的查詢檢索效率。

 

對於External Table技術,Oracle在每個新版本中都在不斷的豐富提升,一些更加實用的特性被不斷加入到系統中。在Oracle 11gR2(在10gR2較晚版本中最開始出現)版本中,正式推出了Preprocessor前處理器語句,在作業系統層面提供了對資料進入資料庫前的程式介入介面。

 

本篇主要介紹Preprocessor語法的使用和應用場景,並且透過案例進行說明。

 

1、語法和內容

 

外部表External Table的核心在於定義資料表時候的描述引數,Preprocessor特性實際上就是外部表定義過程中的一個引數專案。從語法結構上,如下圖所示:

 

使用Preprocessor前處理器語句對外部表進行介入處理

 

使用Preprocessor引數有配套引數專案,用於詳細指定出究竟處理文字檔案的函式是誰?在哪?directory_spec引數是可選專案,如果處理函式位置和預設Directory不同,就是用這個來指定。File_spec就是指定的函式處理程式物件。

 

從系統部署角度看,處理程式(加密或者壓縮)和資料放在相同的位置顯然不是一個好主意,同時也不是規範安全的做法。

 

注意:如果程式執行需要引數設定,需要寫在shell或者batch指令碼中指定。

 

2、實驗背景環境

 

下面透過一個案例來進行說明。案例比較簡單:受磁碟空間大小的限制,在檔案系統中儲存的外部表檔案需要壓縮儲存,但是在讀取的時候,需要即時進行解壓處理。這種時候,就需要使用Proprocessor進行方便的程式處理。

 

我們選擇使用Oracle 11g進行測試,具體版本為11.2.0.4

 

 

SQL> select * from v$version;

 

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE    11.2.0.4.0 Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

 

 

在作業系統層面,設定檔案儲存結構。

 

 

--目錄結構準備

[root@localhost /]# mkdir -p /prtest/bin

[root@localhost /]# mkdir -p /prtest/data

[root@localhost /]# ls -l | grep prtest

drwxr-xr-x.   4 oracle oinstall  4096 Oct 13 15:59 prtest

 

 

準備壓縮資料,為csv格式檔案。

 

 

--資料壓縮準備

[oracle@localhost ~]$ cd /prtest/data/

[oracle@localhost data]$ ls -l

total 1264

-rw-r--r--. 1 oracle oinstall 1291480 Oct 13 16:02 tmp001.csv

[oracle@localhost data]$ gzip tmp001.csv

[oracle@localhost data]$ ls -l

total 340

-rw-r--r--. 1 oracle oinstall 346110 Oct 13 16:02 tmp001.csv.gz

 

 

處理程式可以是實際程式,也可以是一個shell或者batch執行指令碼。我們在Linux環境下,準備一個簡單的解壓命令指令碼。

 

 

[oracle@localhost data]$ cd /prtest/bin/

[oracle@localhost bin]$ echo '/bin/gunzip -c $1' > uncompress.sh

[oracle@localhost bin]$ ls -l

total 4

-rw-r--r--. 1 oracle oinstall 18 Oct 13 16:05 uncompress.sh

[oracle@localhost bin]$ chmod 755 uncompress.sh

[oracle@localhost bin]$ ls -l

total 4

-rwxr-xr-x. 1 oracle oinstall 18 Oct 13 16:05 uncompress.sh

 

 

從部署結構看,/prtest/bin目錄儲存執行程式,data目錄儲存壓縮版本資料。

 

3、外部表建立

 

結束了檔案系統配置,後面可以進行資料庫層面配置。首先,外部表External Table與檔案系統介面就是Directory物件。

 

 

SQL> create directory execdir as '/prtest/bin';

Directory created

 

SQL> grant read, write on directory execdir to scott;

Grant succeeded

 

SQL> create directory data_dir as '/prtest/data';

Directory created

 

SQL> grant read, write on directory data_dir to scott;

Grant succeeded

 

SQL> grant execute on directory execdir to scott;

Grant succeeded

 

SQL> grant execute on directory data_dir to scott;

Grant succeeded

 

 

切換到scott使用者。

 

 

SQL> show user

User is "scott"

SQL> create table xtab(obj_id number(10), obj_name varchar2(2000), obj_typ varchar2(2000))

  2  organization external

  3  (

  4    type oracle_loader

  5    default directory data_dir

  6    access parameters(

  7      records delimited by newline

  8      preprocessor execdir:'uncompress.sh') –設定處理程式

  9     -- fields (obj_id, obj_name, obj_typ)

 10    location('tmp001.csv.gz')

 11  )

 12  REJECT LIMIT UNLIMITED

 13  parallel 2;

 

Table created

 

 

使用select語句。

 

 

SQL> select count(*) from xtab;

 

  COUNT(*)

----------

     31592

 

SQL> select * from xtab where rownum<5;

 

     OBJ_ID OBJ_NAME             OBJ_TYP

----------- -------------------- ----------

         20 ICOL$                TABLE

         46 I_USER1              INDEX

         28 CON$                 TABLE

         15 UNDO$                TABLE

 

 

讀取成功。

 

4、結論

 

Oracle推薦的應用場景看,preprocessor引數能夠在兩個層面起作用,一個是針對特殊的資料處理場景;另一個是管理職責劃分。特殊的資料處理場景,比如壓縮或者加密文字檔案讀取為外部表,透明的進行資料處理。職責劃分上,資料使用者、提供者和管理程式之間,藉助Preprocessor引數特性可以清晰的分割。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-2126294/,如需轉載,請註明出處,否則將追究法律責任。

相關文章