Revise los ejemplos siguientes y modifíquelos para su propio uso. Todos se basan en el mensaje Invoice como entrada:
En este ejemplo, Invoice contiene un número variable de Elementos. 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 que se genera 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 sentencias SELECT anidadas una en el interior de la otra. La externa opera en la lista de facturas (Invoices). La interna opera en la lista de elementos (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 ) -- Note the use of [] in the next expression AS Purchases.Article[],
Indica a la SELECT externa que espere un número variable de elementos en cada resultado. Cada SELECT tiene su propio nombre de correlación: I para la SELECT externa y II para la interna. Cada SELECT utiliza normalmente su propio nombre de correlación, pero la cláusula FROM de la SELECT interna hace referencia al nombre de correlación de la SELECT externa:
(SELECT II.Title AS Desc, CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost, II.Quantity AS Qty -- Note the use of I.Purchases.Item in the next expression FROM I.Purchases.Item[] AS II WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],
Indica a la SELECT interna que trabaje con los elementos de la factura (Invoice) actual. Ambas sentencias SELECT contienen cláusulas WHERE. La externa utiliza un criterio para descartar a ciertos clientes, mientras que la interna usa un criterio diferente para descartar ciertos elementos. El ejemplo también muestra el uso de COALESCE para evitar que la falta de campos de entrada cause la falta del campo de salida correspondiente. Finalmente, también utiliza la función de columna SUM para sumar el valor de todos los elementos de cada factura. Las funciones de columna se describen en el apartado Referencia a columnas en una base de datos.
Cuando se crean los campos Desc, se copia el campo de entrada Title entero: los atributos XML y el valor del campo. Si no desea que estos atributos aparezcan 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' );
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>
Conceptos relacionados
Flujos de mensajes
ESQL
Diseño de mensajes
Tareas relacionadas
Diseño de un flujo de mensajes
Definición del contenido del flujo de mensajes
Gestión de archivos ESQL
Manejo de mensajes XML grandes
Referencia relacionada
Nodo Compute
Nodo Database
Nodo Filter
ESQL
Función CAST
Función COALESCE
Función SELECT
Sentencia SET
Mensaje de ejemplo
Avisos |
Marcas registradas |
Descargas |
Biblioteca |
Soporte |
Información de retorno (feedback)
![]() ![]() |
ak05750_ |