2017-01-06 3 views
1

Ich versuche, einige Daten mit sql * loader zu importieren, aber ich kann keinen Breiten-/Längengrad importieren. Auf der Tabelle sind diese Spalten FLOAT (126) und auf der Datendatei ist nur Text. Ich versuchte mit FLOAT EXTERNAL auf der sqlldr Steuerdatei, aber es funktioniert nicht. Ich habe ORA-01722: ungültige Nummer.Oracle SQL sqlldr importiert keinen Breiten-/Längengrad als Gleitkomma

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) 

Datendatei:

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 

und sqlldr Steuerdatei:

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, 
      ) 

Protokolldatei:

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

Vielleicht eine dumme Frage (meine Frage, folgende): Warum können Sie nicht einfach PRE_LAT und PRE_LNG als 'NUMBER' deklarieren, den Standard-Oracle-Datentyp? Sicherlich können Sie sich nicht mit der Anzahl der Dezimalstellen in einem Längen- oder Breitengrad befassen. – mathguy

+0

Meinst du den Datentyp auf der Tabelle ändern? Kann das nicht tun. Ist nicht meine Tabelle, nicht meine Datenbank. : -/ – Rodrick

+0

Ja, das war was ich meinte. Schade. Ansonsten kann ich nicht helfen, ich habe sqlldr nicht selbst benutzt. Viel Glück! – mathguy

Antwort

2

Sie sehen dies, weil die Betriebssystemumgebung ist so eingerichtet, dass Oracle behandelt ein Komma als Dezimaltrennzeichen und einen Punkt als Gruppentrennzeichen. Ihre Fehlermeldungen sind in Englisch, interessanterweise, also nicht sicher, was genau Sie haben, aber Sie können dasselbe mit etwas wie NLS_LANG="FRENCH_FRANCE.WE8ISO8859P1" sehen.

Aus dem Protokoll können Sie sehen, dass das Feld in Ihrer CSV-Datei als Zeichendaten gelesen wird. Die Zielspalte ist ein Gleitkommawert (jede Art von Zahlenspalte würde dasselbe Problem haben), was bedeutet, dass eine implizite Konvertierung stattfindet und Ihre NLS-Einstellungen verwendet werden. Sie können die gleiche Sache sehen mehr einfach mit:

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 

Gleiche Umwandlung, aber die alter session ist die Bedeutung des Komma und Punkt tauschen.

Sie können entweder explizit Ihre Umgebung etwas mit den richtigen NLS numerischen Zeichen über NLS_LANG gesetzt:

export NLS_LANG="ENGLISH_UNITED KINGDOM.WE8ISO8859P1" 

oder einfach nur, dass bestimmte Einstellung:

export NLS_NUMERIC_CHARACTERS='.,' 

... vor SQL * Loader laufen .