Wie wollen Sie konvertieren von scientific notation in der Oracle-SQL?
Wir werden versuchen, eine Datei zu laden erstellt von FastExport in einer oracle-Datenbank.
Aber der Float-Spalte wird exportiert wie diese: 1.47654345670000000000 E010
.
Wie konfigurieren Sie den SQL*Loader zum importieren von es wie dass.
Erwarten Control-Skript wie folgt Aussehen:
OPTIONS(DIRECT=TRUE, ROWS=20000, BINDSIZE=8388608, READSIZE=8388608)
UNRECOVERABLE LOAD DATA
infile 'data/SOME_FILE.csv'
append
INTO TABLE SOME_TABLE
fields terminated by ','
OPTIONALLY ENCLOSED BY '"' AND '"'
trailing nullcols (
FLOAT_VALUE CHAR(38) "???????????????????",
FILED02 CHAR(5) "TRIM(:FILED02)",
FILED03 TIMESTAMP "YYYY-MM-DD HH24:MI:SS.FF6",
FILED04 CHAR(38)
)
Ich habe versucht to_number('1.47654345670000000000 E010', '9.99999999999999999999 EEEE')
Fehler:
ORA-01481: invalid number format model
Fehler.
Ich habe versucht to_number('1.47654345670000000000 E010', '9.99999999999999999999EEEE')
Fehler:
ORA-01722: invalid number
Dies sind die Lösungen, die ich kam mit, in der Reihenfolge der Präferenz:
to_number(replace('1.47654345670000000000 E010', ' ', ''))
to_number(TRANSLATE('1.47654345670000000000 E010', '1 ', '1'))
Ich würde gerne wissen, ob es irgendwelche leistungsfähigere Lösungen.
to_number()
, vielleicht wird es akzeptieren, string-Funktionen wie substring, string-Verkettung, oder strip-Räume?Das wird mein letzter Ausweg. Ich versuche zu vermeiden String-Operationen so viel als möglich. Wir haben diese Dateien Steuern für Hunderte Milliarden Datensätze.
to_number(to_char(thecolumn)) ich denke,
Das funktioniert nicht, weil der Raum. Die to_char nichts nützliches, da es bereits einen char.
InformationsquelleAutor ScrappyDev | 2012-02-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Soweit ich bin mir bewusst, es gibt keine Möglichkeit zu haben
to_number
ignorieren, den Raum, und nichts, was Sie tun können in SQL*Loader, um es vorzubereiten. Wenn Sie nicht entfernen können es durch das pre-processing der Datei, die du vorgeschlagen hast, ist nicht eine option, dann müssen Sie eine string-Funktion an einem gewissen Punkt. Ich würde nicht erwarten, dass es fügen Sie eine riesige Menge der Verarbeitung, über das, was to_number sowieso tun, aber ich würde immer versuchen Sie es und sehen Sie eher als vorausgesetzt, alles andere - die Vermeidung der string-Funktionen klingt ein wenig wie eine vorzeitige Optimierung. Anyway, die einfachste ist wahrscheinlichreplace
:oder nur für Anzeigezwecke:
Definieren Sie Ihre eigene Funktion zur Vereinfachung der control-Datei etwas, aber nicht sicher, es würde es Wert sein.
Zwei andere Möglichkeiten in den Sinn kommen. (a) Laden Sie in eine temporäre Tabelle als
varchar
, und dann füllen Sie die eigentliche Tabelle mit dento_number(replace())
; aber ich bezweifle, dass wird keine Verbesserung in der Leistung und könnte wesentlich schlimmer. Oder (b) wenn Sie mit 11g, Last in einevarchar
Spalte in der realen Tabelle, und machen Sie Ihre Zahl in Spalte a virtuelle Spalte, die für die Funktionen.Eigentlich eine Dritte option... nicht verwenden SQLLoader, sondern verwenden Sie die CSV-Datei als eine externe Tabelle, und füllen Sie Ihre wahre Tabelle aus. Sie haben noch zu tun, die
to_number(replace())
aber sehen Sie möglicherweise einen Unterschied in der Leistung über es zu tun in SQLLoader. Der Unterschied könnte sein, dass es schlimmer ist, natürlich, aber könnte einen Versuch Wert sein.InformationsquelleAutor Alex Poole
Ändern Anzahl Breite mit "set numw"
select num from blabla >
Ergebnis >> 1,0293 E+15
set numw 20;
select num from blabla >
Ergebnis >> 1029301200000021
set numw
w/ SQLLoader.InformationsquelleAutor Add080bbA
Hier ist die Lösung, die ich ging mit:
In meiner Lösung die Konvertierung in eine Zahl ist implizit:
"REPLACE(:FLOAT_VALUE,' ','')"
InformationsquelleAutor ScrappyDev
In Oracle 11g-es ist nicht nötig zu konvertieren, zahlen extra.
Verwenden Sie einfach
integer external
im.ctl
-Datei:Habe ich versucht, das folgende in meiner Oracle-DB:
Innen
.ctl
-Datei, die ich verwendet die folgende definition:In der Datenbank der Wert ist:
MYNUMBER: -1.61290E-03
Als für das Ergebnis: sqlldr geladen die Schreibweise korrekt:
MYNUMBER field: -0.00161290
Ich bin mir nicht sicher ob es ein bug ist oder ein feature, aber es funktioniert in Oracle 11g.
InformationsquelleAutor Jana-guest