Sehen Sie sich folgende Beispiele an, und ändern Sie sie Ihren Anforderungen entsprechend. Sie basieren alle auf der Nachricht 'Invoice' (Rechnung) als Eingabe:
In diesem Beispiel enthält 'Invoice' eine variable Anzahl Elemente (Item). Die Umwandlung ist im Folgenden dargestellt:
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' );
Die generierte Ausgabenachricht lautet:
<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 sind zwei SELECT-Klauseln ineinander verschachtelt. Die äußere Klausel wird auf die Liste mit Rechnungen (Invoice) angewendet. Die innere Klausel wird auf die Liste mit Elementen (Item) angewendet. 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[],
Dadurch erkennt die äußere SELECT-Klausel, dass eine variable Anzahl an Elementen in jedem Ergebnis zu erwarten ist. Jede SELECT-Klausel hat einen eigenen Korrelationsnamen: I für die äußere SELECT-Klausel und II für die innere. Jede SELECT-Klausel verwendet normalerweise ihren eigenen Korrelationsnamen, aber die FROM-Klausel 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[],
Dadurch erkennt die innere SELECT-Klausel, dass sie mit den Elementen der aktuellen Rechnung arbeiten muss. Beide SELECT-Klauseln enthalten WHERE-Klauseln. Die äußere SELECT-Klausel verwendet ein Kriterium zum Löschen bestimmter Kunden (Customer), und die innere verwendet ein anderes Kriterium zum Löschen bestimmter Elemente (Item). Dieses Beispiel veranschaulicht auch die Verwendung von COALESCE, um zu verhindern, dass fehlende Eingabefelder dazu führen, dass auch das entsprechende Ausgabefeld fehlt. Schließlich wird auch die Spaltenfunktion SUM verwendet, um die Werte aller Elemente in jeder Rechnung zu addieren. Spaltenfunktionen werden unter Auf Spalten in einer Datenbank verweisen erläutert.
Wenn die Desc-Felder erstellt werden, wird das gesamte Eingabefeld 'Title' kopiert : die XML-Attribute und der Feldwert. Wenn diese Attribute in der Ausgabenachricht nicht enthalten sein sollen, können Sie sie mit der FIELDVALUE-Funktion löschen. Schreiben Sie z. B. folgenden 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>