Oracle SQL Loader无法加载非默认格式日期数据(ORA-01858)
解决SQL Loader加载非默认格式日期的问题
你遇到的核心问题是:SQL Loader不会解析数据文件中的SQL函数。它会把TO_DATE('1901-02-01 00:00:00','YYYY-MM-DD HH24:MI:SS')这整串内容当成普通字符串,尝试直接转换为DATE类型,自然触发ORA-01858错误——因为字符串开头的T不是日期格式预期的数字。
下面是两种可行的解决方法:
方法1:直接在控制文件中指定日期格式
这是最简洁的处理方式,不需要修改数据文件结构,仅在控制文件里给MYDATE字段指定格式掩码即可:
调整后的.dat文件内容
1901-02-01 00:00:00&,#2#@
修改后的控制文件
LOAD DATA INFILE "mytable.dat" "str '#@\n'" INTO TABLE mytable TRUNCATE FIELDS TERMINATED BY '&,#' TRAILING NULLCOLS ( MYDATE DATE 'YYYY-MM-DD HH24:MI:SS', ID )
SQL Loader会自动按照指定的YYYY-MM-DD HH24:MI:SS格式,把数据文件中的日期字符串转换为DATE类型,完全不需要依赖会话默认的dd-MON-yy格式。
方法2:用EXPRESSION子句调用SQL函数(适合复杂转换场景)
如果需要对日期做更复杂的处理(比如时区转换、字符串预处理),可以在控制文件中通过EXPRESSION子句调用TO_DATE函数,而非把函数写在数据文件里:
控制文件写法
LOAD DATA INFILE "mytable.dat" "str '#@\n'" INTO TABLE mytable TRUNCATE FIELDS TERMINATED BY '&,#' TRAILING NULLCOLS ( -- 先读取原始日期字符串到临时字段 RAW_DATE CHAR, -- 通过表达式转换为DATE类型 MYDATE EXPRESSION "TO_DATE(:RAW_DATE, 'YYYY-MM-DD HH24:MI:SS')", ID )
对应的.dat文件内容和方法1一致:
1901-02-01 00:00:00&,#2#@
内容的提问来源于stack exchange,提问作者Baker
相关产品推荐
相关产品推荐

