實務操作 SQL*Loader 時,因平面檔案格式多樣、編碼差異、資料品質問題,常遇到各類錯誤。本文整理 9 大高頻錯誤現象、根因分析與標準解決腳本,供現場快速排查參考。
現象: 匯入成功但中文欄位顯示亂碼。
原因: 資料檔編碼與資料庫字元集不一致。
解決: 在控制檔 LOAD DATA 後指定字元集:
LOAD DATA CHARACTERSET 'ZHS16GBK' -- 或 'UTF8'、'AL32UTF8' 視資料庫而定 INFILE '/oradata/impdata/test.txt' APPEND INTO TABLE ETL.TEST FIELDS TERMINATED BY '@#$' TRAILING NULLCOLS (MON_CD, CITY_ID, CELL_ID, ...)
現象: 最後一欄為 NUMBER,匯入報 ORA-01722。
原因: Windows 檔案以 \r\n 換行,\r 被視為數值一部分。
解決: 兩種方式擇一:
TERMINATED BY WHITESPACE (自動去除空白含換行)。"str '\r\n'" 明確識別記錄分隔符。注意: 若欄位為浮點數 (如 99.875),不可 用 INTEGER,會導致數值異常放大。
現象: 日期欄位匯入格式錯亂。
解決: 控制檔中對日期欄位套用 TO_DATE 並指定格式掩碼與 NLS 語言:
ALM_TM "TO_DATE(:ALM_TM, 'DD-MM-YYYY HH24:MI:SS', 'NLS_DATE_LANGUAGE=American')", ALM_DISCOVER_TM "TO_DATE(:ALM_DISCOVER_TM, 'DD-MM-YYYY HH24:MI:SS', 'NLS_DATE_LANGUAGE=American')
現象: 來源檔案缺少某欄位 (如統計日期),需由參數帶入。
解決: 控制檔欄位定義使用 CONSTANT:
COLLECT_DT CONSTANT '20120214', -- 固定值 CELL_ID, CELL_NAM, ...
現象: 使用 vi 查看檔案顯示 ^M (即 \r)。
解決: INFILE 子句加入 "str '\r\n'":
LOAD DATA INFILE 'EDS.TW_BUSS_GN_CELLFLUX_HR4.csv' "str '\r\n'" APPEND INTO TABLE EDS.TW_BUSS_GN_CELLFLUX_HR_TEST FIELDS TERMINATED BY ',' TRAILING NULLCOLS (DATE_CD, HR_CD, LAC_ID, ...)


現象: CSV 欄位值跨多行 (雙引號包裹)。
資料範例 (TEST.csv):
12,"這僅僅是 測試" 14,"數據有 換行"
解決: 同 ERROR 5,指定 "str '\r\n'" 讓 sqlldr 以 |\r\n 為真正記錄結束:
LOAD DATA INFILE 'TEST.csv' "str '\r\n'" APPEND INTO TABLE TEST FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS (ID, NAME)
現象: SQL*Loader- Field in data file exceeds maximum length。
原因: sqlldr 預設字元欄位長度 255。
解決: 控制檔明確指定長度:comments CHAR(1000000)。
SQL*Loader-510: Physical record in data file (...) is longer than the maximum (20971520) SQL*Loader-2026: the load was aborted because SQL Loader cannot continue.
根因: 單筆記錄超過 20MB 限制,通常為檔案傳輸損毀 (FTP 中斷、斷點續傳錯誤) 導致多筆記錄合併成一行。
對策: 重新取得完整來源檔案,驗證檔案大小與行數。
ORA-01653: unable to extend table tablename by 128 in tablespace xxxx SQL*Loader-605: Non-data dependent ORACLE error occurred -- load discontinued.
對策: 以 DBA 身分擴充對應表空間:
ALTER TABLESPACE xxxx ADD DATAFILE '...' SIZE 1G AUTOEXTEND ON;
| 錯誤代碼/現象 | 首要檢查項 | 關鍵修正參數 |
|---|---|---|
| 中文亂碼 | 資料檔編碼 vs DB 字元集 | CHARACTERSET 'ZHS16GBK' |
| ORA-01722 (尾欄 NUMBER) | Windows \r\n 換行 | INFILE "str '\r\n'" 或 TERMINATED BY WHITESPACE |
| 日期格式錯誤 | 缺 TO_DATE 掩碼 | "TO_DATE(:col, 'fmt', 'NLS...')" |
| 缺少欄位 | 來源檔少欄 | CONSTANT 'value' |
| 欄位內含換行 | CSV 跨行欄位 | INFILE "str '\r\n'" + OPTIONALLY ENCLOSED BY '"' |
| Field exceeds 255 | 長文字欄位 | CHAR(大數值) |
| SQL*Loader-510 | 檔案損毀/異常合併 | 重新取得來源檔 |
| ORA-01653 | 表空間滿 | 擴充表空間 |
將此表收藏,遇到 sqlldr 錯誤即可對號入座,大幅縮短排查時間。