Alex_winf01 Geschrieben 16. April 2010 Teilen Geschrieben 16. April 2010 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 17. April 2010 Teilen Geschrieben 17. April 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 19. April 2010 Autor Teilen Geschrieben 19. April 2010 @ dr.dimitri das Feld ist als VARCHAR2(1000 CHAR) definiert und ich verwende folgenden Zeichensatz: NLS_CHARACTERSET=WE8MSWIN1252 NLS_NCHAR_CHARACTERSET=AL16UTF16 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 19. April 2010 Autor Teilen Geschrieben 19. April 2010 Kann mir keiner helfen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Corto -sX- Geschrieben 19. April 2010 Teilen Geschrieben 19. April 2010 ja hier ich endlich kann ich n00b mal den Doktor vorführen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 19. April 2010 Teilen Geschrieben 19. April 2010 endlich kann ich n00b mal den Doktor vorführen Das ist ein Prob des Sqlloaders, er hat default nur 256 Byte pro Spalte.Fast richtig. Es sind 255 Zeichen. Aber das könnte das Problem sein. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Corto -sX- Geschrieben 19. April 2010 Teilen Geschrieben 19. April 2010 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 19. April 2010 Teilen Geschrieben 19. April 2010 Wieso er das macht, hab ich nie herausfinden können.Weil es so in der Doku steht. Tabelle 8-6. Wenn Du keinen Wert angiebst wird eben der Defaultwert verwendet. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Corto -sX- Geschrieben 19. April 2010 Teilen Geschrieben 19. April 2010 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 19. April 2010 Teilen Geschrieben 19. April 2010 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Corto -sX- Geschrieben 19. April 2010 Teilen Geschrieben 19. April 2010 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: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 19. April 2010 Autor Teilen Geschrieben 19. April 2010 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 19. April 2010 Teilen Geschrieben 19. April 2010 Das geht mittels SKIP. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 20. April 2010 Autor Teilen Geschrieben 20. April 2010 @ 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 20. April 2010 Teilen Geschrieben 20. April 2010 Passen denn die Daten die er geladen hat von der Struktur her oder lädt er nur bis zur 3. Spalte? Sind es wirklich 1425 Datensätze? Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Alex_winf01 Geschrieben 20. April 2010 Autor Teilen Geschrieben 20. April 2010 @ dr.dimitri Ja, die importierten Daten passen von der Struktur. Und es sind genau 1425 Datensätze. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 20. April 2010 Teilen Geschrieben 20. April 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.