Riferimenti di campo ESQL

Questa sezione descrive come utilizzare i riferimenti di campo ESQL per formare i percorsi agli elementi del contenuto del messaggio.

La sintassi completa per i riferimenti di CAMPO è VISUALIZZATA DI SEGUITO:

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.

Ad esempio:
InputRoot.XML.Data.Invoice
avvia 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.
Questo formato di riferimento di campo è semplice, conveniente ed è quello più utilizzato. Tuttavia, esso ha due limitazioni:
  • Poiché i nomi utilizzati devono essere identificativi ESQL validi, è possibile utilizzare solo nomi conformi alle regole di ESQL. Quindi, i nomi possono contenere solo caratteri alfanumerici incluso il carattere di sottolineatura, il primo carattere non può essere numerici ed i nomi devono avere almeno un carattere. E' possibile evitare tali limitazioni racchiudendo i nomi non conformi a tali regole tra doppi apici. Ad esempio:
    InputRoot.XML."Customer Data".Invoice
    Se è 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

  • Poiché i nomi dei campi vengono visualizzati nel programma ESQL, devono essere riconosciuti nel momento in cui il programma viene scritto. E' possibile evitare questa limitazione mediante la sintassi alternativa che utilizza le parentesi ( { ... } ). Questa sintassi consente di utilizzare qualsiasi espressione che restituisce un valore non null di tipo character.
    Ad esempio:
    InputRoot.XML."Customer Data".{'Customer-' || 
    	CurrentCustomer}.Invoice
    in 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.

Consultare:
  • Spazio dei nomi per il significato delle diverse combinazioni di spazio dei nomi e nome
  • Riferimenti di campo di destinazione per il significato delle diverse combinazioni di riferimenti di campo
  • Indici per il significato delle diverse combinazioni di clausole index
  • Tipi per il significato delle diverse combinazioni di tipi

Spazio dei nomi

I nomi dei campi possono appartenere agli spazi dei nomi. I riferimenti di campo forniscono il supporto per gli spazi dei nomi come riportato di seguito:
  • Ciascun campo di ciascun riferimento di campo che contiene una clausola name può contenere anche una clausola namespace che definisce lo spazio dei nomi a cui appartiene il nome specificato.
  • Ciascun nome dello spazio dei nomi può essere definito da un identificativo semplice o da un'espressione (racchiusa tra parentesi graffe). Se un identificativo è il nome di una costante dello spazio dei nomi dichiarata, viene utilizzato il valore della costante. Se viene utilizzata un'espressione, deve restituire un valore non null di tipo character.
  • Una clausola namespace * stabilisce in modo esplicito che le informazioni relative allo spazio dei nomi devono essere ignorate quando si individuano i campi in una struttura ad albero.
  • Una clausola namespace senza identificativo, espressione oppure *, che contiene solo con il carattere : individua in modo esplicito lo spazio dei nomi notarget

Indici

Ciascun campo o riferimento di campo può contenere una clausola index. Questa clausola è indicata da parentesi quadre ( [ ... ] ) ed accetta qualsiasi espressione che restituisce un valore non null di tipo integer. Questa clausola identifica quale campo selezionare tra diversi campi con lo stesso nome. I campi vengono numerati dal primo a partire dal numero uno. Se questa clausola non è presente, si suppone che il primo campo sia obbligatorio. Quindi, i due esempi riportati di seguito hanno esattamente lo stesso significato:
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.
Le espressioni di indice possono essere facoltativamente precedute dal simbolo minore di ( < ), che indica che il campo richiesto deve essere indicizzato dall'ultimo campo non dal primo. In questo caso, l'indice 1 si riferisce all'ultimo campo e l'indice 2 fa riferimento al penultimo campo. Per completezza, è possibile utilizzare il simbolo maggiore di per indicare il conteggio dal primo campo. L'esempio riportato di seguito contiene codice ESQL che gestisce gli indici in cui quattro campi sono chiamati Invoice.
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 second 
Una 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).

Tipi

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.

Ad esempio:
<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.

Limiti di tipo

Un limite di tipo verifica il tipo di dati restituiti da un RIFERIMENTO DI CAMPO.
Note:
  1. ScalarDataTypeName può essere uno qualsiasi tra BOOLEAN, INTEGER, INT, FLOAT, DECIMAL, DEC, DATE, TIME, TIMESTAMP, GMTTIME, GMTTIMESTAMP, INTERVAL, CHARACTER, CHAR, BLOB, BIT.

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.

Riepilogo

*, *[..], (..)*, (..)*[..]
Nessuno di tali formati specifica un nome o uno spazio dei nomi. Il campo di destinazione può contenere qualsiasi nome, in qualsiasi spazio dei nomi o in nessuno spazio dei nomi. Viene individuato solamente dal proprio tipo, dal proprio indice o dai propri tipo ed indice, se appropriato.
NameId, NameId[..], (..)NameId, (..)NameId[..]
Tali formati specificano un nome ma nessuno spazio dei nomi. Il campo di destinazione è individuato dallo spazio dei nomi e dal nome ed anche dal tipo e dall'indice, quando appropriato.

Lo spazio dei nomi è considerato l'unico nel percorso namespace che contiene questo nome. L'unico spazio dei nomi che può essere nel percorso è notarget.

Tali formati esistevano prima dell'introduzione degli spazi dei nomi. Sebbene il funzionamento sia stato modificato perché essi confrontano il nome e lo spazio dei nomi, il funzionamento delle trasformazioni esistenti non è stato modificato perché tutte le trasformazioni esistenti creano i propri campi nello spazio dei nomi notarget.

: *, :*[..], (..):*, (..):*[..]
Tali formati specificano lo spazio dei nomi notarget ma nessun nome. Il campo di destinazione è individuato dallo spazio dei nomi e dal tipo e dall'indice, quando appropriato.
: NameId, :NameId[..], (..):NameId, (..):NameId[..]
Tali formati specificano un nome e lo spazio dei nomi notarget. Il campo di destinazione è individuato dallo spazio dei nomi e dal nome ed anche dal tipo e dall'indice, quando appropriato.
* :*, *:*[..], (..)*:*, (..)*:*[..]
Nessuno di tali formati specifica un nome o uno spazio dei nomi. Notare che "*:*" è equivalente a "*" e corrisponde a nessuno spazio dei nomi ed a qualsiasi spazio dei nomi. Il campo di destinazione può contenere qualsiasi nome, in qualsiasi spazio dei nomi o in nessuno spazio dei nomi. Viene individuato solamente dal proprio tipo, dal proprio indice o dai propri tipo ed indice, se appropriato.
* :NameId, *:NameId[..], (..)*:NameId, (..)*:NameId[..]
Tali formati specificano un nome ma nessuno spazio dei nomi. Il campo di destinazione è individuato dal nome e dal tipo e dall'indice, quando appropriato.
SpaceId :*, SpaceId:*[..], (..)SpaceId:*, (..)SpaceId:*[..]
Tali formati specificano uno spazio dei nomi, ma nessun nome. Il campo di destinazione è individuato dallo spazio dei nomi e dal tipo e dall'indice, quando appropriato.
SpaceId :NameId, SpaceId:NameId[..], (..)SpaceId:NameId, (..)SpaceId:NameId[..]
Tali formati specificano uno spazio dei nomi ed un nome. Il campo di destinazione è individuato dallo spazio dei nomi e dal nome ed anche dal tipo e dall'indice, quando appropriato.

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.

Riferimenti di campo di destinazione

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 tali situazioni, esistono diverse circostanze in cui il broker non può indicare il nome o lo spazio dei nomi richiesto e, in tali casi, vengono applicati i seguenti principi generali:
  • Se la clausola name è assente o non specifica alcun nome e la clausola namespace è assente o non specifica o implica uno spazio dei nomi (non è disponibile alcun nome o spazio dei nomi), viene applicata una delle seguenti condizioni:
    • Se l'algoritmo di assegnazione non copia il nome da un campo esistente, il nome e lo spazio dei nomi del nuovo campo sono impostati sulla stringa vuota ed il relativo indicatore name non viene impostato automaticamente.

      In assenza di una specifica del tipo, il tipo del campo non è Name o NameValue, che indica effettivamente che il nuovo campo è senza nome.

      .
    • In caso contrario, se l'algoritmo di assegnazione decide di copiare il nome da un campo esistente, il nome e lo spazio dei nomi del nuovo campo vengono copiati dal campo esistente ed il relativo indicatore Name viene impostato automaticamente
  • Se la clausola name è presente e specifica un nome ma la clausola namespace è assente o non specifica o implica uno spazio dei nomi (il nome è disponibile ma lo spazio dei nomi no), per il nuovo campo:
    • Name è impostato sul valore fornito
    • Namespace è impostato sulla stringa vuota
    • L'indicatore Name è impostato automaticamente
  • Se la clausola name è assente o non specifica un nome ma la clausola namespace e presente e specifica o implica uno spazio dei nomi (lo spazio dei nomi è disponibile ma il nome no), per il nuovo campo:
    • Namespace è impostato sul valore fornito
    • Name è impostato sulla stringa vuota
    • L'indicatore Name è impostato automaticamente
  • Se la clausola name è presente e specifica un nome e la clausola namespace è presente e specifica o implica uno spazio dei nomi, per il nuovo campo:
    • Name è impostato sul valore fornito
    • Namespace è impostato sul valore fornito
    • L'indicatore Name è impostato automaticamente
Esistono anche dei casi in cui il broker crea dei campi in aggiunta a quelli indicati dai riferimenti di campo:
  • Copia della struttura ad albero: i nuovi campi vengono creati da un algoritmo che utilizza una struttura ad albero di origine come modello. Se l'algoritmo copia il nome di un campo origine in un nuovo campo, viene copiato anche il relativo spazio dei nomi.
  • Espressioni select anonime: la clausole SELECT non devono disporre necessariamente di clausole AS; quelle che non dispongono di tali clausole impostano i nomi dei nuovi campi su valori predefiniti (consultare Funzione SELECT).

    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.

Effetto dell'impostazione di un campo su NULL

Prestare attenzione quando si assegna un valore null ad un campo. Ad esempio, il seguente comando elimina il campo Name:
 SET OutputRoot.XML.Msg.Data.Name = NULL;  -- elimina il campo
Di seguito è riportato il modo corretto di assegnare un valore null ad un campo:
SET OutputRoot.XML.Msg.Data.Name VALUE = NULL;  
-- assegna un valore NULL ad un campo senza eliminarlo
Nota: per gli utenti sulla compatibilità con le versioni precedenti

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.

La parola chiave LAST è stata sostituita dalla seguente sintassi, che consente di specificare una direzione di ricerca ed un indice:
      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 ]
Concetti correlati
Panoramica di ESQL
Informazioni particolari | Marchi | Download | Libreria | Supporto | Commenti
Copyright IBM Corporation 1999, 2006 Ultimo aggiornamento: ago 17, 2006
ak04861_