Puede utilizar funciones SELECT que interactúan con datos de mensajes y bases de datos.
También puede anidar una función SELECT que interactúe con un tipo de datos en una cláusula SELECT que interactúe con el otro tipo.
Considere el siguiente mensaje de entrada que contiene información de facturas para dos clientes:
<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>
Examine las siguientes tablas de base de datos, Prices y Addresses, y su contenido:
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
Si codifica la siguiente transformación ESQL:
-- Crear un mensaje de salida válido
SET OutputRoot.MQMD = InputRoot.MQMD;
-- Seleccionar facturas adecuadas
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,
-- Seleccionar elementos adecuados
(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
);
se genera el siguiente mensaje de salida. El mensaje de entrada se aumenta con la información de precio y dirección de la tabla de base de datos.
<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>
Puede anidar la cláusula SELECT de base de datos en la cláusula SELECT de mensaje. En la mayoría de los casos, el código no es tan eficaz como en el ejemplo anterior, pero es posible que considere que es mejor que los mensajes sean pequeños y las tablas de base de datos grandes.
-- Crear un mensaje de salida válido
SET OutputRoot.MQMD = InputRoot.MQMD;
-- Seleccionar facturas adecuadas
SET OutputRoot.XMLNS.Data.Statement[] =
(SELECT I.CustomerNumber AS Customer.Number,
-- Buscar la dirección
THE ( SELECT
A Street,
A.City AS Town,
A.Country
FROM Database.db2admin.Addresses AS A
WHERE A.PartNo = I.CustomerNumber
) AS Customer,
-- Seleccionar elementos adecuados
(SELECT
II.PartNumber AS PartNumber,
II.Quantity AS Quantity,
-- Buscar el precio
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
);