Consultare gli esempi riportati di seguito e modificarli in base alle proprie necessità. Tutti gli esempi si basano sul messaggio Invoice come input:
In questo esempio, Invoice contiene un numero di Item variabile. La conversione è riportata di seguito:
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' );
Il messaggio di output generato è:
<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>
Questa conversione contiene due SELECT nidificate una all'interno dell'altre. L'istruzione esterna esegue operazioni sull'elenco di Invoice. L'istruzione interna esegue operazioni sull'elenco di Item. La clausola AS associata all'istruzione SELECT interna prevede un array:
(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 ) -- Note the use of [] in the next expression AS Purchases.Article[],
Ciò indica all'istruzione SELECT esterna di prevedere un numero variabile di Item in ciascun risultato. Ciascuna istruzione SELECT ha il proprio nome della correlazione: I per la select esterna e II per quella interna. Ciascuna istruzione SELECT generalmente utilizza il proprio nome della correlazione, ma la clausola FROM dell'istruzione SELECT interna fa riferimento al nome della correlazione dell'istruzione SELECT esterna:
(SELECT II.Title AS Desc, CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost, II.Quantity AS Qty -- Note the use of I.Purchases.Item in the next expression FROM I.Purchases.Item[] AS II WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],
Ciò indica all'istruzione SELECT interna di utilizzare gli Item di Invoice correnti. Entrambe le istruzioni SELECT contengono clausole WHERE. Quella esterna utilizza un criterio per eliminare alcuni Customers e quella interna utilizza un criterio diverso per eliminare alcuni Item. L'esempio illustra, inoltre, l'utilizzo di COALESCE per evitare che dei campi di input mancanti determinino la mancanza dei campi di output corrispondenti. Infine, utilizza la funzione della colonna SUM per aggiungere il valore di tutti gli Item in ciascun Invoice. Le funzioni delle colonne sono illustrate in Riferimento alle colonne in un database.
Quando vengono creati i campi Desc, viene copiato tutto il campo Title di input: gli attributi XML ed il valore del campo. Se non si desiderano tali attributi nel messaggio di output, è possibile utilizzare la funzione FIELDVALUE per eliminarli; ad esempio, creare il seguente codice ESQL:
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' );
Che genera il seguente messaggio di output:
<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>