Oracle SQL*Loader (sqlldr) 是高效能大量資料載入工具。當單一資料檔需依條件分流載入多張目標表時,透過控制檔的 INTO TABLE 子句與 WHEN 條件即可實現。本文以實戰範例完整示範流程。
-- 建立測試表
CREATE TABLE test1 (
a1 VARCHAR2(10),
a2 VARCHAR2(10),
a3 VARCHAR2(10)
);
CREATE TABLE test2 (
b1 VARCHAR2(10),
b2 VARCHAR2(10)
);
TYPE1|VAL1|VAL2|VAL3
TYPE2|DATA1|DATA2
TYPE1|VAL4|VAL5|VAL6
TYPE2|DATA3|DATA4
第一欄 TYPE1 載入 test1,TYPE2 載入 test2。
LOAD DATA
INFILE 'data.txt'
BADFILE 'loader.bad'
DISCARDFILE 'loader.dsc'
APPEND
INTO TABLE test1
WHEN (1:5) = 'TYPE1'
FIELDS TERMINATED BY '|'
(
a1 POSITION(7:10) CHAR,
a2 POSITION(12:15) CHAR,
a3 POSITION(17:20) CHAR
)
INTO TABLE test2
WHEN (1:5) = 'TYPE2'
FIELDS TERMINATED BY '|'
(
b1 POSITION(7:10) CHAR,
b2 POSITION(12:15) CHAR
)
| 子句 | 說明 |
|---|---|
INTO TABLE | 可重複多次,每個對應一個目標表 |
WHEN | 條件判斷,支援位置比較 POSITION(start:end) = 'value' 或欄位比較 |
FIELDS TERMINATED BY | 定義欄位分隔符,支援單字元 |
POSITION | 固定寬度或相對位置定義欄位範圍 |
BADFILE | 格式錯誤記錄導向檔案 |
DISCARDFILE | 不符合任何 WHEN 條件的記錄導向檔案 |
sqlldr userid=eygle/eygle control=loader.ctl log=loader.log
移除 WHEN 子句,每個 INTO TABLE 皆會處理所有記錄,實現一對多複製。
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
(
col1 CHAR,
col2 CHAR(100) -- 固定長度
)
col3 "UPPER(:col3)",
col4 "TO_DATE(:col4, 'YYYYMMDD')"
繞過 SQL 層直接寫入資料區塊,大幅提升效能,但有限制(如不可有觸發器、外鍵、叢集索引等)。
POSITION 與實際資料對齊,建議先用 POSITION(*) 相對定位WHEN 條件不匹配:確認資料檔編碼、分隔符、位置偏移DISCARDFILE:表示無符合條件的 INTO TABLE,需檢查條件邏輯INSERT 權限及目錄物件讀寫權限SQL*Loader 透過單一控制檔的多 INTO TABLE + WHEN 機制,原生支援多表條件分流載入,無需外部腳本預處理。掌握控制檔語法細節,能高效完成異構資料遷移、ETL 落地等大量載入任務。