Heute tauchen wir in einen klassischen Bereich des Data Warehouses ein. In diesem Artikel wird sich mit dem Thema Outbound und im Speziellen mit der Erstellung von generischen XML-Exports mit der Datenbankfunktion XMLAGG im Zusammenspiel mit Informatica PowerCenter beschäftigt.
Die Outbound-Herausforderungen
In vielen Unternehmen müssen Daten oder Informationen des zentralen Data Warehouses in Flatfiles bereit gestellt werden. Dies betrifft alles, unter anderem Tools und Abteilungen, welche keinen direkten Zugriff auf die Datenbank des Data Warehouses haben.
Das kann zum Beispiel ein CSV-Export für eine fachliche Abteilung sein, welche gewisse Informationen zu täglichen Auswertungen benötigen. Oder auch XML-Exports für Anwendungen, welche beispielsweise die Unternehmensdaten für die Erstellung der Reports und/ oder für Meldungen an die Aufsichtsbehörden benötigen.
In einem Data Warehouse kann es eine Vielzahl von Tabellen geben, welche ausgeleitet werden müssen, um so die Daten nachfolgenden Prozessen bereitstellen zu können.
Um hierbei Zeit und Aufwand zu sparen und die Fehleranfälligkeit zu minimieren, ist es sinnvoll eine generische Erzeugung des Outbounds zu konzipieren. Damit entfällt eine zusätzliche Informatica-Mapping-Implementierung für jede Tabelle.
In den kommenden Abschnitten beschränken wir uns auf den Outbound von XML-Dateien.
XMLAGG
XMLAGG ist eine Datenbankfunktion, welche Teilfragmente zu einem vollständigen XML-Dokument aggregiert bzw. zusammensetzt. Als Teilfragmente versteht man in diesem Fall die einzelnen Datensätze, welche bereits in eine XML-Struktur gebracht wurden.
Im folgenden Beispiel sind in XML_ENTITY drei Datensätze enthalten. Mithilfe von XMLAGG wird der Inhalt von XML_ENTITY zu einem XML-Dokument zusammengefasst.
Damit ist es relativ einfach, komplette XML-Dateien für den Outbound zu erzeugen.
SQL-Befehl:
SELECT XMLELEMENT(NAME "document", XMLATTRIBUTES( 'Outbounds in-factory Technik-Blog' as "name"),
XMLAGG(XML_ENTITY))
FROM
(SELECT XMLELEMENT(NAME "KUNDEN", XMLATTRIBUTES(KUNDEN_NR, NAME),
CASE WHEN STRASSE IS NOT NULL THEN XMLELEMENT(NAME "FELD", XMLATTRIBUTES('STRASSE' AS FELDNAME, STRASSE AS value)) END,
CASE WHEN PLZ IS NOT NULL THEN XMLELEMENT(NAME "FELD", XMLATTRIBUTES('PLZ' AS FELDNAME, PLZ AS value)) END,
CASE WHEN ORT IS NOT NULL THEN XMLELEMENT(NAME "FELD", XMLATTRIBUTES('Ort' AS FELDNAME , ORT AS value)) END)
AS XML_ENTITY FROM KUNDEN);
XML-Dokument:
<document name="Outbound in-factory Technik-Blog">
<KUNDEN KUNDEN_NR="1" NAME="FIRMA1">
<FELD FELDNAME="STRASSE" VALUE="Klosterwall 87"/>
<FELD FELDNAME="PLZ" VALUE="20095"/>
<FELD FELDNAME="ORT" VALUE="Hamburg"/>
</KUNDEN>
<KUNDEN KUNDEN_NR="2" NAME="FIRMA2">
<FELD FELDNAME="STRASSE" VALUE="Pariser Platz 20"/>
<FELD FELDNAME="PLZ" VALUE="10117"/>
<FELD FELDNAME="ORT" VALUE="Berlin"/>
</KUNDEN>
<KUNDEN KUNDEN_NR="3" NAME="FIRMA3">
<FELD FELDNAME="STRASSE" VALUE="Maximilianstraße 43"/>
<FELD FELDNAME="PLZ" VALUE="80539"/>
<FELD FELDNAME="ORT" VALUE="München"/>
</KUNDEN>
</document>
Integration in Informatica PowerCenter
Um den SQL-Befehl rund um XMLAGG automatisiert und generisch zu erzeugen, bietet sich die Integration in Informatica PowerCenter an. Etwa könnte man die Tabellen-Metadaten der Datenbank nutzen, um die Spalten einer zu exportierenden Tabelle zu ermitteln.
Durch das Übergeben der Parameter „$$DBSCHEMA“ und „$$QUELL_TABELLE“ wird die zu exportierenden Tabelle samt ihrer Spalten ermittelt. Falls zum Beispiel eine Tabelle technische Felder hat, welche nicht exportiert werden sollen, da sie für den nachfolgenden Prozess uninteressant sind, könnte man dies mit einem weiteren Parameter („$$SPALTEN_NICHT_EXPORTIEREN“) lösen.
IBM DB2:
SELECT col.TABSCHEMA, col.TABNAME, col.COLNAME, col.TYPENAME
FROM SYSCAT.COLUMNS col
WHERE col.TABSCHEMA = '$$DBSCHEMA'
AND col.TABNAME = '$$QUELL_TABELLE' AND col.COLNAME NOT IN ($$SPALTEN_NICHT_EXPORTIEREN)
Oracle:
SELECT col.OWNER, col.TABLE_NAME, col.COLUMN_NAME, col.DATA_TYPE
FROM DBA_TAB_COLUMNS col
WHERE col.OWNER = '$$DBSCHEMA'
AND col.TABLE_NAME = '$$QUELL_TABELLE' AND col.COLUMN_NAME NOT IN ($$SPALTEN_NICHT_EXPORTIEREN)
Somit kann mit einem einzigen Informatica Workflow komplett generisch für jede einzelne Tabelle das entsprechende SQL-Statement für die XML-Erzeugung erstellt und der Export durchgeführt werden. Es muss nicht für jede Tabelle ein einzelner individueller Prozess gebaut werden. Diese gewonnen Zeit kann man wiederum für die Umsetzung für weitere Business Logik nutzen.