2017-01-06 18 views
1

sql *ローダーで一部のデータをインポートしようとしていますが、緯度/経度をインポートできません。表のこれらの列はFLOAT(126)であり、データファイル上のテキストは単なるテキストです。私はFLOAT EXTERNALとsqlldr制御ファイルで試しましたが、うまくいきません。 ORA-01722:無効な番号です。Oracle SQL sqlldrがfloatとして緯度/経度をインポートしない

Describe my_table; 

Name      Null  Type   
------------------------- -------- ------------ 
PRE_ID     NOT NULL NUMBER(38) 
PRE_DH     NOT NULL TIMESTAMP(6) 
PRE_PRO     NOT NULL NUMBER(38) 
PRE_INF     NOT NULL NUMBER(38) 
PRE_TPL     NOT NULL NUMBER(38) 
PRE_LAT     NOT NULL FLOAT(126) 
PRE_LNG     NOT NULL FLOAT(126) 

データファイル:

55831;08/12/2016 16:48:07;1;-128;2;-22.4741249084473;-50.55194854736336 
55831;09/12/2016 08:02:06;1;-128;2;-22.5002975463867;-50.8194427490234 
55831;09/12/2016 19:12:06;1;-128;2;-22.5002975463867;-50.8194427490234 

とSQLLDR制御ファイル:

load data 
infile 'my_file.csv' "str '\r\n'" 
append 
into table my_table 
fields terminated by ';' 
trailing nullcols 
      (PRE_ID CHAR(4000), 
      PRE_DH TIMESTAMP "DD/MM/YYYY HH24:MI:SS", 
      PRE_PRO CHAR(4000), 
      PRE_INF CHAR(4000), 
      PRE_TPL CHAR(4000), 
      PRE_LAT FLOAT EXTERNAL, 
      PRE_LNG FLOAT EXTERNAL, 
      ) 

ログファイル:

Table MY_TABLE, loaded from every logical record. 
Insert option in effect for this table: APPEND 
TRAILING NULLCOLS option in effect 

    Column Name     Position Len Term Encl Datatype 
------------------------------ ---------- ----- ---- ---- --------------------- 
PRE_ID        FIRST 4000 ;  CHARACTER    
PRE_DH        NEXT  * ;  DATETIME DD/MM/YYYY HH24:MI:SS 
PRE_PRO        NEXT 4000 ;  CHARACTER    
PRE_INF        NEXT 4000 ;  CHARACTER    
PRE_TPL        NEXT 4000 ;  CHARACTER    
PRE_LAT        NEXT  * ;  CHARACTER    
PRE_LNG        NEXT  * ;  CHARACTER    


value used for ROWS parameter changed from 64 to 1 
Record 1: Rejected - Error on table MY_TABLE, column PRE_LAT. 
ORA-01722: invalid number 

Record 2: Rejected - Error on table MY_TABLE, column PRE_LAT. 
ORA-01722: invalid number 

Record 3: Rejected - Error on table MY_TABLE, column PRE_LAT. 
ORA-01722: invalid number 
+0

おそらくダムの質問(私の質問、以下):なぜ単にPRE_LATとPRE_LNGを標準のOracleデータ型であるNUMBERとして宣言できないのですか?確かに、緯度または経度の小数点以下の桁数には関心がありません。 – mathguy

+0

テーブルのデータ型を変更することを意味しますか?私のテーブルではなく、私のデータベースではありません。 :/ – Rodrick

+0

はい、それは私が意味していたものです。残念な。私が助けることができない以外にも、私はsqlldrを自分で使っていません。がんばろう! – mathguy

答えて

2

オペレーティングシステム環境であるため、あなたはこれを見ています因果関係を確立する小数点区切り記号としてカンマを、グループ区切り記号としてピリオドを使用する場合は、Oracleを使用します。あなたのエラーメッセージは英語であり、興味深いことに、あなたが設定したものは正確にはわかりませんが、同じことをNLS_LANG="FRENCH_FRANCE.WE8ISO8859P1"のように見ることができます。

ログから、CSVファイルのフィールドが文字データとして読み取られていることがわかります。対象の列は浮動小数点型(任意の型の数値列に同じ問題があります)です。つまり、暗黙の変換が行われていることを意味し、NLS設定を使用しています。あなたがより簡単に同じものを見ることができます:

alter session set NLS_NUMERIC_CHARACTERS='.,'; 
select to_number('-22.4741249084473') from dual; 

TO_NUMBER('-22.4741249084473') 
------------------------------ 
      -22.4741249084473 

alter session set NLS_NUMERIC_CHARACTERS=',.'; 
select to_number('-22.4741249084473') from dual; 

Error report - 
ORA-01722: invalid number 

同じ変換が、alter sessionはコンマとピリオドの意味を交換しています。

export NLS_LANG="ENGLISH_UNITED KINGDOM.WE8ISO8859P1" 

か、単にその特定の設定:

export NLS_NUMERIC_CHARACTERS='.,' 

を... SQL * Loaderを実行する前に、あなたが明示的にNLS_LANGを経由して右NLS数字で何かに自分の環境を設定することができます

関連する問題