In diesem Kapitel wird die Verwendung von ESQL-Feldverweisen für die Erstellung von Pfaden zu Nachrichtentextelementen beschrieben.
Eine Feldreferenz besteht aus einem Korrelationsnamen gefolgt von keinem oder mehreren Pfadfeldern, die durch Punkte (.) voneinander getrennt sind. Der Korrelationsname gibt einen anerkannten Ausgangspunkt an und muss dem Namen einer Konstante, einer deklarierten Variablen (skalar, Zeile oder Referenz) oder einem der vordefinierten Ausgangspunkte entsprechen, z. B. InputRoot (Eingabestamm). Die Pfadfelder definieren einen Pfad vom Ausgangspunkt zu dem gewünschten Feld.
InputRoot.XML.Data.InvoiceBei diesem Beispiel beginnt der Broker am Ausgangspunkt 'InputRoot' (die oberste Ebene der Eingabenachricht in einem Rechenknoten) und arbeitet sich dann durch die entsprechenden darunterliegenden Ebenen durch. Zuerst navigiert er vom Stammelement zum ersten untergeordneten Feld mit dem Namen 'XML' und dann zum ersten untergeordneten Feld des Feldes 'XML' mit dem Namen 'Data'. Schließlich navigiert der Broker zum ersten untergeordneten Feld des Feldes 'Data' mit dem Namen 'Invoice'. Bei Verwendung dieses Feldverweises in einem ESQL-Programm erfolgt immer ein Zugriff auf das Feld 'Invoice'.
InputRoot.XML."Customer Data".InvoiceBei Verweisen auf Felder, die doppelte Anführungszeichen enthalten, müssen Sie die Verweise in zwei doppelte Anführungszeichen setzen. Beispiel:
Body.Message.""hello""
Einige Bezeichner sind reservierte Schlüsselwörter, die Sie jedoch mit Ausnahme des Korrelationsnamens in Feldreferenzen verwenden können, ohne sie in Anführungszeichen zu setzen.
InputRoot.XML."Customer Data".{'Customer-' || CurrentCustomer}.InvoiceIn diesem Fall befinden sich die Rechnungen in einem Ordner mit einem Namen, der durch Verknüpfung des Zeichenliterals 'Customer-' mit dem Wert in 'CurrentCustomer' (muss in diesem Beispiel eine deklarierte Variable des Typs 'Character' sein) gebildet wird.
In einem Pfadelement können Sie den Stern (*) als Platzhalterzeichen für einen beliebigen Namen verwenden. Sie können auch den Stern "*" für die Angabe eines Namensteils verwenden. Wenn Sie beispielsweise Präfix* angeben, steht dies für einen beliebigen Namen, der mit "Präfix" beginnt.
Beachten Sie, dass alles, was in ESQL in Anführungszeichen gesetzt wird, zu einem Bezeichner wird, und alles, was in einfache Anführungszeichen gesetzt wird, dadurch zu einem Zeichenliteral wird. Sie müssen alle Zeichenfolgen in einfache Anführungszeichen setzen.
InputRoot.XML.Data[1].Invoice InputRoot.XML.Data.Invoice[1]Dieses Konstrukt wird häufig mit einer Indexvariablen verwendet, so dass eine Schleife all diese Felder in Folge abarbeitet. Beispiel:
WHILE count < 32 DO SET TOTAL = TOTAL + InputRoot.XML.Data.Invoice[count].Amount; SET COUNT = COUNT + 1 END WHILE;Allerdings muss dieses Konstrukt mit Vorsicht eingesetzt werden, da hier davon ausgegangen wird, dass der Broker in der Schleife jedes Mal wieder von vorne beginnen muss. Das heißt, je größer der Wiederholungszähler, desto schlechter die Leistung. In diesen Fällen ist es besser, eine Feldverweisvariable zu verwenden.
InputRoot.XML.Data.Invoice -- Das erste Feld wird ausgewählt InputRoot.XML.Data.Invoice[1] -- Das erste Feld wird ausgewählt InputRoot.XML.Data.Invoice[>] -- Das erste Feld wird ausgewählt InputRoot.XML.Data.Invoice[>1] -- Das erste Feld wird ausgewählt InputRoot.XML.Data.Invoice[>2] -- Das zweite Feld wird ausgewählt InputRoot.XML.Data.Invoice[<] -- Das vierte Feld wird ausgewählt InputRoot.XML.Data.Invoice[<1] -- Das vierte Feld wird ausgewählt InputRoot.XML.Data.Invoice[<2] -- Das dritte Feld wird ausgewählt InputRoot.XML.Data.Invoice[<3] -- Das zweite Feld wird ausgewähltEine Indexklausel kann auch aus einem leeren Paar eckiger Klammern ( "[ ]" ) bestehen. Dies gibt an, dass alle Felder des entsprechenden Namens ausgewählt werden sollen. Verwenden Sie dieses Konstrukt mit Funktionen und Anweisungen, die Listen erwarten (z. B. die Funktionen SELECT, CARDINALITY, SINGULAR und EXISTS oder die SET-Anweisung) .
Jedes Feld einer Feldreferenz kann eine Typklausel enthalten. Diese Typklauseln sind durch runde Klammern ( "( )" ) gekennzeichnet und gestatten die Verwendung beliebiger Ausdrücke, die einen Wert ungleich null des Typs INTEGER zurückgeben. Durch die Angabe eines Typausdrucks wird die Auswahl der Felder auf solche desselben Typs beschränkt. Dieses Konstrukt wird am häufigsten in Verbindung mit generischen XML-Formaten verwendet, die viele Feldtypen enthalten und in denen ein einziges XML-Feld sowohl Attribute als auch weitere XML-Felder mit demselben Namen enthalten kann.
<Item Value = '1234' > <Value>5678</Value> </Item>
Hier verfügt das XML-Feld "Element" über zwei untergeordnete Felder, beide mit dem Namen "Value" (Wert). Das untergeordnete Feldkann mittels zweier Typklauseln unterschieden werden: Element.(<Domäne>.Attribut)Wert zur Auswahl des Attributs und Element.(XML.Element)Werte zur Auswahl des Feldes. Dabei ist die <Domäne> entweder XML, XMLNS oder XMLNSC, wie von der Nachrichtendomäne der Quelle festgelegt.
Normalerweise bewirkt eine Typeinschränkung, dass der skalare Wert der Referenz extrahiert (wie bei der FIELDVALUE-Funktion) und eine Ausnahme ausgelöst wird, wenn die Referenz den falschen Typ hat. Laut Definition wird eine Ausnahme für alle nicht vorhandenen Felder ausgelöst, da diese den Wert NULL ergeben. Auf diese Weise lassen sich Ausnahmen schnell und einfach auslösen, wenn in Nachrichten wichtige Felder fehlen.
Wenn jedoch Typeinschränkungen in Ausdrücken auftreten, die an eine Datenbank übermittelt werden sollen (wenn sie z. B. in einer WHERE-Klausel sind), wird mit Hilfe der Informationen bestimmt, ob der Ausdruck an die Datenbank übergeben werden kann. Dies kann dann von Bedeutung sein, wenn eine WHERE-Klausel einen UMSETZUNGSAUSDRUCK enthält, der in einer Datenbanktabellenspalte aktiv ist. Ohne Typeinschränkung können solche Ausdrücke nicht an die Datenbank übergeben werden, da der Broker nicht weiß, ob die Datenbank die erforderliche Konvertierung ausführen kann. Seien Sie bei der Verwendung von Umsetzungsausdrücken in Spaltenwerten stets besonders sorgfältig, da einige Datenbanken äußerst begrenzte Konvertierungsfunktionen haben.
In allen vorherigen Fällen entspricht ein Name oder ein Namespace, der über einen in geschweiften Klammern ({}) gesetzten Ausdruck angegeben wurde, einem als ID angegebenen Namen.
Der Definition nach entspricht der Name des Nicht-Ziel-Namespaces einer leeren Zeichenfolge. Die leere Zeichenfolge kann über Ausdrücke ausgewählt werden, die eine leere Zeichenfolge ergeben, über die leere ID "" oder über einen Verweis auf eine Namespaceskonstante, die als leere Zeichenfolge definiert wurde.
Die Verwendung von Feldreferenzen beinhaltet in der Regel die Suche nach einem vorhandenen Feld. Falls das benötigte Feld jedoch nicht existiert, wie normalerweise im Falle von Feldreferenzen, die Ziele von SET-Anweisungen sind, und von Feldreferenzen in den AS-Klauseln von SELECT-Funktionen, wird es erstellt.
Ist keine Typspezifikation angegeben, lautet der Typ des Feldes nicht Name oder NameValue, was im Endeffekt bedeutet, dass das neue Feld keinen Namen hat
.Diese Standardwerte können von Feldnamen oder Spaltennamen abgeleitet werden oder können einfach nur systemgenerierte Folgenamen sein. Ist der Name ein Feldname, handelt es sich im Endeffekt um eine Baumstrukturkopie, und der Namespacesname wird wie oben beschrieben kopiert.
Andernfalls wird der Namespace des neu erstellten Feldes abgeleitet, indem der Pfad durchsucht wird, d. h., der Name wird wie die Namens-ID-Syntax einer Feldreferenz behandelt.
SET OutputRoot.XML.Msg.Data.Name = NULL; -- dieser Befehl löscht das Feld
SET OutputRoot.XML.Msg.Data.Name VALUE = NULL; -- dieser Befehl weist einem Feld einen NULL-Wert zu, ohne es zu löschen
Aus Gründen der Abwärtskompatibilität wird das Schlüsselwort LAST nach wie vor unterstützt, die Verwendung ist jedoch veraltet. LAST kann nicht als Teil eines Indexausdrucks verwendet werden: [LAST] ist gültig und entspricht [<], [LAST3] ist jedoch ungültig.
Feld [ > ] -- Das erste Feld, äquivalent zu [ 1 ] Feld [ > (a + b) * 2 ] Feld [ < ] -- Das letzte Feld, äquivalent zu [ LAST ] Feld [ < 1 ] -- Das letzte Feld, äquivalent zu [ LAST ] Feld [ < 2 ] -- Das vorletzte Feld Field [ < (a + b) / 3 ]