Sie können einen Compute-, Filter- oder Database-Knoten konfigurieren, um Daten aus Datenbankspalten auszuwählen und in eine Ausgabenachricht einzufügen.
Im folgenden Beispiel wird vorausgesetzt, dass Sie über eine Datenbanktabelle mit dem Namen USERTABLE und zwei Spalten vom Datentyp CHAR(6) (oder einem äquivalenten Datentyp) mit dem Namen 'Column1' und 'Column2' verfügen. Die Tabelle enthält zwei Zeilen:
Column1 | Column2 | |
---|---|---|
Zeile 1 | value1 | value2 |
Zeile 2 | value3 | value4 |
Konfigurieren Sie den Compute-, Filter- oder Database-Knoten so, dass er die Datenbank, in der Sie die Tabelle definiert haben, identifiziert. Klicken Sie z. B. bei Verwendung der Standarddatenbank (wird über die Knoteneigenschaft Datenquelle angegeben) mit der rechten Maustaste auf den Knoten, wählen Sie ESQL öffnen aus, und codieren Sie die folgenden ESQL-Anweisungen im Modul für diesen Knoten:
SET OutputRoot = InputRoot; DELETE FIELD OutputRoot.*[<]; SET OutputRoot.XML.Test.Result[] = (SELECT T.Column1, T.Column2 FROM Database.USERTABLE AS T);
Dies führt zur Generierung der folgenden Ausgabenachricht:
<Test> <Result> <Column1>Wert1</Column1> <Column2>Wert2</Column2> </Result> <Result> <Column1>Wert3</Column1> <Column2>Wert4</Column2> </Result> </Test>
<Test> <Result> <Column1></Column1> <Column2></Column2> </Result> <Result> <Column1></Column1> <Column2></Column2> </Result> </Test>
Die genaue Struktur des XML-Codes ist nicht wichtig, aber der einschließende Tag muss <Test> heißen, sodass er mit der Referenz im ESQL-Code übereinstimmt. Wenn es sich bei dem einschließenden Tag nicht um <Test> handelt, führen die ESQL-Anweisungen dazu, dass umschließende Tags auf der obersten Ebene erstellt werden, was in XML nicht gültig ist.
Wenn Sie eine Ausgabenachricht erstellen möchten, die alle Spalten aus allen Zeilen, die eine bestimmte Bedingung erfüllen, enthält, geben Sie in der SELECT-Anweisung eine WHERE-Klausel an:
-- Deklarieren und Initialisieren einer Variable zur Aufnahme -- test vaue (in this case the surname Smith) DECLARE CurrentCustomer STRING 'Smith'; -- Loop through table records to extract matching information SET OutputRoot.XML.Invoice[] = (SELECT R FROM Database.USERTABLE AS R WHERE R.Customer.LastName = CurrentCustomer );
Die Nachrichtenfelder werden in derselben Reihenfolge erstellt wie die Spalten in der Tabelle angezeigt werden.
Wenn Sie mit SQL in einer Datenbankumgebung vertraut sind, erwarten Sie möglicherweise, dass SELECT * codiert werden kann. Diese Syntax wird vom Broker nicht akzeptiert, da alle Verweise auf Spalten mit einem Korrelationsnamen beginnen müssen, um Mehrdeutigkeiten bei deklarierten Variablen zu vermeiden. Wenn Sie SELECT I.* codieren, wird diese Syntax vom Broker akzeptiert, '*' wird jedoch als erstes untergeordnetes Element und nicht als alle Elemente interpretiert, wie dies zu erwarten ist, wenn man von anderem SQL-Datenbankcode ausgeht.
Die Zuordnung der Ergebnisliste einer Datenbank zu einer parsereigenen Nachrichtenbaumstruktur ist nur möglich, wenn die Ergebnisliste exakt mit der Nachrichtendefinition übereinstimmt. Da der generische XML-Parser selbstdefinierend ist, wird im Beispiel eine neue untergeordnete Baumstruktur außerhalb des Rechnungsordners erstellt. Der Parser kann dann die neuen Elemente in der untergeordneten Baumstruktur analysieren. Stimmt die Struktur der Ergebnisliste exakt mit der Nachrichtendefinition überein, kann die Ergebnisliste direkt der Baumstruktur für den Nachrichtentext OutputRoot zugeordnet werden.
Bei nicht genauer Übereinstimmung zwischen der Struktur der Ergebnisliste und der MRM-Nachrichtendefinition müssen Sie zunächst die Ergebnisliste einem Datentyp ROW (Zeile) oder einer Umgebungsbaumstruktur ohne zugeordneten Parser zuordnen.
Die erforderlichen Daten können dann OutputRoot zugeordnet werden, um eine der Nachrichtendefinition entsprechende Nachrichtenbaumstruktur aufzubauen.
Wenn bei dem Datenbanksystem die Groß-/Kleinschreibung beachtet werden muss, müssen Sie eine andere Methode verwenden. Diese Methode ist auch erforderlich, wenn Sie den Namen des generierten Feldes ändern möchten:
SET OutputRoot = InputRoot; SET OutputRoot.XML.Test.Result[] = (SELECT T.Column1 AS Column1, T.Column2 AS Column2 FROM Database.USERTABLE AS T);
In diesem Beispiel wird dieselbe Ausgabenachricht wie inAbbildung 1 gezeigt erstellt. Stellen Sie sicher, dass bei den Verweisen auf die Datenbankspalten (in diesem Beispiel 'T.Column1' und 'T.Column2') die Groß-/Kleinschreibung genau mit den Datenbankdefinitionen übereinstimmt. Wenn Sie die Datenbankdefinitionen nicht exakt abgleichen (wenn Sie beispielsweise T.COLUMN1 angeben), generiert der Broker einen Laufzeitfehler. Column1 und Column2 werden in der SELECT-Anweisung verwendet, damit sie mit den Spalten übereinstimmen, die Sie in der Datenbank definiert haben, Sie können hier jedoch beliebige Werte verwenden; die Werte müssen nicht übereinstimmen.
Wenn der Bitstrom aus der Datenbank nicht vom Nachrichtenfluss befragt oder geändert werden muss, kann die Ausgabenachricht in der BLOB-Domäne ohne Änderungen konstruiert werden.
SET Environment.Variables.DBResult = THE( SELECT T.* FROM Database.TABLE1 AS T); DECLARE resultRef REFERENCE TO Environment.Variables.DBResult; IF LASTMOVE(resultRef) THEN DECLARE outMsg BLOB resultRef.MSGDATA; DECLARE outCCSID INT resultRef.MSGCCSID; DECLARE outEncoding INT resultRef.MSGENCODING; DECLARE outMsgPriority INT resultRef.MSGPRIORITY; DECLARE outMsgSeqNum INT resultRef.MSGSEQNUMBER; SET OutputRoot.Properties.CodedCharSetId = outCCSID; SET OutputRoot.Properties.Encoding = outEncoding; CREATE LASTCHILD OF OutputRoot DOMAIN('MQMD') PARSE(outMsg, outEncoding, outCCSID); SET OutputRoot.MQMD.StrucId = MQMD_STRUC_ID; SET OutputRoot.MQMD.Version = MQMD_VERSION_2; SET OutputRoot.MQMD.Priority = outMsgPriority; SET OutputRoot.MQMD.MsgSeqNumber = outMsgSeqNum; DECLARE HDRL INT ; SET HDRL = LENGTH(BITSTREAM(OutputRoot.MQMD)); CREATE FIELD OutputRoot."BLOB"."BLOB"; DECLARE MSGB BLOB; SET MSGB = SUBSTRING(outMsg FROM HDRL +1); SET OutputRoot."BLOB"."BLOB" = MSGB; END IF;
Wenn Sie einen Bitstrom, der aus einer Datenbank extrahiert wurde, befragen oder ändern möchten, müssen Sie die ursprüngliche Nachrichtenbaumstruktur erneut erstellen. Um die XML-Nachrichtenbaumstruktur vom Bitstrom neu zu erstellen, können Sie eine CREATE-Anweisung mit einer PARSE-Klausel verwenden. Die Ausgabenachricht kann dann vom Nachrichtenfluss geändert werden.
Sie können beispielsweise eine Datenbanktabelle erstellen, indem Sie die folgende Anweisung verwenden:
INSERT INTO Database.TABLE1(MSGDATA, MSGENCODING, MSGCCSID) VALUES (msgBitStream, inEncoding, inCCSID);
Im folgenden Codefragment wird die Nachrichtenbaumstruktur in der XMLNS-Domäne erneut erstellt, indem die Daten aus der Tabelle verwendet werden:
CALL CopyMessageHeaders(); SET Environment.Variables.DBResult = THE( SELECT T.* FROM Database.TABLE1 AS T); DECLARE resultRef REFERENCE TO Environment.Variables.DBResult; IF LASTMOVE(resultRef) THEN DECLARE outCCSID INT resultRef.MSGCCSID; DECLARE outEncoding INT resultRef.MSGENCODING; DECLARE outMsg BLOB resultRef.MSGDATA; SET OutputRoot.Properties.CodedCharSetId = outCCSID; SET OutputRoot.Properties.Encoding = outEncoding; CREATE LASTCHILD OF OutputRoot DOMAIN('XMLNS') PARSE(outMsg, outEncoding, outCCSID); -- Nun Nachrichtenbaumstrukturfelder ändern SET OutputRoot.XMLNS.A.B = 4; SET OutputRoot.XMLNS.A.E = 5; END IF;
Im folgenden Beispiel befinden sich Daten in einer Datenbankspalte mit einem Zeichendatentyp wie z. B. CHAR oder VARCHAR. Mit einer Umsetzung werden die Daten, die aus der Datenbank extrahiert wurden, in das BLOB-Format konvertiert. Wenn der Bitstrom aus der Datenbank nicht vom Nachrichtenfluss befragt oder geändert werden muss, kann die Ausgabenachricht in der BLOB-Domäne ohne Änderungen konstruiert werden.
CALL CopyMessageHeaders(); SET Environment.Variables.DBResult = THE( SELECT T.* FROM Database.TABLE1 AS T); DECLARE resultRef REFERENCE TO Environment.Variables.DBResult; IF LASTMOVE(resultRef) THEN DECLARE outCCSID INT resultRef.MSGCCSID; DECLARE outMsg BLOB CAST(resultRef.MSGDATA AS BLOB CCSID outCCSID); SET OutputRoot.Properties.CodedCharSetId = outCCSID; SET OutputRoot.Properties.Encoding = resultRef.MSGENCODING; SET OutputRoot.BLOB.BLOB = outMsg; END IF;
Im folgenden Beispiel befinden sich Daten in einer Datenbankspalte mit einem Zeichendatentyp wie z. B. CHAR oder VARCHAR. Mit einer Umsetzung werden die Daten, die aus der Datenbank extrahiert wurden, in das BLOB-Format konvertiert. Um diese Daten im Nachrichtenfluss zu ändern oder zu befragen, müssen Sie die ursprüngliche Nachrichtenbaumstruktur erneut erstellen. In diesem Beispiel wird mit einer CREATE-Anweisung mit einer PARSE-Klausel die XML-Nachrichtenbaumstruktur in der XMLNS-Domäne erneut erstellt.
CALL CopyMessageHeaders(); SET Environment.Variables.DBResult = THE( SELECT T.* FROM Database.TABLE1 AS T); DECLARE resultRef REFERENCE TO Environment.Variables.DBResult; IF LASTMOVE(resultRef) THEN DECLARE outCCSID INT resultRef.MSGCCSID; DECLARE outEncoding INT resultRef.MSGENCODING; DECLARE outMsg BLOB CAST(resultRef.MSGDATA AS BLOB CCSID outCCSID); SET OutputRoot.Properties.CodedCharSetId = outCCSID; SET OutputRoot.Properties.Encoding = outEncoding; CREATE LASTCHILD OF OutputRoot DOMAIN('XMLNS') PARSE(outMsg, outEncoding, outCCSID); -- Nun Nachrichtenbaumstrukturfelder ändern SET OutputRoot.XMLNS.A.B = 4; SET OutputRoot.XMLNS.A.E = 5; END IF;