Hiermit begrüßen wir Sie zu einer Folge von zwei Artikeln, in denen wir zeigen, wie KeepTool 15 zusammen mit Oracle XML DB verwendet werden kann. Dazu wird Oracles XML-Komplettlösung verwendet, die das Speichern und Laden von XML-Dokumenten aus der Datenbank erlaubt. Dazu können XML-Schemas in der Datenbank registriert und Abfragen auf Objekt-relationale Datenstrukturen durchgeführt werden.
Im ersten Blogbeitrag werden zunächst die Grundlagen erklärt. Anschließend wird Schritt für Schritt eine XML-Schnittstelle für den Datenimport in die Tabelle EMPLOYEES aus Oracles HR (Human Resources) Beispielschema entwickelt.
Im zweiten Beitrag ergänzen wir das Beispiel dann durch eine Exportschnittstelle. Dabei zeigen wir anhand der beiden Tabellen HR.DEPARTMENTS und LOCATIONS, wie eine Master/Detail-Beziehung verarbeitet werden kann.
Dabei konzentrieren wir uns auf das Wesentliche. Dabei bleibt Spielraum, die Logik weiter zu vervollständigen und an die eigenen Bedürfnisse anzupassen.
Betrachten wir einen regionalen Standort eines großen Unternehmens. Lokal wird eine eigene Kopie der Personaldatenbank (HR) geführt. Die Mitarbeiterdaten der EMPLOYEES-Tabelle werden zentral verwaltet. Der lokale Standort erhält Aktualisierungen von neuen und geänderten Mitarbeiterdaten über eine XML-Schnittstelle vom Hauptstandort:
Im ersten Teil unserer Serie werden wir zeigen, wie eine XML-Struktur importiert werden kann. EMPLOYEES-Daten in der lokalen HR-Datenbank werden entweder eingefügt oder aktualisiert. Im zweiten Blog werden wir dann die Technologie des Datenexports beschreiben.
Entdecken Sie die Möglichkeiten von KeepTool.
Die Aufgabe besteht darin, Daten in die Tabelle EMPLOYEES aus Oracle Demoschema HR zu importieren. Als ersten Schritt dazu definieren wir einige PL/SQL Types, um anschließend daraus mit Hilfe von Oracle XML-DB eine XSD-Schema-Definition zu erzeugen.
Genauer gesagt, benötigen wir 3 voneinander abhängige PL/SQL Types:
Wir erzeugen die 3 Types, indem wir das folgende Skript auf Horas SQL-Seite ausführen:
Jetzt können wir die Types in Hora auf der PL/SQL Types-Seite sehen. Da wir den Reiter ‚All Types‘ aktiviert haben, sind die Objekt Types und Collection Types in einer gemeinsamen Liste zu sehen:
Das Beispiel zeigt auch, wie Hora automatisch Warnungen bzw. Fehlermeldungen anzeigt, die von der Datenbank erzeugt werden.
Jetzt können wir die Prozedur dbms_xmlschema.generateschema verwenden, um eine XML-Schemabeschreibung zu erzeugen:
select dbms_xmlschema.generateschema( 'HR', 'EMPLOYEES_XML_ELEM', 'EMPLOYEES_LIST') from dual;
Das Ergebnis der Abfrage ist das XSD als CLOB-Datentyp. Wir reichen den CLOB gleich weiter an die Prozedur dbms_xmlschema.registerschema:
begin dbms_xmlschema.registerschema( 'EMPLOYEES.XSD', dbms_xmlschema.generateschema( schemaname => 'HR', typename => 'EMPLOYEES_XML_ELEM', elementname => 'EMPLOYEES_LIST'), gentypes => FALSE, genbean => FALSE, gentables => FALSE); end;
Nachdem dieser anonyme Block ausgeführt worden ist, ist das XSD in der Datenbank registriert. Das können wir uns in Hora auf der XML-Seite anschauen:
Auf der zweiten Tab-Lasche zeigt Hora die Zuordnung der XSD-Elemente zu den PL/SQL Types:
Um die beschriebene PL/SQL-Logik bequem nutzen zu können, haben wir den Code in einem PL/SQL-Package XML_LOGIC zusammengefasst:
Mit Hilfe dieses Packages brauchen wir nur noch eine einzige Methode, register_xsd, aufzurufen:
begin XML_LOGIC.register_xsd( 'EMPLOYEES'); end;
Die Prozedur registriert das XSD in der Datenbank. Darüber hinaus speichert sie es auch als XSD-Datei in einem vordefinierten Oracle-Directory.
Sie können diese XSD-Datei den Softwareentwicklern bereitstellen, welche die zu importierenden XML-Daten zukünftig bereitstellen sollen.
Die Tabelle XML_EMPLOYEES_TRANSFER wird von uns für die Durchführung des Datenimports verwendet. Die externe Stelle, die das System mit Daten versorgen soll, kann diese Tabelle zum Bereitstellen neuer Daten benutzen.
Die Struktur der Tabelle sieht wie folgt aus:
Für jeden Importvorgang fügt das externe System einen neuen Datensatz in die Tabelle ein. Ein Trigger versorgt die Primärschlüsselspalte ID mit einem neuen Wert aus einer Sequence.
Die Spalte XML_DATA enthält die zu importierenden Daten im XML-Format. Die restlichen Spalten beinhalten Metadaten wie Zeitstempel, Statistiken und Fehlermeldungen. Letztere beinhaltet Informationen, wenn beim Import Fehler aufgetreten sind.
Die View XML_EMPLOYEES_TRANS_DATA_V selektiert Daten aus der Importtabelle, wobei alle XML-Daten in eine relationale Struktur gebracht werden:
Hier https://www.oratable.com/xmltable-convert-xml-to-relational-form/ finden Sie weitergehende Informationen zur Umwandlung von XML-Daten eine relationale Ansicht.
Sie können sich den Inhalt der View später anschauen, nachdem wir einen Datensatz in die Tabelle XML_EMPLOYEES_TRANSFER eingefügt haben.
Nachdem wir die Grundlagen bereitgestellt haben, können wir mit der Implementierung der eigentlichen Importlogik fortfahren. Dazu erstellen wir das PL/SQL-Package XML_INTERFACE.
….
Das Package beinhaltet genau eine Prozedur für den XML-Import. Die Prozedur implementiert die folgenden Schritte:
Der XML-Import kann nun mittels folgender zwei Schritte genutzt werden:
Nachdem der Datensatz eingefügt wurde, können Sie das XML noch einmal in Hora überprüfen:
Nun führen wir die Prozedur aus. Die DataContent-Ansicht in Hora enthält jetzt den neu eingefügten Datensatz:
Die Statistiken zum Datensatz der Transfertabelle wurden nun aktualisiert:
Mit Hilfe der bereits beschriebenen View XML_EMPLOYEES_TRANS_DATA_V können die Daten aus dem XML zusammen mit den Spalten der Tabelle XML_EMPLOYEES_TRANSFER in relationaler Form angezeigt werden:
Die XML-basierte Datenimport-Schnittstelle ist nun einsatzbereit. Sie können das Beispiel hier herunterladen und als Vorlage benutzen, um Ihre eigene Datenimport-Schnittstelle zu erstellen.
Weitaus komplexere Schnittstellenimplementierungen aufbauend auf dem vorgestellten Konzept haben sich bereits in der praktischen Projektarbeit bewährt. Die beteiligten Entwickler berichten von einer deutlichen Verbesserung der Produktivität durch den Einsatz unserer Tools.
Im nächsten Blockbeitrag greifen wir das Beispiel wieder auf und ergänzen es um eine Datenexport-Schnittstelle.