Zur Erstellung von Pfaden zu Nachrichtentextelementen können Sie ESQL-Feldreferenzen verwenden.
>>-Korrelationsname--+---------------------+------------------->< | .-.---------------. | | V | | '---| PathElement |-+-' Pfadelement |--+-----------+------------------------------------------------> '-(--Typ--)-' >-- ---+--------------------------------+--+-Name---------------+--> '-+-------------------------+--:-' +-{--NameAusdruck--}-+ +-Namespace---------------+ '-*------------------' +-{--NamespaceAusdruck--}-+ '---*---------------------' >--+------------------------+-----------------------------------| '-[--+--------------+--]-' +-Index--------+ +-<--+-------+-+ | '-Index-' | +->--+-------+-+ | '-Index-' | '-<------------'
Eine Feldreferenz besteht aus einem Korrelationsnamen gefolgt von keinem oder mehreren Pfadelementen, 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.XMLNS.Data.Invoice
Bei diesem Pfad beginnt der Broker an der
Position InputRoot (dem Stammelement der Eingabenachricht an einen Rechenknoten) und führt dann
eine Folge von Navigationsschritten aus.
Zuerst navigiert er vom Stammelement zum ersten
untergeordneten Feld mit dem Namen 'XMLNS' und dann zum ersten untergeordneten Feld des Feldes
'XMLNS' mit dem Namen 'Data'. Schließlich navigiert der Broker zum ersten untergeordneten Feld des Feldes
'Data' mit dem Namen 'Invoice'. Immer wenn diese Feldreferenz in einem ESQL-Programm vorkommt,
erfolgt ein Zugriff auf das Feld 'Invoice'.InputRoot.XMLNS."Customer Data".Invoice
Wenn Sie auf Felder verweisen müssen,
die Anführungszeichen enthalten, setzen Sie zwei Anführungszeichen sowohl vor als auch hinter die
Referenz. 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.XMLNS."Customer Data".{'Customer-' ||
CurrentCustomer}.Invoice
In 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. InputRoot.XMLNS.*.Invoice.Value
entspricht jedem Pfadelement, in dem die Rechnungen enthalten sind.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.
DECLARE sp1 NAMESPACE 'http://www.ibm.com/space1';
/* Namespace-Deklaration für die Zuordnung des Präfixes 'space1' zum Namespace */
SET OutputRoot.XMLNS.TestCase.(XML.NamespaceDecl)xmlns:space1 = 'http://www.ibm.com/space1';
SET OutputRoot.XMLNS.TestCase.sp1:data1 = 'Hello!';
generiert:<TestCase xmlns:space1="http://www.ibm.com/space1">
<space1:data1>Hello!</space1:data1>
</TestCase>
InputRoot.XMLNS.Data[1].Invoice
InputRoot.XMLNS.Data.Invoice[1]
Dieses Konstrukt wird am häufigsten in Verbindung mit
einer Indexvariablen benutzt, sodass in einer Schleife alle Felder nacheinander bearbeitet werden. Beispiel: WHILE count < 32 DO
SET TOTAL = TOTAL + InputRoot.XMLNS.Data.Invoice[count].Amount;
SET COUNT = COUNT + 1
END WHILE;
Setzen Sie diese Art von Konstrukt mit Vorsicht ein, denn es impliziert,
dass der Broker die Felder bei jeder Schleife von Anfang an zählen muss. Das heißt, je größer der
Wiederholungszähler, desto schlechter die Leistung. In solchen Fällen empfiehlt sich als bessere
Alternative die Verwendung einer Feldreferenzvariablen.InputRoot.XMLNS.Data.Invoice -- Erstes Feld wird ausgewählt
InputRoot.XMLNS.Data.Invoice[1] -- Erstes Feld wird ausgewählt
InputRoot.XMLNS.Data.Invoice[>] -- Erstes Feld wird ausgewählt
InputRoot.XMLNS.Data.Invoice[>1] -- Erstes Feld wird ausgewählt
InputRoot.XMLNS.Data.Invoice[>2] -- Zweites Feld wird ausgewählt
InputRoot.XMLNS.Data.Invoice[<] -- Viertes Feld wird ausgewählt
InputRoot.XMLNS.Data.Invoice[<1] -- Viertes Feld wird ausgewählt
InputRoot.XMLNS.Data.Invoice[<2] -- Drittes Feld wird ausgewählt
InputRoot.XMLNS.Data.Invoice[<3] -- Zweites Feld wird ausgewählt
Eine Indexklausel kann auch
aus zwei leeren eckigen Klammern bestehen ( [] ).
Das heißt, es werden alle Felder mit
übereinstimmenden Namen ausgewählt. 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 Klausel ist durch runde Klammern ( ( ) ) gekennzeichnet und akzeptiert alle Ausdrücke, die einen Wert ungleich null des Typs 'Integer' (Ganzzahl) liefern. Die Angabe eines Typausdrucks bewirkt, dass nur die Felder ausgewählt werden, die mit dem angegebenen Typ übereinstimmen. 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 Feld kann 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.
(1) >>-(--Feldverweis--)--NameSkalarerDatentyp---------------------><
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 mithilfe 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.
Der Namespace wird als der einzige Namespace im Namespacepfad, der diesen Namen enthält, akzeptiert. Der einzige Namespace, der im Pfad enthalten sein kann, ist der Namespace 'notarget'.
Diese Art von Referenz gab es bereits vor der Einführung von Namespaces. Zwar hat sich ihr Verhalten dahingehend geändert, dass jetzt sowohl Name als auch Namespace verglichen werden. Dies sollte jedoch keine Auswirkung auf das Verhalten vorhandener Umwandlungen haben, weil alle vorhandenen Umwandlungen ihre Felder im Namespace 'notarget' erstellen.
In allen genannten Fällen ist ein Name, oder Namespace, der durch einen Ausdruck in geschweiften Klammern ({}) angegeben wird, äquivalent zu einem Namen, der als ein Bezeichner angegeben wird.
Laut Definition ist der Name des Namespace 'notarget' die leere Zeichenfolge. Die leere Zeichenfolge kann durch Ausdrücke, deren Auswertung die leere Zeichenfolge ergibt, durch den leeren Bezeichner "" oder durch Verweis auf eine Namespacekonstante, die als leere Zeichenfolge definiert ist, ausgewählt werden.
Die Verwendung von Feldverweisen beinhaltet in der Regel die Suche nach einem vorhandenen Feld. Falls das benötigte Feld jedoch nicht existiert, wie normalerweise im Falle von Feldverweisen, die Ziele von SET-Anweisungen sind, und von Feldverweisen 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 Namespacename 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 NameId-Syntax eines Feldverweises behandelt.
SET OutputRoot.XMLNS.Msg.Data.Name = NULL; -- Löscht das Feld
SET OutputRoot.XMLNS.Msg.Data.Name VALUE = NULL;
-- dieser Befehl weist einem Feld einen NULL-Wert zu, ohne es zu löschen
Aus Gründen der Kompatibilität mit früheren Versionen 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.
Field [ > ] -- Das erste Feld, äquivalent zu [ 1 ]0
Field [ > (a + b) * 2 ]
Feld [ < ] -- Das letzte Feld, äquivalent zu [ LAST ]
Feld [ < 1 ] -- Das letzte Feld, äquivalent zu [ LAST ]
Feld [ < 2 ] -- Das vorletzte Feld
Feld [ < (a + b) / 3 ]