Oracle 12c - SQL Loader无效月错误

时间:2016-12-30 15:52:26

标签: oracle oracle12c sql-loader

我收到ORA-01843:在使用带有分页符分隔文本文件和oracle 12c上的sql loader 11.1.0.6.0加载数据时没有有效月份错误。

控制文件:

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
)

1 个答案:

答案 0 :(得分:1)

似乎SQL * Loader控制文件是interpreting a backslash as an escape characterSQL 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