SQL*Loader (sqlldr) 是 Oracle 高效能大量載入工具,支援固定寬度、分隔符、變長記錄等格式。本文示範 Excel 另存為 Tab 分隔文字檔,再用 sqlldr 匯入的標準流程。
test.xls (備份原檔)。test.txt → 存放 C:\。產生的 test.txt 內容範例:
1 user1 pass1 2023-01-01
2 user2 pass2 2023-01-02
3 user3 pass3 2023-01-03
CONN system/manager
CREATE TABLE test (
id NUMBER,
username VARCHAR2(10),
password VARCHAR2(10),
sj VARCHAR2(20)
);
檔名:C:\input.ctl (記事本編輯)
LOAD DATA
INFILE 'test.txt'
APPEND INTO TABLE test
FIELDS TERMINATED BY X'09'
(id, username, password, sj)
| 子句 | 說明 |
|---|---|
| LOAD DATA | 控制檔標識 |
| INFILE 'test.txt' | 資料來源檔案 |
| APPEND | 追加模式 (其他:INSERT 需空表、REPLACE/TRUNCATE 先清空) |
| FIELDS TERMINATED BY X'09' | 欄位分隔符為 Tab (十六進位 09) |
| (id, username, password, sj) | 對應資料表欄位順序 |
開啟 CMD (命令提示字元):
C:\> sqlldr userid=system/manager control=input.ctl
遠端資料庫:
C:\> sqlldr userid=system/manager@service_name_192.168.1.248 control=input.ctl
input.log (執行日誌) 與 input.bad (壞記錄檔)。input.log:Rows successfully loaded、Rows not loaded due to data errors。SELECT * FROM test; 對比 Excel 原始筆數。| 場景 | 解決方案 |
|---|---|
| 欄位含逗號/雙引號 | 使用 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' (CSV 格式) |
| 日期格式轉換 | 控制檔加 sj DATE 'YYYY-MM-DD' 或 SQL*Loader 內建轉換 |
| 大檔案效能 | DIRECT=TRUE (直徑路徑載入,繞過 SQL 層)、ROWS=10000 (提交頻率)、READSIZE/BINDSIZE 調大 |
| 跳過標題行 | INFILE 'test.txt' SKIP=1 |
| 多檔案載入 | INFILE 'data1.txt' INFILE 'data2.txt' |
| 錯誤記錄分析 | 檢視 .bad 檔與 .log 錯誤行號,修正資料或控制檔 |
@echo off
set ORACLE_SID=ORCL
set CTL=C:\loader\input.ctl
set LOG=C:\loader\input_%date:~-4,4%%date:~-10,2%%date:~-7,2%.log
sqlldr userid=system/manager control=%CTL% log=%LOG%
if errorlevel 1 (
echo SQL*Loader FAILED, check %LOG%
exit /b 1
)
echo SQL*Loader SUCCESS
「Excel → Tab 文字檔 → SQL*Loader」是最通用、零成本的中小資料量匯入方案。掌握控制檔語法 (FIELDS TERMINATED BY, APPEND/REPLACE, DATE FORMAT) 並善用 DIRECT=TRUE 大幅提升大檔案載入效能。配合批次腳本與排程,即可構建穩定的 ETL 入口管線。