2016-12-30 30 views
2

ORA-01843:oracle 12cにSQLローダー11.1.0.6.0でタブ区切りのテキストファイルを使用してデータをロードする際に有効な月エラーではありません。Oracle 12c - SQLローダー無効な月エラー

制御ファイル:

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

あなたは 'YYYY/MM /を探しているのに、なぜあなたは' MM-DD-yyyy'を指定していますdd'? –

+0

私はyyyy/mm/dd自体でテストしていましたが、後でmm-dd-yyyyに変更して動作するかどうかを確認しました。私は質問を編集しました。 Thnx – CodingFreak

答えて

1

SQL * Loader制御ファイルがinterpreting a backslash as an escape characterで、それはそうです。 SQL operator sectionは二重引用符もエスケープされています。それは他のものにも当てはまることは明白ではありませんが、単一のバックスラッシュが常に何かをエスケープしていると思われるのは当然のことです。

普通の表現パターンは、プレーンSQLと同じようにファイル内でパターンを動作させるために、\dをダブルエスケープする必要があります。現時点ではパターンは一致していないので、wrngフォーマットのマスクであるelse(両方とも訂正されている場合でも)になるすべての値が一致します。

これは動作します:

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 
関連する問題