Der XML Extender bietet zwei gespeicherte Prozeduren, dxxGenXML() und dxxRetrieveXML(), zum Zusammensetzen von XML-Dokumenten.
Die gespeicherte Prozedur dxxGenXML() konstruiert XML-Dokumente mit Hilfe von Daten in XML-Objektgruppentabellen, die über das Element <Xcollection> in der DAD-Datei angegeben sind. Diese gespeicherte Prozedur fügt jedes XML-Dokument als Zeile in eine Ergebnistabelle ein. Sie können auch einen Cursor in der Ergebnistabelle öffnen und die Ergebnisgruppe abrufen. Die Ergebnistabelle muß von der Anwendung erstellt werden; sie hat immer eine Spalte des Typs VARCHAR, CLOB, XMLVARCHAR oder XMLCLOB. Wenn Sie das Element für die Prüfung in der DAD-Datei auf YES setzen, fügt der XML Extender außerdem die Spalte DXX_VALID des Typs INTEGER hinzu und fügt den Wert 1 für ein gültiges XML-Dokument und 0 für ein ungültiges Dokument hinzu.
Die gespeicherte Prozedur dxxGenXML() ermöglicht außerdem die Angabe der maximalen Anzahl von Zeilen, die in der Ergebnistabelle generiert werden sollen. Auf diese Weise wird die Verarbeitungszeit verkürzt. Die gespeicherte Prozedur gibt die tatsächliche Anzahl von Zeilen in der Tabelle zusammen mit allen eventuellen Rückkehrcodes und Nachrichten zurück.
Die entsprechende gespeicherte Prozedur für das Zerlegen ist dxxShredXML(); sie verwendet ebenfalls die DAD-Datei als Eingabeparameter. Für diese Prozedur braucht die XML-Objektgruppe nicht aktiviert zu sein.
So erstellen Sie eine XML-Objektgruppe: dxxGenXML()
Integrieren Sie den Aufruf einer gespeicherten Prozedur in Ihrer Anwendung mit der folgenden Deklaration einer gespeicherten Prozedur:
dxxGenXML(CLOB(100K) DAD, /* Eingabe */ char(UDB_SIZE) resultTabName, /* Eingabe */ integer overrideType, /* Eingabe */ varchar(1024) override, /* Eingabe */ integer maxRows, /* Eingabe */ integer numRows, /* Ausgabe */ long returnCode, /* Ausgabe */ varchar(1024) returnMsg) /* Ausgabe */
Eine ausführliche Beschreibung der Syntax sowie Beispiele finden Sie im Abschnitt dxxGenXML().
Beispiel: Mit dem folgenden Beispiel wird ein XML-Dokument zusammengesetzt:
#include "dxx.h" #include "dxxrc.h" EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; SQL TYPE is CLOB(100K) dad; /* DAD */ SQL TYPE is CLOB_FILE dadFile; /* DAD-Datei */ char result_tab[32]; /* Name der Ergebnistabelle */ char override[2]; /* Überschreiben, auf NULL gesetzt*/ short overrideType; /* definiert in dxx.h */ short max_row; /* maximale Anzahl Zeilen */ short num_row; /* tatsächliche Anzahl Zeilen */ long returnCode; /* Rückkehr-Fehlercode */ char returnMsg[1024]; /* Fehlernachrichtentext */ short dad_ind; short rtab_ind; short ovtype_ind; short ov_inde; short maxrow_ind; short numrow_ind; short returnCode_ind; short returnMsg_ind; EXEC SQL END DECLARE SECTION; /* Tabelle erstellen */ EXEC CREATE TABLE xml_order_tab (xmlorder XMLVarchar); /* Daten aus einer Datei in ein CLOB einlesen */ strcpy(dadfile.name,"c:\dxx\samples\dad\getstart_xcollection.dad"); dadfile.name_length = strlen("c:\dxx\samples\dad\getstart_xcollection.dad"); dadfile.file_options = SQL_FILE_READ; EXEC SQL VALUES (:dadfile) INTO :dad; strcpy(result_tab,"xml_order_tab"); override[0] = '\0'; overrideType = NO_OVERRIDE; max_row = 500; num_row = 0; returnCode = 0; msg_txt[0] = '\0'; collection_ind = 0; dad_ind = 0; rtab_ind = 0; ov_ind = -1; ovtype_ind = 0; maxrow_ind = 0; numrow_ind = -1; returnCode_ind = -1; returnMsg_ind = -1; /* Gespeicherte Prozedur aufrufen */ EXEC SQL CALL dxxGenXML(:dad:dad_ind; :result_tab:rtab_ind, :overrideType:ovtype_ind,:override:ov_ind, :max_row:maxrow_ind,:num_row:numrow_ind, :returnCode:returnCode_ind,:returnMsg:returnMsg_ind);
Die Ergebnistabelle enthält nach dem Aufrufen der gespeicherten Prozedur 250 Zeilen, da die in der DAD-Datei angegebene SQL-Abfrage 250 XML-Dokumente generiert hatte.
Die gespeicherte Prozedur dxxRetrieveXML() funktioniert wie die gespeicherte Prozedur dxxGenXML() mit dem Unterschied, daß sie den Namen einer aktivierten XML-Objektgruppe statt einer DAD-Datei verwendet. Wenn eine XML-Objektgruppe aktiviert ist, wird eine DAD-Datei in der Tabelle XML_USAGE gespeichert. Der XML Extender ruft daher die DAD-Datei ab; von dieser Stelle ab ist dxxRetrieveXML() identisch mit dxxGenXML().
dxxRetrieveXML() ermöglicht die Verwendung derselben DAD-Datei beim Zusammensetzen und Zerlegen. Die gespeicherte Prozedur kann auch zum Abrufen zerlegter XML-Dokumente verwendet werden.
Die entsprechende gespeicherte Prozedur für das Zerlegen ist dxxInsertXML(); sie verwendet ebenfalls den Namen einer aktivierten XML-Objektgruppe.
So erstellen Sie eine XML-Objektgruppe: dxxRetrieveXML()
Integrieren Sie den Aufruf einer gespeicherten Prozedur in Ihrer Anwendung mit der folgenden Deklaration einer gespeicherten Prozedur:
dxxRetrieveXML(char(UDB_SIZE) collectionName, /* Eingabe */ char(UDB_SIZE) resultTabName, /* Eingabe */ integer overrideType, /* Eingabe */ varchar(1024) override, /* Eingabe */ integer maxRows, /* Eingabe */ integer numRows, /* Ausgabe */ long returnCode, /* Ausgabe */ varchar(1024) returnMsg) /* Ausgabe */
Eine ausführliche Beschreibung der Syntax sowie Beispiele finden Sie im Abschnitt dxxRetrieveXML().
Beispiel: Das folgende Beispiel zeigt einen Aufruf von dxxRetrieveXML(). Dabei wird davon ausgegangen, daß die Ergebnistabelle mit dem Namen XML_ORDER_TAB erstellt wird und eine Spalte des Typs XMLVARCHAR enthält.
#include "dxx.h" #include "dxxrc.h" EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; char collection[32]; /* DAD-Puffer */ char result_tab[32]; /* Name der Ergebnistabelle */ char override[2]; /* Überschreiben, auf NULL gesetzt*/ short overrideType; /* definiert in dxx.h */ short max_row; /* maximale Anzahl Zeilen */ short num_row; /* tatsächliche Anzahl Zeilen */ long returnCode; /* Rückkehr-Fehlercode */ char returnMsg[1024]; /* Fehlernachrichtentext */ short dadbuf_ind; short rtab_ind; short ovtype_ind; short ov_inde; short maxrow_ind; short numrow_ind; short returnCode_ind; short returnMsg_ind; EXEC SQL END DECLARE SECTION; /* Tabelle erstellen */ EXEC SQL CREATE TABLE xml_order_tab (xmlorder XMLVarchar); /* Host-Variable und Anzeiger initialisieren */ strcpy(collection,"sales_ord"); strcpy(result_tab,"xml_order_tab"); override[0] = '\0'; overrideType = NO_OVERRIDE; max_row = 500; num_row = 0; returnCode = 0; msg_txt[0] = '\0'; collection_ind = 0; rtab_ind = 0; ov_ind = -1; ovtype_ind = 0; maxrow_ind = 0; numrow_ind = -1; returnCode_ind = -1; returnMsg_ind = -1; /* Gespeicherte Prozedur aufrufen */ EXEC SQL CALL dxxRetrieve(:collection:collection_ind; :result_tab:rtab_ind, :overrideType:ovtype_ind,:override:ov_ind, :max_row:maxrow_ind,:num_row:numrow_ind, :returnCode:returnCode_ind,:returnMsg:returnMsg_ind);