Transformación de un mensaje XML complejo

Cuando codifique ESQL para un nodo Compute, utilice la sentencia SELECT para transformar mensajes complejos.

Ejemplos

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>
Conceptos relacionados
Visión general de flujos de mensajes
Visión general de ESQL
Modelado de mensajes
Tareas relacionadas
Diseñar un flujo de mensajes
Definir el contenido del flujo de mensajes
Gestión de archivos ESQL
Manejar mensajes XML grandes
Referencia relacionada
Nodo Compute
Nodo Database
Nodo Filter
Referencia de ESQL
Función CAST
Función COALESCE
Función SELECT
Sentencia SET
Mensaje de ejemplo
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
ak05750_