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, dasssqlldr
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vor kurzem hatte das gleiche Problem beim laden von Daten in meine Tabelle per csv-Datei.
Meine Datei sah so aus :
Und wie Sie bereits erwähnt , ich habe immer die gleiche Fehlermeldung "ungültige Nummer"
Stellt sich heraus, diese erfolgt in der Regel
-wenn die Spalte ein Datentyp ist Zahl, aber die Daten, die Sie bekommen, aus Ihrer csv-Datei in string,so oracle-loader fehlschlägt führen Sie eine Konvertierung von string zu Zahl.
- wenn dein Feld in der csv-Datei wird beendet durch einige Trennzeichen ,sagen, Leerzeichen,tabs, etc.
Dies ist, wie ich veränderte meine ctl-Datei :
Versuchen Sie es mit stream-record-format und Angabe der terminator-string. Von den docs
Terminator string sollte Ihnen ermöglichen, geben Sie eine Kombination von Zeichen.