Cuando codifique el ESQL para un nodo Compute, utilice la función SELECT para la transformación de mensajes complejos.
En este ejemplo, Invoice contiene un número variable de Items. La transformación se muestra en el siguiente ejemplo:
SET OutputRoot.XMLNS.Data.Statement[] =
(SELECT I.Customer.Title AS Customer.Title,
I.Customer.FirstName || ' ' || I.Customer.LastName AS Customer.Name,
COALESCE(I.Customer.PhoneHome,'') AS Customer.Phone,
(SELECT II.Title AS Desc,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity AS Qty
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],
(SELECT SUM( CAST(II.UnitPrice AS FLOAT) *
CAST(II.Quantity AS FLOAT) *
1.6 )
FROM I.Purchases.Item[] AS II ) AS Amount,
'Dollars' AS Amount.(XML.Attribute)Currency
FROM InputRoot.XMLNS.Invoice[] AS I
WHERE I.Customer.LastName <> 'Brown'
);
El mensaje de salida generado es:
<Data>
<Statement>
<Customer>
<Title>Mr</Title>
<Name>Andrew Smith</Name>
<Phone>01962818000</Phone>
</Customer>
<Purchases>
<Article>
<Desc Category="Computer" Form="Paperback" Edition="2">The XML Companion</Desc>
<Cost>4.472E+1</Cost>
<Qty>2</Qty>
</Article>
<Article>
<Desc Category="Computer" Form="Paperback" Edition="2">
A Complete Guide to DB2 Universal Database</Desc>
<Cost>6.872E+1</Cost>
<Qty>1</Qty>
</Article>
<Article>
<Desc Category="Computer" Form="Hardcover" Edition="0">JAVA 2 Developers Handbook</Desc>
<Cost>9.5984E+1</Cost>
<Qty>1</Qty>
</Article>
</Purchases>
<Amount Currency="Dollars">2.54144E+2</Amount>
</Statement>
</Data>
Esta transformación tiene cláusulas SELECT anidadas. La sentencia externa operan en la lista de Invoices. La sentencia interna opera en la lista de Items. La cláusula AS asociada con la cláusula SELECT interna espera una matriz:
(SELECT II.Title AS Desc,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity AS Qty
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice > 0.0 )
-- Observe el uso de [] en la expresión siguiente
AS Purchases.Article[],
Esta sentencia indica a la cláusula SELECT externa que espere un número variable de elementos (Items) en cada resultado. Cada cláusula SELECT tiene su propio nombre de correlación: I para la cláusula SELECT externa y II para la interna. Normalmente cada cláusula SELECT utiliza su propio nombre de correlación, pero la cláusula FROM de la cláusula SELECT interna hace referencia al nombre de correlación de la cláusula SELECT externa:
(SELECT II.Title AS Desc,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity AS Qty
-- Observe el uso de I.Purchases.Item en la siguiente expresión
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice> 0.0 ) AS Purchases.Article[],
Esta sentencia indica a la cláusula SELECT interna que trabaje con los elementos de la factura actual. Ambas cláusulas SELECT contienen cláusulas WHERE. La externa utiliza un criterio para descartar determinados clientes y la interna utiliza un criterio diferente para descartar determinados elementos. El ejemplo también muestra el uso de COALESCE para impedir que los campos de entrada que faltan hagan que se omita el campo de salida correspondiente. Finalmente, también utiliza la función SUM de columna para sumar el valor de todos los Items de cada Invoice. Las funciones de columna se describen en Referencia a columnas de una base de datos.
Cuando se crean los campos Desc, se copia todo el campo Title de entrada: los atributos XML y el valor del campo. Si no desea estos atributos en el mensaje de salida, utilice la función FIELDVALUE para descartarlos; por ejemplo, codifique el siguiente ESQL:
SET OutputRoot.XMLNS.Data.Statement[] =
(SELECT I.Customer.Title AS Customer.Title,
I.Customer.FirstName || ' ' || I.Customer.LastName AS Customer.Name,
COALESCE(I.Customer.PhoneHome,'') AS Customer.Phone,
(SELECT FIELDVALUE(II.Title) AS Desc,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity AS Qty
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],
(SELECT SUM( CAST(II.UnitPrice AS FLOAT) *
CAST(II.Quantity AS FLOAT) *
1.6 )
FROM I.Purchases.Item[] AS II ) AS Amount,
'Dollars' AS Amount.(XML.Attribute)Currency
FROM InputRoot.XMLNS.Invoice[] AS I
WHERE I.Customer.LastName <> 'Brown'
);
Ese código genera el siguiente mensaje de salida:
<Data>
<Statement>
<Customer>
<Title>Mr</Title>
<Name>Andrew Smith</Name>
<Phone>01962818000</Phone>
</Customer>
<Purchases>
<Article>
<Desc>The XML Companion</Desc>
<Cost>4.472E+1</Cost>
<Qty>2</Qty>
</Article>
<Article>
<Desc>A Complete Guide to DB2 Universal Database</Desc>
<Cost>6.872E+1</Cost>
<Qty>1</Qty>
</Article>
<Article>
<Desc>JAVA 2 Developers Handbook</Desc>
<Cost>9.5984E+1</Cost>
<Qty>1</Qty>
</Article>
</Purchases>
<Amount Currency="Dollars">2.54144E+2</Amount>
</Statement>
</Data>