外部表的兩大“超能力”:直接讀取壓縮文件和自動清理髒數據

超能力一:直接讀取壓縮文件,還能邊讀邊過濾

一個頭疼的場景
你每週都會收到一個巨大的壓縮數據包(比如 data.csv.gz)。按照老辦法,你需要:

  1. 手動解壓它。
  2. 然後才能把解壓後的文件加載到數據庫。

這就像每次收快遞,都得先拆了包裝才能把東西放進屋裏,多了一步,很麻煩。

外部表的“一步到位”解決方案
外部表可以讓你直接查詢壓縮包內部,甚至在讀取時還能對數據進行篩選。

它是怎麼做到的?——靠一個“預處理腳本”

想象一下,你給外部表配了一個智能小助手(預處理腳本)。當你查詢外部表時,會發生以下神奇的事情:

  1. 你:SELECT * FROM 壓縮數據表;
  2. 數據庫:呼叫智能小助手!
  3. 小助手:收到!自動找到壓縮包 -> 解壓 -> 順便只提取第一列數據 -> 把整理好的結果交給數據庫。
  4. 你:直接看到了最終結果。

真實操作步驟

  1. 編寫智能腳本:這個腳本用 find 命令找到壓縮文件,用 zcat 解壓,並用 cut 命令只保留第一列數據。
  2. 創建外部表:在定義外部表時,通過 PREPROCESSOR 指令把這個腳本“裝配”上去。
CREATE TABLE 我的壓縮數據表 (
  第一列 VARCHAR2(20)
)
ORGANIZATION EXTERNAL (
  ...
  PREPROCESSOR exec_dir:'我的智能腳本.sh' -- 關鍵!指定小助手
  ...
);

最終效果
當你查詢這張表時,看到的直接就是解壓並過濾後的乾淨數據,完全感覺不到背後壓縮包的存在。

這個技巧妙在哪?
你甚至可以讓腳本去搜索整個目錄下的所有壓縮文件,然後把它們的內容合併、過濾後,作為一張表呈現給你。數據源從“一個文件”變成了“一組文件”或“一個動態搜索的結果”。


超能力二:自動給數據“洗澡”,告別髒字符

一個更頭疼的場景
業務人員從Windows電腦發來一個CSV文件,讓你緊急導入生產庫。你興沖沖地建好外部表,卻發現數據後面總跟着奇怪的 ^M 字符(Windows回車符),導致數據長度不對,查詢和比對也各種出錯。

傳統笨辦法
先用一個文本工具手動清理文件,去掉這些髒字符,然後再加載。

外部表的“自動洗澡”方案
同樣,利用預處理腳本,在數據被讀取前,自動給它“洗個澡”,洗乾淨再入庫。

“自動洗澡”流程

  1. 編寫“洗澡”腳本:這個腳本使用 seddos2unix 這樣的命令,專門清除 ^M 這類不必要的字符。
  2. 創建外部表:同樣用 PREPROCESSOR 指令掛載這個“洗澡”腳本。
CREATE TABLE 乾淨數據表 (
  ...
)
ORGANIZATION EXTERNAL (
  ...
  PREPROCESSOR exec_dir:'我的洗澡腳本.sh' -- 數據進來先過一遍水
  ...
);

效果驗證
查詢這張表,數據乾乾淨淨。你可以用 LENGTH(字段名) 函數來檢查,確認數據長度正確,沒有隱藏字符。

小貼士:腳本里的 ^M 字符很特殊,不能直接輸入^M,而是要在編輯器裏按 Ctrl+V,再按 Ctrl+M 打出來。


總結:預處理——外部表的“萬能瑞士軍刀”

通過這三個例子(查詢系統狀態、讀取壓縮文件、清理數據),我們看到 PREPROCESSOR 指令就像給外部表裝上了一把“瑞士軍刀”,讓它變得無所不能:

  • 數據源無限擴展:數據可以來自任何地方——一個系統命令的輸出、一個壓縮包、甚至是網絡流。
  • 數據處理前置:可以在數據進入數據庫視線之前,完成解壓、過濾、清洗、轉換等所有準備工作。
  • 流程極致簡化:把原本需要多步、多人協作的複雜流程,壓縮成了“一條SQL查詢”的簡單操作。

核心思想將操作系統的強大命令能力與SQL的聲明式查詢能力無縫融合,讓數據庫能夠直接消費和處理任何格式、任何位置的數據。

至此,我們已經領略了外部表在數據加載方面的強大威力。接下來,我們將探索本章的另一個主題:如何利用外部表或其它工具,高效地從數據庫中卸載數據

------------------作者介紹-----------------------
姓名:黃廷忠