WebSphere Message Broker, Versión 8.0.0.5 Sistemas operativos: AIX, HP-Itanium, Linux, Solaris, Windows, z/OS

Consulte la información sobre la última versión del producto en IBM Integration Bus, Versión 9.0

Selección de datos de las columnas de base de datos

Puede configurar un nodo Compute, Filter o Database para seleccionar datos de columnas de la base de datos e incluirlos en un mensaje de salida.

El ejemplo siguiente presupone que tiene una tabla de base de datos denominada USERTABLE con dos columnas de tipo de datos char(6) (o equivalente), denominadas Column1 y Column2. La tabla contiene dos filas:

  Column1 Column2
Fila 1 value1 value2
Fila 2 value3 value4

Configure los nodos Compute, Filter o Database para identificar la base de datos en la que ha definido la tabla. Por ejemplo, si está utilizando la base de datos predeterminada (especificada en la propiedad origen de datos del nodo), pulse el botón derecho del ratón en el nodo, seleccione Abrir ESQL y codifique las siguientes sentencias ESQL en el módulo de este nodo:

SET OutputRoot = InputRoot;
DELETE FIELD OutputRoot.*[<];
SET OutputRoot.XML.Test.Result[] =
  (SELECT T.Column1, T.Column2 FROM Database.USERTABLE AS T);

Este ESQL produce el siguiente mensaje de salida:

Figura 1. Mensaje de salida
<Test>
   <Result>
      <Column1>value1</Column1>
      <Column2>value2</Column2>
   </Result>
   <Result>
      <Column1>value3</Column1>
      <Column2>value4</Column2>
   </Result>
</Test>
Para desencadenar la sentencia SELECT, envíe un mensaje desencadenante con un texto XML que tenga el formato siguiente:
<Test>
   <Result>
      <Column1></Column1>
      <Column2></Column2>
   </Result>
   <Result>
      <Column1></Column1>
      <Column2></Column2>
   </Result>
</Test>

La estructura exacta del XML no es importante pero el código final debe ser <Test> para que coincida con la referencia del ESQL. Si el código final no es <Test>, las sentencias ESQL resultantes forman códigos finales de nivel superior, lo cual no es XML válido.

Si desea crear un mensaje de salida que incluya todas las columnas de todas las filas que cumplen con una condición determinada, utilice la sentencia SELECT con una cláusula WHERE:

-- Declarar e inicializar una variable que contenga el 
--      valor de test (en este caso el apellido Smith)
DECLARE CurrentCustomer STRING 'Smith';

-- Cree un bucle por los registros de la tabla para extraer la información coincidente
SET OutputRoot.XML.Invoice[] = 
    (SELECT R FROM Database.USERTABLE AS R
              WHERE R.Customer.LastName = CurrentCustomer
    );

Los campos de mensajes se crean en el mismo orden en el que aparecen las columnas de la tabla.

Si está familiarizado con SQL en un entorno de base de datos, es posible que espere poder codificar SELECT *. El intermediario no acepta esta sintaxis porque debe iniciar todas las referencias a columnas con un nombre de correlación para evitar ambigüedades con variables declaradas. Asimismo, si codifica SELECT I.*, el intermediario aceptará la sintaxis, pero el asterisco, *, se interpretará como el primer elemento hijo, no como todos los elementos, como podría esperarse de otro SQL de base de datos.

La asignación del conjuntos de resultados de una base de datos a un árbol de mensaje propiedad de un analizador requiere que el conjunto de resultados coincida exactamente con la definición de mensaje. Puesto que el analizador XML genérico es autodefinido, el ejemplo crea un nuevo subárbol fuera de la carpeta Invoice y el analizador puede analizar los nuevos elementos en subárbol. Si la estructura del conjunto de resultados coincide exactamente con la definición de mensaje, el conjunto de resultados puede asignarse directamente al árbol del cuerpo de mensaje OutputRoot.

Si la estructura del conjunto de resultados no coincide exactamente con la definición de mensaje MRM, primero debe asignar el conjunto de resultados a un tipo de datos ROW o a un árbol de entorno que no tenga ningún analizador asociado a él.

Entonces, pueden asignarse los datos necesarios a OutputRoot para crear un árbol de mensaje que se ajuste a la definición de mensaje.

Selección de datos de una tabla de un sistema de base de datos sensible a mayúsculas y minúsculas

Si el sistema de base de datos es sensible a las mayúsculas y minúsculas, debe utilizar un método alternativo. Este método también es necesario, si desea modificar el nombre del campo generado por algo diferente:

SET OutputRoot = InputRoot;
SET OutputRoot.XML.Test.Result[] =
  (SELECT T.Column1 AS Column1, T.Column2 AS Column2
  FROM Database.USERTABLE AS T);

Este ejemplo genera el mensaje de salida tal como se muestra en Figura 1. Asegúrese de que las referencias a columnas de base de datos (en este ejemplo, T.Column1 y T.Column2) se especifiquen con las mayúsculas y minúsculas correctas, de modo que coincidan exactamente con las definiciones de la base de datos. Si las referencias que especifica no coinciden exactamente con las definiciones de la base de datos (por ejemplo si especifica T.COLUMN1), el intermediario genera un error en tiempo de ejecución. Column1 y Column2 se utilizan en la sentencia SELECT para comparar las columnas que se han definido en la base de datos, aunque aquí se pueden utilizar cualesquiera valores; no es necesario que los valores coincidan.

Selección de datos de corriente de bits de una base de datos

Estos ejemplos muestran cómo recuperar datos de corriente de bits XML de una base de datos y cómo incluirlos en un mensaje de salida. Consulte la Sentencia INSERT para ver ejemplos de cómo puede insertar datos de corriente de bits en una base de datos.
En el ejemplo siguiente, los datos de corriente de bits están contenidos en una columna de base de datos con un tipo de datos BLOB. La tabla de base de datos utilizada en el ejemplo (TABLE1) es la que se ha creado en los ejemplos de Sentencia INSERT y la tabla contiene las columnas siguientes:
  • MSGDATA
  • MSGCCSID
  • MSGENCODING

Si la corriente de bits de la base de datos no necesita ser consultado o manipulado por el flujo de mensajes, el mensaje de salida puede construirse en el dominio BLOB sin realizar ningún cambio.

En el ejemplo siguiente, los datos de mensaje, junto con la cabecera MQMD, están contenidos en una columna de base de datos con un tipo de datos BLOB. Para volver a crear el árbol de mensaje, incluida la cabecera MQMD, a partir de la corriente de bits, puede utilizar una sentencia CREATE con una cláusula PARSE y DOMAIN('MQMD'). A continuación, el flujo de mensajes puede modificar el mensaje de salida:
SET Environment.Variables.DBResult = THE( SELECT T.* FROM Database.TABLE1 AS T);
DECLARE resultRef REFERENCE TO Environment.Variables.DBResult;

IF LASTMOVE(resultRef) THEN

  DECLARE outMsg BLOB resultRef.MSGDATA;
  DECLARE outCCSID INT resultRef.MSGCCSID;
  DECLARE outEncoding INT resultRef.MSGENCODING;
  DECLARE outMsgPriority INT resultRef.MSGPRIORITY;
  DECLARE outMsgSeqNum INT resultRef.MSGSEQNUMBER;

  SET OutputRoot.Properties.CodedCharSetId = outCCSID;
  SET OutputRoot.Properties.Encoding = outEncoding;
  
  CREATE LASTCHILD OF OutputRoot DOMAIN('MQMD') PARSE(outMsg, outEncoding, outCCSID);
    
    SET OutputRoot.MQMD.Version = MQMD_VERSION_2;
  
  
  SET OutputRoot.MQMD.Priority = outMsgPriority;
  SET OutputRoot.MQMD.MsgSeqNumber = outMsgSeqNum;

  DECLARE HDRL INT ;                             
  SET HDRL = LENGTH(BITSTREAM(OutputRoot.MQMD)); 
  CREATE FIELD OutputRoot."BLOB"."BLOB";         
  DECLARE MSGB BLOB;                             
  SET MSGB = SUBSTRING(outMsg FROM HDRL +1);  
  SET OutputRoot."BLOB"."BLOB" = MSGB;           

END IF;

Si desea consultar o manipular una corriente de bits extraída de una base de datos, debe volver a crear el árbol de mensaje original. Para volver a crear el árbol de mensaje XML a partir de la corriente de bits, puede utilizar una sentencia CREATE con una cláusula PARSE. El flujo de mensajes puede entonces modificar el mensaje de salida.

Por ejemplo, puede crear una tabla de base de datos utilizando la siguiente sentencia:

INSERT INTO Database.TABLE1(MSGDATA, MSGENCODING, MSGCCSID) 
			VALUES (msgBitStream, inEncoding, inCCSID);

El siguiente fragmento de código muestra cómo volver a crear el árbol de mensaje en el dominio XMLNS utilizando os datos leídos en la tabla:

CALL CopyMessageHeaders();
  SET Environment.Variables.DBResult = THE( SELECT T.* FROM Database.TABLE1 AS T);
  DECLARE resultRef REFERENCE TO Environment.Variables.DBResult;
  IF LASTMOVE(resultRef) THEN
    DECLARE outCCSID INT resultRef.MSGCCSID;
    DECLARE outEncoding INT resultRef.MSGENCODING;
    DECLARE outMsg BLOB resultRef.MSGDATA;
    SET OutputRoot.Properties.CodedCharSetId = outCCSID;
    SET OutputRoot.Properties.Encoding = outEncoding;
    CREATE LASTCHILD OF OutputRoot DOMAIN('XMLNS') PARSE(outMsg, outEncoding, outCCSID);
    -- Ahora modifique los campos del árbol de mensaje 
    SET OutputRoot.XMLNS.A.B = 4;
    SET OutputRoot.XMLNS.A.E = 5;
  END IF;

En el ejemplo siguiente, los datos están contenidos en una columna de base de datos con un tipo de datos de caracteres, como CHAR o VARCHAR. Se utiliza una transformación CAST para convertir los datos extraídos de la base de datos al formato BLOB. Si los datos de corriente de bits de la base de datos no necesitan ser consultados o manipulados por el flujo de mensajes, el mensaje de salida puede construirse en el dominio BLOB sin realizar ningún cambio:

CALL CopyMessageHeaders();
  SET Environment.Variables.DBResult = THE( SELECT T.* FROM Database.TABLE1 AS T);
  DECLARE resultRef REFERENCE TO Environment.Variables.DBResult;
  IF LASTMOVE(resultRef) THEN
    DECLARE outCCSID INT resultRef.MSGCCSID;
    DECLARE outMsg BLOB CAST(resultRef.MSGDATA AS BLOB CCSID outCCSID);
    SET OutputRoot.Properties.CodedCharSetId = outCCSID;
    SET OutputRoot.Properties.Encoding = resultRef.MSGENCODING;
    SET OutputRoot.BLOB.BLOB = outMsg;
  END IF;

En el ejemplo siguiente, los datos están contenidos en una columna de base de datos con un tipo de datos de caracteres, como CHAR o VARCHAR. Se utiliza una transformación CAST para convertir los datos extraídos de la base de datos al formato BLOB. Para manipular o consultar estos datos dentro del flujo de mensajes, debe volver a crear el árbol de mensaje original. En este ejemplo, se utiliza una sentencia CREATE con una cláusula PARSE para volver a crear el árbol de mensaje XML en el dominio XMLNS.

CALL CopyMessageHeaders();
  SET Environment.Variables.DBResult = THE( SELECT T.* FROM Database.TABLE1 AS T);
  DECLARE resultRef REFERENCE TO Environment.Variables.DBResult;
  IF LASTMOVE(resultRef) THEN
    DECLARE outCCSID INT resultRef.MSGCCSID;
    DECLARE outEncoding INT resultRef.MSGENCODING;
    DECLARE outMsg BLOB CAST(resultRef.MSGDATA AS BLOB CCSID outCCSID);
    SET OutputRoot.Properties.CodedCharSetId = outCCSID;
    SET OutputRoot.Properties.Encoding = outEncoding;
    CREATE LASTCHILD OF OutputRoot DOMAIN('XMLNS') PARSE(outMsg, outEncoding, outCCSID);
    -- Ahora modifique los campos del árbol de mensaje 
    SET OutputRoot.XMLNS.A.B = 4;
    SET OutputRoot.XMLNS.A.E = 5;
  END IF;

Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Comentarios

Copyright IBM Corporation 1999, 2014Copyright IBM Corporation 1999, 2014.

        
        Última actualización:
        
        Última actualización: 2015-02-28 16:59:59


Tema de tareaTema de tarea | Versión 8.0.0.5 | ak05810_