Überprüfen Sie die folgenden Beispiele, und passen Sie sie Ihren Anforderungen entsprechend an. Alle Beispiele basieren auf der Invoice-Nachricht (Rechnung) als Eingabe.
In diesem Beispiel enthält die Invoice-Nachricht eine variable Anzahl von Elementen (Items). Die Umwandlung wird im Folgenden gezeigt:
SET OutputRoot.XML.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.XML.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 Umwandlung werden zwei SELECT-Anweisungen verwendet, die ineinander verschachtelt sind. Die äußere bearbeitet die Liste der Rechnungen (Invoices). Die innere bearbeitet die Liste der Elemente (Items). Die AS-Klausel, die der inneren SELECT-Anweisung 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[],
Dies sagt der äußeren SELECT-Anweisung, dass sie in jedem Ergebnis mit einer variablen Anzahl von Elementen rechnen muss. Jede SELECT-Anweisung hat einen eigenen Korrelationsnamen: I für die äußere und II für die innere. In der Regel verwendet jede SELECT-Anweisung ihren eigenen Korrelationsnamen, wobei die FROM-Klausel der inneren SELECT-Anweisung auf den Korrelationsnamen der äußeren SELECT-Anweisung verweist:
(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[],
Dies sagt der inneren SELECT-Anweisung, dass sie die Elemente der aktuellen Invoice-Nachricht bearbeiten soll. Beide SELECT-Anweisungen 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 mit Hilfe 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 Verweise auf Spalten in einer Datenbank 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 mit Hilfe der Funktion FIELDVALUE löschen, z. B. mit folgendem ESQL-Code:
SET OutputRoot.XML.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.XML.Invoice[] AS I WHERE I.Customer.LastName <> 'Brown' );
Auf diese Weise wird folgende Ausgabenachricht generiert:
<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>