Sie können SELECT-Funktionen verwenden, die sowohl mit Nachrichtendaten als auch mit Datenbanken interagieren.
Sie können eine SELECT-Funktion, die mit einem dieser Datentypen interagiert, aber auch in eine SELECT-Klausel, die mit dem anderen Typ interagiert, 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>
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
Wenn Sie folgende ESQL-Umwandlung codieren:
-- Create a valid output message SET OutputRoot.MQMD = InputRoot.MQMD; -- Select suitable invoices SET OutputRoot.XMLNS.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.XMLNS.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-Klausel für die Datenbank in der SELECT-Klausel für die Nachricht verschachteln. Der Code 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.
-- Create a valid output message SET OutputRoot.MQMD = InputRoot.MQMD; -- Select suitable invoices SET OutputRoot.XMLNS.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.XMLNS.Data.Invoice[] AS I );