【问题标题】:Oracle 12c - SQL Loader Invalid month ErrorOracle 12c - SQL 加载程序无效月份错误
【发布时间】:2016-12-30 15:52:25
【问题描述】:

在 oracle 12c 上使用制表符分隔的文本文件和 sql loader 11.1.0.6.0 加载数据时出现 ORA-01843: not a valid month 错误。

控制文件:

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
)

【问题讨论】:

  • 为什么在查找yyyy/mm/dd 时指定mm-dd-yyyy
  • 我正在使用 yyyy/mm/dd 本身进行测试,但后来我更改为 mm-dd-yyyy 以查看它是否有效。我已经编辑了这个问题。谢谢

标签: oracle oracle12c sql-loader


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2020-12-15
    相关资源
    最近更新 更多