Sentencia SET

La sentencia SET evalúa expresión_origen y asigna el valor resultante a la entidad identificada por destino.

Sintaxis

El destino puede ser una variable declarada o un campo de un árbol de mensajes que se puede modificar; por ejemplo, Environment, InputLocalEnvironment, OutputLocalEnvironment, OutputRoot o OutputExceptionList.

Si el destino es una variable declarada, omita las cláusulas TYPE, NAME, NAMESPACE y VALUE. La expresión de origen debe devolver un valor escalar de un tipo que sea el mismo que el tipo de datos declarado de la variable, o que se pueda convertir a éste. Los valores NULL se manejan exactamente de la misma manera que cualquier otro valor.

Si el destino es un campo, se navega al mismo (creando los campos si es necesario) y su valor se establece de acuerdo a un conjunto de normas que dependen de la presencia o ausencia de las cláusulas TYPE, NAME, NAMESPACE o VALUE y el tipo de datos devuelto por la expresión de origen.

Si se utilizan índices de matriz en la referencia de campo, sólo se puede crear una instancia de un campo determinado. Si escribe una sentencia SET que empieza por:
SET OutputRoot.XML.Message.Structure[2].Field = ...
debe existir al menos una instancia de Estructura en el mensaje. Es decir, los únicos campos del árbol que se crean son los que están en una vía de acceso directa desde la raíz al campo identificado por la referencia de campo.

Si una cláusula TYPE está presente, el tipo del campo de destino se cambia por el devuelto por expresión_origen. Se emite una excepción si el resultado no es escalar, no es del tipo INTEGER, o es NULL.

Si una cláusula NAMESPACE está presente, se establece el espacio de nombres del elemento. Al establecer el espacio de nombres de un elemento se establece automáticamente su distintivo NAME.

Si una cláusula NAME está presente, el nombre del campo de destino se cambia por el devuelto por expresión_origen. Se emite una excepción si el resultado no es escalar, no es del tipo CHARACTER, o es NULL.

Si una cláusula VALUE está presente, el valor del campo de destino se cambia por el devuelto por expresión_origen. Se emite una excepción si el resultado no es escalar.

Si no utiliza cláusulas TYPE, NAME o VALUE (el caso más frecuente), el comportamiento dependerá de si expresión_origen se evalúa en un escalar, una referencia de campo o una lista (de varias clases):
  • Si expresión_origen es un escalar, el valor del campo de destino se cambia por el devuelto por expresión_origen. La excepción es que, cuando el resultado es NULL, el campo de destino se separa.
  • Si expresión_origen es una referencia de campo, el valor del campo de destino se toma del campo de origen, los campos dependientes se separan y al campo nuevo se le suministran copias de los campos dependientes del campo de origen (y de los dependientes de niveles inferiores). Si el campo indicado por expresión_origen no existe, el campo de destino se separa.
  • Si expresión_origen es una lista, los campos dependientes se separan y se añade un nuevo conjunto de campos dependientes según el tipo y el contenido de la lista.
Las sentencias SET son particularmente útiles en los nodos Compute que modifican un mensaje, sea cambiando un campo o añadiendo un campo nuevo al mensaje original. Las sentencias SET también son útiles en los nodos Filter y Database para establecer variables declaradas o los campos del árbol Environment o los árboles Local Environment. Puede utilizar sentencias como éstas en un nodo Compute que modifique un mensaje:
			SET OutputRoot = InputRoot;
SET OutputRoot.XML.Order.Name = UPPER(InputRoot.XML.Order.Name);

Este ejemplo convierte el texto de un campo del mensaje a mayúsculas. La primera sentencia construye un mensaje de salida que es una copia completa del mensaje de entrada. La segunda sentencia establece el valor del campo Order.Name en un valor nuevo, como lo define la expresión de la derecha.

Si el campo Order.Name no existe en el mensaje de entrada original, no existe en el mensaje de salida tal como lo genera la primera sentencia. La expresión de la derecha de la segunda sentencia devuelve NULL (porque el campo referenciado dentro de la llamada a la función UPPER no existe). Asignar el valor NULL a un campo tiene el efecto de suprimirlo si ya existe y, por tanto, el efecto es que la segunda sentencia no tiene efectos.

Si desea asignar un valor NULL a un campo sin suprimirlo, utilice una sentencia como la siguiente:
SET OutputRoot.XML.Order.Name VALUE = NULL;

Conceptos relacionados
ESQL

Tareas relacionadas
Desarrollo de ESQL
Acceso a elementos en el cuerpo del mensaje

Referencia relacionada
Preferencia de sintaxis
Sentencias ESQL