Este tópico descreve como utilizar referências de campo ESQL para formar caminhos para elementos do corpo da mensagem.
Uma referência de campo consiste em um nome de correlação, seguido de zero ou mais Campos de caminho, separados por pontos (.). O nome de correlação identifica um ponto de início bem conhecido e deve ser o nome de uma constante, uma variável declarada (escalar, linha ou referência) ou um dos pontos de início predefinidos; por exemplo, InputRoot. Os Campos de caminho definem um caminho do ponto de início para o campo desejado.
InputRoot.XML.Data.Invoiceinicia o intermediário no local InputRoot (isto é, a raiz da mensagem de entrada de um nó Compute) e, em seguida, realiza uma seqüência de navegações. Inicialmente, ele navega da raiz ao primeiro campo filho denominado XML, em seguida, ao primeiro campo filho do campo XML denominado Data. Finalmente, o intermediário navega até o primeiro campo filho do campo Data, denominado Invoice. Toda vez que essa referência de campo ocorre em um programa ESQL, o campo Invoice é acessado.
InputRoot.XML."Customer Data".InvoiceSe precisar fazer referência a campos que contêm aspas, utilize dois pares de aspas em torno da referência. Por exemplo:
Body.Message."""hello"""
Alguns identificadores são reservados apenas como palavras-chave, mas, com exceção dos nomes de correlação, é possível utilizá-los nas referências de campo, sem a utilização de aspas duplas
InputRoot.XML."Customer Data".{'Customer-' || CurrentCustomer}.Invoiceno qual as faturas estão contidas em uma pasta com um nome formado pela concatenação do literal de caractere Customer- com o valor em CurrentCustomer (que, neste exemplo, deve ser uma variável declarada de caractere de tipo).
Você pode utilizar o caractere curinga asterisco (*) em um elemento de caminho para corresponder a qualquer nome. Também pode utilizar "*" para especificar um nome parcial. Por exemplo, Prefix* corresponde a qualquer nome que começa com "Prefix".
Observe que encerrar qualquer coisa em aspas duplas no ESQL torna-o um identificador; encerrar qualquer coisa em aspas simples torna-o um literal de caractere. Você deve incluir todas as cadeias de caracteres entre aspas simples.
InputRoot.XML.Data[1].Invoice InputRoot.XML.Data.Invoice[1]Esta construção é a mais utilizada com uma variável de índice, portanto, se um loop percorre todos estes campos em seqüência. Por exemplo:
WHILE count < 32 DO SET TOTAL = TOTAL + InputRoot.XML.Data.Invoice[count].Amount; SET COUNT = COUNT + 1 END WHILE;Utilize este tipo de construção com cuidado, pois ele implica em que o intermediário deve contar os campos desde o começo cada vez ao longo do loop. Se a contagem repetida for grande, o desempenho será fraco. Nesses casos, uma alternativa melhor é utilizar uma variável de referência de campo.
InputRoot.XML.Data.Invoice -- Seleciona o primeiro InputRoot.XML.Data.Invoice[1] -- Seleciona o primeiro InputRoot.XML.Data.Invoice[>] -- Seleciona o primeiro InputRoot.XML.Data.Invoice[>1] -- Seleciona o primeiro InputRoot.XML.Data.Invoice[>2] -- Seleciona o segundo InputRoot.XML.Data.Invoice[<] -- Seleciona o quarto InputRoot.XML.Data.Invoice[<1] -- Seleciona o quarto InputRoot.XML.Data.Invoice[<2] -- Seleciona o terceiro InputRoot.XML.Data.Invoice[<3] -- Seleciona o segundoUma cláusula de índice também pode consistir em um par de colchetes vazio ( [] ). Isso seleciona todos os campos com nomes correspondentes. Utilize essa construção com funções e instruções que esperam listas (por exemplo, as funções SELECT, CARDINALITY, SINGULAR e EXISTS ou a instrução SET) .
Cada campo de uma referência de campo pode conter uma cláusula type. Elas são denotadas por parênteses ( ( ) ) e aceitam qualquer expressão que retorna um valor não-nulo de tipo inteiro. A presença de uma expressão de tipo restringe os campos que são selecionados aos do tipo correspondente. Essa construção é utilizada mais freqüentemente com o XML genérico, em que há muitos tipos de campos e é possível que um campo XML contenha ambos os atributos e outros Campos XML com o mesmo nome.
<Item Value = '1234' > <Value>5678</Value> </Item>
Aqui, o campo XML Item possui dois Campos filhos, ambos denominados "Value". Os Campos filhos podem ser distintos utilizando-se as cláusulas do tipo: Item.(<Domínio>.Attribute)Value para selecionar o atributo e Item.(XML.Element)Value para selecionar o campo, em que <Domínio> é um de XML, XMLNS ou XMLNSC, como determinado pelo domínio de mensagens da origem.
Normalmente, uma restrição de tipo faz com que o valor escalar da referência seja extraído (de um modo semelhante à função FIELDVALUE) e uma exceção seja emitida se a referência não for do tipo correto. Por definição, uma exceção será emitida para todos os campos não-existentes, porque eles são avaliados como NULL. Isso fornece uma maneira conveniente e rápida de causar exceções se campos essenciais estiverem ausentes nas mensagens.
Entretanto, quando restrições de tipos ocorrem em expressões que são candidatas para serem transmitidas a um banco de dados (por exemplo, elas estão em uma cláusula WHERE), as informações são utilizadas para determinar se a expressão pode ser especificada no banco de dados. Isso pode ser importante se uma cláusula WHERE contiver uma operação CAST em uma coluna de tabela de banco de dados. Na falta de uma restrição de tipo, como por exemplo, as expressões não podem ser especificadas no banco de dados porque o intermediário não pode informar se o banco de dados é capaz de desempenhar a conversão requerida. Entretanto, observe que você deve sempre tomar cuidado ao utilizar coerções que operam em valores de colunas, porque alguns bancos de dados possuem recursos de conversão de dados excessivamente limitados.
Em todos os casos anteriores, um nome, ou espaço de nomes, fornecido por uma expressão contida entre chaves ({}) é equivalente a um nome fornecido como um identificador.
Por definição, o nome do espaço de nomes notarget é a cadeia vazia. A cadeia vazia pode ser selecionada por expressões que se resolvem como a cadeia vazia, o identificador vazio "" ou por referência a uma constante de espaço de nomes definida como a cadeia vazia.
A utilização de referências de campo geralmente implica na procura por um campo existente. No entanto, se o campo requerido não existir, como é geralmente o caso para referências de campo que são os destinos das instruções SET e aqueles na cláusula AS das funções SELECT, ele é criado.
Na ausência de especificação de um tipo, o tipo de campo não é Name nem NameValue, o que indica efetivamente que o novo campo não tem nome
.Estes padrões podem ser derivados de nomes de campos, nomes de colunas ou podem ser simplesmente nomes de seqüência fabricados. Se o nome for o nome de um campo, trata-se efetivamente de uma cópia de árvore e o nome do espaço de nomes será copiado como acima.
Se não, o espaço de nomes do campo recém-criado será derivado da procura do caminho, isto é, o nome será tratado como a sintaxe NameId de uma referência de campo.
SET OutputRoot.XML.Msg.Data.Name = NULL; -- exclui o campo
SET OutputRoot.XML.Msg.Data.Name VALUE = NULL; -- designa um valor NULL a um campo sem excluí-lo
Para fins de compatibilidade reversa, a palavra-chave LAST ainda é suportada, mas seu uso é desaconselhado. LAST não pode ser utilizada como parte de uma expressão de índice: [LAST] é válido e é equivalente a [<], mas [LAST3] não é válido.
Field [ > ] -- O primero campo, equivalente a [ 1 ] Field [ > (a + b) * 2 ] Field [ < ] -- O último campo, equivalente a [ LAST ] Field [ < 1 ] -- O último campo, equivalente a [ LAST ] Field [ < 2 ] -- O último, mas único campo Field [ < (a + b) / 3 ]