Oracle 官方高效能大量載入工具,支援固定寬度、分隔符、資料流等多種格式,繞過 SQL 層直接格式化資料區塊寫入。
-- input.ctl
LOAD DATA
INFILE 'data.txt' -- 資料檔路徑 (可多檔)
APPEND -- 模式: INSERT (表需空), APPEND, REPLACE, TRUNCATE
INTO TABLE target_table -- 目標表
FIELDS TERMINATED BY '|' -- 分隔符: '|', ',', X'09'(Tab), WHITESPACE
OPTIONALLY ENCLOSED BY '"' -- 選擇性引號包裹
TRAILING NULLCOLS -- 允許尾端欄位為 NULL
(
col_id CHAR(10), -- 資料型別長度 (CHAR, DATE, INTEGER EXTERNAL, DECIMAL EXTERNAL...)
col_name CHAR(50),
col_desc CHAR(100),
col_price DECIMAL EXTERNAL(10,2),
col_date DATE "YYYY-MM-DD HH24:MI:SS", -- 日期格式轉換
col_flag POSITION(100:100) CHAR(1) -- 固定寬度定位
)
1001|Product A|Description A|123.45|2023-01-15 10:30:00|Y
1002|Product B|Description B|67.89|2023-01-16 14:22:00|N
| 參數 | 說明 | 範例 |
|---|---|---|
| userid | 連線字串 | userid=scott/tiger@ORCL |
| control | 控制檔路徑 (必要) | control=input.ctl |
| data | 資料檔路徑 (覆蓋控制檔 INFILE) | data=data.txt |
| log | 記錄檔路徑 (預設 control_name.log) | log=import.log |
| bad | 錯誤資料檔 (格式錯誤/違反約束) | bad=import.bad |
| discard | 捨棄資料檔 (不符合 WHEN 條件) | discard=import.dsc |
| discardmax | 最大捨棄筆數 (預設全允許) | discardmax=100 |
| errors | 最大錯誤筆數達到則中止 (預設 50) | errors=1000 |
| rows | 傳統路徑提交頻率 (筆數),直接路徑忽略 | rows=1000 |
| direct | TRUE=直接路徑 (高效能, 鎖表), FALSE=傳統路徑 | direct=true |
| parallel | 平行直接路徑載入 (需分區表) | parallel=true |
| silent | 抑制訊息 (header, feedback, errors, discards, partitions, all) | silent=(header,feedback) |
| skip | 跳過資料檔前 N 筆 (標題列) | skip=1 |
| load | 最大載入筆數 | load=10000 |
| bindsize / readsize | 綁定/讀取緩衝區大小 (bytes, 直接路徑關鍵) | bindsize=2097152 |
sqlldr userid=scott/tiger@ORCL control=input.ctl data=data.txt log=import.log bad=import.bad errors=5000 direct=true
ORA-01722: invalid number:資料格式不符合 `DECIMAL EXTERNAL` / `INTEGER EXTERNAL` 定義,檢查千分位符、負號、小數點。ORA-01841: (full) year must be between -4712 and +9999:日期格式遮罩與資料不符,確認 `DATE "format"` 雙引號大小寫。SQL*Loader-510: Physical record too long:單行超過 `READSIZE`,調大 `READSIZE` 或檢查換行符 (CRLF vs LF)。