SQL*Loader 是 Oracle 高效能大量載入工具,支援固定寬度、分隔符、資料轉換、多表載入等進階功能。
CREATE TABLE TEST (
HEAD_ID NUMBER(6) NOT NULL,
HEAD VARCHAR2(20) NOT NULL,
AREA_CODE VARCHAR2(9) NOT NULL,
HEAD_LENGTH NUMBER(2),
COMMENTS VARCHAR2(60)
);
1,021,021,3,上海
2,025,025,3,南京
3,0410,410,4,鐵嶺
4,0512,512,4,蘇州
5,139159,025,7,南京
6,123456789,025,9,test
LOAD DATA
INFILE 'result.txt'
APPEND INTO TABLE TEST
FIELDS TERMINATED BY ','
(
HEAD_ID CHAR(6),
HEAD CHAR(20),
AREA_CODE CHAR(9),
HEAD_LENGTH CHAR(2),
COMMENTS CHAR(60)
)
sqlldr userid=username/password@SID control=result.ctl log=result.log
pause
load_data.batresult.log 確認 Rows successfully loadedSELECT * FROM TEST 驗證| 參數 | 說明 | 範例 |
|---|---|---|
INFILE | 資料檔路徑,支援多檔 INFILE 'a.dat' INFILE 'b.dat' | INFILE 'data.csv' |
APPEND / INSERT / REPLACE / TRUNCATE | 載入模式:追加/需空表/清空再載入/截斷表 | APPEND |
FIELDS TERMINATED BY | 欄位分隔符 | ',' '\t' '|' |
TRAILING NULLCOLS | 欄位缺失視為 NULL | 適用不定欄位資料 |
BADFILE / DISCARDFILE | 錯誤/捨棄記錄輸出檔 | BADFILE 'load.bad' |
DIRECT=TRUE | 直接路徑載入,繞過 SQL 層,極速 | 大量資料首選,但有限制 |
PARALLEL=TRUE | 並行直接載入,配合分區表 | TB 級載入 |
' 日期轉換
HIRE_DATE DATE "YYYY-MM-DD HH24:MI:SS"
' 條件載入
INTO TABLE EMP WHEN DEPTNO = 10
INTO TABLE EMP WHEN DEPTNO = 20
' 序列/函數賦值
EMPNO SEQUENCE(MAX,1)
CREATED SYSDATE
' LOBFILE 載入大物件
RESUME LOBFILE(RESUME_CLOB) TERMINATED BY EOF
DIRECT=TRUE (直接路徑)READSIZE/BINDSIZE (如 10MB+)PARALLEL=TRUE + 分區表UNRECOVERABLE (無日誌) → 載入後必須立即備份| 錯誤 | 原因 | 對策 |
|---|---|---|
| ORA-01722 invalid number | 資料型別不符 (如字串寫入數字欄) | 控制檔加 TO_NUMBER 或清洗資料 |
| Record rejected - all columns null | 分隔符錯誤導致整列解析失敗 | 檢查 FIELDS TERMINATED BY、資料檔編碼 |
| ORA-01652 unable to extend temp segment | 暫存表空間不足 | 擴充 TEMP、或分批載入 |
| Log shows "0 Rows successfully loaded" | 控制檔欄位映射錯誤 / 檔案編碼不符 | 用 sqlldr ... control=test.ctl 單步測試 |
SQL*Loader 是 Oracle DBA 必備技能,掌握控制檔語法與直接路徑載入,能從容應對 TB 級資料遷移與日常 ETL。