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

Oracle SQL*Loader (sqlldr) 核心功能與控制文件語法深度解析

     編輯:Oracle 資料庫基礎

SQL*Loader 核心能力矩陣

  • 多源加載:支持多個數據文件、多表並發加載。
  • 格式通吃:固定寬度、分隔符 (CSV/TSV)、變長記錄、二進制/壓縮十進制。
  • 邏輯記錄構建:物理記錄合併 (CONCATENATE)、條件續行 (CONTINUEIF)。
  • 數據轉換:字符串→數字/日期、SEQUENCE/RECNUM 生成鍵值、NULLIF/DEFAULTIF 條件賦值。
  • 錯誤隔離:壞文件 (BADFILE)、棄文件 (DISCARDFILE)、日志文件完整記錄。
  • 性能優化:直接路徑加載 (DIRECT=TRUE)、並行加載 (PARALLEL=TRUE)、ROWS/BINDSIZE/READSIZE 緩衝調優。

控制文件三段式結構


-- 1. 全局選項 (OPTIONS 子句)
OPTIONS (SKIP=10, ERRORS=1000, ROWS=5000, BINDSIZE=2097152, SILENT=(HEADER, FEEDBACK))

-- 2. 輸入數據源 (INFILE/INDDN)
LOAD DATA
INFILE 'data.csv' "STR '\r\n'"  -- 記錄分隔符
BADFILE 'data.bad'
DISCARDFILE 'data.dsc'
DISCARDMAX 100

-- 3. 目標表與字段映射 (INTO TABLE ... FIELDS ...)
APPEND
INTO TABLE scott.emp
WHEN (1:1) <> 'H'  -- 跳過標題行
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS  -- 尾部缺列視為 NULL
(
  empno     POSITION(1:4) INTEGER EXTERNAL,
  ename     CHAR(20)  "UPPER(:ename)",  -- SQL 表達式轉換
  job       CHAR(15),
  mgr       INTEGER EXTERNAL NULLIF (mgr=''),
  hiredate  DATE 'DD-MON-YYYY',
  sal       DECIMAL EXTERNAL,
  comm      DECIMAL EXTERNAL DEFAULTIF (comm=''),
  deptno    INTEGER EXTERNAL
)
-- 可續寫多個 INTO TABLE 針對同/不同文件

關鍵子句詳解

記錄格式定義

格式語法適用場景
流式 (默認)INFILE 'file' "STR '\n'"文本文件,行分隔符明確
固定長度INFILE 'file' "FIX 80"大型機下傳文件、無分隔符
變長 (含長度前綴)INFILE 'file' "VAR 4"前 2-4 字節存儲記錄長度

字段定義屬性

  • POSITION(start:end) / POSITION(*) / POSITION(*+5):精確/相對偏移定位。
  • datatype:CHAR, INTEGER EXTERNAL, DECIMAL EXTERNAL, DATE 'fmt', ZONED, PACKED DECIMAL 等。
  • TERMINATED BY / ENCLOSED BY:分隔/包裹字符,支持 16 進制 X'2C'。
  • NULLIF (col=BLANKS) / DEFAULTIF (col='N/A'):條件賦 NULL/默認值。
  • "SQL 表達式":如 "TO_DATE(:col, 'YYYYMMDD')"、":col + 1",功能極強。

加載模式

  • INSERT:目標表必須為空,否則報錯。
  • APPEND:追加數據,保留現有行。
  • REPLACE:TRUNCATE TABLE 後加載。
  • TRUNCATE:同 REPLACE,語義更清晰。

直接路徑加載 (Direct Path Load) 加速秘籍


sqlldr userid=/ control=big_load.ctl DIRECT=TRUE PARALLEL=TRUE
  -- 關鍵參數
  READSIZE=20971520
  BINDSIZE=20971520
  ROWS=10000
  -- 表級並行需配合
  -- ALTER TABLE big_table PARALLEL 4;
  -- 索引策略:建議先 DISABLE 非唯一索引,載入後 REBUILD

限制:不支持觸發器、外鍵、聚簇表、對象類型、REF 列;需獨佔段鎖 (或分區級並行)。

常見錯誤與調試技巧

錯誤現象根因解決
ORA-01722 invalid number字符數據非數字格式用 NULLIF/DEFAULTIF 過濾,或 DECODE 表達式清洗
ORA-01841 date format mismatch日期格式不匹配控制文件中顯式 DATE 'fmt',或 SQL 表達式 TO_DATE
Load 緩慢常規路徑、提交頻繁、索引維護DIRECT=TRUE, 增大 ROWS/BINDSIZE, 暫停索引
字符集亂碼NLS_LANG 與文件編碼不符設置 NLS_LANG=AL32UTF8 (或文件實際編碼)

總結

SQL*Loader 以「控制文件聲明式語法 + 直接路徑引擎」成為 Oracle 大批量數據加載的標準利器。掌握 FIELDS 映射、POSITION 定位、SQL 表達式 轉換、DIRECT/PARALLEL 加速五大核心,配合壞/棄文件機制與日志分析,即可構建健壯、高效、可重試的 ETL 加載管道。

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