Sie können SELECT-Anweisungen verwenden, die sowohl mit Nachrichtendaten als auch mit Datenbanken interagieren. Sie können eine SELECT-Anweisung, die mit einem dieser Datentypen interagiert, aber auch in eine SELECT-Anweisung, die mit dem anderen Typ interagiert, verschachteln.
Betrachten Sie die folgende Eingabenachricht, die Rechnungsdaten für zwei Kunden enthält:
<Data> <Invoice> <CustomerNumber>1234</CustomerNumber> <Item> <PartNumber>1</PartNumber> <Quantity>9876</Quantity> </Item> <Item> <PartNumber>2</PartNumber> <Quantity>8765</Quantity> </Item> </Invoice> <Invoice> <CustomerNumber>2345</CustomerNumber> <Item> <PartNumber>2</PartNumber> <Quantity>7654</Quantity> </Item> <Item> <PartNumber>1</PartNumber> <Quantity>6543</Quantity> </Item> </Invoice> </Data>
Betrachten Sie die folgenden Datenbanktabellen mit Preisen und Adressen sowie deren Inhalte:
PARTNO PRICE ----------- ------------------------ 1 +2.50000E+001 2 +6.50000E+00 PARTNO STREET CITY COUNTRY ------ ------------------- -------------- ------- 1234 22 Railway Cuttings East Cheam England 2345 The Warren Watership Down England
Für diese Tabellen wird folgender ESQL-Code für eine Umwandlung erstellt:
-- Erstellen einer gültigen Ausgabenachricht SET OutputRoot.MQMD = InputRoot.MQMD; -- Auswählen geeigneter Rechnungen SET OutputRoot.XML.Data.Statement[] = (SELECT I.CustomerNumber AS Customer.Number, A.Street AS Customer.Street, A.City AS Customer.Town, A.Country AS Customer.Country, -- Auswählen geeigneter Elemente (SELECT II.PartNumber AS PartNumber, II.Quantity AS Quantity, PI.Price AS Price FROM Database.db2admin.Prices AS PI, I.Item[] AS II WHERE II.PartNumber = PI.PartNo ) AS Purchases.Item[] FROM Database.db2admin.Addresses AS A, InputRoot.XML.Data.Invoice[] AS I WHERE I.CustomerNumber = A.PartNo );
Als Ergebnis wird folgende Ausgabenachricht generiert. Die Eingabenachricht wird um den Preis und die Adressinformationen aus den Datenbanktabellen erweitert:
<Data> <Statement> <Customer> <Number>1234</Number> <Street>22 Railway Cuttings</Street> <Town>East Cheam</Town> <Country>England</Country> </Customer> <Purchases> <Item> <PartNumber>1</PartNumber> <Quantity>9876</Quantity> <Price>2.5E+1</Price> </Item> <Item> <PartNumber>2</PartNumber> <Quantity>8765</Quantity> <Price>6.5E+1</Price> </Item> </Purchases> </Statement> <Statement> <Customer> <Number>2345</Number> <Street>The Warren</Street> <Town>Watership Down</Town> <Country>England</Country> </Customer> <Purchases> <Item> <PartNumber>1</PartNumber> <Quantity>6543</Quantity> <Price>2.5E+1</Price></Item> <Item> <PartNumber>2</PartNumber> <Quantity>7654</Quantity> <Price>6.5E+1</Price> </Item> </Purchases> </Statement> </Data>
Sie können die SELECT-Anweisung für die Datenbank in der SELECT-Anweisung für die Nachricht verschachteln. Dies ist in den meisten Fällen zwar nicht so effizient wie das vorherige Beispiel, aber möglicherweise ist es Ihnen lieber, wenn die Nachrichten kurz und die Datenbanktabellen groß sind.
-- Erstellen einer gültigen Ausgabenachricht SET OutputRoot.MQMD = InputRoot.MQMD; -- Auswählen geeigneter Rechnungen SET OutputRoot.XML.Data.Statement[] = (SELECT I.CustomerNumber AS Customer.Number, -- Suchen der Adresse THE ( SELECT A.Street, A.City AS Town, A.Country FROM Database.db2admin.Addresses AS A WHERE A.PartNo = I.CustomerNumber ) AS Customer, -- Auswählen geeigneter Elemente (SELECT II.PartNumber AS PartNumber, II.Quantity AS Quantity, -- Suchen des Preises THE (SELECT ITEM P.Price FROM Database.db2admin.Prices AS P WHERE P.PartNo = II.PartNumber ) AS Price FROM I.Item[] AS II ) AS Purchases.Item[] FROM InputRoot.XML.Data.Invoice[] AS I );