2012-07-12

Manchmal ist char kürzer als char(xxx)

Aufgabe: Mit Hilfe einer einer externen Tabelle sollen Daten aus einer csv-Datei mit Oracle Warehouse Builder eingelesen und weiter verarbeitet werden.

Damit die ohne Probleme verarbeitet werden können und es zu keinen Fehlern mit falschen Formatmasken kommt wird die Tabellenstruktur folgendermaßen angelegt:

-- Create table
create table IMPORT_SRC
(
  id         VARCHAR2(4000),
  datum VARCHAR2(4000),
  daten VARCHAR2(4000)
)
organization external
(
  type ORACLE_LOADER
  default directory MOD_CSV_LOCATION
  access parameters
  (
    RECORDS DELIMITED BY '\r\n'
    CHARACTERSET WE8MSWIN1252
    STRING SIZES ARE IN BYTES
    NOBADFILE
    NODISCARDFILE
    NOLOGFILE
    SKIP 1
    FIELDS
      TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '"' AND '"'
      NOTRIM
      (
        "ID" CHAR,
        "DATUM" CHAR,
        "DATEN" CHAR      )

  )
  location (MOD_CSV_LOCATION:Import.csv')
)
reject limit UNLIMITED;

 

Problem: Es werden nicht alle Zeilen der Datei verarbeitet. Auch ein SQL-Statement auf die Externe Tabelle liefert von den 10 sich in der Datei befindeten Zeilen nur 8 zurück. Beim betrachten der Datei sticht hervor, dass in 2 Zeilen die Werte in der Spalte für Daten deutlich länger sind als in den anderen Zeilen.

Lösung: Nach einigem Testen und Modifizieren der Datei stellt sich raus, dass die magische Grenze bei 255 Zeichen liegt. Sobald die Länge diesen Wert übersteigt, wird die Zeile nicht mehr verarbeitet.

Abhilfe schafft hier die Definition der Externen Tabelle mit einer Angabe für die maximale Spaltenlänge. So greift die Einschränkung der Länge nicht mehr und die Daten können verarbeitet werden.

-- Create table
create table IMPORT_SRC
(
id VARCHAR2(4000),
datum VARCHAR2(4000),
daten VARCHAR2(4000)
)
organization external
(
type ORACLE_LOADER
default directory MOD_CSV_LOCATION
access parameters
(
RECORDS DELIMITED BY '\r\n'
CHARACTERSET WE8MSWIN1252
STRING SIZES ARE IN BYTES
NOBADFILE
NODISCARDFILE
NOLOGFILE
SKIP 1
FIELDS
TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"' AND '"'
NOTRIM
(
"ID" CHAR,
"DATUM" CHAR,
"DATEN" CHAR (1000) )
)
location (MOD_CSV_LOCATION:Import.csv')
)
reject limit UNLIMITED;

 

Lesson learned: Manchmal ist char kürzer als char(xxx)

Keine Kommentare:

Kommentar veröffentlichen