Questa sezione descrive come utilizzare i riferimenti di campo ESQL per formare i percorsi agli elementi del contenuto del messaggio.
Un riferimento di campo è composto da un nome della correlazione, seguito da zero o più campi del percorso separati da punti (.). Il nome della correlazione identifica un punto iniziale conosciuto e deve essere il nome di una costante, di una variabile dichiarata (scalare, row o riferimento) oppure uno dei punti iniziali predefiniti; ad esempio, InputRoot. I campi del percorso definiscono un percorso dal punto iniziale al campo desiderato.
InputRoot.XML.Data.Invoiceavvia il broker nell'ubicazione InputRoot (la root del messaggio di input per un nodo Compute) e quindi esegue una sequenza di navigazioni. Per prima cosa, passa dalla root al primo campo child denominato XML, quindi al primo campo child del campo XML chiamato Data. Infine, il broker passa al primo campo child del campo Data denominato Invoice. Ogni volta che questo riferimento di campo ricorre in un programma ESQL, si accede al campo invoice.
InputRoot.XML."Customer Data".InvoiceSe è necessario fare riferimento a campi che contengono virgolette, utilizzare due coppie di virgolette per racchiudere il riferimento. Ad esempio:
Body.Message."""hello"""
Alcuni identificativi sono riservati come parole chiave, ma ad eccezione del nome della correlazione, è possibile utilizzarli nei riferimenti di campo senza dover utilizzare i doppi apici
InputRoot.XML."Customer Data".{'Customer-' || CurrentCustomer}.Invoicein cui le fatture sono contenute in una cartella il cui nome è formato concatenando la parola Customer- con il valore in CurrentCustomer (che in questo esempio deve essere una variabile dichiarata di tipo character).
E' possibile utilizzare il carattere wildcard asterisco (*) in un elemento del percorso per la corrispondenza di qualsiasi nome. E' anche possibile utilizzare "*" per specificare un nome parziale. Ad esempio, Prefix* corrisponde a qualsiasi nome che inizia con "Prefix".
Notare che qualsiasi elemento racchiuso tra doppi apici in ESQL diventa un identificativo; qualsiasi elemento racchiuso tra apici diventa un carattere letterale. E' necessario racchiudere tutte le stringhe di caratteri tra apici singoli.
InputRoot.XML.Data[1].Invoice InputRoot.XML.Data.Invoice[1]Tale struttura è utilizzata con una variabile index, in modo che un loop passi attraverso tutti questi campi in sequenza. Ad esempio:
WHILE count < 32 DO SET TOTAL = TOTAL + InputRoot.XML.Data.Invoice[count].Amount; SET COUNT = COUNT + 1 END WHILE;Utilizzare questo tipo di struttura con attenzione, perché implica che il broker deve contare i campi dall'inizio ogni volta. Se il conteggio di ripetizioni è elevato, le prestazioni non saranno ottimali. In tali casi, è preferibile utilizzare una variabile del riferimento di campo.
InputRoot.XML.Data.Invoice -- Selects the first InputRoot.XML.Data.Invoice[1] -- Selects the first InputRoot.XML.Data.Invoice[>] -- Selects the first InputRoot.XML.Data.Invoice[>1] -- Selects the first InputRoot.XML.Data.Invoice[>2] -- Selects the second InputRoot.XML.Data.Invoice[<] -- Selects the fourth InputRoot.XML.Data.Invoice[<1] -- Selects the fourth InputRoot.XML.Data.Invoice[<2] -- Selects the third InputRoot.XML.Data.Invoice[<3] -- Selects the secondUna clausola index può essere composta anche da una coppia di parentesi vuote ( [] ). In questo modo, vengono selezionati tutti i campi con nomi corrispondenti. Utilizzare questa struttura con funzioni ed istruzioni che prevedono elenchi (ad esempio, le funzioni SELECT, CARDINALITY, SINGULAR ed EXISTS e l'istruzione SET).
Ciascun campo di un riferimento di campo può contenere una clausola type. Tali clausole sono indicate dalle parentesi ( ( ) ) ed accettano qualsiasi espressione che restituisce un valore non null di tipo integer. La presenza di un'espressione di tipo limita i campi selezionati a quelli del tipo corrispondente. Tale struttura è utilizzata generalmente con XML generico, in cui esistono molti tipi di campi ed è possibile che un campo XML contenga attributi ed ulteriori campi XML con lo stesso nome.
<Item Value = '1234' > <Value>5678</Value> </Item>
In questo caso, il campo XML Item ha due campi child, entrambi denominati "Value". I campi child possono essere distinti mediante clausole type: Item.(<Domain>.Attribute)Value per selezionare l'attributo e Item.(XML.Element)Value per selezionare il campo, dove <Domain> è uno fra XML, XMLNS o XMLNSC, a seconda di quanto determinato dal dominio del messaggio dell'origine.
Generalmente, un limite di tipo comporta che il valore scalare del riferimento venga estratto (nello stesso modo della funzione FIELDVALUE) e che venga generata un'eccezione se il riferimento non è del tipo corretto. Per definizione, viene generata un'eccezione per tutti i campi non esistenti, perché il valore di tali campi è NULL. Questo è un modo semplice e rapido per generare eccezioni se i campi importanti non sono contenuti nei messaggi.
Tuttavia, quando sono presenti limiti di tipo in espressioni candidate per essere passate ad un database (ad esempio, in una clausola WHERE), le informazioni vengono utilizzate per determinare se le espressioni possono essere fornite al database. Ciò può essere importante se una clausola WHERE contiene una funzione CAST su una colonna di tabella del database. In assenza del limite di tipo, tali espressioni non possono essere fornite al database perché il broker non può indicare se il database è in grado di eseguire la conversione richiesta. Notare, tuttavia, che è necessaria sempre attenzione quando si eseguono operazioni cast sui valori delle colonne, perché alcuni database dispongono di funzioni di conversione dei dati abbastanza limitate.
In tutti i casi precedenti, un nome o uno spazio dei nomi forniti da un'espressione compresa tra parentesi graffe ({}) è equivalente ad un nome fornito come identificatore.
Per definizione, il nome dello spazio dei nomi notarget è la stringa vuota. La stringa vuota può essere selezionata da espressioni che hanno come risultato la stringa vuota, dall'identificativo vuoto "" oppure da un riferimento ad una costante dello spazio dei nomi definita come stringa vuota.
Generalmente, l'utilizzo dei riferimenti di campo implica la ricerca di un campo esistente. Tuttavia, se il campo richiesto non esiste, come nel caso di riferimenti di campo che sono destinazioni di istruzioni SET e quelli nelle clausole AS di funzioni SELECT, esso viene creato.
In assenza di una specifica del tipo, il tipo del campo non è Name o NameValue, che indica effettivamente che il nuovo campo è senza nome.
.Tali valori predefiniti possono essere derivati da nomi di campi, nomi di colonne o possono essere nomi di sequenze prodotti. Se il nome è un nome di campo, si tratta effettivamente di una copia della struttura ad albero ed il nome dello spazio dei nomi viene copiato come indicato in precedenza.
In caso contrario, lo spazio dei nomi del nuovo campo creato deriva dalla ricerca del percorso: il nome viene considerato come la sintassi NameId di un riferimento di campo.
SET OutputRoot.XML.Msg.Data.Name = NULL; -- elimina il campo
SET OutputRoot.XML.Msg.Data.Name VALUE = NULL; -- assegna un valore NULL ad un campo senza eliminarlo
Per la compatibilità con le versioni precedenti, la parola chiave LAST è ancora supportata, ma è stata dichiarata obsoleta. LAST non può essere utilizzata come parte di un'espressione di indice: l'espressione [LAST] è valida ed è equivalente a [<], ma [LAST3] non è valida.
Field [ > ] -- The first field, equivalent to [ 1 ] Field [ > (a + b) * 2 ] Field [ < ] -- The last field, equivalent to [ LAST ] Field [ < 1 ] -- The last field, equivalent to [ LAST ] Field [ < 2 ] -- The last but one field Field [ < (a + b) / 3 ]