2016-12-30 103 views
2

我得到ORA-01843:在oracle 12c上使用带有sql loader 11.1.0.6.0的制表符分隔的文本文件加载数据时不是有效的月份错误。Oracle 12c - SQL Loader无效的月份错误

控制文件:

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 
) 
+0

你为什么要指定'MM-DD-yyyy'当你正在寻找'YYYY/MM/dd'? –

+0

我正在用yyyy/mm/dd本身进行测试,但后来我更改为mm-dd-yyyy以查看它是否有效。我编辑了这个问题。日Thnx – CodingFreak

回答

1

的SQL * Loader控制文件是interpreting a backslash as an escape character,它似乎。 SQL operator section显示双引号也被转义;它不会明显适用于其他任何事情,但是有意义的是,一个反斜杠总是会被假定为逃避某事。

您的正则表达式模式需要双重转义\d才能使该模式在文件中工作,就像在普通SQL中一样。此刻该模式不匹配,所以所有的数值都会变为,这是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