La sentencia DECLARE define una variable, el tipo de datos de la variable y, opcionalmente, su valor inicial.
Consulte también la opción ATOMIC de la Sentencia BEGIN ... END. La construcción BEGIN ATOMIC es útil cuando deben realizarse varios cambios en una variable compartida y es importante evitar que otras instancias vean los estados intermedios de los datos.
Utilice CONSTANT para definir una constante. Puede declarar constantes en sentencias compuestas, esquemas, módulos o rutinas (tanto implícita como explícitamente). El comportamiento de estos casos es el siguiente:
Una constante o variable declarada en una rutina solapa cualquier parámetro del mismo nombre y todas las constantes y variables del mismo nombre declaradas en el módulo o esquema que la contiene.
Utilice EXTERNAL para indicar una UDP (propiedad definida por el usuario). Una UDP es una constante definida por el usuario cuyo valor inicial (establecido opcionalmente mediante una sentencia DECLARE) lo puede modificar, durante el diseño, el Editor de flujos de mensajes o lo puede alterar temporalmente, durante el despliegue, el Editor de archivador de intermediario. Su valor no se puede modificar mediante ESQL.
Para obtener una visión general de las UDP, consulte Propiedades definidas por el usuario en ESQL.
Cuando se da un valor inicial a la UDP en la sentencia DECLARE, éste pasa a ser su valor por omisión. Sin embargo, cualquier valor especificado por el editor de flujos de mensajes durante el diseño o por el editor BAR durante el despliegue (incluso una serie de longitud cero) alterará temporalmente cualquier valor inicial codificado en la sentencia DECLARE.
Todas las UDP en un flujo de mensajes deben tener un valor, proporcionado mediante una sentencia DECLARE, o el flujo de mensajes o el editor BAR; de lo contrario, se produce un error en tiempo de despliegue. En la ejecución, después de que la UDP se haya declarado, el valor se puede consultar mediante sentencias ESQL subsiguientes pero no se puede modificar.
La ventaja de las UDP es que el personal de operaciones puede cambiar los valores en el tiempo de despliegue. Por ejemplo, si utiliza las UDP para que contengan datos de configuración, significa que puede configurar un flujo de mensajes para una máquina, una tarea o un entorno determinados durante el despliegue, sin tener que cambiar el código a nivel de nodo.
Las UDP sólo se pueden declarar en módulos o esquemas.
Tenga cuidado al especificar el tipo de datos de una UDP, porque se produce un CAST para efectuar una transformación CAST en el TipoDatos solicitado.
DECLARE mycolour EXTERNAL CHARACTER ‘blue';
DECLARE TODAYSCOLOR EXTERNAL CHARACTER; SET COLOR = TODAYSCOLOR;donde TODAYSCOLOR es una propiedad definida por el usuario que tiene el valor TYPE de CHARACTER y el valor de VALUE establecido por el editor de flujos de mensajes.
Utilice NAME para definir un alias (otro nombre) por el que se conozca una variable.
-- La sentencia siguiente proporciona el alias 'Joe' a Schema1. DECLARE Schema1 NAME 'Joe'; -- La sentencia siguiente crea un campo denominado 'Joe'. SET OutputRoot.XML.Data.Schema1 = 42; -- La sentencia siguiente inserta un valor en una tabla denominada Table1 -- del esquema denominado 'Joe'. INSERT INTO Database.Schema1.Table1 (Answer) VALUES 42;
DECLARE Schema1 EXTERNAL NAME; CREATE FIRSTCHILD OF OutputRoot.XML.TestCase.Schema1 Domain('XML') NAME 'Node1' VALUE '1'; -- Si a Schema1 se le da el valor 'red', el resultado sería: <xml version="1.0"?> <TestCase> <red> <Node1>1</Node1> </red>
Utilice NAMESPACE para definir un alias (otro nombre) por el que se conozca un espacio de nombres.
En este ejemplo se utiliza una declaración de espacio de nombres, su uso como SpaceId en una vía de acceso y su uso como una constante de carácter en una expresión de espacio de nombres:
DECLARE prefixOne NAMESPACE 'http://www.example.com/PO1'; -- En el lado derecho de la asignación se está utilizando una constante -- de espacio de nombres como tal, mientras que en el lado izquierdo -- se utiliza una como una constante ordinaria (es decir, en una expresión). SET OutputRoot.XML.{prefixOne}:{'PurchaseOrder'} = InputRoot.XML.prefixOne:PurchaseOrder;
Utilice SHARED para definir una variable compartida. Las variables compartidas son reservadas para el flujo (si se declaran dentro de un esquema) o el nodo (si se declaran dentro de un módulo) pero se comparten entre las instancias del flujo (hebras). No hay ningún tipo de variable que sea visible más ampliamente que a nivel de flujo. Por ejemplo, no puede compartir variables entre grupos de ejecución.
Las variables compartidas pueden utilizarse para implementar una memoria caché interna en el flujo de mensajes, consulte Optimizar los tiempos de respuesta de los flujos de mensajes. Las variables compartidas tienen una gran duración y son visibles para múltiples mensajes que pasan por un flujo, consulte Variables de larga duración. Su duración es la misma que el proceso del grupo de ejecución, la duración del flujo o nodo, o la duración del SQL del nodo que declara la variable (el que sea menor). Se inicializan cuando el primer mensaje pasa por el flujo o el nodo después de cada inicio de intermediario.
No se puede definir una variable compartida dentro de una función o procedimiento.
Estas variables de lectura-escritura, con una duración mayor que la de un mensaje pero con un rendimiento superior a una base de datos, son ideales para usuarios dispuestos a sacrificar las ventajas de permanencia y transaccionalidad de las bases de datos para obtener un mayor rendimiento.
Con las variables compartidas por flujos (es decir, las definidas a nivel de esquema), tenga cuidado cuando varios flujos puedan actualizar las variables, especialmente si la variable se utiliza como contador. Asimismo, con variables compartidas por nodos (es decir, las definidas a nivel de módulo), tenga cuidado cuando varias instancias puedan actualizarlas.
Las variables de fila compartidas permiten que un programa de usuario realice una copia eficaz de lectura/escritura del mensaje de un nodo de entrada. Normalmente, esta característica es muy útil y, concretamente, simplifica la técnica para manejar mensajes grandes.
Hay una restricción por la cual los subárboles no pueden copiarse directamente de una variable de fila compartida a otra. Los subárboles puede copiarse indirectamente utilizando una variable de fila no compartida. Los valores escalares extraídos de una variable de fila compartida (utilizando la función FIELDVALUE) pueden copiarse a otra variable de fila compartida.
Para obtener un ejemplo del uso de las variables compartidas, consulte el programa de ejemplo "Direccionamiento de mensajes", que muestra cómo utilizar tanto las variables compartidas como las externas. El ejemplo "Dirección de mensajes" está en la Galería de ejemplos en el Kit de herramientas de Message Brokers.