使用控制文件加载CSV至Oracle表时遇ORA-01841日期错误求助
解决SQL*Loader加载Oracle表时的ORA-01841日期错误
错误原因
ORA-01841报错说明第10001条记录的DATE字段值无法通过TO_DATE(:DATE,'DD-MM-YYYY')完成转换,核心问题包括:
- 日期值实际格式与控制文件中指定的
DD-MM-YYYY不匹配(比如用了/分隔符、月日顺序颠倒) - 日期值为空、包含乱码或年份超出
-4713到9999的有效范围 DATE是Oracle保留关键字,作为列名可能引发解析异常
解决方案
1. 定位并修正无效记录
直接打开CSV文件找到第10001条记录,检查DATE字段:
- 若分隔符错误(比如用
/代替-),将控制文件的格式掩码改为'DD/MM/YYYY' - 若月日顺序颠倒(比如是
MM-DD-YYYY格式),调整掩码为对应格式 - 若为空值、乱码或年份无效,直接修正CSV中的这条数据
2. 处理关键字列名问题
DATE是Oracle保留关键字,作为列名易引发解析问题,两种解决方式:
- 优先修改表的列名(比如改为
LOAD_DATE) - 若无法改表名,在控制文件中给列名加双引号,同时确保转换逻辑对应:
"DATE" "TO_DATE(trim(:DATE),'DD-MM-YYYY')"
3. 添加转换容错机制
如果CSV中存在少量无效日期,不想整行被拒绝,可通过VALIDATE_CONVERSION函数过滤无效值(需表的DATE列允许NULL):
"DATE" "CASE WHEN VALIDATE_CONVERSION(:DATE AS DATE, 'DD-MM-YYYY') = 1 THEN TO_DATE(trim(:DATE),'DD-MM-YYYY') ELSE NULL END"
4. 用日志精准排查问题
在控制文件中添加日志配置,生成的loader.bad文件会保存被拒绝的原始记录,方便快速定位:
LOAD DATA REPLACE INTO TABLE Tab_A Fields terminated by "," OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS LOG 'loader.log' BAD 'loader.bad' ( ITEM "trim(:ITEM)", LOC "trim(:LOC)", "DATE" "TO_DATE(trim(:DATE),'DD-MM-YYYY')", DUR, QTY )
验证步骤
修改后重新执行加载命令,查看日志确认错误消除,再查询Tab_A表验证数据是否正确导入。
内容的提问来源于stack exchange,提问作者Megala
相关产品推荐
相关产品推荐

