2016-12-30 105 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