Enlace de datos de mensajes XML y tablas de base de datos

Puede utilizar sentencias SELECT que interactúan con datos de mensajes y con bases de datos. También puede anidar una sentencia SELECT que interactúe con un tipo de datos en una sentencia SELECT que interactúe con el otro tipo.

Considere el siguiente mensaje de entrada que contiene información de facturas para dos clientes:

<Data>
  <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 las siguientes tablas de base de datos Prices y Addresses y su contenido:

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

Si codifica la siguiente transformación ESQL:

-- Crear un mensaje de salida válido
SET OutputRoot.MQMD = InputRoot.MQMD; 

-- Seleccionar facturas adecuadas
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,

        -- Seleccionar elementos adecuados
          (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
    );

se genera el siguiente mensaje de salida. El mensaje de entrada se aumenta con la información de precio y dirección de la tabla de base de datos.

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

Puede anidar la base de datos SELECT en la sentencia SELECT del mensaje. En la mayor parte de los casos, no es tan eficaz como el ejemplo anterior pero es posible que le resulte mejor si los mensajes son pequeños y las tablas de base de datos son grandes.

-- Crear un mensaje de salida válido
SET OutputRoot.MQMD = InputRoot.MQMD; 

-- Seleccionar facturas adecuadas
SET OutputRoot.XML.Data.Statement[] =
    (SELECT I.CustomerNumber                  AS Customer.Number,

        -- Buscar la dirección
        THE ( SELECT 
                  A Street,
                  A.City    AS Town,
                  A.Country
                FROM Database.db2admin.Addresses AS A
                WHERE A.PartNo = I.CustomerNumber
            )                             AS Customer,

        -- Seleccionar elementos adecuados
        (SELECT 
            II.PartNumber AS PartNumber,
            II.Quantity   AS Quantity,

            -- Buscar el precio
            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
    );
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
Referencia relacionada
Nodo Compute
Nodo Database
Nodo Filter
Referencia de ESQL
Función SELECT
Sentencia SET
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
ak05780_