Você pode utilizar funções SELECT que interagem com dados da mensagem e com bancos de dados.
Você pode aninhar também uma função SELECT que interage com um tipo de dados em uma função SELECT que interage com o outro tipo.
Considere a seguinte mensagem de entrada que contém informações de fatura para dois clientes:
<Dados>
<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>
Considere as seguintes tabelas de banco de dados, Preços e Endereços e seus conteúdos:
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
Se você codificar a seguinte transformação ESQL:
-- 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
);
é gerada a seguinte mensagem de saída. A mensagem de entrada foi aumentada com informações de preço e de endereço a partir da tabela do banco de dados:
<Dados>
<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>
Você pode aninhar a cláusula SELECT do banco de dados na cláusula SELECT da mensagem. Na maioria dos casos, o código não é tão suficiente quanto o exemplo anterior, mas você pode achar melhor se as mensagens forem pequenas e as tabelas do banco de dados forem grandes.
-- 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
);