SQL*Loader加载CSV到Oracle表列映射错误及ORA-01460转换失败求助
问题排查与解决方案
核心问题定位
列映射顺序不匹配是根源——CSV的字段被错误映射到Oracle表的列,导致FTE数值列收到了非数值型数据,触发ORA-01460转换错误,最终所有记录加载失败。
针对性排查步骤
- 核对控制文件列顺序:
检查SQL*Loader控制文件中FIELDS块的列定义顺序,必须和CSV文件的列顺序完全一致。比如CSV列是EMP_ID,NAME,FTE,DEPT,但控制文件写成EMP_ID,FTE,NAME,DEPT,就会把NAME的字符串塞到FTE列,直接触发转换错误。 - 验证分隔符一致性:
确认控制文件TERMINATED BY指定的分隔符(比如逗号',')和CSV实际使用的分隔符完全匹配,包括是否有隐藏的空格、制表符。如果CSV用分号但控制文件写逗号,整行数据会被识别为单个字段,映射彻底混乱。 - 检查CSV表头处理:
如果CSV包含表头行,控制文件必须用SKIP 1跳过表头。没加这行的话,表头的字符串(比如"FTE")会被当作第一行数据加载,直接触发FTE列的转换错误。 - 分析错误日志细节:
从SQL*Loader错误日志里找到失败记录的原始数据片段,对比表结构就能直观看到哪列数据被错放到了FTE列。比如日志显示FTE列收到"Marketing",说明DEPT的数据被错映射到了FTE位置。
修复方案示例
假设Oracle表结构:
CREATE TABLE EMPLOYEES ( EMP_ID NUMBER(10) PRIMARY KEY, NAME VARCHAR2(50), FTE NUMBER(3,2), DEPT VARCHAR2(30) );
CSV文件内容(带表头):
EMP_ID,NAME,FTE,DEPT 1001,John Doe,1.0,Engineering 1002,Jane Smith,0.5,Marketing
正确的SQL*Loader控制文件(load_emp.ctl):
LOAD DATA INFILE 'employees.csv' BADFILE 'employees.bad' DISCARDFILE 'employees.dsc' APPEND INTO TABLE EMPLOYEES FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' SKIP 1 -- 跳过表头行 ( EMP_ID, NAME, FTE, DEPT )
Shell调用脚本示例:
sqlldr username/password@database control=load_emp.ctl log=load_emp.log
修复验证
重新执行加载后,确认:
- 日志文件中
rows successfully loaded数量符合预期 - BAD文件为空(无错误记录)
- 直接查询Oracle表,确认各列数据映射正确,FTE列数值正常
内容的提问来源于stack exchange,提问作者aditya442
相关产品推荐
相关产品推荐

