Transformación de un mensaje XML complejo

Cuando codifique ESQL para un nodo Compute, utilice la sentencia SELECT para la transformación de mensajes complejos.

Ejemplos

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