Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Import mit Oracle SQL*Loader

Empfohlene Antworten

Veröffentlicht

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?

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

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.

Genau, 255 byte.

Wieso er das macht, hab ich nie herausfinden können. Aber ich war auch sehr überrascht als ich nach Stunden endlich meinen Text geladen bekam.

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?

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.

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:

  • Autor

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?

  • Autor

@ 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?

Hmm dann hab ich erstmal keine Ahnung. Kannst Du rausfinden welcher Datensatz fehlt? Wenn Du Datensätze aus der csv Datei entfernst, wird dann immer einer zu wenig geladen? Sprich bei nur einem Satz + Header wird kein Satz geladen?

Vielleicht hat aber auch Corto |sX| wieder eine Idee.

Dim

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.