前言:最通用的異構數據遷移路徑
Excel → 文本 (制表符分隔) → SQL*Loader → Oracle,無需第三方工具、支持大數據量、可腳本化自動化。本文給出從 Excel 另存為到驗證導入的標準化 8 步流程。
一、 標準化 8 步流程
步驟 1-3:Excel 數據準備與導出
- 打開 Excel,輸入/整理數據 (表頭建議與目標表列名一致)
- 另存為 → 保存類型選 「文本文件 (制表符分隔) (*.txt)」,如
C:\data.txt
- 關鍵:制表符 (Tab, Hex 0x09) 作為列分隔符,避免逗號/分號在數據中出現導致解析錯誤
步驟 4:創建目標表 (SQL*Plus)
CONN system/manager
CREATE TABLE test (
id NUMBER,
username VARCHAR2(10),
password VARCHAR2(10),
created_dt VARCHAR2(20) -- 日期建議先以字符串導入,再轉型
);
步驟 5:編寫控制文件 input.ctl
LOAD DATA
INFILE 'C:\data.txt'
APPEND INTO TABLE test
FIELDS TERMINATED BY X'09' -- 制表符十六進制
(
id,
username,
password,
created_dt
)
關鍵參數解析
| 參數 | 含義 | 示例值 |
| LOAD DATA | 控制文件標識 | 固定 |
| INFILE | 數據文件路徑 | 'C:\data.txt' |
| APPEND/INSERT/REPLACE/TRUNCATE | 裝載模式 | APPEND (追加) |
| FIELDS TERMINATED BY | 列分隔符 | X'09' (Tab), ',' (CSV) |
| TRAILING NULLCOLS | 允許末尾列為空 (可選) | 常用於 CSV 末尾空列 |
步驟 6:執行 SQL*Loader
-- 本地導入
C:\> sqlldr userid=system/manager control=input.ctl
-- 遠程導入 (需 TNS 別名配置)
C:\> sqlldr userid=system/manager@orcl_tns control=input.ctl
生成文件
input.log — 詳細日志 (必看:Rows loaded, Errors, Discards)
input.bad — 格式錯誤記錄 (不符合控制文件定義)
input.dsc — 篩選條件不符記錄 (WHEN 子句)
步驟 7:驗證導入結果
-- 1. 行數核對
SELECT COUNT(*) FROM test;
-- 對比 .log 中 "Rows successfully loaded"
-- 2. 抽樣核對
SELECT * FROM test WHERE ROWNUM <= 10;
-- 對比 Excel 源數據
-- 3. 錯誤分析
-- 若 .bad 文件非空,檢查數據格式、長度、約束違規
步驟 8:常見問題排查
| 現象 | 原因 | 解決 |
| ORA-01722: invalid number | 數值列含非數字字符 | 數據清洗、或控制文件用 CHAR 轉換函數 |
| ORA-12899: value too large | 字符串超過列定義長度 | 擴大列長度、或 SUBSTR 截取 |
| 日期格式錯誤 | NLS_DATE_FORMAT 不匹配 | 控制文件指定 DATE "YYYY-MM-DD" 或導入 VARCHAR2 後 UPDATE TO_DATE |
| 編碼亂碼 | 文件編碼 (UTF-8/GBK) 與 NLS_LANG 不一致 | 設置 NLS_LANG=AMERICAN_AMERICA.ZHS16GBK (Windows) / .AL32UTF8 (Linux) |
二、 進階技巧
- 大文件並行載入:
sqlldr ... PARALLEL=TRUE + 多個控制文件分片 + 表分區/啟用 Direct Path (DIRECT=TRUE)
- 日期/時間戳轉換:
created_dt DATE "YYYY-MM-DD HH24:MI:SS" -- 控制文件直接轉型
- 序列自動填充:
id EXPRESSION "seq_test.NEXTVAL" -- 不佔用數據文件列
- 條件載入:
INTO TABLE test WHEN (1) = 'Y' -- 根據第 1 列值決定是否載入
INTO TABLE test WHEN (1) <> 'Y' -- 互斥條件載入另一表
三、 總結
Excel → Tab 文本 → SQL*Loader 是 Oracle 數據遷移的**基礎技能**。掌握 FIELDS TERMINATED BY X'09'、APPEND、.bad/.log 分析、編碼設置、Direct Path 並行載入,即可應對 90% 異構導入場景。大數據量 (GB 級+) 必用 DIRECT=TRUE PARALLEL=TRUE 繞過 SQL 層直寫數據塊。
- 上一篇文章: Oracle 鎖機制分類詳解:自動/顯式、共享/排它、DML/DDL、內部閂鎖四維劃分
- 下一篇文章: Oracle Spatial 空間數據加密技術探討:從自定義函數到硬件綁定雙因子方案
Copyright ©
程式碼之家 All Rights Reserved