Oracle 12c - SQL 加载程序无效月份错误

Oracle 12c - SQL Loader Invalid month Error

在 oracle 12c 上使用 sql 加载器 11.1.0.6.0 使用制表符分隔的文本文件加载数据时出现 ORA-01843: 不是有效月份错误。

控制文件:

options (skip=1)
load data
truncate
into table test_table
fields terminated by '\t' TRAILING NULLCOLS
( 
  type,
  rvw_date "case when :rvw_date = 'NULL' then null  WHEN       REGEXP_LIKE(:rvw_date, '\d{4}/\d{2}/\d{2}') THEN to_date(:rvw_date,'yyyy/mm/dd')   else to_date(:rvw_date,'mm-dd-yy') end"
)

数据:

type     rvw_date
Phone    2014/01/29
Phone    2014/02/13
Field    NULL
Phone    01/26/15
Field    02/25/12

架构:

create table test_table
(
    type varchar2(20),
    rvw_date date
)

SQL*Loader 控制文件 interpreting a backslash as an escape character, it seems. The SQL operator section 也显示双引号被转义;它并不明显它是否适用于其他任何东西,但是总是假设单个反斜杠是在转义某些东西是有道理的。

您的正则表达式模式需要双重转义 \d 以使模式在文件中像在普通 SQL 中一样工作。目前模式不匹配,因此所有值都进入 else,这是 wrng 格式掩码(即使它们都已更正)。

这个有效:

options (skip=1)
load data
truncate
into table test_table
fields terminated by '\t' TRAILING NULLCOLS
(
  type,
  rvw_date "case when :rvw_date = 'NULL' then null when REGEXP_LIKE(:rvw_date,'\d{4}/\d{2}/\d{2}') then to_date(:rvw_date,'yyyy/mm/dd') else to_date(:rvw_date,'mm/dd/rr') end"
)

使用创建行的原始数据:

alter session set nls_date_format = 'YYYY-MM-DD';
select * from test_table;

TYPE                 RVW_DATE  
-------------------- ----------
Phone                2014-01-29
Phone                2014-02-13
Field                          
Phone                2015-01-26
Field                2012-02-25