Puede utilizar sentencias SELECT que interactúan con datos de mensajes y con bases de datos. También puede anidar una sentencia SELECT que interactúe con un tipo de datos en una sentencia 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>
Considere 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.XML.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.XML.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 base de datos SELECT en la sentencia SELECT del mensaje. En la mayor parte de los casos, no es tan eficaz como el ejemplo anterior pero es posible que le resulte mejor si los mensajes son pequeños y las tablas de base de datos son grandes.
-- Crear un mensaje de salida válido SET OutputRoot.MQMD = InputRoot.MQMD; -- Seleccionar facturas adecuadas SET OutputRoot.XML.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.XML.Data.Invoice[] AS I );