首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle SQL*Loader 完整指南:控制檔寫法、資料格式、效能優化

     編輯:Oracle 資料庫相關知識

命令語法

sqlldr userid=user/pass control=emp.ctl data=emp.dat bad=emp.bad log=emp.log

常用參數:USERID、CONTROL、DATA、BAD、LOG、DISCARD、ERRORS(允許錯誤筆數)、ROWS(陣列大小)、BINDSIZE、SILENT、DIRECT=TRUE(直徑載入)。

控制檔三段式結構

-- 1. 全域選項
LOAD DATA
INFILE 'emp.dat'          -- 或 INFILE * 配合 BEGINDATA
APPEND                    -- INSERT/REPLACE/TRUNCATE
INTO TABLE emp
FIELDS TERMINATED BY '|'  -- 分隔符
(
-- 3. 欄位映射與資料型別
  empno     POSITION(1:4)   INTEGER EXTERNAL,
  ename     CHAR(20),
  hiredate  DATE 'YYYYMMDD',
  sal       DECIMAL EXTERNAL,
  comm      FLOAT EXTERNAL
)
-- 2. 內嵌資料(僅 INFILE * 時)
BEGINDATA
7369|SMITH|19801217|800|0
7499|ALLEN|19810220|1600|300

關鍵選項詳解

選項說明範例
FIELDS TERMINATED BY分隔符,支援 WHITESPACE、十六進位 X'09' (Tab)FIELDS TERMINATED BY ','
POSITION(start:end)固定寬度欄位位置POSITION(1:10)
FILLER跳過該欄位不載入col1 FILLER CHAR(10)
RECNUM自動產生行號seq_no RECNUM
SKIP n跳過前 n 行(如標題列)SKIP 1
DATE 'fmt'日期格式轉換hiredate DATE 'DD-MON-YYYY'
NULLIF col=BLANKS空白視為 NULLcomm NULLIF comm=BLANKS

載入模式對比

模式行為前提效能
INSERT表必須為空,否則報錯空表基準
APPEND追加資料,保留既有無快
REPLACEDELETE 全表再載入需 DELETE 權限中
TRUNCATETRUNCATE 全表再載入需 DROP ANY TABLE最快(無 UNDO)

效能優化清單

  1. Direct Path Load:sqlldr ... DIRECT=TRUE 繞過 SQL 層,直接格式化資料塊寫入,速度提升 5-10 倍。限制:需獨佔表、禁用觸發器/約束(稍後 ENABLE)、不支援 Cluster/Object 表。
  2. 大幅增加 ROWS/BINDSIZE:ROWS=10000 BINDSIZE=20971520(20MB)減少網路往返。
  3. 並行載入:多個 SQL*Loader 會話載入同一表不同分區(PARTITION 子句),需表分區、禁用索引/約束、載入後 REBUILD。
  4. 預先排序資料:按索引鍵排序輸入檔,減少索引維護開銷。
  5. UNRECOVERABLE/NOLOGGING:控制檔加 UNRECOVERABLE 或表設 NOLOGGING,最小化重做日誌(載入後必須備份)。

常見錯誤排查

  • ORA-01722 invalid number → 檢查數值欄位格式、千分位符號、科學記號。
  • ORA-01841 date format mismatch → 核對控制檔 DATE 格式與資料實際格式(含時區)。
  • SQL*Loader-500 → 檔案不存在或權限不足。
  • BAD 檔大量記錄 → 檢查分隔符、引號嵌套、換行符(Windows CRLF vs Unix LF)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved