Referencias de campo ESQL

En este tema se describe cómo utilizar las referencias de campo ESQL para formar vías de acceso a elementos de cuerpo de mensajes.

A CONTINUACIóN, SE MUESTRAN LA SINTAXIS COMPLETA DE LAS REFERENCIAS DE CAMPO:

Una referencia de campo consta de un nombre de correlación, seguido de cero o más campos de vía de acceso separados por puntos (.). El nombre de correlación identifica un punto inicial conocido y debe ser el nombre de una constante, una variable declarada (escalar, fila o referencia), o uno de los puntos de inicio predefinidos; por ejemplo, InputRoot. Los campos de vía de acceso definen una vía de acceso desde el punto inicial al campo deseado.

Por ejemplo:
InputRoot.XML.Data.Invoice
inicia el intermediario en la ubicación InputRoot (esto es, la raíz del mensaje de entrada a un nodo Compute) y luego efectúa una secuencia de navegaciones. En primer lugar, va desde la raíz al primer campo hijo denominado XML, a continuación al primer campo hijo del campo XML denominado Data. Finalmente, el intermediario navega hasta el primer campo hijo del campo Data denominado Invoice. Cuando aparece esta referencia de campo en un programa ESQL, se accede al campo Invoice.
Este formato de referencia de campo es sencillo, práctico y se utiliza de forma generalizada. No obstante, tiene dos limitaciones:
  • Debido a que los nombres utilizados deben ser identificadores ESQL válidos, sólo puede utilizar nombres que se ajusten a las normas de ESQL. Es decir, los nombres sólo pueden contener caracteres alfanuméricos, incluido el carácter de subrayado, el primer carácter no puede ser numérico y como mínimo los nombres deben tener una longitud de un carácter. Puede evitar estas limitaciones encerrando entre comillas dobles los nombres que no satisfagan estas normas. Por ejemplo:
    InputRoot.XML."Customer Data".Invoice
    Si necesita hacer referencia a campos que contengan comillas, utilice dos pares de comillas para encerrar la referencia. Por ejemplo:
    Body.Message."""hola"""

    Algunos identificadores están reservados como palabras clave pero, con la excepción del nombre de correlación, puede utilizarlos en referencias de campo sin utilizar comillas dobles

  • Debido a que los nombres de los campos aparecen en el programa ESQL, deben conocerse cuando se escribe el programa. Esta limitación se puede evitar utilizando la sintaxis alternativa que utiliza paréntesis ( { ... } ). Esta sintaxis le permite utilizar cualquier expresión que devuelva un valor no nulo de tipo carácter.
    Por ejemplo:
    InputRoot.XML."Customer Data".{'Customer-' || 
    	CurrentCustomer}.Invoice
    en el que las facturas están contenidas en una carpeta cuyo nombre se forma mediante una concatenación del literal de caracteres Customer- con el valor de CurrentCustomer (que en este ejemplo debe ser una variable declarada de tipo carácter).

Puede utilizar el carácter comodín asterisco (*) en un elemento de vía de acceso, para que coincida con cualquier nombre. También puede utilizar "*" para especificar un nombre parcial. Por ejemplo, Prefix* coincide con cualquier nombre que empiece por "Prefix".

Tenga en cuenta que en ESQL todo lo que se encierra entre comillas dobles se convierte en un identificador y todo lo que se encierra entre comillas simples se convierte en un literal de tipo carácter. Debe encerrar todas las series de caracteres entre comillas simples.

Vea:
  • Espacios de nombres para obtener información sobre las distintas combinaciones de espacios de nombres y nombres
  • Referencias de campo de destino para obtener información sobre las distintas combinaciones de referencias de campo
  • Índices para obtener información sobre las distintas combinaciones de cláusulas de índice
  • Tipos para obtener información sobre las distintas combinaciones de tipos

Espacios de nombres

Los nombres de campos pueden pertenecer a espacios de nombres. Las referencias de campos proporcionan soporte para los espacios de nombres, de la siguiente forma:
  • Cada campo de cada referencia de campo que contiene una cláusula de nombre puede contener también una cláusula de espacio de nombres que define el espacio de nombres al que pertenece el nombre especificado.
  • Cada nombre del espacio de nombres se puede definir utilizando un identificador sencillo o mediante una expresión (encerrada entre corchetes). Si un identificador es el nombre de una constante de espacio de nombre declarada, se utiliza el valor de la constante. Si se utiliza una expresión, debe devolver un valor no nulo de tipo carácter.
  • Una cláusula de espacio de nombre de tipo * indica explícitamente que la información del espacio de nombres se ha de ignorar cuando se localicen campos en un árbol.
  • Una cláusula de espacio de nombres sin ningún identificador, expresión ni *, es decir, en la que solo está presente : apunta explícitamente al espacio de nombres sin destino.

Índices

Cada campo de una referencia de campo puede contener una cláusula de índice. Esta cláusula está marcada mediante corchetes( [ ... ] ) y acepta cualquier expresión que devuelva un valor no nulo de tipo entero. Esta cláusula identifica el campo con el mismo nombre que se ha de seleccionar. Los campos se numeran a partir del primero, comenzando por uno. Si no está presente esta cláusula, se presupone que el primer campo es necesario. De este modo, los dos ejemplos siguientes tienen exactamente el mismo significado:
InputRoot.XML.Data[1].Invoice
InputRoot.XML.Data.Invoice[1] 
Esta construcción se utiliza comúnmente como una variable de índice de modo que un bucle recorre todos estos campos en secuencia. Por ejemplo:
WHILE count < 32 DO
     SET TOTAL = TOTAL + InputRoot.XML.Data.Invoice[count].Amount;
     SET COUNT = COUNT + 1 
END WHILE; 
Utilice este tipo de construcción con atención debido a que implica que el intermediario debe contar los campos desde el principio en cada vuelta del bucle. Si el número de repeticiones es muy elevado, el rendimiento será bajo. En tales casos, la mejor alternativa es utilizar una variable de referencia de campo.
Opcionalmente, las expresiones de índice pueden ir precedidas por un signo de menor que ( < ), lo que indica que el campo obligatorio se ha de indexar desde el último campo y no desde el primero. En este caso, el índice 1 hace referencia al último campo y el índice 2 hace referencia al penúltimo campo. Para que sea completo, puede utilizar un signo de mayor que para indicar que se ha de contar a partir del primer campo. El ejemplo siguiente muestra código ESQL que maneja índice con cuatro campos denominados Invoice.
InputRoot.XML.Data.Invoice       -- Selecciona el primero
InputRoot.XML.Data.Invoice[1]    -- Selecciona el primero
InputRoot.XML.Data.Invoice[>] -- Selecciona el primero
InputRoot.XML.Data.Invoice[>1] -- Selecciona el primero
InputRoot.XML.Data.Invoice[>2] -- Selecciona el segundo
InputRoot.XML.Data.Invoice[<]    -- Selecciona el cuarto
InputRoot.XML.Data.Invoice[<1]   -- Selecciona el cuarto
InputRoot.XML.Data.Invoice[<2]   -- Selecciona el tercero
InputRoot.XML.Data.Invoice[<3]   -- Selecciona el segundo 
Una cláusula de índice puede constar también de un par de corchetes vacíos ( [] ). Esto selecciona todos los campos con nombres coincidentes. Utilice esta construcción con funciones y sentencias que esperan listas (por ejemplo, las funciones SELECT, CARDINALITY, SINGULAR y EXISTS, o la sentencia SET) .

Tipos

Cada campo de una referencia de campo puede contener una cláusula de tipo. Esto se indica con paréntesis ( ( ) ) y se acepta cualquier expresión que devuelva un valor no nulo de tipo entero. La presencia de una expresión de tipo limita los campos que se selecciona a los que son de tipo coincidente. Esta construcción se utiliza normalmente con XML genérico, donde hay muchos tipos de campos y un campo XML puede contener tanto atributos como campos XML adicionales con el mismo nombre.

Por ejemplo:
<Item Value = '1234' >
     <Value>5678</Value>
</Item>

Aquí, el campo XML Item tiene dos hijos y ambos se denominan "Value". Los campos hijo pueden distinguirse mediante cláusulas de tipo: Item.(<Domain>.Attribute)Value para seleccionar el atributo, e Item.(XML.Element)Value para seleccionar el campo, donde <Domain> es XML, XMLNS o XMLNSC, tal como determina el dominio de mensajes del origen.

Restricciones de tipo

Una restricción de tipo comprueba el tipo de datos que DEVUELVE UNA REFERENCIA DE CAMPO.
Notas:
  1. NombreTipoDatosEscalares puede ser BOOLEAN, INTEGER, INT, FLOAT, DECIMAL, DEC, DATE, TIME, TIMESTAMP, GMTTIME, GMTTIMESTAMP, INTERVAL, CHARACTER, CHAR, BLOB y BIT.

Normalmente, una restricción de tipo extrae el valor escalar de la referencia (de forma similar a la función FIELDVALUE) y genera una excepción si la referencia no es del tipo correcto. Por definición, se generará una excepción para todos los campos no existentes, porque tendrán el valor NULL. Esto proporciona una manera muy eficaz y rápida de generar excepciones cuando faltan campos esenciales en los mensajes.

Sin embargo, cuando se producen restricciones de tipo en expresiones que son candidatas para pasarlas a una base de datos (por ejemplo, están en una cláusula WHERE), la información se utiliza para determinar si la expresión puede pasarse a la base de datos. Esto puede ser importante si la cláusula WHERE contiene un elemento CAST que opera en una columna de tabla de base de datos. Si no hay una restricción de tipo, estas expresiones no se pueden pasar a la base de datos porque el intermediario no puede saber si la base de datos es capaz de realizar la conversión que se necesita. Sin embargo, tenga presente que siempre debe tener la máxima precaución al utilizar conversiones que operen en valores de columna, porque algunas bases de datos tienen una capacidad de conversión de datos extremadamente limitada.

Resumen

*, *[..], (..)*, (..)*[..]
Ninguno de estos formatos especifica un nombre o espacio de nombres. El campo de destino puede tener cualquier nombre, en cualquier espacio de nombres o en ninguno. Se localiza solamente mediante su tipo, su índice, o su tipo e índice, cuando resulta adecuado.
NameId, NameId[..], (..)NameId, (..)NameId[..]
Todos estos formatos especifican un nombre pero ningún espacio de nombres. El campo de destino se localiza mediante el espacio de nombres y el nombre, y también mediante el tipo y el índice, cuando resulta adecuado.

El espacio de nombres se presupone que es el único espacio de nombres de la vía de acceso al espacio de nombres que contiene este nombre. El único espacio de nombres que puede estar en la vía de acceso es el espacio de nombres sin destino.

Estos formatos ya existían antes de se introdujeran los espacios de nombres. Aunque su comportamiento ha cambiado puesto que ahora comparan tanto el nombre como el espacio de nombres, las transformaciones existentes no deben observar ningún cambio en su comportamiento debido a que todas las transformaciones existentes crean sus campos en el espacio de nombres sin destino.

: *, :*[..], (..):*, (..):*[..]
Todos estos formatos especifican el espacio de nombres sin destino pero ningún nombre. El campo de destino se localiza mediante su espacio de nombres y también mediante el tipo y el índice, cuando resulta adecuado.
:NameId, :NameId[..], (..):NameId, (..):NameId[..]
Todos estos formatos especifican un nombre y el espacio de nombres sin destino. El campo de destino se localiza mediante el espacio de nombres y el nombre, y también mediante el tipo y el índice, cuando resulta adecuado.
* :*, *:*[..], (..)*:*, (..)*:*[..]
Ninguno de estos formato especifica un nombre o un espacio de nombres. Tenga en cuenta que "*:*" es equivalente a "*", y hace que coincida con ningún espacio de nombres, así como con cualquier espacio de nombres. El campo de destino puede tener cualquier nombre, en cualquier espacio de nombres o en ninguno. Se localiza solamente mediante su tipo, su índice, o su tipo e índice, cuando resulta adecuado.
*:NameId, *:NameId[..], (..)*:NameId, (..)*:NameId[..]
Todos estos formatos especifican un nombre pero ningún espacio de nombres. El campo de destino se localiza mediante su nombre y también mediante su tipo e índice, cuando resulta adecuado.
SpaceId:*, SpaceId:*[..], (..)SpaceId:*, (..)SpaceId:*[..]
Todos estos formatos especifican un espacio de nombres pero ningún nombre. El campo de destino se localiza mediante su espacio de nombres y también mediante su tipo e índice, cuando resulta adecuado.
SpaceId:NameId, SpaceId:NameId[..], (..)SpaceId:NameId, (..)SpaceId:NameId[..]
Todos estos formatos especifican un espacio de nombres y un nombre. El campo de destino se localiza mediante el espacio de nombres y el nombre, y también mediante el tipo y el índice, cuando resulta adecuado.

En todos los casos anteriores, un nombre o espacio de nombres suministrado mediante una expresión encerrada entre corchetes ({}) es equivalente a un nombre proporcionado como un identificador.

Por definición, el nombre del espacio de nombres sin destino es la serie de caracteres vacía. La serie de caracteres vacía se puede seleccionar mediante expresiones que se evalúan en la serie de caracteres vacía, el identificador vacío "" o mediante la referencia a una constante de espacio de nombres definida como la serie de caracteres vacía.

Referencias de campo de destino

El uso de las referencias de campo generalmente implica que se busca un campo existente. Sin embargo, se crea el campo si éste no existe, como suele ser el caso de las referencias de campo que son los destinos de las sentencias SET y de las que se incluyen en las cláusulas AS de las sentencias SELECT.

En estas situaciones, hay diferentes circunstancias en las que el intermediario no puede diferenciar entre el nombre y el espacio de nombres y, en estas situaciones, se aplican los siguientes principios generales:
  • Si falta la cláusula de nombre o si no especifica un nombre y la cláusula de espacio de nombres está ausente o no especifica ni implica un espacio de nombres (esto es, no hay un nombre ni un espacio de nombres disponible), se aplica una de las siguientes condiciones:
    • Si el algoritmo de asignación no copia el nombre de algún campo existente, el nuevo campo tiene el nombre y el espacio de nombres establecido en la serie de caracteres vacía y su indicador de nombre no se establece automáticamente.

      Si falta una especificación de tipo, el tipo de campo no es Name ni NameValue, lo cual indica de forma eficaz que el nuevo elemento no tiene nombre.

      .
    • De lo contrario, si el algoritmo de asignación opta por copiar el nombre de otro campo existente, el nuevo campo tiene tanto el nombre y el espacio de nombres que se ha copiado del campo existente y su indicador Name se establece automáticamente.
  • Si la cláusula de nombre está presente y especifica un nombre pero la cláusula de espacio de nombres está ausente o no especifica ni implica un espacio de nombres, (esto es, hay un nombre disponible pero no así un espacio de nombres), el nuevo campo tiene su indicador:
    • Name establecido en el valor dado
    • Namespace establecido en la serie de caracteres vacía
    • Name establecido automáticamente
  • Si falta la cláusula de nombre o si no especifica un nombre y la cláusula de espacio de nombres está presente y especifica o implica un espacio de nombres (esto es, hay un espacio de nombres disponible pero no así un nombre), el nuevo campo tiene su indicador:
    • Namespace establecido en el valor dado
    • Name establecido en la serie de caracteres vacía
    • Name establecido automáticamente
  • Si hay una cláusula de nombre y especifica un nombre y la cláusula de espacio de nombres está presente y especifica o implica un espacio de nombres, el nuevo campo tiene su indicador:
    • Name establecido en el valor dado
    • Namespace establecido en el valor dado
    • Name establecido automáticamente
También hay casos en los que el intermediario crea campos adicionales a los que hacen referencia las referencias de campo:
  • Copia de árbol: los nuevos campos se crean mediante un algoritmo que utiliza como plantilla un árbol de origen. Si el algoritmo copia el nombre de un campo de origen en un campo nuevo, también se copia su espacio de nombres.
  • Expresiones SELECT anónimas: las cláusulas SELECT no están obligadas a tener cláusulas AS; las que no las tienen, establecen los nombres de los campos creados recientemente en sus valores por omisión (consulte Función SELECT).

    Estos valores por omisión se pueden derivar de los nombres de campos, nombres de columnas o simplemente pueden ser nombres de secuencias fabricadas. Si el nombre es un nombre de campo, se trata en realidad de una copia de árbol y el nombre del espacio de nombres se copia como se ha indicado anteriormente.

    De lo contrario, el espacio de nombres del campo recién creado se obtiene buscando la vía de acceso, es decir, el nombre se trata como la sintaxis NameId de una referencia de campo.

Efecto de establecer un campo en NULL

Tenga cuidado al asignar el valor Null a un campo. Por ejemplo, el siguiente mandato suprime el campo Name:
 SET OutputRoot.XML.Msg.Data.Name = NULL;  -- esto suprime el campo
La forma correcta de asignar un valor Null a un campo es la siguiente:
SET OutputRoot.XML.Msg.Data.Name VALUE = NULL;  
-- esto asigna un valor NULL a un campo sin suprimirlo
Nota: Para usuarios que requieren compatibilidad con versiones anteriores

Por motivos de compatibilidad con versiones anteriores se sigue dando soporte a la palabra clave LAST, aunque su uso se ha abandonado. No se puede utilizar LAST como una expresión de índice: [LAST] es válida y es equivalente a [<], pero [LAST3] no es válida.

La palabra clave LAST se ha sustituido por la siguiente sintaxis de flecha que permite especificar una dirección de búsqueda y un índice:
      Field [ > ] -- El primer campo, equivalente a [ 1 ]
      Field [ > (a + b) * 2 ]
      Field [ < ]                   -- El último campo, equivalente a [ LAST ]
      Field [ < 1 ]	                -- El último campo, equivalente a [ LAST ]
      Field [ < 2 ]	                -- El penúltimo campo
      Field [ < (a + b) / 3 ]
Conceptos relacionados
Visión general de ESQL
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
ak04861_