Einfache Nachricht umwandeln

Verwenden Sie beim Erstellen des ESQL-Codes für einen Compute-Knoten die SELECT-Funktion zum Umwandeln einfacher Nachrichten.

Dieser Abschnitt enthält Beispiele für eine einfache Nachrichtenumsetzung. Überprüfen Sie die Beispiele, 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.XMLNS.Data.Output[] =
    (SELECT R.Quantity, R.Author FROM InputRoot.XMLNS.Invoice.Purchases.Item[] AS R
    );

Wenn dieser ESQL-Code die Invoice-Nachricht verarbeitet, erzeugt er folgende Ausgabenachricht:

<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>

Drei Ausgabefelder sind vorhanden, eines für jedes Elementfeld, da SELECT für jedes in der FROM-Liste beschriebene Element ein Element in seiner Ergebnisliste erstellt. In jedem Ausgabefeld wird für jedes in der SELECT-Klausel genannte Feld ein Feld erstellt. Diese Felder stehen in der Reihenfolge, in der sie in der SELECT-Klausel angegeben sind, und nicht in der Reihenfolge, in der sie in der ankommenden Nachricht stehen.

Das R, das mit dem letzten AS-Schlüsselwort eingeführt wird, 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 Signifikanz. Kurz gesagt hat diese einfache Umwandlung zwei Funktionen:

  1. Unerwünschte Felder werden gelöscht.
  2. Die Reihenfolge der Felder wird garantiert.

Sie können dieselbe Umsetzung mit einem prozedurgesteuerten Algorithmus ausführen:

DECLARE i INTEGER 1;
DECLARE count INTEGER CARDINALITY(InputRoot.XMLNS.Invoice.Purchases.Item[]);

WHILE (i <= count)
   SET OutputRoot.XMLNS.Data.Output[i].Quantity = InputRoot.XMLNS.Invoice.Purchases.Item[i].Quantity;
   SET OutputRoot.XMLNS.Data.Output[i].Author   = InputRoot.XMLNS.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.XMLNS.Data.Output[] =
    (SELECT R.Quantity AS Book.Quantity, 
            R.Author   AS Book.Author 
            FROM InputRoot.XMLNS.Invoice.Purchases.Item[] AS R
    );

In dieser Umwandlung ist jedem Element in der SELECT-Klausel eine AS-Klausel zugeordnet. Durch diese Klausel erhält jedes Feld im Ergebnis einen expliziten Namen, statt eines Feldnamens, der aus der Eingabe übernommen werden. Diese Namen können wie im Beispiel Pfade sein (d. h. eine durch Kommas getrennte Liste mit Namen). Die Struktur der Ausgabenachricht kann sich von der 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.XMLNS.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.XMLNS.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.XMLNS.Data.Output[] =
    (SELECT R.Quantity.* AS Book.(XML.Attribute)Quantity, 
            R.Author.*   AS Book.(XML.Attribute)Author
            FROM InputRoot.XMLNS.Invoice.Purchases.Item[] AS R
    );

Bei Verwendung derselben Invoice-Nachricht sieht das Ergebnis folgendermaßen aus:

<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 mithilfe 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.XMLNS.Data.Output[] =
    (SELECT R.Quantity AS Book.Quantity, 
            R.Author   AS Book.Author
            FROM InputRoot.XMLNS.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>
Zugehörige Konzepte
Nachrichtenflüsse - Übersicht
Übersicht zu ESQL
Nachrichten modellieren
Zugehörige Tasks
Nachrichtenfluss entwerfen
Nachrichtenflussinhalte definieren
ESQL-Dateien verwalten
Zugehörige Verweise
Compute-Knoten
Database-Knoten
Filter-Knoten
ESQL-Referenz
CARDINALITY-Funktion
DECLARE-Anweisung
SELECT-Funktion
SET-Anweisung
WHILE-Anweisung
Beispielnachricht
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Feedback

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
Letzte Aktualisierung : 2009-02-17 15:29:32

ak05740_