Reveja os exemplos a seguir e modifique-os para utilização. Todos eles têm como base a mensagem Invoice como entrada.
Considere o seguinte ESQL:
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity, R.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R);
Quando a mensagem Invoice for processada por este ESQL, será produzida a seguinte mensagem de saída:
<Dados> <Output> <Quantity>2</Quantity> <Autho>Neil Bradley</Autho> </Output> <Output> <Quantity>1</Quantity> <Autho>Don Chamberlin</Autho> </Output> <Output> <Quantity>1</Quantity> <Autho>Philip Heller, Simon Roberts</Autho> </Output> </Data>
Existem três campos de Saída, um para cada campo Item. Isto ocorre porque, por padrão, SELECT cria um item em sua lista de resultados para cada item descrito por sua lista FROM. Dentro de cada campo de Saída, existe um Campo para cada campo nomeado na cláusula SELECT e eles estão na ordem na qual são especificados dentro da SELECT, não na ordem em que aparecem na mensagem que chega.
O "R" apresentado pela palavra-chave AS final é conhecido como um nome de correlação. É uma variável local que representa, por sua vez, cada um dos campos endereçados pela cláusula FROM. Não existe significado para o nome escolhido. Em resumo, esta transformação simples faz duas coisas:
Aqui está a mesma transformação implementada por um algoritmo de procedimento:
DECLARE i INTEGER 1; DECLARE count INTEGER CARDINALITY(InputRoot.XML.Invoice.Purchases.Item[]); WHILE (i <= count) SET OutputRoot.XML.Data.Output[i].Quantity = InputRoot.XML.Invoice.Purchases.Item[i].Quantity; SET OutputRoot.XML.Data.Output[i].Author = InputRoot.XML.Invoice.Purchases.Item[i].Author; SET i = i + 1; END WHILE;
Esses exemplos mostram que a versão SELECT da transformação é muito mais concisa. Ela também tem execução mais rápida.
O exemplo a seguir mostra uma transformação mais avançada:
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity AS Book.Quantity, R.Author AS Book.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R );
Nesta transformação, existe uma cláusula AS associada a cada item na cláusula SELECT. Isto fornece a cada campo no resultado um nome explícito em vez dos nomes de campos serem herdados da entrada. Estes nomes podem ser caminhos (ou seja, uma lista de nomes separados por ponto), conforme mostrado no exemplo. Assim, a estrutura da mensagem de saída pode ser arbitrariamente diferente da estrutura da mensagem de entrada. Utilizando a mesma mensagem Invoice, o resultado será:
<Dados> <Output> <Manual> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Manual> </Output> </Data> <Dados> <Output> <Manual> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Manual> </Output> <Output> <Manual> <Quantity>1</Quantity> <Author>Don Chamberlin</Author> </Manual> </Output> <Output> <Manual> <Quantity>1</Quantity> <Author>Philip Heller, Simon Roberts</Author> </Manual> </Output> </Data>
As expressões na cláusula SELECT podem ter qualquer complexidade e não existem restrições especiais. Elas podem incluir operadores, funções, literais e podem referir-se a variáveis ou a campos não relacionados ao nome de correlação. O exemplo a seguir mostra expressões mais complexas:
SET OutputRoot.XML.Data.Output[] = (SELECT 'Start' AS Header, 'Number of books:' || R.Quantity AS Book.Quantity, R.Author || ':Name and Surname' AS Book.Author, 'End' AS Trailer FROM InputRoot.XML.Invoice.Purchases.Item[] AS R );
Utilizando a mesma mensagem Invoice, o resultado, nesse caso, será:
<Dados> <Output> <Header>Start</Header> <Manual> <Quantity>Number of books:2</Quantity> <Author>Neil Bradley:Name and Surname</Author> </Manual> <Trailer>End</Trailer> </Output> <Output> <Header>Start</Header> <Manual> <Quantity>Number of books:1</Quantity> <Author>Don Chamberlin:Name and Surname</Author> </Manual> <Trailer>End</Trailer> </Output> <Output> <Header>Start</Header> <Manual> <Quantity>Number of books:1</Quantity> <Author>Philip Heller, Simon Roberts:Name and Surname</Author> </Manual> <Trailer>End</Trailer> </Output> </Data>
Conforme mostrado acima, as cláusulas AS da cláusula SELECT contêm um caminho que descreve o nome completo do campo a ser criado no resultado. Estes caminhos também especificam (pois é normal para caminhos) o tipo de campo a ser criado. A transformação de exemplo a seguir especifica os tipos de campos. Nesse caso, os dados ativados de XML são transformados em atributos de XML:
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity.* AS Book.(XML.Attribute)Quantity, R.Author.* AS Book.(XML.Attribute)Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R );
Utilizando a mesma mensagem Invoice, o resultado será:
<Dados> <Output> <Book Quantity="2" Author="Neil Bradley"/> </Output> <Output> <Book Quantity="1" Author="Don Chamberlin"/> </Output> <Output> <Book Quantity="1" Author="Philip Heller, Simon Roberts"/> </Output> </Data>
Finalmente, uma cláusula WHERE pode ser utilizada para eliminar alguns dos resultados. No exemplo a seguir, uma cláusula WHERE é utilizada para remover os resultados nos quais um critério específico é atendido. Um resultado inteiro é incluído ou excluído:
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity AS Book.Quantity, R.Author AS Book.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R WHERE R.Quantity = 2 );
Utilizando a mesma mensagem de entrada, o resultado será:
<Dados> <Output> <Manual> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Manual> </Output> </Data>