SQL-Loader Prof. Dr. Waldemar Rohde Dipl.-Ing. Jörg Höppner 05.05.2006 1 *SQL-Loader Beschreibung Definition transferiert Daten aus einer oder mehreren externen Dateien in eine oder mehrere Tabellen einer Oracle-Datenbank. ist ein eigenständiges Programm, was zum Lieferumfang von Oracle gehört Einlese-Formate Binäre Formate Character Formate Bedingung Zieltabellen müssen in der Datenbank existieren Zweck Laden von großen Datenmengen (05.05.2006) 2 *SQL-Loader Funktion Kontroll-Datei Daten-Dateien Parameter-Datei (optional) SQL*Loader abgewiesen Feld-Bearbeitung Bad-Datei akzeptiert Nicht zutreffend Datensatz-Auswahl selektiert Discard Datei (optional) abgewiesen Oracle-Server eingefügt Log-Datei DatenbankDateien (05.05.2006) 3 *SQL-Loader Aufruf Syntax sqlldr [Schlüssel = Wert], [Schlüssel = Wert], . . . Beispiel sqlldr userid = scott/tiger@student, control=insert.ctl, log=report.log, bad=error.dat oder sqlldr scott/tiger@student, control=insert.ctl, log=report.log, bad=error.dat Erklärung Dieser Programmaufruf bewirkt den Ladevorgang in die Datenbank student unter der Benutzung der UserID scott mit dem Passwort tiger. Die Definition der zu ladenden Daten befindet sich in der Datei insert.ctl, alle Meldungen des Vorgangs werden in die Datei report.log geschrieben, während sich am Ende des Ladevorgangs alle abgelehnten Datensätze in der Datei error.dat befinden werden. (05.05.2006) 4 *SQL-Loader Schaubild 10;ACCOUNTING;NEW YORK 20;RESEARCH;DALLAS 30;SALES;CHICAGO 40;OPERATIONS;BOSTON Dateisystem Programm SQL*Loader deptno Oracle DB 10 20 30 40 dname ACCOUNTING RESEARCH SALES OPERATIONS data.dat Kontroll-Datei => loc NEW YORK DALLAS CHICAGO BOSTON LOAD DATA INFILE `data.dat` INSERT INTO TABLE dept FIELDS TERMINATED by `;` OPTIONALLY ENCLOSED BY `“` (deptno integer external, dname char(14), loc char(13) ) Tabelle dept (05.05.2006) 5 *SQL-Loader Ladedaten Variante 1 Definition der Import Daten mit Felddaten variabler Länge und entspr. Feldtrennzeichen ¾ 10;ACCOUNTING;NEW YORK 20;RESEARCH;DALLAS 30;SALES;CHICAGO 40;OPERATIONS;BOSTON Variante 2 Definition der Import Daten mit Felddaten fester Länge ohne Feldtrennzeichen ¾ 10 20 30 40 ¾ Das 1. Feld ist 4 Zeichen, das 2.Feld ist 12 Zeichen und das 3.Feld ist 8 Zeichen lang. ACCOUNTING RESEARCH SALES OPERATIONS NEW YORK DALLAS CHICAGO BOSTON (05.05.2006) 6 *SQL-Loader Datentypen gebräuchliche Typen alphanumerisch CHAR [(length)] DATE [(length)] [,`date format`] DECIMAL EXTERNAL [(length)] INTEGER EXTERNAL [(length)] binär DOUBLE FLOAT DECIMAL [(digits [,precision])] INTEGER SMALLINT BLOB, CLOB (05.05.2006) 7 *SQL-Loader Datentypen Loader-DDL-Mapping DECIMAL EXTERNAL INTEGER EXTERNAL Attribut: Gleitkommazahl DDL: NUMBER(7,2) (z.B.) Attribut: Ganzzahl DDL: NUMBER(7) (z.B.) CHAR(7) Attribut: Zeichenfolge DDL: CHAR(7) oder VARCHAR2(7) (z.B.) (05.05.2006) 8 *SQL-Loader Kontrolldatei Bestandteile (Forts.) Felddefinitionen bzgl. Positionen bei Feldern fester Länge oder Trennzeichen bei Feldern variabler Länge, Datentypen und Filterkriterien (Schlüsselwort FIELDS) Filterbedingungen für die Definition einer Untermenge der zu ladenden Daten (Schlüsselwort WHEN) z.B. WHEN (8:20) != ‘ 12345‘ and (60:70) = ‘was ist das‘ Kommentare (eingeleitet durch --) (05.05.2006) 9 *SQL-Loader Kontrolldatei Bestandteile Name der zu ladenden Daten-Datei (Schlüsselwort INFILE) Name der Tabelle in die die Daten geladen werden sollen, sowie die Methode wie Daten zu laden sind. INSERT Zieltabelle muß leer sein, bevor mit der Befüllung begonnen werden kann. REPLACE Bevor geladen werden kann wird die Tabelle geleert. Aus den verknüpften Childtabellen werden durch DELETE CASCADE zugehörige DS entfernt. APPEND Die zu ladenden Daten werden an die Tabelle angehängt. (Alter Datenbestand bleibt erhalten) TRUNCATE entspricht dem REPLACE mit dem Unterschied, dass die Childtabelle unverändert bleibt. Hierbei wird unterschieden, ob Daten in eine leere Tabelle geschrieben werden oder an die Inhalte einer bereits gefüllten Tabelle angehängt werden. (Schlüsselwort INTO TABLE) (05.05.2006) 10 *SQL-Loader Kontrolldatei (Beispiel 1 alphanumerisch) Hier sind aus einer Textdatei mit Datensätzen, bestehend aus Datenfeldern fester Länge, Daten in eine Tabelle mit dem Namen dept zu überführen. Die Felder dieser Zieltabelle sind wie folgt definiert: Name NULL? Type DEPTNO DNAME LOC NOT NULL NUMBER(2) VARCHAR2(14) VARCHAR2(13) LOAD DATA INFILE `data.dat` INSERT INTO TABLE dept ( deptno dname loc ) position(1:4) integer external, position(5:17) char, position(18:25 char (05.05.2006) 11 *SQL-Loader Kontrolldatei (Beispiel 2 alphanumerisch) Hier sind aus einer Textdatei mit Datensätzen, bestehend aus Datenfeldern variabler Länge, Daten in eine Tabelle mit dem Namen dept zu überführen. Die Felder dieser Zieltabelle entsprechen dem Beispiel 1: Name NULL? Type DEPTNO DNAME HIREDATE LOC NOT NULL NUMBER(2) VARCHAR2(14) DATE(10) VARCHAR2(13) LOAD DATA INFILE `data.dat` INSERT INTO TABLE dept Fields terminated by `;` optionally enclosed by `“` ( deptno integer external, dname char(14), hiredate date(10) “DD.MM.YYYY“, loc char(13) ) Heiweis: Bei einen Datum ist es der sicherste Weg die Formatierung des Datums zu beschreiben. Nach dem Beispiel wird ein Datum in dem Format 2stellig Tag, 2stellig Monat und 4stellig Jahr erwartet. Diese Komponenten sind durch einen Punkt von einander getrennt. (05.05.2006) 12 *SQL-Loader Kontrolldatei (Beispiel 3 alphanumerisch + binär) Hier sind aus einer Textdatei mit Datensätzen, bestehend aus Datenfeldern variabler Länge, zzgl. der Dateinamen, hinter denen sich die binären Bildinformationen verbergen, Daten in eine Tabelle mit dem Namen autodaten zu überführen. Anders als bei den anderen Beispielen sollen hier Bilder, die binär codiert sind, in die Zieltabelle gespeichert werden. Name ID Hersteller Typ Baujahr Bild Null ? NOT NULL Type NUMBER(3) VARCHAR2(20) VARCHAR2(20) VARCHAR2(4) BLOB <autodaten.txt> 2;Ferrari;F40;1998;ferrari.jpg 3;Lotus;Elise;2000;lotus.jpg 4;Maybach;57;2003;maybach.jpg (05.05.2006) 13 *SQL-Loader Kontrolldatei (Beispiel 3 Forts.) Für die zuvor beschriebene Anforderung wird das folgende Kontoll-File erforderlich LOAD DATA INFILE `autodaten.txt` INSERT INTO TABLE autodaten Fields terminated by `;` optionally enclosed by `“` (ID integer external, HerstellerCHAR(20), Typ CHAR(20), Baujahr CHAR(4), Dummy FILLER CHAR(40), Bild LOBFILE (Dummy) TERMINATED BY EOF ) Länge des Dateinamens Inklusive Dateipfad Beide Deklarationen sind für den Zugriff auf Bilddateien notwendig! Ein Filler (hier „Dummy“ genannt) wird nur als Beschreibungsunterstützung des Ablageortes der Bildinformationen benötigt. Er stellt den Bezug zu der Datei her, die das Bild gespeichert vorhält. Der Fillerinhalt (i.R. der Dateiname) wird dann beim Zugriff des Loaders auf die Datei verwendet. Der Zugriff auf Binärdateien ist nur über diesen Weg möglich. (05.05.2006) 14 *SQL-Loader Kontrolldatei Hinweise Nach Abschluß der Kontrolldatei-Datei erfolgt immer ein carriage return/ line feed kurz: CR/LF (Entertastendruck)! Jeder Datensatz innerhalb der Ladedatei wird ebenfalls mit CR/LF abgeschlossen. Dieses gilt auch für den letzten Eintrag! Der Ladedatei (festgelegt durch INFILE) wird immer in dem Verzeichnis gesucht, in dem das Programm sqlldr gestartet wurde! Sind in einer Ladedatei Sätze vorhanden, deren letztes Feld bzw. deren letzte Felder NULL sind, so ist in dem Kontroll-File die Option TRAILING NULLCOLS einzustellen! LOAD DATA INFILE `data.dat` INSERT INTO TABLE dept Fields terminated by `;` TRAILING NULLCOLS trailing NULLCOLS optionally enclosed by `“` ( deptno integer external, … (05.05.2006) 15