我收到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
)
答案 0 :(得分:1)
似乎SQL * Loader控制文件是interpreting a backslash as an escape character。 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