Sie können SELECT-Anweisungen verwenden, die mit Nachrichtendaten und Datenbanken interagieren. Sie können auch eine SELECT-Anweisung, die mit einem Datentyp interagiert, und eine SELECT-Anweisung, die mit dem anderen Typ interagiert, ineinander verschachteln.
Sehen Sie sich folgende Eingabenachricht an, die Rechnungsinformationen 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>
Sehen Sie sich die folgenden Datenbanktabellen 'Prices' (Preise) und 'Addresses' (Adressen) und deren Inhalt an:
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
Wenn Sie folgende ESQL-Umwandlung codieren:
-- Create a valid output message SET OutputRoot.MQMD = InputRoot.MQMD; -- Select suitable invoices 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, -- Select suitable items (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 );
wird folgende Ausgabenachricht generiert. Die Eingabenachricht wird um die Preis- und Adressinformationen aus der Datenbanktabelle 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 Datenbanken in die SELECT-Anweisung für Nachrichten einfügen. In den meisten Fällen ist dies nicht so effizient wie im vorherigen Beispiel, aber wenn die Nachrichten klein und die Datenbanktabellen groß sind, kann dies die bessere Lösung sein.
-- Create a valid output message SET OutputRoot.MQMD = InputRoot.MQMD; -- Select suitable invoices SET OutputRoot.XML.Data.Statement[] = (SELECT I.CustomerNumber AS Customer.Number, -- Look up the address THE ( SELECT A.Street, A.City AS Town, A.Country FROM Database.db2admin.Addresses AS A WHERE A.PartNo = I.CustomerNumber ) AS Customer, -- Select suitable items (SELECT II.PartNumber AS PartNumber, II.Quantity AS Quantity, -- Look up the price 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 );