Transformando uma Mensagem XML Complexa

Ao codificar o ESQL para um nó Compute, utilize a instrução SELECT para executar transformação de mensagens complexas.

Exemplos

Reveja os exemplos a seguir e modifique-os para utilização. Eles são baseados na mensagem Fatura como entrada:

Neste exemplo, Fatura contém um número variável de Itens. A transformação é mostrada abaixo:

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'
    );

A mensagem de saída gerada é:

<Dados>
    <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>

Essa transformação possui duas SELECTs aninhadas uma dentro da outra. A externa opera na lista de Faturas. A interna opera na lista de Itens. A cláusula AS associada ao SELECT interno espera uma 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[],

Isto instrui a select externa a esperar um número variável de Itens em cada resultado. Cada SELECT possui seu próprio nome de correlação: I para o select externo e II para o interno. Normalmente cada SELECT utiliza seu próprio nome de correlação, mas a cláusula FROM da SELECT interna faz referência ao nome de correlação da 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[],

Isto instrui a SELECT interna a funcionar com os Itens da Fatura atual. As duas SELECTs contêm cláusulas WHERE. A externa utiliza um critério para descartar alguns Clientes e a interna utiliza um critério diferente para descartar alguns Itens. O exemplo também mostra a utilização de COALESCE para evitar que campos de entrada ausentes façam com que o campo de saída correspondente fique ausente. Por último, também utiliza a função de coluna SUM para incluir o valor de todos os Itens em cada Fatura. As funções de coluna são discutidas em Referenciando as Colunas em um Banco de Dados.

Quando os campos Desc são criados, todo o campo Título de entrada é copiado: ou seja, os atributos XML e o valor do campo. Se não desejar esses atributos na mensagem de saída, poderá utilizar a função FIELDVALUE para descartá-los. Por exemplo, codifique o seguinte ESQL:

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'
    );

Isso gera a seguinte mensagem de saída:

<Dados>
    <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>
Conceitos relacionados
Visão Geral de Fluxos de Mensagens
Visão Geral do ESQL
Modelagem de Mensagens
Tarefas relacionadas
Projetando um Fluxo de Mensagens
Definindo o Conteúdo do Fluxo de Mensagens
Gerenciando Arquivos ESQL
Tratando de Grandes Mensagens XML
Referências relacionadas
Nó Compute
Nó Database
Nó Filter
Referência de ESQL
Função CAST
Função COALESCE
Função SELECT
Instrução SET
Mensagem de Exemplo
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2006 Última Atualização: 1 Sep 2006
ak05750_