Oracle Sql-Loader "ORA-01722: ungültige Anzahl" beim laden von CSV-Datei mit Windows-Zeilenenden

Bin ich mit dem Oracle Sql-Loader-Utility von der Linux-shell laden der csv-Daten in Oracle-DB.
Aber ich habe bemerkt, dass wenn die Quell-csv-Dateien Zeilen-Endungen sind '\r\n' (Windows-format), sqlldr nicht geladen werden Daten der letzten Spalte.

Beispielsweise, wenn die Letzte Spalte ist der FLOAT-Typ (definiert in ctl-Datei als 'FLOAT EXTERNAL'), sqlldr schlägt fehl mit "ORA-01722: invalid number':

Sqlldr ctl-Datei:

OPTIONS(silent=(HEADER))
load data
 replace
 into table fp_basic_bd
 fields terminated by "|" optionally enclosed by '"'
 TRAILING NULLCOLS
 (
 FS_PERM_SEC_ID CHAR(20),
 "DATE" DATE "YYYY-MM-DD", 
 ADJDATE DATE "YYYY-MM-DD", 
 CURRENCY CHAR(3),
 P_PRICE FLOAT EXTERNAL,
 P_PRICE_OPEN FLOAT EXTERNAL,
 P_PRICE_HIGH FLOAT EXTERNAL,
 P_PRICE_LOW FLOAT EXTERNAL,
 P_VOLUME FLOAT EXTERNAL
 )

sqlldr Befehl:

sqlldr -userid XXX -data ./test.data -log ./test.log -bad ./test.errors -control test.ctl -errors 3 -skip_unusable_indexes -skip_index_maintenance

sqlldr-error-log:

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
FS_PERM_SEC_ID                      FIRST    20   |  O(") CHARACTER            
"DATE"                               NEXT     *   |  O(") DATE YYYY-MM-DD      
ADJDATE                              NEXT     *   |  O(") DATE YYYY-MM-DD      
CURRENCY                             NEXT     3   |  O(") CHARACTER            
P_PRICE                              NEXT     *   |  O(") CHARACTER            
P_PRICE_OPEN                         NEXT     *   |  O(") CHARACTER            
P_PRICE_HIGH                         NEXT     *   |  O(") CHARACTER            
P_PRICE_LOW                          NEXT     *   |  O(") CHARACTER            
P_VOLUME                             NEXT     *   |  O(") CHARACTER            

value used for ROWS parameter changed from 300000 to 65534
Record 1: Rejected - Error on table FP_BASIC_BD, column P_VOLUME.
ORA-01722: invalid number

Record 2: Rejected - Error on table FP_BASIC_BD, column P_VOLUME.
ORA-01722: invalid number

Wenn ich ersetzt die Windows-Zeilenenden zu Unix, alle Fehler Weg und alle Daten korrekt geladen.

Meine Frage ist: wie kann ich festlegen, line terminator char in sqlldr config-Datei, aber immer noch halten Sie den Namen der Quelldatei in shell-Befehl?

Ich habe gesehen, wie einige Beispiele dafür, wie zu tun, dass mit stream record format http://docs.oracle.com/cd/E11882_01/server.112/e16536/ldr_control_file.htm#SUTIL1087,
aber diese Beispiele sind nicht anwendbar in meinem Fall, wie ich brauche, um den Namen der Daten-Datei in shell-Befehl, und nicht in ctl-Datei.

  • Die EOL-Konvertierung auf unix mit dos2unix urfilename urfilename und nach, dass sqlldr funktionieren sollte ?
  • Ja, es ist der Weg, ich bin derzeit der Umgang mit diesem. Aber Quelle der Daten ist unter ist zu groß (bis zu 40 Gb pro Tag) und ich versuche, Daten laden so schnell wie möglich. Also ich bin auf der Suche nach Möglichkeiten, um Sie alle durch nur sqlldr ohne zusätzliche pre-editing Eingabe-CSV-Dateien.
InformationsquelleAutor daniilyar | 2014-04-01
Schreibe einen Kommentar