SQL*Loader

SQL*Loader kann genutzt werden, um Dateien in die Datenbank zu laden. Dazu ist es nützlich, wenn diese Dateien eine Struktur besitzen und dass der SQL*Loader auch zur Verfügung steht ;-).

SQL*Loader Client-Programm

Der SQL*Loader ist im Oracle-Client zu finden, d.h. nicht im Instant-Client:

  • SL5: /opt/products/oracle-client/10.2g
  • Windows: typischerweise in C:\ORACLE\product\10.2.0\client_1 via NetInstall

Erforderliche Komponenten für SQL*Loader

Um strukturierte Daten zu laden, sind einige Komponenten erforderlich:

  • Informationen, wie die Datenbank zu erreichen ist
  • die Daten
  • eine Control-Datei, die sagt, wie die Daten geladen werden

Die Daten

Die Daten liegen am einfachsten als CSV-Datei vor. Es geht auch anders, dann wird die Control-Date ggf. komplizierter. Es sind sogar Binärdaten (Bilder etc.) per SQL*Loader ladbar.

Eine Beispielzeile:

{948F2889-3119-44E0-9409-2E980A1E5292},0,0,NULL,"mailrptr","mailrptr (owner: Jahnke-Zumbusch, Dirk)","ADXV1","ADXV1_SG1","V1_SG1_DB1",0,"WIN\sys_djz",20100331104528,0,2010-09-21

 

Die Controldatei

Passend zur obigen Zeile die Controldatei mit einigen Angaben für den Ladevorgang zu Beginn:

Anfangs zu sehen:

  • LOAD DATA
    hier geht's los
  • INFILE 'D:\temp\exchange-mailboxusage-load.data'
    hier stehen die Daten drin (ginge auch inline)
  • BADFILE 'D:\temp\exchange-mailboxusage-load-bad.txt'
    falsch formatierte oder abgelehnte Datensätze stehen hinterher hier
  • DISCARDFILE 'D:\temp\exchange-mailboxusage-load-discard.txt'
    alle Datensätze, die nicht fehlerhaft sind oder abgelehnt wurden
  • APPEND INTO TABLE MAILRPTW.T_X2003_MAILBOXUSAGE_BY_DATE
    in diese Tabelle gehen die Daten; APPEND => die Tabelle wird vorher nicht genullt, wichtig!
  • und so sind sie im Ursprungsfile formatiert:
    FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
    (
    GUID ,
    ASSOCCONTENTCOUNT,
    DELETEDMESSAGESIZEEXTENDED,
    LASTLOGOFFTIME DATE "YYYYMMDDHH24MISS" NULLIF LASTLOGOFFTIME='NULL',
    LEGACYDN ,
    MAILBOXDISPLAYNAME ,
    SERVERNAME ,
    STORAGEGROUPNAME ,
    STORENAME ,
    TOTALITEMS ,
    LASTLOGGEDONUSERACCOUNT ,
    LASTLOGONTIME DATE "YYYYMMDDHH24MISS" NULLIF LASTLOGONTIME='NULL',
    MAILBOXSIZE ,
    TSTAMP DATE "YYYY-MM-DD"
    )

Und hier wg. copy & paste ohne Kommentare:

LOAD DATA
INFILE 'D:\temp\exchange-mailboxusage-load.data'
BADFILE 'D:\temp\exchange-mailboxusage-load-bad.txt'
DISCARDFILE 'D:\temp\exchange-mailboxusage-load-discard.txt'
APPEND INTO TABLE MAILRPTW.T_X2003_MAILBOXUSAGE_BY_DATE
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
(
GUID ,
ASSOCCONTENTCOUNT,
DELETEDMESSAGESIZEEXTENDED,
LASTLOGOFFTIME DATE "YYYYMMDDHH24MISS" NULLIF LASTLOGOFFTIME='NULL',
LEGACYDN ,
MAILBOXDISPLAYNAME ,
SERVERNAME ,
STORAGEGROUPNAME ,
STORENAME ,
TOTALITEMS ,
LASTLOGGEDONUSERACCOUNT ,
LASTLOGONTIME DATE "YYYYMMDDHH24MISS" NULLIF LASTLOGONTIME='NULL',
MAILBOXSIZE ,
TSTAMP DATE "YYYY-MM-DD"
)

Aufruf von SQL*Loader

Windows

$ORACLE_HOME\bin\sqlldr control=MY.CTL SILENT=ALL USERID=USERNAME/PASSWD@desy.desy.de LOG=LOGFILE.TXT

Linux/UNIX

dito, halt / statt \ oder sqlldr ist im Pfad...

Und nicht vergessen, die log, bad und discard Dateien zu filtern/"grep"en auf Fehler etc.