Zum Inhalt springen

Import mit Oracle SQL*Loader


Alex_winf01

Empfohlene Beiträge

Hallo liebe Forengemeinde,

ich habe ein kleines Problem beim Import in eine Oracle-Datenbank.

Also es geht um eine csv-Datei. In dieser csv-Datei sind die erste und letzte Spalte mit " " eingeschlossen. Dies habe ich in der Loader-Datei angegeben. Es wird alles bis auf einen Datensatz eingelesen. Angeblich reicht der Wertebereich für die lezte Spalte in der Datenbank nicht aus. Die Spalte ist aber als varchar2(1000) angegeben und der Text ist aber gerade mal 500 Zeichen lang.

Hat da jemand schon mal Erfahrungen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Welchen Zeichensatz verwendet die Datenbank? Je nach Zeichensatz und Zeichen kann ein Zeichen auch bis zu 4 Byte lang sein. Dann ist es noch wichtig, ob die Spalte mit VARCHAR2(1000 Byte) oder VARCHAR2(1000 CHAR) definiert wurde. Je nachdem sind es 1000 Byte oder eben 1000 Zeichen - unabhängig vom Zeichensatz.

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

ja hier ich :)

endlich kann ich n00b mal den Doktor vorführen :P

Das ist ein Prob des Sqlloaders, er hat default nur 256 Byte pro Spalte.

das kannst du in der ctl datei aber ändern..

warte ich google schnell mal..

NAME_DES_VARCHAR_COLUMS CHAR(500),

so, also nur das CHAR(1000) und schon hat er 1000 Zeichen platz.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Schon klar, ich meinte mehr wo der Sinn des ganzen ist.

Ein Workaround zu schreiben das bei der betreffenden Fehlermeldung einfach mal den Default vergrößert oder ähnliches ist ja nicht wirklich schwierig.

Einem solchen Programm hab ich ehrlich gesagt solche Unfähigkeit nicht zugetraut.

Er merkt das sein Platz nicht ausreicht die Zeichenkette zu speichern - und das schreibt er auch als Error. Wieso dann nicht intern einfach mal n paar mehr Bytes nutzen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es geht hier um Speicher- und Performanceoptimierung. Der SQLLoader schreibt ja direkt in die Tabellen (bzw. der Serverteil des SQLLoader). Für den Ladevorgang wird intern entsprechender Speicher allokiert der dann pro einzulesenden Block belegt wird. Den Speicher immer wieder neu zu allokieren würde natürlich zeit erfordern.

Noch interessanter wird es bein Direct Load hier wird der Block direkt fertig formatiert ans Ende der Tabelle gehängt.

Der Loader ist eben für Performance optimiert (wir laden hier Millionen von Datensätzen in Minuten) und dafür muss muss man eben auf der "Bequemlichkeitsseite" ein paar Einschränkungen machen.

Dim

PS: Wenn man weiß, dass die Daten nur z.B. 10 Byte lang sind, kann man durch diese Angabe den Ladevorgang natürlich auch schneller machen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmm, direct load ist da ein Stichwort an das ich nicht direkt gedacht habe...

Und ein bissschen rumgespielt mit sehr großen oder kleinen werten im (CHAR) hab ich auch mal, allerdings ohne nennenswerte Unterschiede.

Aber nun gibt es eine Seite im Inet mehr auf der man diesem ominösen Problem auf die Schliche kommt :cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke schon mal für Eure hilfreichen Antworten. Jetzt habe ich zm SQL*Loader noch eine Frage:

Ich habe eine Tabelle mit drei Spalten, die nur Text aufnimmt. Nun habe ich in der ersten Zeile einen Header. Diese erste Zeile möchte ich gerne überspringen. Geht das mit dem SQL*Loader oder muss ich den Header vor dem Import rausnehmen, da er sonst mit importiert werden würde?

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ dr.dimitri

vielen Dank für Deine schnelle Antwort. Jetzt habe ich noch ein Problem mit einer csv-Datei. Die erste und letzte Spalte habe ich in Hochkomma gesetzt (glaub zu der Problematik habe ich schon mal gepostet). Jede Spalte wird mit ; getrennt. So habe ich das auch in meiner Loader-Datei angegeben.

FIELDS TERMINATED BY';' optionally enclosed by '"'

In der csv-Datei sind insgesamt 1425 Datensätze zum einlesen, der SQL-Loader liest aber nur 1423 Datensätze. Es wird keine bad-Datei erzeugt und in der log-Datei steht folgendes:

1423 Zeilen erfolgreich geladen.

0 Zeilen aufgrund von Datenfehlern nicht geladen.

0 Zeilen nicht geladen, da alle WHEN-Klauseln fehlerhaft waren.

0 Zeilen nicht geladen, da alle Felder NULL waren

Gesamtzahl der übersprungenen logischen Datensätze: 1

Gesamtzahl der gelesenen logischen Datensätze: 1423

Gesamtzahl der abgelehnten logischen Datensätze: 0

Gesamtzahl der zurückgewiesenen logischen Datensätze: 0

Den einen übersprungenen Datensatz habe ich beim Aufruf überspringen lassen, da es sich um die Header-Zeile handelt.

Woran kann das liegen? In der 3. Spalte können Sonderzeichen wie

";,
vorkommen. Kann das daran liegen? Aber müsste ich dann nicht zumindestens eine Fehlermeldung bekommen?
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...