Conversione di un messaggio XML complesso

Quando si crea il codice ESQL per un nodo Compute, utilizzare l'istruzione SELECT per la conversione di messaggi complessi.

Esempi

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>
Concetti correlati
Panoramica dei flussi di messaggi
Panoramica di ESQL
Creazione di modelli di messaggio
Attività correlate
Progettazione di un flusso di messaggi
Definizione del contenuto del flusso di messaggi
Gestione dei file ESQL
Gestione di messaggi XML di grandi dimensioni
Riferimenti correlati
Nodo Compute
Nodo Database
Nodo Filter
Riferimento ESQL
Funzione CAST
Funzione COALESCE
Funzione SELECT
Istruzione SET
Messaggio di esempio
Informazioni particolari | Marchi | Download | Libreria | Supporto | Commenti
Copyright IBM Corporation 1999, 2006 Ultimo aggiornamento: ago 17, 2006
ak05750_