L'istruzione DECLARE definisce una variabile, il tipo di dati della variabile e, come opzione, il relativo valore iniziale.
Consultare anche l'opzione ATOMIC in Istruzione BEGIN ... END. La struttura BEGIN ATOMIC è utile quando è necessario apportare un numero di modifiche ad una variabile condivisa ed è importante per evitare che altre istanze vedano gli stati intermedi dei dati.
Utilizzare CONSTANT per definire una costante. E' possibile dichiarare le costanti all'interno di schemi, moduli, routine o istruzioni composte (implicite ed esplicite). Di seguito è riportato il funzionamento di tali casi:
Una costante o una variabile dichiarata all'interno di una routine sostituisce tutti i parametri con lo stesso nome e tutte le costanti e le variabili con lo stesso nome dichiarate in un modulo o in uno schema.
Utilizzare EXTERNAL per indicare una UDP (user-defined property). Una UDP è una costante definita dall'utente il cui valore iniziale (facoltativamente impostato dall'istruzione DECLARE) può essere modificato, al momento della progettazione, dall'Editor Flusso di messaggi oppure sostituito, al momento della distribuzione, dall'Editor Archivio del broker. Il suo valore non può essere modificato da ESQL.
Per una panoramica sulle UDP, consultare UDP (User-defined property) in ESQL.
Quando all'UDP viene assegnato un valore iniziale nell'istruzione DECLARE, tale valore diventa il valore predefinito. Tuttavia, qualsiasi valore specificato dall'editor Flusso di messaggi al momento della progettazione oppure dall'editor BAR al momento della distribuzione (anche una stringa di lunghezza zero) sostituisce il valore iniziale indicato nell'istruzione DECLARE.
Tutte le UDP in un flusso di messaggi devono disporre di un valore, assegnato nell'istruzione DECLARE oppure dall'editor di BAR o del flusso di messaggi; in caso contrario, si verifica un errore relativo all'ora di distribuzione. Al runtime, dopo che l'UDP è stata dichiarata, le istruzioni ESQL successive possono interrogare ma non modificare il relativo valore.
Il vantaggio delle UDP è che il relativo valore può essere modificato al momento della distribuzione. Se, ad esempio, si utilizzano le UDP per conservare i dati di configurazione, è possibile configurare un flusso di messaggi per una particolare macchina, attività o ambiente al momento della distribuzione, senza dover modificare il codice al livello del nodo.
E' possibile dichiarare le UDP solo nei moduli o negli schemi.
Prestare attenzione quando si specifica il tipo di dati di una UDP, perché viene eseguita un'istruzione CAST per assegnare il DataType richiesto.
DECLARE mycolour EXTERNAL CHARACTER ‘blue';
DECLARE TODAYSCOLOR EXTERNAL CHARACTER; SET COLOR = TODAYSCOLOR;dove TODAYSCOLOR è una UDP che ha un TYPE uguale a CHARACTER e VALUE impostato dall'editor Flusso di messaggi.
Utilizzare NAME per definire un alias (un altro nome) mediante il quale è possibile riconoscere una variabile.
-- The following statement gives Schema1 an alias of 'Joe'. DECLARE Schema1 NAME 'Joe'; -- The following statement produces a field called 'Joe'. SET OutputRoot.XML.Data.Schema1 = 42; -- The following statement inserts a value into a table called Table1 -- in the schema called 'Joe'. INSERT INTO Database.Schema1.Table1 (Answer) VALUES 42;
DECLARE Schema1 EXTERNAL NAME; CREATE FIRSTCHILD OF OutputRoot.XML.TestCase.Schema1 Domain('XML') NAME 'Node1' VALUE '1'; -- If Schema1 has been given the value 'red', the result would be: <xml version="1.0"?> <TestCase> <red> <Node1>1</Node1> </red>
Utilizzare NAMESPACE per definire un alias (un altro nome) mediante il quale è possibile riconoscere uno spazio dei nomi.
Questo esempio illustra una dichiarazione di spazio dei nomi, il relativo utilizzo come SpaceId in un percorso ed il relativo utilizzo come costante character in un'espressione namespace:
DECLARE prefixOne NAMESPACE 'http://www.example.com/PO1'; -- On the right hand side of the assignment a namespace constant -- is being used as such while, on the left hand side, one is -- being used as an ordinary constant (that is, in an expression). SET OutputRoot.XML.{prefixOne}:{'PurchaseOrder'} = InputRoot.XML.prefixOne:PurchaseOrder;
Utilizzare SHARED per definire una variabile condivisa. Le variabili condivise sono private per il flusso (se dichiarate all'interno di uno schema) o per il nodo (se dichiarate all'interno di un modulo) ma sono condivise tra le istanze del flusso (thread). Nessun tipo di variabile è più visibile di una variabile a livello del flusso. Ad esempio, non è possibile condividere le variabili tra i gruppi di esecuzione.
Le variabili condivise possono essere utilizzate per implementare una cache in memoria nel flusso di messaggi. Consultare Ottimizzazione dei tempi di riposta del flusso di messaggi. Le variabili condivise hanno una durata elevata e sono visibili per più messaggi che attraversano un flusso; consultare Variabili a lunga durata. Queste variabili esistono per l'intera durata del processo del gruppo di esecuzione, l'intera durata del flusso o del nodo o l'intera durata del codice SQL del nodo che dichiara la variabile (qualunque sia la più breve). Sono inizializzate quando il primo messaggio passa attraverso il flusso o il nodo dopo l'avvio di ciascun broker.
Non è possibile definire una variabile condivisa all'interno di una funzione o di una procedura.
Tali variabili di lettura-scrittura, con una durata superiore a quella di un messaggio me che funzionano meglio di un database, sono ideali per gli utenti pronti a sacrificare i vantaggi transazionali e di permanenza dei database per migliorare le prestazioni.
Con le variabili condivise del flusso (definite al livello dello schema), prestare attenzione quando più flussi possono aggiornare le variabili, specialmente se la variabile viene utilizzata come contatore. Allo stesso modo, con le variabili condivise del nodo (definite al livello del modulo), prestare attenzione quando più istanze possono aggiornare le variabili.
Le variabili row condivise consentono a un programma utente di eseguire un'efficace copia in lettura/scrittura di un messaggio del nodo di input. Ciò è generalmente utile e, in particolare, semplifica la tecnica per la gestione di messaggi di grandi dimensioni.
Esiste una limitazione relativa alle strutture ad albero secondarie che non possono essere copiate direttamente da una variabile row condivisa ad un'altra variabile row condivisa. Le strutture ad albero secondarie possono essere copiate indirettamente utilizzando una variabile row non condivisa. I valori scalari estratti da una variabile row condivisa (utilizzando la funzione FIELDVALUE) possono essere copiati ad un'altra variabile row condivisa.
Per un esempio di utilizzo delle variabili condivise, consultare il programma di esempio "Instradamento messaggio" che illustra come utilizzare le variabili condivise ed esterne. L'esempio "Instradamento messaggio" è disponibile nella Galleria degli esempi in Message Brokers Toolkit.