首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL*Loader 常見錯誤彙總與解決方案速查表

     編輯:關於SqlServer

實務操作 SQL*Loader 時,因平面檔案格式多樣、編碼差異、資料品質問題,常遇到各類錯誤。本文整理 9 大高頻錯誤現象、根因分析與標準解決腳本,供現場快速排查參考。

ERROR 1:中文亂碼 — 編碼不匹配

現象: 匯入成功但中文欄位顯示亂碼。
原因: 資料檔編碼與資料庫字元集不一致。
解決: 在控制檔 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, ...)

ERROR 2:ORA-01722 invalid number — 換行符被吃入數值

現象: 最後一欄為 NUMBER,匯入報 ORA-01722。
原因: Windows 檔案以 \r\n 換行,\r 被視為數值一部分。
解決: 兩種方式擇一:

  • 控制檔欄位加 TERMINATED BY WHITESPACE (自動去除空白含換行)。
  • INFILE 指定 "str '\r\n'" 明確識別記錄分隔符。

注意: 若欄位為浮點數 (如 99.875),不可 用 INTEGER,會導致數值異常放大。

ERROR 3:日期格式錯誤 — 缺乏明確轉換

現象: 日期欄位匯入格式錯亂。
解決: 控制檔中對日期欄位套用 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')

ERROR 4:資料檔缺少欄位 — 使用 CONSTANT 常數填補

現象: 來源檔案缺少某欄位 (如統計日期),需由參數帶入。
解決: 控制檔欄位定義使用 CONSTANT:

COLLECT_DT CONSTANT '20120214',  -- 固定值
CELL_ID, CELL_NAM, ...

ERROR 5:Windows 換行符識別 — INFILE str 參數

現象: 使用 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, ...)

ERROR 6:欄位值內含換行符 — 保留原始換行入庫

現象: 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)

ERROR 7:欄位長度超過 255 — 預設長度限制

現象: SQL*Loader- Field in data file exceeds maximum length。
原因: sqlldr 預設字元欄位長度 255。
解決: 控制檔明確指定長度:comments CHAR(1000000)。

ERROR 8:SQL*Loader-510 / 2026 — 實體記錄超過最大值

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 中斷、斷點續傳錯誤) 導致多筆記錄合併成一行。
對策: 重新取得完整來源檔案,驗證檔案大小與行數。

ERROR 9:ORA-01653 / SQL*Loader-605 — 表空間無法擴展

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 錯誤即可對號入座,大幅縮短排查時間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved