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

SQL*Loader 實戰:從 CSV 高效導入 Oracle,含 Sequence 自動賦值技巧

     編輯:Oracle 資料庫基礎

場景:Excel → CSV → Oracle 表

來源:Prize_VS.xls(姓名、身分證、地址、郵遞區號)
目標:表 方案名.Prize_VS

步驟 1:另存為 CSV

Excel → 「另存為」→ CSV (逗號分隔) (*.csv) → Prize_VS.csv
**注意**:若欄位含逗號/換行,Excel 會自動加雙引號包裹,SQL*Loader 預設可識別。

步驟 2:編寫控制檔 input.ctl

LOAD DATA
INFILE 'Prize_VS.csv'
APPEND
INTO TABLE 方案名.Prize_VS
TRAILING NULLCOLS
(
  NAME       TERMINATED BY ",",
  IDCARD     TERMINATED BY ",",
  ADDRESS    TERMINATED BY ",",
  POSTALCODE TERMINATED BY ","
)

關鍵子句說明:

  • APPEND:資料追加(預設)。INSERT 要求表為空,REPLACE/TRUNCATE 會清空表。
  • TRAILING NULLCOLS:若行尾欄位缺失,視為 NULL(避免「欄位不足」報錯)。
  • TERMINATED BY ",":CSV 標準分隔符。若為 TAB 用 TERMINATED BY X'09',固定寬度用 POSITION(1:10)。

步驟 3:執行匯入

sqlldr 用戶名/密碼@服務名 CONTROL=input.ctl

產出檔案:

  • input.log:詳細執行日誌(讀取行數、提交行數、錯誤統計、**必看**)。
  • Prize_VS.bad:拋錯行(資料型別不符、約束違反等),修正後可重跑。
  • Prize_VS.dsc:若用 DISCARDFILE 子句,存放不符合 WHEN 條件的行。

進階技巧:目標欄位值來自 Sequence

表 test(field_a, field_b, field_c),field_c 取 sequence_field_c.NEXTVAL。

LOAD DATA
INFILE 'C:\test.csv'
TRUNCATE
INTO TABLE test
FIELDS TERMINATED BY ','
(
  field_a,
  field_b,
  field_c "sequence_field_c.NEXTVAL"
)

原理:雙引號內為 **SQL 運算式**,每行載入時執行一次。同理可用 SYSDATE、UPPER(:field_a) 等任意合法 SQL 運算式。

常用進階參數速查

效能調優清單

  1. **大表優先用 DIRECT=TRUE + PARALLEL=TRUE**(需分區表、禁用索引/約束、載入後重建)。
  2. **關鍵約束/索引載入前 DISABLE/UNUSABLE**,載入後 REBUILD(ALTER INDEX ... REBUILD ONLINE)。
  3. **調大 BINDSIZE/READSIZE**(8MB+),減少系統呼叫。
  4. **檔案預處理**:去除 BOM、統一換行符、處理編碼(NLS_LANG 需匹配 CSV 編碼)。
  5. **並行度** = CPU 核心數 × 0.5 ~ 1,避免 I/O 爭用。

常見錯誤與對策

參數用途範例
DIRECT=TRUE直接路徑載入,繞過 SQL 層,**極速**,但限制多(無觸發器、無外鍵、獨佔鎖)sqlldr ... DIRECT=TRUE
PARALLEL=TRUE並行直接載入,配合多控制檔/多檔案,需表分區sqlldr ... PARALLEL=TRUE
ERRORS=999999允許錯誤行上限(預設 50),防止少量髒資料中斷整批sqlldr ... ERRORS=10000
SKIP=1跳過 CSV 首行標題sqlldr ... SKIP=1
BINDSIZE=2097152綁定陣列大小(位元組),直接路徑下調大提升吞吐sqlldr ... BINDSIZE=8388608
READSIZE=2097152讀取緩衝區大小sqlldr ... READSIZE=8388608

結語

SQL*Loader 是 Oracle 原生高效載入工具,**掌握控制檔語法(TERMINATED BY、SQL 運算式賦值)、日誌分析、DIRECT/PARALLEL 直接路徑** 即可應對 90% 場景。CSV 只是起點,固定寬度、邏輯記錄拼接、LOBFILE 大物件載入同理可通。記住:**載入前禁索引/約束、載入後重建、日誌必讀、BAD 檔必查**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤現象原因對策
ORA-01722: invalid number數值欄位含非數字字符(如千分位逗號)CSV 預處理移除,或控制檔用 TO_NUMBER(REPLACE(:col,','))
ORA-01400: cannot insert NULLNOT NULL 欄位缺值檢查 CSV、或給預設值 DEFAULT 'N/A'
ORA-00001: unique constraint violated主鍵/唯一鍵重複源資料去重、或用 WHEN 子句過濾
載入極慢未用 DIRECT、索引/觸發器開啟、BINDSIZE 太小按調優清單逐項落地