使用Preprocessor前處理器語句對外部表進行介入處理
Oracle外部表External Table是一項比較傳統方便的工具。使用獨立在檔案系統中的文字檔案為載體,透過Directory物件建立起虛擬資料表(External Table)和資料檔案資料之間的關係。同時,透過直接載入等技術提高資料匯入過程速度,讓使用者使用起來可以得到同資料庫表相同的查詢檢索效率。
對於External Table技術,Oracle在每個新版本中都在不斷的豐富提升,一些更加實用的特性被不斷加入到系統中。在Oracle 11gR2(在10gR2較晚版本中最開始出現)版本中,正式推出了Preprocessor前處理器語句,在作業系統層面提供了對資料進入資料庫前的程式介入介面。
本篇主要介紹Preprocessor語法的使用和應用場景,並且透過案例進行說明。
1、語法和內容
外部表External Table的核心在於定義資料表時候的描述引數,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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 海量資料處理_使用外部表進行資料遷移
- 使用 canvas 對影象進行處理Canvas
- 使用預處理PreparedStatement執行Sql語句SQL
- 使用CSS前處理器LessCSS
- 淺談 CSS 前處理器(一):為什麼要使用前處理器?CSS
- css前處理器scss/sass語法以及使用CSS
- CSS 前處理器CSS
- C語言細節 前處理器C語言
- 前處理器變數變數
- CSS 前處理器—sassCSS
- DML 語句處理過程
- 批處理刪除語句
- 語言處理器
- block 對外部引用變數的處理BloC變數
- 使用 getopt() 進行命令列處理命令列
- 使用matlab對影像進行二值化處理Matlab
- 拋開語法,深度剖析CSS前處理器CSS
- CSS | 前處理器(上)- SassCSS
- SQL語句的處理過程SQL
- MySQL 預處理語句prepare、execute、deallocate的使用MySql
- 多對一處理 和一對多處理的處理
- 使用go語言對csv檔案進行解析處理,匯入匯出。Go
- Oracle對資料進行加密&解密處理Oracle加密解密
- .NET使用MailKit進行郵件處理AI
- css前處理器--Sass,Less,StylusCSS
- CSS 前處理器之目錄CSS
- C前處理器和C庫
- mysql常用語句及問題處理MySql
- ORACLE 查詢語句處理過程(Oracle
- SQL語句的處理過程修正SQL
- MySQL 遊標(PREPARE預處理語句)MySql
- oracle動態sql語句處理(轉)OracleSQL
- 使用 Python+spaCy 進行簡易自然語言處理Python自然語言處理
- Flutter 中使用 OpenAI GPT-3 進行語義化處理FlutterOpenAIGPT
- 通過xml處理sql語句時對小於號與大於號的處理轉換XMLSQL
- 反向索引處理前%索引
- 前%的處理--PostgreSQLSQL
- c#常用的前處理器指令C#