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
在 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