2012-01-24 17 views
2

EXTERNAL TABLESを使用してOracle 11g R2にデータをロードするときに、次のエラーが発生します。Oracle外部テーブル日付エラー

error processing column DATE_M in row 1 for datafile C:\app\S\admin\orcl\dpdump\TABLE_EXT.txt 
ORA-01847: day of month must be between 1 and last day of month 
error processing column DATE_M in row 2 for datafile C:\app\S\admin\orcl\dpdump\TABLE_EXT.txt 
ORA-01843: not a valid month 
error processing column DATE_M in row 3 for datafile C:\app\S\admin\orcl\dpdump\TABLE_EXT.txt 
ORA-01843: not a valid month 
error processing column DATE_M in row 4 for datafile C:\app\S\admin\orcl\dpdump\TABLE_EXT.txt 
ORA-01847: day of month must be between 1 and last day of month 
error processing column DATE_M in row 5 for datafile C:\app\S\admin\orcl\dpdump\TABLE_EXT.txt 
ORA-01843: not a valid month 
error processing column DATE_M in row 6 for datafile C:\app\S\admin\orcl\dpdump\TABLE_EXT.txt 
ORA-01843: not a valid month 
error processing column DATE_M in row 7 for datafile C:\app\S\admin\orcl\dpdump\TABLE_EXT.txt 
ORA-01843: not a valid month 
error processing column DATE_M in row 8 for datafile C:\app\S\admin\orcl\dpdump\TABLE_EXT.txt 
ORA-01843: not a valid month 
error processing column DATE_M in row 9 for datafile C:\app\S\admin\orcl\dpdump\TABLE_EXT.txt 
ORA-01843: not a valid month 
error processing column DATE_M in row 10 for datafile C:\app\S\admin\orcl\dpdump\TABLE_EXT.txt 
ORA-01843: not a valid month 

外部表の作成:

CREATE TABLE TABLE_EXT 
("COMPANY" VARCHAR2(101), 
"COMPANY_VN" VARCHAR2(15), 
"IL" VARCHAR2(17), 
"TERMINAL" VARCHAR2(8), 
"T_NO" VARCHAR2(15), 
"NAME" VARCHAR2(108), 
"SNAME" VARCHAR2(50), 
"REF_NO" VARCHAR2(23), 
"AMOUNT" NUMBER(15,2), 
"DATE_M" DATE, 
"TIME" VARCHAR2(11), 
"TEL_NO" VARCHAR2(25), 
"ADDRESS" VARCHAR2(50) 
) 
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER 
DEFAULT DIRECTORY data_pump_dir 
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE 
FIELDS TERMINATED BY '|' 
MISSING FIELD VALUES ARE NULL 
(
COMPANY, 
COMPANY_VN, 
IL, 
TERMINAL, 
T_NO, 
NAME, 
SNAME, 
REF_NO, 
AMOUNT decimal , 
DATE_M CHAR date_format DATE mask "dd.mm.yyyy" , 
TIME, 
TEL_NO, 
ADDRESS 
) 
) 
LOCATION ('TABLE_EXT.txt') 
) 

REJECT LIMIT 10 

サンプルデータ:

CITY HOSPITAL|04680072124|CITY|00614860|47746244218|JOHN|WHITE|172871|420,12|21.08.2011|14:26|0806422627784|06 
CITY HOSPITAL|04680072124|CITY|00614847|14274017676|BRAD|BROWN|448127|810,00|22.08.2011|11:04|0806427488476|06 
CITY HOSPITAL|04680072124|CITY|00614842|16218778886|PETER|BALSON|862626|12,00|24.08.2011|14:16|0806062177008|06 
CITY HOSPITAL|04680072124|CITY|00614846|14607666866|GEORGE|LOUIS|688811|40,10|24.08.2011|08:48|0806424172468|06 
CITY HOSPITAL|04680072124|CITY|00614846|14607666866|GEORGE|LOUIS|460481|42,64|24.08.2011|08:47|0806424172468|06 
CITY HOSPITAL|04680072124|CITY|00614860|18460662462|JR|TEPE|404622|44,16|22.04.2011|20:08|0806446446866|06 
CITY HOSPITAL|04680072124|CITY|00614840|47207688618|BARRY|HRAN|402886|42,40|27.08.2011|11:12|0806478768007|06 
CITY HOSPITAL|04680072124|CITY|00614847|42161048612|TOM|HIGGS|148640|12,00|06.06.2011|08:18|0806068076700|06 
CITY HOSPITAL|04680072124|CITY|00614846|42161048612|TOM|HIGGS|208847|12,00|06.06.2011|08:46|0806068076700|06 

NLS_DATE_FORMAT : DD/MM/RRRR 

注:、

DATE_M DATE "dd.mm.yyyy"

DATE_M CHAR date_format DATE mask "DD/MM/RRRR"

答えて

2

まず、あなたは二重引用符、単一引用符内のあなたの日付書式マスクを指定する必要はありません: 私は無駄に次のことを試してみました。

第2に、これはかなり混乱しています。「金額」列に指定した形式が正しくありません。データが "DECIMAL"であると言うと、実際には入力ファイルにバイナリ形式を指定しています。アクセス・パラメータ内のFIELD定義の文字を指定し、フィールドを数値に変換する必要があります。私は、SQL * Loaderまたは外部表のいずれかに入力データを記述するためにCHAR以外の形式を使用することはめったにありません。しかし、私はあなたが小文字(あなたの場合は、)を外部テーブル定義で指定することはできないと思うので、ここではちょっと固まっています。 NLSインスタンスのパラメータによってのみ変更できます。

ここで私は(注:10gデータベース)やったことだあなたの例を動作させるために:

CREATE TABLE TABLE_EXT ("COMPANY" VARCHAR2(101) 
         , "COMPANY_VN" VARCHAR2(15) 
         , "IL" VARCHAR2(17) 
         , "TERMINAL" VARCHAR2(8) 
         , "T_NO" VARCHAR2(15) 
         , "NAME" VARCHAR2(108) 
         , "SNAME" VARCHAR2(50) 
         , "REF_NO" VARCHAR2(23) 
         , "AMOUNT" NUMBER(15,2) 
         , "DATE_M" DATE 
         , "TIME_M" VARCHAR2(11) 
         , "TEL_NO" VARCHAR2(25) 
         , "ADDRESS" VARCHAR2(50)) 
     ORGANIZATION EXTERNAL 
      (TYPE ORACLE_LOADER 
      DEFAULT DIRECTORY external_tables 
      ACCESS PARAMETERS 
       (RECORDS DELIMITED BY NEWLINE 
        FIELDS TERMINATED BY '|' 
        MISSING FIELD VALUES ARE NULL 
       (COMPANY 
       , COMPANY_VN 
       , IL 
       , TERMINAL 
       , T_NO 
       , NAME 
       , SNAME 
       , REF_NO 
       , AMOUNT 
       , DATE_M CHAR date_format DATE mask 'dd.mm.yyyy' 
       , TIME_M 
       , TEL_NO 
       , ADDRESS)) 
      LOCATION ('TABLE_EXT.txt')) 
      REJECT LIMIT 10 ; 

私はあなたの小数点文字を変更するには、わずかにあなたのデータを変更「」データ内:

CITY HOSPITAL|04680072124|CITY|00614860|47746244218|JOHN|WHITE|172871|420.12|21.08.2011|14:26|0806422627784|06 
CITY HOSPITAL|04680072124|CITY|00614847|14274017676|BRAD|BROWN|448127|810.00|22.08.2011|11:04|0806427488476|06 
CITY HOSPITAL|04680072124|CITY|00614842|16218778886|PETER|BALSON|862626|12.00|24.08.2011|14:16|0806062177008|06 
CITY HOSPITAL|04680072124|CITY|00614846|14607666866|GEORGE|LOUIS|688811|40.10|24.08.2011|08:48|0806424172468|06 
CITY HOSPITAL|04680072124|CITY|00614846|14607666866|GEORGE|LOUIS|460481|42.64|24.08.2011|08:47|0806424172468|06 
CITY HOSPITAL|04680072124|CITY|00614860|18460662462|JR|TEPE|404622|44,16|22.04.2011|20:08|0806446446866|06 
CITY HOSPITAL|04680072124|CITY|00614840|47207688618|BARRY|HRAN|402886|42.40|27.08.2011|11:12|0806478768007|06 
CITY HOSPITAL|04680072124|CITY|00614847|42161048612|TOM|HIGGS|148640|12.00|06.06.2011|08:18|0806068076700|06 
CITY HOSPITAL|04680072124|CITY|00614846|42161048612|TOM|HIGGS|208847|12.00|06.06.2011|08:46|0806068076700|06 

これは私に役立ちました。

ボトムライン、データの変更、インスタンスのNLSパラメータの小数点文字の変更、データの文字ロードなどが必要になると思います。また、TO_NUMBER関数を外部テーブルの上に表示します。

+0

データを変更し、カンマをあなたが提案したとおりのピリオドに置き換えて、結果が成功しました。ありがとうございます。私のINSTANCE NLSパラメータは、 'NLS_NUMERIC_CHARACTERS、。 'My DATABASE NLSパラメータは' NLS_NUMERIC_CHARACTERS。 'です。このデータを変更せずにロードするにはどうすればいいですか?10進数のセパレータとしてコンマを使用した数値ですか? – bonsvr

+0

OK.ExternalテーブルはデータベースレベルでNLSパラメータを使用しますが、それが問題でした。あなたが示唆したように、数値をvarchar2としてロードしてから数値に変換するのが最善です。どうもありがとうございました。 – bonsvr

+0

ここの文書は、例では二重引用符を示しています。また、私は正常に私の外部テーブルで二重引用符を使用しています。 ORACLE_LOADERアクセス・ドライバ:http://docs.oracle.com/cd/E11882_01/server.112/e16536/et_params.htm#g1031955 – leanne

関連する問題