Unindo Dados de Mensagens XML e Tabelas do Banco de Dados

Você pode utilizar instruções SELECT que interagem com dados da mensagem e com bancos de dados. Você pode aninhar também uma SELECT que interage com um tipo de dados em uma SELECT que interage com o outro tipo.

Considere a seguinte mensagem de entrada que contém informações de fatura para dois clientes:

<Dados>
     <Invoice>
        <CustomerNumber>1234</CustomerNumber>
     <Item>
              <PartNumber>1</PartNumber>
              <Quantity>9876</Quantity>
     </Item>
     <Item>
              <PartNumber>2</PartNumber>
              <Quantity>8765</Quantity>
     </Item>
   </Invoice>
     <Invoice>
        <CustomerNumber>2345</CustomerNumber>
     <Item>
              <PartNumber>2</PartNumber>
              <Quantity>7654</Quantity>
     </Item>
     <Item>
              <PartNumber>1</PartNumber>
            <Quantity>6543</Quantity>
     </Item>
   </Invoice>
</Data>

Considere as seguintes tabelas do banco de dados Prices e Addresses e seu conteúdo:

PARTNO      PRICE
----------- ------------------------
                    1            +2.50000E+001
                    2            +6.50000E+00



PARTNO      STREET                CITY             COUNTRY
------      -------------------   --------------   ------- 
1234        22 Railway Cuttings   East Cheam       England
2345        The Warren            Watership Down   England

Se você codificar a seguinte transformação ESQL:

-- Create a valid output message
SET OutputRoot.MQMD = InputRoot.MQMD;

-- Select suitable invoices
SET OutputRoot.XML.Data.Statement[] =
       (SELECT I.CustomerNumber                  AS Customer.Number,
                      A.Street                                 AS Customer.Street,
                      A.City                                   AS Customer.Town,
                      A.Country                                AS Customer.Country,

                -- Select suitable items
                    (SELECT II.PartNumber AS PartNumber,
                              II.Quantity   AS Quantity,
                                    PI.Price      AS Price
                      FROM Database.db2admin.Prices AS PI,
                              I.Item[]                 AS II
                      WHERE II.PartNumber = PI.PartNo     )    AS Purchases.Item[]
      
        FROM Database.db2admin.Addresses  AS A,
                  InputRoot.XML.Data.Invoice[] AS I
           
        WHERE I.CustomerNumber = A.PartNo
    );

é gerada a seguinte mensagem de saída. A mensagem de entrada foi aumentada com informações de preço e de endereço a partir da tabela do banco de dados:

<Dados>
     <Statement>
         <Customer>
            <Number>1234</Number>
            <Street>22 Railway Cuttings</Street>
            <Town>East Cheam</Town>
            <Country>England</Country>
         </Customer>
         <Purchases>
       <Item>
                <PartNumber>1</PartNumber>
                <Quantity>9876</Quantity>
                <Price>2.5E+1</Price>
       </Item>
       <Item>
                <PartNumber>2</PartNumber>
                <Quantity>8765</Quantity>
                <Price>6.5E+1</Price>
       </Item>
         </Purchases>
     </Statement>
     <Statement>
         <Customer>
            <Number>2345</Number>
            <Street>The Warren</Street>
            <Town>Watership Down</Town>
            <Country>England</Country>
         </Customer>
         <Purchases>
       <Item>
                <PartNumber>1</PartNumber>
                <Quantity>6543</Quantity>
                <Price>2.5E+1</Price></Item>
       <Item>
                <PartNumber>2</PartNumber>
                <Quantity>7654</Quantity>
                <Price>6.5E+1</Price>
       </Item>
         </Purchases>
     </Statement>
</Data>

Você pode aninhar SELECT do banco de dados na instrução SELECT da mensagem. Na maioria dos casos, isso não é tão eficiente quanto o exemplo anterior, mas você pode achar que é o melhor se as mensagens forem pequenas e as tabelas do banco de dados forem grandes.

-- Create a valid output message
SET OutputRoot.MQMD = InputRoot.MQMD;

-- Select suitable invoices
SET OutputRoot.XML.Data.Statement[] =
        (SELECT I.CustomerNumber                  AS Customer.Number,

                -- Look up the address
                THE ( SELECT
                                    A.Street,
                                    A.City    AS Town,
                                    A.Country
                                FROM Database.db2admin.Addresses AS A
                                WHERE A.PartNo = I.CustomerNumber
                        )                             AS Customer,

                -- Select suitable items
        (SELECT
                        II.PartNumber AS PartNumber,
                        II.Quantity   AS Quantity,

                        -- Look up the price
                        THE (SELECT ITEM P.Price
                            FROM Database.db2admin.Prices AS P
                            WHERE P.PartNo = II.PartNumber
                        )             AS Price

                    FROM I.Item[] AS II           ) AS Purchases.Item[]
      
         FROM InputRoot.XML.Data.Invoice[] AS I
    );
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
Referências relacionadas
Nó Compute
Nó Database
Nó Filter
Referência de ESQL
Função SELECT
Instrução SET
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2006 Última Atualização: 1 Sep 2006
ak05780_