Verwenden Sie beim Erstellen des ESQL-Codes für einen Compute-Knoten die SELECT-Funktion zum Umwandeln komplexer Nachrichten.
In diesem Beispiel enthält 'Invoice' eine variable Anzahl Elemente (Item). Die Umsetzung ist im folgenden Beispiel dargestellt:
SET OutputRoot.XMLNS.Data.Statement[] =
(SELECT I.Customer.Title AS Customer.Title,
I.Customer.FirstName || ' ' || I.Customer.LastName AS Customer.Name,
COALESCE(I.Customer.PhoneHome,'') AS Customer.Phone,
(SELECT II.Title AS Desc,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity AS Qty
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],
(SELECT SUM( CAST(II.UnitPrice AS FLOAT) *
CAST(II.Quantity AS FLOAT) *
1.6 )
FROM I.Purchases.Item[] AS II ) AS Amount,
'Dollars' AS Amount.(XML.Attribute)Currency
FROM InputRoot.XMLNS.Invoice[] AS I
WHERE I.Customer.LastName <> 'Brown'
);
Es wird folgende Ausgabenachricht generiert:
<Data>
<Statement>
<Customer>
<Title>Mr</Title>
<Name>Andrew Smith</Name>
<Phone>01962818000</Phone>
</Customer>
<Purchases>
<Article>
<Desc Category="Computer" Form="Paperback" Edition="2">The XML Companion</Desc>
<Cost>4.472E+1</Cost>
<Qty>2</Qty>
</Article>
<Article>
<Desc Category="Computer" Form="Paperback" Edition="2">
A Complete Guide to DB2 Universal Database</Desc>
<Cost>6.872E+1</Cost>
<Qty>1</Qty>
</Article>
<Article>
<Desc Category="Computer" Form="Hardcover" Edition="0">JAVA 2 Developers Handbook</Desc>
<Cost>9.5984E+1</Cost>
<Qty>1</Qty>
</Article>
</Purchases>
<Amount Currency="Dollars">2.54144E+2</Amount>
</Statement>
</Data>
Bei dieser Umsetzung sind SELECT-Klauseln verschachtelt. Die äußere Anweisung wird auf die Liste mit Rechnungen (Invoice) angewendet. Die innere bearbeitet die Liste der Elemente (Items). Die AS-Klausel, die der inneren SELECT-Klausel zugeordnet ist, erwartet eine Feldgruppe:
(SELECT II.Title AS Desc,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity AS Qty
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice > 0.0 )
-- Beachten Sie die Verwendung von [] im nächsten Ausdruck
AS Purchases.Article[],
Diese Anweisung sagt der äußeren SELECT-Klausel, dass sie in jedem Ergebnis mit einer variablen Anzahl von Elementen rechnen muss. Jede SELECT-Klausel hat einen eigenen Korrelationsnamen: I für die äußere SELECT-Klausel äußere II für die innere. In der Regel verwendet jede SELECT-Klausel einen eigenen Korrelationsnamen, doch die FROM-Klausel in der inneren SELECT-Klausel verweist auf den Korrelationsnamen der äußeren SELECT-Klausel:
(SELECT II.Title AS Desc,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity AS Qty
-- Beachten Sie die Verwendung von I.Purchases.Item im nächsten Ausdruck
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],
Diese Anweisung sagt der inneren SELECT-Klausel, dass sie die Elemente der aktuellen Invoice-Nachricht bearbeiten soll. Beide SELECT-Klauseln enthalten WHERE-Klauseln. Die äußere verwendet ein Kriterium, um bestimmte Kunden (Customer) zu löschen, und die innere verwendet ein anderes Kriterium, um bestimmte Elemente (Items) zu löschen. Das Beispiel zeigt, wie mithilfe von COALESCE verhindert wird, dass fehlende Eingabefelder dazu führen, dass auch die entsprechenden Ausgabefelder fehlen. Schließlich verwendet das Beispiel die Spaltenfunktion SUM, um den Wert aller Elemente in jeder einzelnen Rechnung zu addieren. Spaltenfunktionen werden unter Auf Spalten in einer Datenbank verweisen erläutert.
Bei der Erstellung der Beschreibungsfelder (Desc) wird der vollständige Inhalt des Eingabefeldes für den Titel kopiert: die XML-Attribute und der Feldwert. Falls die Ausgabenachricht diese Attribute nicht enthalten soll, können Sie sie mithilfe der Funktion FIELDVALUE löschen, z. B. mit folgendem ESQL-Code:
SET OutputRoot.XMLNS.Data.Statement[] =
(SELECT I.Customer.Title AS Customer.Title,
I.Customer.FirstName || ' ' || I.Customer.LastName AS Customer.Name,
COALESCE(I.Customer.PhoneHome,'') AS Customer.Phone,
(SELECT FIELDVALUE(II.Title) AS Desc,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity AS Qty
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],
(SELECT SUM( CAST(II.UnitPrice AS FLOAT) *
CAST(II.Quantity AS FLOAT) *
1.6 )
FROM I.Purchases.Item[] AS II ) AS Amount,
'Dollars' AS Amount.(XML.Attribute)Currency
FROM InputRoot.XMLNS.Invoice[] AS I
WHERE I.Customer.LastName <> 'Brown'
);
Dieser Code generiert die folgende Ausgabenachricht:
<Data>
<Statement>
<Customer>
<Title>Mr</Title>
<Name>Andrew Smith</Name>
<Phone>01962818000</Phone>
</Customer>
<Purchases>
<Article>
<Desc>The XML Companion</Desc>
<Cost>4.472E+1</Cost>
<Qty>2</Qty>
</Article>
<Article>
<Desc>A Complete Guide to DB2 Universal Database</Desc>
<Cost>6.872E+1</Cost>
<Qty>1</Qty>
</Article>
<Article>
<Desc>JAVA 2 Developers Handbook</Desc>
<Cost>9.5984E+1</Cost>
<Qty>1</Qty>
</Article>
</Purchases>
<Amount Currency="Dollars">2.54144E+2</Amount>
</Statement>
</Data>