Die DECLARE-Anweisung definiert eine Variable, ihren Datentyp und - optional - ihren Anfangswert.
Lesen Sie auch die Hinweise zur Option ATOMIC der BEGIN ... END-Anweisung. Das Konstrukt BEGIN ATOMIC ist nützlich, wenn mehrere Änderungen an einer gemeinsamen Variablen vorgenommen werden, und der Zwischenstatus der Daten für andere Instanzen nicht sichtbar sein soll.
Definieren Sie eine Konstant mit CONSTANT. Konstanten innerhalb von Schemata, Modulen, Routinen oder zusammengesetzten Anweisungen können (sowohl implizit als auch explizit) deklariert werden. Diese Vorgänge laufen wie folgt ab:
Eine Konstante oder Variable, die innerhalb einer Routine deklariert wurde, überschreibt alle Parameter und alle in einem enthaltenen Modul oder Schema deklarierten Konstanten und Variablen mit demselben Namen.
Mit EXTERNAL zeigen Sie eine benutzerdefinierte Eigenschaft (UDP) an. Eine UDP ist eine benutzerdefinierte Konstante, deren Anfangswert (optional von der DECLARE-Anweisung festgelegt) bei der Entwicklung vom Nachrichtenflusseditor geändert bzw. bei der Implementierung vom Brokerarchiveditor überschrieben werden kann. Ihr Wert kann nicht von ESQL geändert werden.
Eine Übersicht über benutzerdefinierte Eigenschafen finden Sie unter Benutzerdefinierte Eigenschaften in ESQL.
Wenn eine UDP in der DECLARE-Anweisung einen Anfangswert erhält, wird dieser als Standardwert verwendet. Jeder Wert, der bei der Entwicklung vom Nachrichtenfluss-Editor bzw. während der Implementierung vom BAR-Editor festgelegt wird (sogar Zeichenfolgen mit Null-Länge), überschreibt jedoch jeden in der DECLARE-Anweisung codierten Anfangswert.
Alle UDPs in einem Nachrichtenfluss müssen einen Wert haben, der entweder in der DECLARE-Anweisung oder durch den Nachrichtenfluss- bzw. BAR-Editor vergeben wurde. Anderenfalls tritt bei Implementierungszeit ein Fehler auf. Nachdem die UDP deklariert wurde, kann ihr Wert zwar bei Laufzeit von nachfolgenden ESQL-Anweisungen abgefragt, aber nicht geändert werden.
UDPs haben den Vorteil, dass Administratoren ihre Werte bei der Implementierungszeit ändern können. Wenn Sie z. B. mit den UDPs Konfigurationsdaten halten, können Sie bei der Implementierung einen Nachrichtenfluss für einen bestimmten Computer, eine Aufgabe oder Umgebung konfigurieren, ohne den Code auf Knotenebene ändern zu müssen.
UDPs können nur in Modulen oder Schemas deklariert werden.
Legen Sie den Datentyp einer UDP mit Bedacht fest, da der Typ CAST den angeforderten Datentyp umsetzt.
DECLARE mycolour EXTERNAL CHARACTER ‘blue';
DECLARE TODAYSCOLOR EXTERNAL CHARACTER; SET COLOR = TODAYSCOLOR;wobei es sich bei TODAYSCOLOR um eine benutzerdefinierte Eigenschaft vom Typ CHARACTER und mit einem vom Nachrichtenfluss-Editor festgelegten WERT ist.
Mit NAME definieren Sie einen Aliasnamen (d. h. einen anderen Namen), unter dem eine Variable bekannt sein kann.
-- Die nachfolgende Anweisung gibt Schema1 den Aliasnamen 'Joe'. DECLARE Schema1 NAME 'Joe'; -- Die nachfolgende Anweisung erstellt ein Feld 'Joe'. SET OutputRoot.XML.Data.Schema1 = 42; -- Die nachfolgende Anweisung fügt einen Wert in eine Tabelle namens Table1 -- im Schema 'Joe' ein. 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'; -- Wenn Schema1 den Wert 'red' erhalten hat, lautete das Ergebnis: <xml version="1.0"?> <TestCase> <red> <Node1>1</Node1> </red>
Mit NAMESPACE definieren Sie einen Aliasnamen (d. h. einen anderen Namen), unter dem ein Namespace bekannt sein kann.
Dies ist ein Beispiel für eine Namensbereichsdeklaration, ihre Verwendung als BereichsId in einem Pfad und als Zeichenkonstante in einem Namensbereichsausdruck:
DECLARE prefixOne NAMESPACE 'http://www.example.com/PO1'; -- Auf der rechten Seite der Zuweisung wird eine Namensbereichkonstante -- als solche verwendet, während auf der linken Seite eine -- als normale Konstante verwendet wird (d. h. in einem Ausdruck). SET OutputRoot.XML.{prefixOne}:{'PurchaseOrder'} = InputRoot.XML.prefixOne:PurchaseOrder;
Mit SHARED definieren Sie eine gemeinsame Variable. Gemeinsame Variablen gehören dem Nachrichtenfluss (wenn sie in einem Schema deklariert sind) oder Knoten (wenn sie in einem Modul deklariert sind), werden aber von den Instanzen des Flusses (Threads) gemeinsam verwendet. Kein Variablentyp ist weiter verbreitet als der derjenige auf Flussebene. Variablen können beispielsweise nicht über Ausführungsgruppen hinweg gemeinsam verwendet werden.
Gemeinsame Variablen können zur Implementierung eines Speichercaches in den Nachrichtenfluss verwendet werden (siehe Reaktionszeiten von Nachrichtenflüssen optimieren). Gemeinsame Variablen haben eine lange Lebensdauer und sind für mehrere Nachrichten sichtbar, die einen Nachrichtenfluss durchlaufen (siehe Langlebige Variablen). Sie bestehen für die Lebensdauer des Prozesses der Ausführungsgruppe, für die Lebensdauer des Flusses oder Knotens oder für die Lebensdauer der SQL des Knotens, die die Variable deklariert (immer die kürzestes Lebensdauer). Sie werden initialisiert, wenn die erste Nachricht nach jeder Broker-Initialisierung den Fluss oder Knoten durchläuft.
Sie können keine gemeinsame Variabel innerhalb einer Funktion oder Prozedur definieren.
Diese Lese-Schreib-Variablen, deren Lebensdauer länger ist als die einer Nachricht, die jedoch eine bessere Leistung als eine Datenbank aufweisen, sind ideal geeignet für Benutzer, die die Persistenz und Transaktionsorientiertheit von Datenbanken gerne gegen eine bessere Leistung eintauschen.
Beachten Sie bei Variablen, die gemeinsam in einem Nachrichtenfluss verwendet werden (d. h. die auf Schemaebene definiert sind), darauf, dass mehrere Flüsse die Variablen aktualisieren können - insbesondere, wenn die Variable als Zähler verwendet wird. Beachten Sie gleichfalls bei Variablen, die gemeinsam in einem Knoten verwendet werden (d. h. die auf Modulebene definiert sind), darauf, dass mehrere Instanzen die Variablen aktualisieren können.
Gemeinsam in Zeilen verwendete Variablen ermöglichen einem Benutzerprogramm, eine effiziente Lese/Schreibkopie der Nachricht eines Empfangsknotens zu erstellen. Dies ist generell hilfreich und vereinfacht im Speziellen die Bearbeitung großer Nachrichten.
"Es besteht die Einschränkung, dass untergeordnete Baumstrukturen nicht direkt aus einer gemeinsamen Zeilenvariablen in eine andere gemeinsamen Zeilenvariable kopiert werden können. Untergeordnete Baumstrukturen lassen sich indirekt unter Verwendung einer Zeilenvariablen kopieren, die nicht gemeinsam genutzt wird. Skalare Werte, die aus einer gemeinsam genutzten Zeilenvariablen extrahiert wurden (mit Hilfe der FIELDVALUE-Funktion), können Sie in eine andere gemeinsam genutzte Zeilenvariable kopieren.
Beispiele für die Verwendung der gemeinsamen Variablen, finden Sie im "Nachrichtenrouting"-Beispiel, das die Verwendung gemeinsamer und externer Variablen veranschaulicht. Das "Nachrichtenrouting"-Beispiel befindet sich in derBeispielprogrammgalerie des Message Brokers Toolkits.