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.
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.
InputRoot.XML.Data.Invoiceinicia 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.
InputRoot.XML."Customer Data".InvoiceSi 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
InputRoot.XML."Customer Data".{'Customer-' || CurrentCustomer}.Invoiceen 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.
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.
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 segundoUna 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) .
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.
<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.
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.
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.
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.
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.
.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.
SET OutputRoot.XML.Msg.Data.Name = NULL; -- esto suprime el campo
SET OutputRoot.XML.Msg.Data.Name VALUE = NULL; -- esto asigna un valor NULL a un campo sin suprimirlo
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.
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 ]