CONCATENATE)、條件續行 (CONTINUEIF)。SEQUENCE/RECNUM 生成鍵值、NULLIF/DEFAULTIF 條件賦值。BADFILE)、棄文件 (DISCARDFILE)、日志文件完整記錄。DIRECT=TRUE)、並行加載 (PARALLEL=TRUE)、ROWS/BINDSIZE/READSIZE 緩衝調優。
-- 1. 全局選項 (OPTIONS 子句)
OPTIONS (SKIP=10, ERRORS=1000, ROWS=5000, BINDSIZE=2097152, SILENT=(HEADER, FEEDBACK))
-- 2. 輸入數據源 (INFILE/INDDN)
LOAD DATA
INFILE 'data.csv' "STR '\r\n'" -- 記錄分隔符
BADFILE 'data.bad'
DISCARDFILE 'data.dsc'
DISCARDMAX 100
-- 3. 目標表與字段映射 (INTO TABLE ... FIELDS ...)
APPEND
INTO TABLE scott.emp
WHEN (1:1) <> 'H' -- 跳過標題行
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS -- 尾部缺列視為 NULL
(
empno POSITION(1:4) INTEGER EXTERNAL,
ename CHAR(20) "UPPER(:ename)", -- SQL 表達式轉換
job CHAR(15),
mgr INTEGER EXTERNAL NULLIF (mgr=''),
hiredate DATE 'DD-MON-YYYY',
sal DECIMAL EXTERNAL,
comm DECIMAL EXTERNAL DEFAULTIF (comm=''),
deptno INTEGER EXTERNAL
)
-- 可續寫多個 INTO TABLE 針對同/不同文件
| 格式 | 語法 | 適用場景 |
|---|---|---|
| 流式 (默認) | INFILE 'file' "STR '\n'" | 文本文件,行分隔符明確 |
| 固定長度 | INFILE 'file' "FIX 80" | 大型機下傳文件、無分隔符 |
| 變長 (含長度前綴) | INFILE 'file' "VAR 4" | 前 2-4 字節存儲記錄長度 |
POSITION(start:end) / POSITION(*) / POSITION(*+5):精確/相對偏移定位。datatype:CHAR, INTEGER EXTERNAL, DECIMAL EXTERNAL, DATE 'fmt', ZONED, PACKED DECIMAL 等。TERMINATED BY / ENCLOSED BY:分隔/包裹字符,支持 16 進制 X'2C'。NULLIF (col=BLANKS) / DEFAULTIF (col='N/A'):條件賦 NULL/默認值。"SQL 表達式":如 "TO_DATE(:col, 'YYYYMMDD')"、":col + 1",功能極強。INSERT:目標表必須為空,否則報錯。APPEND:追加數據,保留現有行。REPLACE:TRUNCATE TABLE 後加載。TRUNCATE:同 REPLACE,語義更清晰。
sqlldr userid=/ control=big_load.ctl DIRECT=TRUE PARALLEL=TRUE
-- 關鍵參數
READSIZE=20971520
BINDSIZE=20971520
ROWS=10000
-- 表級並行需配合
-- ALTER TABLE big_table PARALLEL 4;
-- 索引策略:建議先 DISABLE 非唯一索引,載入後 REBUILD
限制:不支持觸發器、外鍵、聚簇表、對象類型、REF 列;需獨佔段鎖 (或分區級並行)。
| 錯誤現象 | 根因 | 解決 |
|---|---|---|
| ORA-01722 invalid number | 字符數據非數字格式 | 用 NULLIF/DEFAULTIF 過濾,或 DECODE 表達式清洗 |
| ORA-01841 date format mismatch | 日期格式不匹配 | 控制文件中顯式 DATE 'fmt',或 SQL 表達式 TO_DATE |
| Load 緩慢 | 常規路徑、提交頻繁、索引維護 | DIRECT=TRUE, 增大 ROWS/BINDSIZE, 暫停索引 |
| 字符集亂碼 | NLS_LANG 與文件編碼不符 | 設置 NLS_LANG=AL32UTF8 (或文件實際編碼) |
SQL*Loader 以「控制文件聲明式語法 + 直接路徑引擎」成為 Oracle 大批量數據加載的標準利器。掌握 FIELDS 映射、POSITION 定位、SQL 表達式 轉換、DIRECT/PARALLEL 加速五大核心,配合壞/棄文件機制與日志分析,即可構建健壯、高效、可重試的 ETL 加載管道。