Revise los ejemplos siguientes y modifíquelos para utilizarlos como desee. Todos están basados en el mensaje Invoice como entrada:
En este ejemplo, Invoice contiene un número variable de Items. La transformación se muestra a continuación:
SET OutputRoot.XML.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.XML.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 dos SELECT anidadas una dentro de la otra. La externa opera en la lista de Invoices. La interna opera en la lista de Items. La cláusula AS asociada a la sentencia 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[],
Esto indica a la sentencia externa que espere un número variable de Items en cada resultado. Cada SELECT tiene su propio nombre de correlación: I para SELECT externa y II para SELECT interna. Generalmente, cada SELECT utiliza su propio nombre de correlación pero la cláusula FROM de SELECT hace referencia al nombre de correlación de 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[],
Esto indica a la sentencia SELECT interna que trabaje con los Items de Invoice actual. Ambas sentencias SELECT contienen cláusulas WHERE. La externa utiliza un criterio para descartar a determinados clientes y la interna utiliza un criterio diferente para descartar determinados Items. Asimismo, el ejemplo muestra el uso de COALESCE para impedir que los campos que faltan hagan que falte 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 que estos atributos estén en el mensaje de salida, puede utilizar la función FIELDVALUE para descartarlos, por ejemplo, codifique el ESQL siguiente:
SET OutputRoot.XML.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.XML.Invoice[] AS I WHERE I.Customer.LastName <> 'Brown' );
Que 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>