Reveja os exemplos a seguir e modifique-os para utilização. Eles são baseados na mensagem Fatura como entrada:
Neste exemplo, Fatura contém um número variável de Itens. A transformação é mostrada abaixo:
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' );
A mensagem de saída gerada é:
<Dados> <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>
Essa transformação possui duas SELECTs aninhadas uma dentro da outra. A externa opera na lista de Faturas. A interna opera na lista de Itens. A cláusula AS associada ao SELECT interno espera uma matriz:
(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[],
Isto instrui a select externa a esperar um número variável de Itens em cada resultado. Cada SELECT possui seu próprio nome de correlação: I para o select externo e II para o interno. Normalmente cada SELECT utiliza seu próprio nome de correlação, mas a cláusula FROM da SELECT interna faz referência ao nome de correlação da externa:
(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[],
Isto instrui a SELECT interna a funcionar com os Itens da Fatura atual. As duas SELECTs contêm cláusulas WHERE. A externa utiliza um critério para descartar alguns Clientes e a interna utiliza um critério diferente para descartar alguns Itens. O exemplo também mostra a utilização de COALESCE para evitar que campos de entrada ausentes façam com que o campo de saída correspondente fique ausente. Por último, também utiliza a função de coluna SUM para incluir o valor de todos os Itens em cada Fatura. As funções de coluna são discutidas em Referenciando as Colunas em um Banco de Dados.
Quando os campos Desc são criados, todo o campo Título de entrada é copiado: ou seja, os atributos XML e o valor do campo. Se não desejar esses atributos na mensagem de saída, poderá utilizar a função FIELDVALUE para descartá-los. Por exemplo, codifique o seguinte 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' );
Isso gera a seguinte mensagem de saída:
<Dados> <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>