Puede utilizar referencias de campo ESQL para formar vías de acceso a elementos de cuerpo de mensaje.
>>-NombreCorrelación--+---------------------+------------------>< | .-.---------------. | | V | | '---| PathElement |-+-' PathElement |--+------------+-----------------------------------------------> '-(--Tipo--)-' >-- ---+--------------------------------------+--+-Nombre----------------+--> '-+-------------------------------+--:-' +-{--ExpresiónNombre--}-+ +-EspacioNombres----------------+ '-*---------------------' +-{--ExpresiónEspacioNombres--}-+ '---*---------------------------' >--+-------------------------+----------------------------------| '-[--+---------------+--]-' +-Índice--------+ +-<--+--------+-+ | '-Índice-' | +->--+--------+-+ | '-Índice-' | '-<-------------'
Una referencia de campo consta de un nombre de correlación, seguido de cero o más elementos 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.XMLNS.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 XMLNS, a
continuación al primer campo hijo del campo XMLNS 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.XMLNS."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
InputRoot.XMLNS."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). InputRoot.XMLNS.*.Invoice.Value
coincide con cualquier elemento de vía de acceso que contenga las facturas.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.
DECLARE sp1 NAMESPACE 'http://www.ibm.com/space1';
/* Declaración de espacio de nombres para asociar el prefijo 'space1' con el espacio de nombres */
SET OutputRoot.XMLNS.TestCase.(XML.NamespaceDecl)xmlns:space1 = 'http://www.ibm.com/space1';
SET OutputRoot.XMLNS.TestCase.sp1:data1 = 'Hello!';
genera:<TestCase xmlns:space1="http://www.ibm.com/space1">
<space1:data1>Hello!</space1:data1>
</TestCase>
InputRoot.XMLNS.Data[1].Invoice
InputRoot.XMLNS.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.XMLNS.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.XMLNS.Data.Invoice -- Selecciona el primero
InputRoot.XMLNS.Data.Invoice[1] -- Selecciona el primero
InputRoot.XMLNS.Data.Invoice[>] -- Selecciona el primero
InputRoot.XMLNS.Data.Invoice[>1] -- Selecciona el primero
InputRoot.XMLNS.Data.Invoice[>2] -- Selecciona el segundo
InputRoot.XMLNS.Data.Invoice[<] -- Selecciona el cuarto
InputRoot.XMLNS.Data.Invoice[<1] -- Selecciona el cuarto
InputRoot.XMLNS.Data.Invoice[<2] -- Selecciona el tercero
InputRoot.XMLNS.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).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.
(1) >>-(--ReferenciaCampo--)--NombreTipoDatosEscalares-------------><
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.
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.
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 predeterminados 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.XMLNS.Msg.Data.Name = NULL; -- esto suprime el campo
SET OutputRoot.XMLNS.Msg.Data.Name VALUE = NULL;
-- esto asigna un valor NULL a un campo sin suprimirlo
Por compatibilidad con versiones anteriores, se sigue soportando 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 ]