Sehen Sie sich folgende Beispiele an, und ändern Sie sie Ihren Anforderungen entsprechend. Sie basieren alle auf der Nachricht 'Invoice' (Rechnung) als Eingabe.
Sehen Sie sich folgenden ESQL-Code an:
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity, R.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R);
Wenn die Nachricht 'Invoice' von diesem ESQL-Code verarbeitet wird, wird folgende Ausgabenachricht erstellt:
<Data> <Output> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Output> <Output> <Quantity>1</Quantity> <Author>Don Chamberlin</Author> </Output> <Output> <Quantity>1</Quantity> <Author>Philip Heller, Simon Roberts</Author> </Output> </Data>
Es sind drei Ausgabefelder (Output) vorhanden, eines für jedes Elementfeld (Item). Dies ist darauf zurückzuführen, dass SELECT standardmäßig für jedes Element, das durch die FROM-Liste beschrieben wird, ein Element in der Ergebnisliste erstellt. In jedem Ausgabefeld ist für jedes in der SELECT-Klausel benannte Feld ein Feld vorhanden, wobei die Felder in der Reihenfolge angegeben werden, in der sie auch in der SELECT-Klausel angegeben sind, nicht in der Reihenfolge, in der sie in der ankommenden Nachricht angezeigt werden.
Das R hinter dem letzten Schlüsselwort AS wird als Korrelationsname bezeichnet. Es handelt sich dabei um eine lokale Variable, die der Reihe nach jedes der Felder darstellt, die von der FROM-Klausel adressiert werden. Der gewählte Name hat keine Bedeutung. Kurz gesagt hat diese einfache Umwandlung zwei Funktionen:
Im folgenden Beispiel wird dieselbe Umwandlung von einem prozeduralen Algorithmus implementiert:
DECLARE i INTEGER 1; DECLARE count INTEGER CARDINALITY(InputRoot.XML.Invoice.Purchases.Item[]); WHILE (i <= count) SET OutputRoot.XML.Data.Output[i].Quantity = InputRoot.XML.Invoice.Purchases.Item[i].Quantity; SET OutputRoot.XML.Data.Output[i].Author = InputRoot.XML.Invoice.Purchases.Item[i].Author; SET i = i+1; END WHILE;
Diese Beispiele zeigen, dass die SELECT-Version der Umwandlung viel präziser ist. Außerdem wird sie schneller ausgeführt.
Im folgenden Beispiel wird eine erweiterte Umwandlung dargestellt:
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity AS Book.Quantity, R.Author AS Book.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R );
In dieser Umwandlung ist jedem Element in der SELECT-Klausel eine AS-Klausel zugeordnet. Dadurch erhält jedes Feld im Ergebnis einen expliziten Namen, und die Feldnamen werden nicht von der Eingabe übernommen. Diese Namen können wie im Beispiel Pfade sein (d. h. eine durch Kommas getrennte Liste mit Namen). Deshalb kann sich die Struktur der Ausgabenachricht willkürlich von der Struktur der Eingabenachricht unterscheiden. Bei Verwendung derselben Invoice-Nachricht sieht das Ergebnis folgendermaßen aus:
<Data> <Output> <Book> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Book> </Output> </Data> <Data> <Output> <Book> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Book> </Output> <Output> <Book> <Quantity>1</Quantity> <Author>Don Chamberlin</Author> </Book> </Output> <Output> <Book> <Quantity>1</Quantity> <Author>Philip Heller, Simon Roberts</Author> </Book> </Output> </Data>
Für die Ausdrücke in der SELECT-Klausel gelten keine Begrenzungen hinsichtlich der Komplexität und auch sonst keine besonderen Einschränkungen. Sie können Operatoren, Funktionen und Literale enthalten sowie auf Variablen oder Felder verweisen, die keine Beziehung zum Korrelationsnamen haben. Das folgende Beispiel enthält einige komplexere Ausdrücke:
SET OutputRoot.XML.Data.Output[] = (SELECT 'Start' AS Header, 'Number of books:' || R.Quantity AS Book.Quantity, R.Author || ':Name and Surname' AS Book.Author, 'End' AS Trailer FROM InputRoot.XML.Invoice.Purchases.Item[] AS R );
Auf der Basis derselben Invoice-Nachricht führt dies in diesem Fall zu folgendem Ergebnis:
<Data> <Output> <Header>Start</Header> <Book> <Quantity>Number of books:2</Quantity> <Author>Neil Bradley:Name and Surname</Author> </Book> <Trailer>End</Trailer> </Output> <Output> <Header>Start</Header> <Book> <Quantity>Number of books:1</Quantity> <Author>Don Chamberlin:Name and Surname</Author> </Book> <Trailer>End</Trailer> </Output> <Output> <Header>Start</Header> <Book> <Quantity>Number of books:1</Quantity> <Author>Philip Heller, Simon Roberts:Name and Surname</Author> </Book> <Trailer>End</Trailer> </Output> </Data>
Wie oben gezeigt, enthalten die AS-Klauseln der SELECT-Klausel einen Pfad, der den vollständigen Namen des Feldes, das im Ergebnis erstellt werden soll, beschreibt. Diese Pfade können auch den Typ des zu erstellenden Feldes angeben (wie normalerweise bei Pfaden). In der folgenden Beispielumwandlung sind die Feldtypen angegeben. In diesem Fall werden mit Tags versehene XML-Daten in XML-Attribute umgewandelt:
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity.* AS Book.(XML.Attribute)Quantity, R.Author.* AS Book.(XML.Attribute)Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R );
Auf der Basis derselben Invoice-Nachricht führt dies zu folgendem Ergebnis:
<Data> <Output> <Book Quantity="2" Author="Neil Bradley"/> </Output> <Output> <Book Quantity="1" Author="Don Chamberlin"/> </Output> <Output> <Book Quantity="1" Author="Philip Heller, Simon Roberts"/> </Output> </Data>
Schließlich haben Sie die Möglichkeit, einige der Ergebnisse mit Hilfe einer WHERE-Klausel auszuschließen. Im folgenden Beispiel wird eine WHERE-Klausel verwendet, um Ergebnisse, die eine bestimmte Bedingung erfüllen, entfernt werden. Ein vollständiges Ergebnis wird entweder ein- oder ausgeschlossen:
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity AS Book.Quantity, R.Author AS Book.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R WHERE R.Quantity = 2 );
Auf der Basis derselben Eingangsnachricht führt dies zu folgendem Ergebnis:
<Data> <Output> <Book> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Book> </Output> </Data>