<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://superxhosting.de/wiki/index.php?action=history&amp;feed=atom&amp;title=Kernmodul_Sonderladeroutinen</id>
	<title>Kernmodul Sonderladeroutinen - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://superxhosting.de/wiki/index.php?action=history&amp;feed=atom&amp;title=Kernmodul_Sonderladeroutinen"/>
	<link rel="alternate" type="text/html" href="https://superxhosting.de/wiki/index.php?title=Kernmodul_Sonderladeroutinen&amp;action=history"/>
	<updated>2026-09-17T16:55:06Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in SuperX</subtitle>
	<generator>MediaWiki 1.39.11</generator>
	<entry>
		<id>https://superxhosting.de/wiki/index.php?title=Kernmodul_Sonderladeroutinen&amp;diff=16619&amp;oldid=prev</id>
		<title>Andrek: Die Seite wurde neu angelegt: „=Sonderladeroutinen in SuperX=  Sonderladeroutinen ermöglichen es, zusätzliche Lade- und Verarbeitungsschritte in SuperX abzubilden, ohne dafür eine reguläre Modulladeroutine verändern zu müssen.  Eine Sonderladeroutine besteht aus einem ETL-Job mit mehreren ETL-Schritten. Die einzelnen Schritte können beispielsweise Daten aus einer Datenbank entladen, UNL-Dateien in Tabellen laden, SQL-Befehle ausführen oder vorhandene SQL-Skripte starten.  Damit…“</title>
		<link rel="alternate" type="text/html" href="https://superxhosting.de/wiki/index.php?title=Kernmodul_Sonderladeroutinen&amp;diff=16619&amp;oldid=prev"/>
		<updated>2026-09-16T09:28:02Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „=Sonderladeroutinen in SuperX=  Sonderladeroutinen ermöglichen es, zusätzliche Lade- und Verarbeitungsschritte in SuperX abzubilden, ohne dafür eine reguläre Modulladeroutine verändern zu müssen.  Eine Sonderladeroutine besteht aus einem ETL-Job mit mehreren ETL-Schritten. Die einzelnen Schritte können beispielsweise Daten aus einer Datenbank entladen, UNL-Dateien in Tabellen laden, SQL-Befehle ausführen oder vorhandene SQL-Skripte starten.  Damit…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Sonderladeroutinen in SuperX=&lt;br /&gt;
&lt;br /&gt;
Sonderladeroutinen ermöglichen es, zusätzliche Lade- und Verarbeitungsschritte in SuperX abzubilden, ohne dafür eine reguläre Modulladeroutine verändern zu müssen.&lt;br /&gt;
&lt;br /&gt;
Eine Sonderladeroutine besteht aus einem ETL-Job mit mehreren ETL-Schritten. Die einzelnen Schritte können beispielsweise Daten aus einer Datenbank entladen, UNL-Dateien in Tabellen laden, SQL-Befehle ausführen oder vorhandene SQL-Skripte starten.&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich sowohl kleine Datenübernahmen als auch umfangreichere und komplexere Ladeprozesse individuell zusammenstellen.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Definitionsdatei==&lt;br /&gt;
&lt;br /&gt;
Am Anfang der Definitionsdatei befinden sich die FreeMarker-Definitionen der Sonderladeroutine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
etl_jobs&lt;br /&gt;
etl_job_params&lt;br /&gt;
etl_steps&lt;br /&gt;
etl_step_properties&lt;br /&gt;
testfaelle&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser obere Bereich wird bei der Erstellung oder Anpassung einer Sonderladeroutine bearbeitet.&lt;br /&gt;
&lt;br /&gt;
Darunter beginnt das erste Makro, beispielsweise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;#macro etl_steps_def_check&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ab diesem ersten Makro sollte die Datei nicht mehr verändert werden.&lt;br /&gt;
&lt;br /&gt;
Für eine neue Sonderladeroutine wird daher am besten eine vorhandene Vorlage kopiert und ausschließlich der Definitionsbereich am Anfang der Datei angepasst.&lt;br /&gt;
&lt;br /&gt;
Am Ende der Datei wird die Verarbeitung mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;@ETL_STEPS_FUELLEN/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gestartet.&lt;br /&gt;
&lt;br /&gt;
==ETL-Job==&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;etl_jobs&amp;lt;/code&amp;gt; wird der eigentliche Ladejob definiert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;#assign etl_jobs = [&lt;br /&gt;
{&amp;quot;uniquename&amp;quot;:&amp;quot;kern_special_demo_special&amp;quot;,&lt;br /&gt;
 &amp;quot;name&amp;quot;:&amp;quot;Demo Sonderladeroutine&amp;quot;,&lt;br /&gt;
 &amp;quot;systeminfo_id&amp;quot;:9,&lt;br /&gt;
 &amp;quot;logfile&amp;quot;:&amp;quot;&amp;quot;}&lt;br /&gt;
] /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Angaben sind:&lt;br /&gt;
&lt;br /&gt;
===uniquename===&lt;br /&gt;
&lt;br /&gt;
Technisch eindeutiger Name des Jobs.&lt;br /&gt;
&lt;br /&gt;
Bei einer Sonderladeroutine muss der &amp;lt;code&amp;gt;uniquename&amp;lt;/code&amp;gt; auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
_special&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enden.&lt;br /&gt;
&lt;br /&gt;
Nur dann wird der Job in SuperX als Sonderladeroutine erkannt und entsprechend angezeigt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
kern_special_demo_special&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Namen der einzelnen ETL-Schritte müssen dagegen nicht auf &amp;lt;code&amp;gt;_special&amp;lt;/code&amp;gt; enden.&lt;br /&gt;
&lt;br /&gt;
===name===&lt;br /&gt;
&lt;br /&gt;
Bezeichnung des Jobs, die in der Oberfläche angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
===systeminfo_id===&lt;br /&gt;
&lt;br /&gt;
Komponente beziehungsweise SuperX-Modul, zu dem die Sonderladeroutine gehört.&lt;br /&gt;
&lt;br /&gt;
Für das Kernmodul ist dies beispielsweise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===logfile===&lt;br /&gt;
&lt;br /&gt;
Optionales Feld für eine Logdatei. Für normale Sonderladeroutinen kann dieser Wert leer bleiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;logfile&amp;quot;:&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die bei der Ausführung erzeugten Jobprotokolle befinden sich normalerweise unter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
webapps/superx/WEB-INF/logs/jobs/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für einen Job wird dort eine Logdatei nach dem Schema&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
JOBNAME.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
erzeugt.&lt;br /&gt;
&lt;br /&gt;
Für die Demo-Sonderladeroutine wäre dies beispielsweise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
webapps/superx/WEB-INF/logs/jobs/kern_special_demo_special.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Jobprotokoll ist insbesondere bei Fehlern hilfreich, da dort die Ausführung der einzelnen ETL-Schritte und mögliche Fehlermeldungen protokolliert werden.&lt;br /&gt;
&lt;br /&gt;
==Datenbankverbindungen==&lt;br /&gt;
&lt;br /&gt;
Bei einer Sonderladeroutine können unterschiedliche Datenbankverbindungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Je nach Step-Typ heißen die entsprechenden Properties beispielsweise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
datasource&lt;br /&gt;
dataSource&lt;br /&gt;
database&lt;br /&gt;
sqlVarSource&lt;br /&gt;
sqlVarDataSource&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist dabei, dass hier nicht zwingend der physische Name der Datenbank angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Verwendet wird der in SuperX konfigurierte Name der Datenbankverbindung.&lt;br /&gt;
&lt;br /&gt;
Die Datenbankverbindungen werden in&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
webapps/superx/WEB-INF/conf/his1_databases.properties&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
konfiguriert.&lt;br /&gt;
&lt;br /&gt;
Dort kann beispielsweise eine Verbindung unter dem Namen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
eduetl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
definiert sein.&lt;br /&gt;
&lt;br /&gt;
Dieser Name wird dann auch in der Sonderladeroutine verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;prop_name&amp;quot;:&amp;quot;dataSource&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;eduetl&amp;quot;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder bei einem LOAD-Schritt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;prop_name&amp;quot;:&amp;quot;database&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;eduetl&amp;quot;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der physische Datenbankname kann davon abweichen.&lt;br /&gt;
&lt;br /&gt;
Für die Sonderladeroutine ist daher der in &amp;lt;code&amp;gt;his1_databases.properties&amp;lt;/code&amp;gt; vergebene Name der Datenbankverbindung maßgeblich.&lt;br /&gt;
&lt;br /&gt;
Die genaue Konfiguration der Datei &amp;lt;code&amp;gt;his1_databases.properties&amp;lt;/code&amp;gt; wird separat beschrieben.&lt;br /&gt;
&lt;br /&gt;
==ETL-Jobparameter==&lt;br /&gt;
&lt;br /&gt;
Über &amp;lt;code&amp;gt;etl_job_params&amp;lt;/code&amp;gt; können Parameter für einen Ladejob definiert werden.&lt;br /&gt;
&lt;br /&gt;
Wenn keine Parameter benötigt werden, bleibt die Definition leer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;#assign etl_job_params = [&lt;br /&gt;
] /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Parameter besitzt drei wesentliche Angaben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
param_name&lt;br /&gt;
name&lt;br /&gt;
param_default&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;#assign etl_job_params = [&lt;br /&gt;
{&amp;quot;etl_job&amp;quot;:&amp;quot;kern_special_demo_special&amp;quot;,&lt;br /&gt;
 &amp;quot;param_name&amp;quot;:&amp;quot;semester&amp;quot;,&lt;br /&gt;
 &amp;quot;name&amp;quot;:&amp;quot;Semester&amp;quot;,&lt;br /&gt;
 &amp;quot;param_default&amp;quot;:&amp;quot;20262&amp;quot;}&lt;br /&gt;
] /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei bedeutet:&lt;br /&gt;
&lt;br /&gt;
;etl_job&lt;br /&gt;
:Der Job, zu dem der Parameter gehört.&lt;br /&gt;
&lt;br /&gt;
;param_name&lt;br /&gt;
:Technischer Name des Parameters, im Beispiel &amp;lt;code&amp;gt;semester&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;name&lt;br /&gt;
:Bezeichnung des Parameters, im Beispiel &amp;lt;code&amp;gt;Semester&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;param_default&lt;br /&gt;
:Defaultwert, der verwendet beziehungsweise bei der Ausführung vorbelegt werden kann, im Beispiel &amp;lt;code&amp;gt;20262&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Weitere denkbare Parameter wären beispielsweise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
startdatum&lt;br /&gt;
dateiname&lt;br /&gt;
nur_pruefen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit Defaultwerten wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2026-01-01&lt;br /&gt;
daten.unl&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit können Werte, die sich zwischen einzelnen Jobausführungen ändern sollen, als Jobparameter definiert werden, anstatt sie fest in der Laderoutine zu hinterlegen.&lt;br /&gt;
&lt;br /&gt;
Welche Parameter tatsächlich sinnvoll sind und wie sie innerhalb eines konkreten ETL-Schrittes verwendet werden, hängt vom jeweiligen Step-Typ und dessen Handler ab.&lt;br /&gt;
&lt;br /&gt;
Für einfache Sonderladeroutinen werden Jobparameter normalerweise nicht benötigt.&lt;br /&gt;
&lt;br /&gt;
==ETL-Schritte==&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Verarbeitungsschritte werden in &amp;lt;code&amp;gt;etl_steps&amp;lt;/code&amp;gt; definiert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;#assign etl_steps = [&lt;br /&gt;
{&amp;quot;etl_job&amp;quot;:&amp;quot;kern_special_demo_special&amp;quot;,&lt;br /&gt;
 &amp;quot;uniquename&amp;quot;:&amp;quot;kern_special_demo_unload&amp;quot;,&lt;br /&gt;
 &amp;quot;name&amp;quot;:&amp;quot;Demo-Daten entladen&amp;quot;,&lt;br /&gt;
 &amp;quot;type&amp;quot;:&amp;quot;UNLOAD&amp;quot;,&lt;br /&gt;
 &amp;quot;parent&amp;quot;:&amp;quot;&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;etl_job&amp;quot;:&amp;quot;kern_special_demo_special&amp;quot;,&lt;br /&gt;
 &amp;quot;uniquename&amp;quot;:&amp;quot;kern_special_demo_create&amp;quot;,&lt;br /&gt;
 &amp;quot;name&amp;quot;:&amp;quot;Demo-Zieltabelle anlegen&amp;quot;,&lt;br /&gt;
 &amp;quot;type&amp;quot;:&amp;quot;DOQUERY&amp;quot;,&lt;br /&gt;
 &amp;quot;parent&amp;quot;:&amp;quot;&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;etl_job&amp;quot;:&amp;quot;kern_special_demo_special&amp;quot;,&lt;br /&gt;
 &amp;quot;uniquename&amp;quot;:&amp;quot;kern_special_demo_load&amp;quot;,&lt;br /&gt;
 &amp;quot;name&amp;quot;:&amp;quot;Demo-Daten laden&amp;quot;,&lt;br /&gt;
 &amp;quot;type&amp;quot;:&amp;quot;LOAD&amp;quot;,&lt;br /&gt;
 &amp;quot;parent&amp;quot;:&amp;quot;&amp;quot;}&lt;br /&gt;
] /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Angaben sind:&lt;br /&gt;
&lt;br /&gt;
;etl_job&lt;br /&gt;
:Technischer Name des Jobs, zu dem der Step gehört.&lt;br /&gt;
&lt;br /&gt;
;uniquename&lt;br /&gt;
:Technisch eindeutiger Name des ETL-Schrittes.&lt;br /&gt;
&lt;br /&gt;
;name&lt;br /&gt;
:Bezeichnung des Schrittes.&lt;br /&gt;
&lt;br /&gt;
;type&lt;br /&gt;
:Art des auszuführenden ETL-Schrittes.&lt;br /&gt;
&lt;br /&gt;
;parent&lt;br /&gt;
:Optionaler übergeordneter Step. Bei einem einfachen linearen Ablauf bleibt dieser Wert leer.&lt;br /&gt;
&lt;br /&gt;
Die Reihenfolge der Einträge in &amp;lt;code&amp;gt;etl_steps&amp;lt;/code&amp;gt; bestimmt die Ausführungsreihenfolge.&lt;br /&gt;
&lt;br /&gt;
==Verfügbare Step-Typen==&lt;br /&gt;
&lt;br /&gt;
Das Template unterstützt folgende Step-Typen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Typ&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;UNLOAD&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ergebnis einer SQL-Abfrage in eine Datei schreiben&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt;&lt;br /&gt;
|Datei in eine Datenbanktabelle laden&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;DOQUERY&amp;lt;/code&amp;gt;&lt;br /&gt;
|SQL-Befehl direkt ausführen&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;DOSQL&amp;lt;/code&amp;gt;&lt;br /&gt;
|SQL-Skriptdatei ausführen&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;MSG&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ausgabe beziehungsweise Nachricht innerhalb der Verarbeitung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Für typische Sonderladeroutinen werden insbesondere &amp;lt;code&amp;gt;UNLOAD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOQUERY&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DOSQL&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
==Step-Properties==&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaften der einzelnen ETL-Schritte werden über &amp;lt;code&amp;gt;etl_step_properties&amp;lt;/code&amp;gt; definiert.&lt;br /&gt;
&lt;br /&gt;
Der allgemeine Aufbau lautet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;NAME_DES_SCHRITTES&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;PROPERTY&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;WERT&amp;quot;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;etl_step&amp;lt;/code&amp;gt; verweist dabei auf den &amp;lt;code&amp;gt;uniquename&amp;lt;/code&amp;gt; eines zuvor definierten ETL-Schrittes.&lt;br /&gt;
&lt;br /&gt;
Je nach Step-Typ stehen unterschiedliche Properties zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
==UNLOAD==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;UNLOAD&amp;lt;/code&amp;gt;-Schritt führt eine SQL-Abfrage auf einer Datenbank aus und schreibt deren Ergebnis in eine Datei.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;kern_special_demo_unload&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;datasource&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;eduetl&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;kern_special_demo_unload&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;sqlVarSource&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;eduetl&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;kern_special_demo_unload&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;sql&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;select 1 as id, &amp;#039;&amp;#039;Demo&amp;#039;&amp;#039; as name&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;kern_special_demo_unload&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;unlFile&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;$KERN_LOAD_PFAD/unl/kern_special_demo.unl&amp;quot;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtige Properties:&lt;br /&gt;
&lt;br /&gt;
;datasource&lt;br /&gt;
:Datenbankverbindung, auf der die SQL-Abfrage ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
;sqlVarSource&lt;br /&gt;
:Datenbankverbindung für die Verarbeitung von SQL-Variablen. In der Regel wird hier dieselbe Datenbankverbindung wie bei &amp;lt;code&amp;gt;datasource&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
;sql&lt;br /&gt;
:SQL-Abfrage, deren Ergebnis entladen werden soll.&lt;br /&gt;
&lt;br /&gt;
;unlFile&lt;br /&gt;
:Datei, in die das Ergebnis geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
;sourceVersions&lt;br /&gt;
:Optionale Einschränkung nach Versionen des Vorsystems.&lt;br /&gt;
&lt;br /&gt;
==DOQUERY==&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;DOQUERY&amp;lt;/code&amp;gt; kann ein SQL-Befehl direkt ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;kern_special_demo_create&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;dataSource&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;eduetl&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;kern_special_demo_create&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;sqlVarDataSource&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;eduetl&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;kern_special_demo_create&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;sql&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;create table if not exists tmp_kern_special_demo (id integer, name varchar(20))&amp;quot;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtige Properties:&lt;br /&gt;
&lt;br /&gt;
;dataSource&lt;br /&gt;
:Datenbankverbindung, auf der der SQL-Befehl ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
;sqlVarDataSource&lt;br /&gt;
:Datenbankverbindung für die Verarbeitung von SQL-Variablen.&lt;br /&gt;
&lt;br /&gt;
;sql&lt;br /&gt;
:Auszuführender SQL-Befehl.&lt;br /&gt;
&lt;br /&gt;
;databaseSystem&lt;br /&gt;
:Verwendetes Datenbanksystem, standardmäßig &amp;lt;code&amp;gt;postgres&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;sourceVersions&lt;br /&gt;
:Optionale Einschränkung nach Quellversionen.&lt;br /&gt;
&lt;br /&gt;
Für kurze SQL-Anweisungen ist &amp;lt;code&amp;gt;DOQUERY&amp;lt;/code&amp;gt; meist die einfachste Möglichkeit.&lt;br /&gt;
&lt;br /&gt;
==LOAD==&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; wird eine Datei in eine Datenbanktabelle geladen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;kern_special_demo_load&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;database&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;eduetl&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;kern_special_demo_load&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;unlFilePath&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;$KERN_LOAD_PFAD/unl/kern_special_demo.unl&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;kern_special_demo_load&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;tableName&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;tmp_kern_special_demo&amp;quot;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtige Properties:&lt;br /&gt;
&lt;br /&gt;
;database&lt;br /&gt;
:Datenbankverbindung der Zieltabelle.&lt;br /&gt;
&lt;br /&gt;
;unlFilePath&lt;br /&gt;
:Pfad der einzulesenden Datei.&lt;br /&gt;
&lt;br /&gt;
;tableName&lt;br /&gt;
:Zieltabelle.&lt;br /&gt;
&lt;br /&gt;
;delimiter&lt;br /&gt;
:Feldtrenner. Standard ist &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;header&lt;br /&gt;
:Gibt an, ob die Datei eine Kopfzeile enthält. Standard ist &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;refresh&lt;br /&gt;
:Legt fest, ob die Tabelle vor dem Laden geleert wird. Standard ist &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;usePostgresCopyApi&lt;br /&gt;
:Verwendet bei PostgreSQL die COPY-basierte Ladefunktion. Standard ist &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Anzahl und Reihenfolge der Felder in der Datei müssen zur Zieltabelle passen.&lt;br /&gt;
&lt;br /&gt;
==DOSQL==&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;DOSQL&amp;lt;/code&amp;gt; wird eine vorhandene SQL-Skriptdatei ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Dies ist sinnvoll, wenn die Verarbeitung umfangreicher ist oder bereits ein SQL-Skript vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;mein_update&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;sqlScriptPath&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;$KERN_PFAD/schluesseltabellen/mein_update.sql&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;mein_update&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;dataSource&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;eduetl&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;mein_update&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;sqlVarDataSource&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;eduetl&amp;quot;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtige Properties sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
sqlScriptPath&lt;br /&gt;
dataSource&lt;br /&gt;
sqlVarDataSource&lt;br /&gt;
databaseSystem&lt;br /&gt;
limitDebugStmts&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kurze SQL-Befehle können direkt über &amp;lt;code&amp;gt;DOQUERY&amp;lt;/code&amp;gt; definiert werden. Umfangreichere SQL-Verarbeitungen können mit &amp;lt;code&amp;gt;DOSQL&amp;lt;/code&amp;gt; in eine eigene Datei ausgelagert werden.&lt;br /&gt;
&lt;br /&gt;
==Unterschiedliche Datenbank-Properties==&lt;br /&gt;
&lt;br /&gt;
Je nach Step-Typ wird für die Datenbankverbindung ein unterschiedlicher Property-Name verwendet.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Step-Typ&lt;br /&gt;
!Datenbank-Property&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;UNLOAD&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;datasource&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;DOQUERY&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;dataSource&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;DOSQL&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;dataSource&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;database&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Groß- und Kleinschreibung sollte exakt übernommen werden.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich gibt es für die SQL-Variablenverarbeitung &amp;lt;code&amp;gt;sqlVarSource&amp;lt;/code&amp;gt; beziehungsweise &amp;lt;code&amp;gt;sqlVarDataSource&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Automatische Standardwerte==&lt;br /&gt;
&lt;br /&gt;
Das Template ergänzt verschiedene Properties automatisch, wenn sie nicht ausdrücklich definiert wurden.&lt;br /&gt;
&lt;br /&gt;
Für alle Steps werden unter anderem folgende Werte gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
systemInfoId&lt;br /&gt;
active = true&lt;br /&gt;
custom = true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach Step-Typ werden weitere Standardwerte ergänzt.&lt;br /&gt;
&lt;br /&gt;
Beispielsweise bei &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
database           = eduetl&lt;br /&gt;
delimiter          = ^&lt;br /&gt;
header             = false&lt;br /&gt;
refresh            = true&lt;br /&gt;
usePostgresCopyApi = true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;lt;code&amp;gt;DOQUERY&amp;lt;/code&amp;gt; werden unter anderem verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
databaseSystem   = postgres&lt;br /&gt;
dataSource       = eduetl&lt;br /&gt;
sqlVarDataSource = eduetl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit können einfache Sonderladeroutinen relativ kompakt definiert werden.&lt;br /&gt;
&lt;br /&gt;
Wenn vom Standard abgewichen werden soll, wird das entsprechende Property ausdrücklich in &amp;lt;code&amp;gt;etl_step_properties&amp;lt;/code&amp;gt; gesetzt.&lt;br /&gt;
&lt;br /&gt;
==Pfade==&lt;br /&gt;
&lt;br /&gt;
Bei Dateien sollten möglichst die vorhandenen SuperX- beziehungsweise Modulvariablen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$KERN_LOAD_PFAD/unl/datei.unl&lt;br /&gt;
$SVA_LOAD_PFAD/unl/datei.unl&lt;br /&gt;
$SVA_PFAD/schluesseltabellen/script.sql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch müssen keine absoluten Installationspfade in der Sonderladeroutine hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
==SQL innerhalb von prop_value==&lt;br /&gt;
&lt;br /&gt;
SQL-Anweisungen werden innerhalb eines FreeMarker-Strings definiert.&lt;br /&gt;
&lt;br /&gt;
Enthält das SQL selbst einfache Hochkommata, müssen diese verdoppelt werden.&lt;br /&gt;
&lt;br /&gt;
Statt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
select 1, &amp;#039;Demo&amp;#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird innerhalb von &amp;lt;code&amp;gt;prop_value&amp;lt;/code&amp;gt; geschrieben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
select 1, &amp;#039;&amp;#039;Demo&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;etl_step&amp;quot;:&amp;quot;kern_special_demo_unload&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_name&amp;quot;:&amp;quot;sql&amp;quot;,&lt;br /&gt;
 &amp;quot;prop_value&amp;quot;:&amp;quot;select 1 as id, &amp;#039;&amp;#039;Demo&amp;#039;&amp;#039; as name&amp;quot;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testfälle==&lt;br /&gt;
&lt;br /&gt;
Die Definitionsdatei bietet zusätzlich die Möglichkeit, einfache Testfälle anzugeben.&lt;br /&gt;
&lt;br /&gt;
Wenn keine Tests benötigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;#assign testfaelle = [&lt;br /&gt;
] /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Testfall besteht aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
testcase&lt;br /&gt;
assertion&lt;br /&gt;
sql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;testcase&lt;br /&gt;
:Name des Testfalls.&lt;br /&gt;
&lt;br /&gt;
;assertion&lt;br /&gt;
:Erwarteter Wert.&lt;br /&gt;
&lt;br /&gt;
;sql&lt;br /&gt;
:SQL-Abfrage, die einen einzelnen Vergleichswert zurückliefert.&lt;br /&gt;
&lt;br /&gt;
Ein einfacher Test kann beispielsweise prüfen, ob der definierte ETL-Job nach dem Einspielen vorhanden ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;#assign testfaelle = [&lt;br /&gt;
{&amp;quot;testcase&amp;quot;:&amp;quot;Demo-Job wurde angelegt&amp;quot;,&lt;br /&gt;
 &amp;quot;assertion&amp;quot;:&amp;quot;1&amp;quot;,&lt;br /&gt;
 &amp;quot;sql&amp;quot;:&amp;quot;select count(*) from etl_job where uniquename=&amp;#039;kern_special_demo_special&amp;#039;&amp;quot;}&lt;br /&gt;
] /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Template vergleicht den erwarteten Wert mit dem Ergebnis der SQL-Abfrage.&lt;br /&gt;
&lt;br /&gt;
Diese Testfälle werden beim Einspielen der Definitionsdatei ausgeführt. Sie testen damit die Installation beziehungsweise den Zustand unmittelbar nach dem Einspielen der Definition und nicht automatisch das Ergebnis einer späteren Ausführung des ETL-Jobs.&lt;br /&gt;
&lt;br /&gt;
==Bereich unterhalb der Definitionen==&lt;br /&gt;
&lt;br /&gt;
Unterhalb der FreeMarker-Definitionen beginnen die allgemeinen Makros der Vorlage.&lt;br /&gt;
&lt;br /&gt;
Ab dem ersten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;#macro ...&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sollte die Datei nicht mehr bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Für eine eigene Sonderladeroutine reicht es aus, die FreeMarker-Definitionen am Anfang der Datei anzupassen.&lt;br /&gt;
&lt;br /&gt;
==Einspielen der Sonderladeroutine==&lt;br /&gt;
&lt;br /&gt;
Die fertige Definitionsdatei wird in einer geladenen SuperX-Umgebung mit &amp;lt;code&amp;gt;DOSQL&amp;lt;/code&amp;gt; eingespielt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
DOSQL kern_sonderladeroutine_demo.sql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden Job, ETL-Steps, Properties, Jobparameter und die Beziehungen zwischen den Steps erzeugt beziehungsweise aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Anschließend steht der Job als Sonderladeroutine zur Verfügung, wenn sein &amp;lt;code&amp;gt;uniquename&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;_special&amp;lt;/code&amp;gt; endet.&lt;br /&gt;
&lt;br /&gt;
==Demo-Sonderladeroutine==&lt;br /&gt;
&lt;br /&gt;
Als Vorlage steht eine bewusst klein gehaltene Demo-Sonderladeroutine zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Demo-Datei befindet sich im Git-Repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
BI_Maintenance&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie kann als Ausgangspunkt für eigene Sonderladeroutinen verwendet werden. Dabei sollte nur der Definitionsbereich am Anfang der Datei angepasst werden. Der darunterliegende Makrobereich bleibt unverändert.&lt;br /&gt;
&lt;br /&gt;
Die Demo zeigt einen möglichst kleinen vollständigen Ablauf.&lt;br /&gt;
&lt;br /&gt;
Der erste Step entlädt einen einfachen Datensatz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
select 1 as id, &amp;#039;Demo&amp;#039; as name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis wird in eine UNL-Datei geschrieben.&lt;br /&gt;
&lt;br /&gt;
Anschließend erzeugt ein &amp;lt;code&amp;gt;DOQUERY&amp;lt;/code&amp;gt;-Step eine kleine Zieltabelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
create table if not exists tmp_kern_special_demo&lt;br /&gt;
(&lt;br /&gt;
    id integer,&lt;br /&gt;
    name varchar(20)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der abschließende &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt;-Step lädt die zuvor erzeugte UNL-Datei in diese Tabelle.&lt;br /&gt;
&lt;br /&gt;
Der Ablauf ist damit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Datenbank&lt;br /&gt;
  ↓&lt;br /&gt;
UNLOAD&lt;br /&gt;
  ↓&lt;br /&gt;
UNL-Datei&lt;br /&gt;
  ↓&lt;br /&gt;
LOAD&lt;br /&gt;
  ↓&lt;br /&gt;
Zieltabelle&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Demo zeigt damit die grundlegende Arbeitsweise einer Sonderladeroutine, ohne dass komplexes SQL vom Aufbau der ETL-Schritte ablenkt.&lt;br /&gt;
&lt;br /&gt;
==Hinweise==&lt;br /&gt;
&lt;br /&gt;
*Eine vorhandene Vorlage kopieren.&lt;br /&gt;
*Nur die FreeMarker-Definitionen am Anfang der Datei bearbeiten.&lt;br /&gt;
*Ab dem ersten Makro den Inhalt der Vorlage unverändert lassen.&lt;br /&gt;
*Der &amp;lt;code&amp;gt;uniquename&amp;lt;/code&amp;gt; des ETL-Jobs muss auf &amp;lt;code&amp;gt;_special&amp;lt;/code&amp;gt; enden.&lt;br /&gt;
*Für Datenbanken den in &amp;lt;code&amp;gt;his1_databases.properties&amp;lt;/code&amp;gt; definierten Verbindungsnamen verwenden.&lt;br /&gt;
*Der Verbindungsname muss nicht mit dem physischen Datenbanknamen übereinstimmen.&lt;br /&gt;
*Die Property-Namen einschließlich Groß- und Kleinschreibung exakt übernehmen.&lt;br /&gt;
*Bei SQL innerhalb von &amp;lt;code&amp;gt;prop_value&amp;lt;/code&amp;gt; einfache Hochkommata verdoppeln.&lt;br /&gt;
*Bei &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; darauf achten, dass Aufbau der Datei und Aufbau der Zieltabelle zusammenpassen.&lt;br /&gt;
*Für kurze SQL-Befehle eignet sich &amp;lt;code&amp;gt;DOQUERY&amp;lt;/code&amp;gt;, für umfangreichere vorhandene SQL-Dateien &amp;lt;code&amp;gt;DOSQL&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Bei Problemen das Jobprotokoll unter &amp;lt;code&amp;gt;WEB-INF/logs/jobs/JOBNAME.log&amp;lt;/code&amp;gt; prüfen.&lt;/div&gt;</summary>
		<author><name>Andrek</name></author>
	</entry>
</feed>