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
);