Ao codificar o ESQL para um nó Compute, utilize a função SELECT para transformar mensagens simples.
Considere o seguinte ESQL:
SET OutputRoot.XMLNS.Data.Output[] = (SELECT R.Quantity, R.Author FROM InputRoot.XMLNS.Invoice.Purchases.Item[] AS R );
Quando esse código ESQL processa a mensagem Invoice, ele produz a seguinte mensagem de saída:
<Dados> <Output> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Output> <Output> <Quantity>1</Quantity> <Author>Don Chamberlin</Author> </Output> <Output> <Quantity>1</Quantity> <Author>Philip Heller, Simon Roberts</Author> </Output> </Data>
Estão presentes três campos de Saída, uma para cada campo Item, porque SELECT cria um item em sua lista de resultados para cada item descrito por sua lista FROM. Em cada campo Saída, um Campo é criado para cada campo denominado na cláusula SELECT. Esses campos estão na ordem em que são especificados na cláusula SELECT, não na ordem em que aparecem na mensagem que chega.
O R que é introduzido 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. O nome escolhido não possui significado. Em resumo, esta transformação simples faz duas coisas:
É possível executar a mesma transformação com um algoritmo de procedimento.
DECLARE i INTEGER 1; DECLARE count INTEGER CARDINALITY(InputRoot.XMLNS.Invoice.Purchases.Item[]); WHILE (i <= count) SET OutputRoot.XMLNS.Data.Output[i].Quantity = InputRoot.XMLNS.Invoice.Purchases.Item[i].Quantity; SET OutputRoot.XMLNS.Data.Output[i].Author = InputRoot.XMLNS.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.XMLNS.Data.Output[] = (SELECT R.Quantity AS Book.Quantity, R.Author AS Book.Author FROM InputRoot.XMLNS.Invoice.Purchases.Item[] AS R );
Nesta transformação, um cláusula AS é associada a cada item na cláusula SELECT. Essa cláusula fornece a cada campo do resultado um nome explícito, em vez de um nome de campo herdado da entrada. Esses nomes podem ser caminhos (ou seja, uma lista de nomes separados por pontos), conforme mostrado no exemplo. A estrutura da mensagem de saída pode ser diferente 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.XMLNS.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.XMLNS.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. Esses 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.XMLNS.Data.Output[] = (SELECT R.Quantity.* AS Book.(XML.Attribute)Quantity, R.Author.* AS Book.(XML.Attribute)Author FROM InputRoot.XMLNS.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.XMLNS.Data.Output[] = (SELECT R.Quantity AS Book.Quantity, R.Author AS Book.Author FROM InputRoot.XMLNS.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>