3. Modul DBOUT - ODBC-Datenbank schreiben

3.1. Allgemeines

Mit dem Skriptmodul können Objekte in eine ODBC-Datenbank (z.B. MS-Access, Oracle) geschrieben werden.

Der Modul wird mit:

|INCL \script\dbout.mod

in einer ICS RUN1-Konfiguration verfügbar gemacht.

3.2. Abhängigkeiten von anderen Modulen

Keine Abhängigkeiten vorhanden.

3.3. Parametermap DB_PARAM

Folgende Parameter können in der Map DB_PARAM für den Modul gesetzt werden:

Parameterreq/optBeschreibung
SOURCEoODBC-Source der Datenbank. Muss gesetzt werden, falls die ODBC-Source nicht interaktiv abgefragt wird.
USERoDatenbank User für die Verbindung mit der ODBC-Source. Muss gesetzt werden, falls die ODBC-Source nicht interaktiv abgefragt wird.
PASSWORDoDatenbank Password für die Verbindung mit der ODBC-Source. Muss gesetzt werden, falls die ODBC-Source nicht interaktiv abgefragt wird.
TRACEoON oder OFF, Default = OFF. Für jedes gelesene Objekt eine Zeile ausgeben.

3.4. Parametermap DBOUT_PARAM

Folgende Parameter können in der Map DBOUT_PARAM für den Modul gesetzt werden:

Parameterreq/optBeschreibung
CREATE_TABLEoON, OFF,Default = OFF. Definiert ob die Tables definiert mit Record-Definitionen (siehe weiter unten) in der Datenbank erzeugt werden sollen. Mit OFF werden die Tabellen nicht erzeugt. Mit ON werden die Tabellen erzeugt und zwar zum Zeitpunkt, wenn das erste Objekt in die Tabelle geschrieben wird. Tables in die keine Objekte geschrieben werden, werden auch nicht erzeugt.
DELETE_OLDoON, OFF oder DROP, Default = OFF. Löscht bestehende Daten in Tables definiert mit Record-Definitionen (siehe weiter unten). Mit OFF werden keine Daten gelöscht. Mit ON werden die Daten über ein delete-sql-statement gelöscht. Mit DROP wird die Table und damit die Daten gelöscht. Zusammen mit DROP und dem Parameter CREATE_TABLE => ON werden die Tables gelöscht und wieder erzeugt.
BATCHoON oder OFF, Default = OFF. Mit OFF werden die sql-statements direkt auf der Datenbank ausgeführt. Mit OFF werden die sql-statements in ein Batchfile geschrieben. Mit dem Parameter BATCH_FILE wird das Batchfile definiert.
BATCH_OUTPUT_DIRo<directory>. Definiert ein Output-Directory für Batchfiles. Mit diesem Parameter kann das Output-Directory für Batchfiles definiert werden, falls der Parameter BATCH = ON definiert ist. Batchfiles können sein ein File mit SQL-Statementes oder in Kombination mit dem Oracle Output Modul die SQLLOADER-Bulkfiles. Ist dieser Parameter nicht gesetzt, so wird das Output-Directory aus einem eventuellen Input-File definiert in OPT.input bestimmt. Ist kein Input-File definiert, so ist das Output-Directory iltools\data\ics.sql.
BATCH_FILEo<file>. Definiert das Batchfile. Mit diesem Parameter kann das Batchfile definiert werden, falls der Parameter BATCH = ON definiert ist. Ist dieser Parameter nicht gesetzt, so wird das Batchfile aus einem eventuellen Input-File definiert in OPT.input mit der Endung .sql bestimmt. Ist kein Input-File definiert, so ist das Batchfile iltools\data\ics.sql als definiert. Das Batchfile beinhaltet SQL-Statements, um die transferierten Daten mittels SQL in eine Datenbank zu importieren.
SQLTRACEoON oder OFF, Default = OFF. Zeigt als sql-statements im Logfile an.
STATISTICSoON oder OFF, Default = OFF. Statistik anzeigen.
DATASEToON oder OFF, Default = OFF. Definiert, ob die in die Datenbank geschriebenen Daten als Datasets verwaltetet werden. Sie dazu mehr unter dem Kapitel Datasets. Der Wert ON hebt den Parameter DELETE_OLD auf.

3.5. Objektmodell

Der Modul verlangt pro OUT-Objekt folgende Systemkomponenten:

Komponentereq/optBeschreibung
OUT.TABLE(s)rTablename des OUT Objekts.
OUT.<Attribut>(s)oAttributname der Tabelle. Der Wert der Komponente beinhaltet den Wert für die Datenbank. Der Typ des Werts muss mit dem Typ des Attributs in der Datenbank übereinstimmen. Es können beliebig viele Attribute definiert werden.

Dieses Objektmodell gilt für die Anwendung mit der Prozedur DBOUT_WRITE_OBJECT0. Die Tabellen mit den Attributen müssen in der Datenbank bereits bestehen oder in einer Konfiguration mit Prozeduren und Methoden vorgängig erzeugt werden. Falls die Datenbankstrukturen automatisiert mit dem Modul erstellt werden sollen, so beachten Sie das Kapitel mit den Record-Definitionen und die Prozedur DBOUT_WRITE_RECORD1.

3.6. Record Definitionen

Mit Record Definitionen können nicht nur Objekte in die Datenbank geschrieben werden, sondern auch Datenbank-Tabellen automatisiert in der Datenbank angelegt werden. Die Record Definitionen werden von der Prozedur DBOUT_WRITE_RECORD1 verarbeitet. Eine Record Definition sieht wie folgt aus.

MAP RECORD_<n>
   TABLE => <Table-Name>
   :
   <Attribute-Name> => <Attribute-Type>,<Attribute-Value>
   :
END_MAP

Die einzelnen Bestandteile einer Record-Definition sind:

RECORD_<n>

Eine Record Definition ist eine Map. Der Map-Name muss mit dem Prefix RECORD_ beginnen und eine eindeutige Nummer <n> für die Record Definition beinhalten.

TABLE

Diese Komponente ist required und definiert die Datenbank-Tabelle.

<Table-Name>

Definiert als Wert der Komponente TABLE die Datenbank-Tabelle.

<Attribute-Name>

Definiert als Komponente einen Attribut-Namen der Tabelle. Es können beliebig viele Attribute als Komponenten definiert werden.

<Attribute-Type>

Definiert den Attribut-Type in der Datenbank. Im Normalfall können der Datenbank bekannt Typen verwendet werden. Spezialtypen einer Datenbank werden eventuell nocht nicht unterstützt. Solche Spezialtypen werden bei Bedarf und auf Anfrage implementiert. Bei den Typen ist auf folgendes zu achten.

Alle Datenbanken

CHAR(<length>)

Stringtypen sind immer als CHAR mit der Länge <length> zu definieren. Je nach Datenbank wird der Typ vom Modul in einen der Datenbank bekannten Type umgewandelt z.B. Oracle als VARCHAR2.

NUMBER

Number-Typen ohne Argumente werden vom Modul als NUMBER(38,5) interpretiert.

DB_GEOMETRY(<type>;<dimension)

Geometrien müssen als Type DB_GEOMETRY definiert werden. Dabei sind folgende weiteren Definitionen notwendig.

<type>

Type der Geometrie, einer der Werte: point|line|area.

<dimension>

Dimension der Geometrie, einer der Werte: 2D|3D.

Der Type point wird in 2 Attribute (2D) oder 3 Attribute (3D) mit den Suffixen _X,_Y,_Z zum Attributnamen abgelegt.

Record-Definition:

MAP RECORD_1
   TABLE => Bodenbedeckung_BoFlaeche_Area
   Geometrie => DB_GEOMETRY(point;2D),IN.Geometrie
END_MAP

Generiert Table:

CREATE TABLE Bodenbedeckung_BoFlaeche_Area (
   Geometrie_X DOUBLE,  -- X-Koordinate
   Geometrie_Y DOUBLE,  -- Y-Koordinate
);

Die Type line wird in einer Zusatztabelle abgelegt. Der Name der Zusatztabelle ergibt sich aus der Haupttabelle und der Suffix des Geometrieattributes.

Record-Definition:

MAP RECORD_1
   TABLE => Bodenbedeckung_BoFlaeche_Geometrie
   GEOM => DB_GEOMETRY(line;2D),IN.GEOM
END_MAP

Generiert Table:

CREATE TABLE Bodenbedeckung_BoFlaeche_Geometrie (
   GEOM INTEGER
);

CREATE TABLE Bodenbedeckung_BoFlaeche_Geometrie_GEOM (
   ID       INTEGER,   -- Fremdschlüssel zu Haupttabelle.GEOM
   POINT_I  INTEGER,   -- Punktindex für Punktreihenfolge
   ARCPOINT INTEGER,   -- Ist Punkt ein Ponkt auf einem Kreisbogen (1) oder nicht (0)
   X        DOUBLE,    -- X-Koordinate
   Y        DOUBLE,    -- Y-Koordinate
);

Der Type area wird in einer Zusatztabelle abgelegt. Der Name der Zusatztabelle ergibt sich aus der Haupttabelle und der Suffix des Geometrieattributes.

Record-Definition:

MAP RECORD_1
   TABLE => Bodenbedeckung_BoFlaeche_Area
   GEOM => DB_GEOMETRY(area;2D),IN.GEOM
END_MAP

Generiert Table:

CREATE TABLE Bodenbedeckung_BoFlaeche_Area (
   GEOM INTEGER
);

CREATE TABLE Bodenbedeckung_BoFlaeche_Area_GEOM (
   ID       INTEGER,   -- Fremdschlüssel zu Haupttabelle.GEOM
   RAND_I   INTEGER,   -- Randindex für Randreihenfolge, 1. Rand = Aussenrand, weitere =Innenränder
   POINT_I  INTEGER,   -- Punktindex für Punktreihenfolge innerhalb eines Randes
   ARCPOINT INTEGER,   -- Ist Punkt ein Ponkt auf einem Kreisbogen (1) oder nicht (0)
   X        DOUBLE,    -- X-Koordinate
   Y        DOUBLE,    -- Y-Koordinate
);

MSACCESS

MEMO

Stringtyp für Texte > 255 Zeichen.

DATETIME

Datums/Zeit Typ. Der <Attribute-Value> muss der SQL-Spezifikation von MSACCESS entsprechen. Zum Beispiel für ein Datum <Attribute-Value> = '03.04.1993' , für Datum/Zeit <Attribute-Value>='03.04.1993 17:34:00'.

ORACLE

DATE("YYYY-MM-DD")

Datums Typ. Mit dem Datums Typ muss auch das Format des Datums definiert werden. Der Modul erzeugt aufgrund des Formats eine entsprechende SQL-Anweisung TO_DATE('1993-04-03','YYYY-MM-DD')). Der Wert für das Attribut, muss als Integer oder String die Form YYYYMMDD aufweisen. Zum Beispiel <Attribute-Value>=19939493 oder <Attribute-Value>='19939493' .

<Attribut-Value>

Definiert den Wert für das Attribut. Als Wert können absolute Werte oder ICS-Variablen, die einen Wert beinhalten - z.B. IN.OBJID - verwendet werden.

Beispiel einer Record Definition.

MAP RECORD_1
   TABLE => Bodenbedeckung_BoFlaeche_Area
   OBJID => CHAR(10),IN.OBJID
   Entstehung => CHAR(10),IN.Entstehung.OBJID
   Geometrie => DB_GEOMETRY(point;2D),IN.Geometrie
   Qualitaet => CHAR(30),IN.Qualitaet
   Art => INTEGER,IN.Art
   Art_TXT => CHAR(47),IN.Art_TXT
   Herkunft => CHAR(30),IN.Herkunft
   GEOM => DB_GEOMETRY(area;2D),IN.GEOM
END_MAP

3.7. Datasets

Mit dem Parameter DBOUT_PARAM.DATASET => ON kann der Modul veranlasst werden, die Daten in Datasets zu verwalten. In der Regel werden verschiedene Datasets in einen Datenbank geschrieben. Die einzelnen Datasets können danach als Subset des Daten nachgeführt oder gelöscht werden. Typischerweise bildet ein INTERLIS-File ein solches Dataset. Falls der Dataset-Parameter eingeschaltet ist, wird in der Datenbank folgendes angelegt:

CREATE TABLE GS_FILE (
   FileID       INTEGER    -- Schlüssel für Dataset
   ModelName    CHAR(255)  -- Modellname (INTERLIS)
   FileName     CHAR(255)  -- Filenamen
   DateFile     INTEGER    -- YYYYMMDD Datum des Files
   DateUpload   INTEGER    -- YYYYMMDD Datum des lesen in die Datenbank 
   UserUpload   CHAR(255)  -- eventuell ein Username
);

CREATE TABLE <Data-Table> (
   GS_FileID    INTEGER    -- Fremdschlüssel für Dataset
   : 
);

Die Tabelle GS_FILE verwaltet die Datasets. Jedes Dataset erhält eine eindeutigen Schlüssel im Attribut FileID . Jede angelegte Tabelle für die Daten erhält ein Attribut GS_FileID, das den Fremdschlüssel des Datasets beinhalten.

Wird ein Dataset (File) das erste Mal in die Datenbank geschrieben (INSERT) , wird der Eintrag in GS_FILE generiert, und jeder Daten-Record erhält den Fremdschlüssel des Datasets.

Wird ein Dataset (File) ein nächstes Mal in die Datenbank geschrieben (UPDATE) , wird der Eintrag in GS_FILE mit den Daten nachgeführt, die bestehenden Daten des Datasets in der Datenbank gelöscht und die neuen Daten in die Datenbank geschrieben.

Soll ein Dataset (File) aus der Datenbank gelöscht werden (DELETE), so steht folgende Konfiguration zur Verfügung:

ILTOOLS_DIR\system\script\il2db\dbdatasetdelete.cfg

Diese Konfiguration löscht die Daten eines Datasets und den Eintrag des Datasets in GS_FILE .

3.8. Datenbank Modellgenerierung mit CONFIG_PARAM.GENERATE_MODEL

Falls basierend auf den Record-Definitionen vor einem Datentransfer das gesamte Datenbankmodell erstellt werden soll, so ist der Parameter CONFIG_PARAM.GENERATE_MODEL auf ON zu setzten und das Script il2db.lib zu includen:

MAP CONFIG_PARAM
   GENERATE_MODEL => ON
END_MAP
:
|INCL \script\il2db\il2db.lib

Entsprechend den Record-Definitionen wird vor einem Datentransfer das Datenbankmodell angelegt, falls es nicht schon angelegt wurde.

3.9. Exportierte Prozeduren und Methoden

ProzedurDBOUT_OPEN [][]
BeschreibungÖffnet eine Datenbank definiert mit DB_PARAM.SOURCE. Die Prozedur wird von RUN1 automatisch aufgerufen.
Beispiel
DBOUT_OPEN
ProzedurDBOUT_WRITE_OBJECT0
Beschreibung

Schreibt ein Objekt in die Datenbank. Das OUT-Objekt muss gemäss dem Objektmodell gefüllt sein.

Beispiel
DBOUT_WRITE_OBJECT0
ProzedurDBOUT_WRITE_RECORD1 ! s recordname
Beschreibung

Schreibt ein Objekt definiert in <recordname> in die Datenbank. <recordname> ist der Name einer Record-Definition (siehe weiter oben). Je nach den gesetzten Parametern führt die Prozedur beim ersten Aufruf für eine Record-Definition folgende Aktionen auf der Datenbank aus:

  1. Die Tabelle oder deren Inhalt wird gelöscht, falls definiert durch Parameter.

  2. Die Tabelle wird erzeugt, falls definiert durch Parameter.

  3. Das Objekt wird in die Datenbank geschrieben.

Beispiel
... => DBOUT_WRITE_RECORD1,RECORD_1
ProzedurDBOUT_CLOSE [][]
BeschreibungSchliesst den Modul und gibt die durch den Modul belegten Resourcen wieder frei. Die Prozedur wird von RUN1 automatisch aufgerufen.
Beispiel
DBOUT_CLOSE

Neben diesen Prozeduren des Modules stehen auch die Methoden der Klasse DB zur Verfügung (s.a. iG/Script Benutzer- und Referenzhandbuch).

3.10. Skriptbeispiel

! Diese ICS Konfiguration liest ein INTERLIS FIle,
! erzeugt eine Tabelle für LFP's in der Datenbank
! und schreibt die LFP's in die Tabelle.

|LICENSE \license\iltools.lic

MAP USER_INPUT1
   DIALOG        => FILE
   MESSAGE       => 'Enter INTERLIS Input File'
   FILE_FILTER   => itf
   FILE_EXISTS   => TRUE
   OPT           => input
END_MAP

MAP USER_INPUT2
   DIALOG        => ODBC
   OPT           => output
END_MAP

MAP ILIN_PARAM
   INTERLIS_DEF => \models\Grunddatensatz.ili
   STATISTICS   => ON
   CALC_SURFACE => ON
   ENUM_TO_TEXT => ON
   TRACE        => OFF
END_MAP

MAP ILIN_TOPO
   DEFAULT => OFF
END_MAP

MAP DB_PARAM
   SOURCE     => '' ! ODBC-Source
   USER       => '' ! ODBC-User
   PASSWD     => '' ! ODBC-Password
   TRACE      => OFF
END_MAP

MAP DBOUT_PARAM
   STATISTICS      => ON
   CREATE_TABLE    => ON
   DATASET         => ON
END_MAP

MAP RECORD_1
   TABLE => Fixpunkte_LFP
   OBJID => CHAR(10),IN.OBJID
   ENTSTEHUNG => CHAR(10),IN.Entstehung.OBJID
   NUMMER => CHAR(12),IN.Nummer
   GEOMETRIE => DB_GEOMETRY(point;3D),IN.Geometrie
   LAGEZUV_TXT => CHAR(4),IN.LageZuv_TXT
   HOEHEZUV_TXT => CHAR(4),IN.HoeheZuv_TXT
   BEGEHBARKEIT_TXT => CHAR(14),IN.Begehbarkeit_TXT
   SYMBOLORI => NUMBER,IN.SymbolOri
   ART_TXT => CHAR(4),IN.Art_TXT
   HERKUNFT => CHAR(30),IN.Herkunft
END_MAP

MAP INPUT_SOURCES
   I1 => ILTOPO,OPT.input
END_MAP

MAP INOUT
   I1                => IN.TOPIC,IN.TABLE
   I1,Fixpunkte,LFP  => DBOUT_WRITE_RECORD1,RECORD_1
   I1,*              => OFF
END_MAP

|INCL \script\iltopo.mod
|INCL \script\dbout.mod
|INCL \script\run1.prg