Cuando codifique ESQL para un nodo Compute, utilice la función SELECT para transformar mensajes simples.
Observe el ESQL siguiente:
SET OutputRoot.XMLNS.Data.Output[] =
(SELECT R.Quantity, R.Author FROM InputRoot.XMLNS.Invoice.Purchases.Item[] AS R
);
Cuando este código ESQL procesa el mensaje Invoice, produce el siguiente mensaje de salida:
<Data>
<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>
Existen tres campos de salida, uno para cada campo de elemento, porque SELECT crea un elemento en la lista de resultados para cada elemento descrito por la lista FROM. En cada campo de salida (Output), se crea un campo (Field) para cada campo mencionado en la cláusula SELECT. Estos campos están en el orden en el que se especifican en la cláusula SELECT, no en el orden en que aparecen en el mensaje de entrada.
La R entrada por la palabra clave AS final se conoce como nombre de correlación. Es una variable local que representa a su vez cada uno de los campos tratados por la cláusula FROM. El nombre elegido no tiene ningún significado. En resumen, esta sencilla transformación realiza dos cosas:
Puede realizar la misma transformación con un algoritmo de procedimiento:
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;
Estos ejemplos muestran que la versión SELECT de la transformación es mucho más concisa. También se ejecuta con más rapidez.
El ejemplo siguiente muestra una transformación más avanzada:
SET OutputRoot.XMLNS.Data.Output[] =
(SELECT R.Quantity AS Book.Quantity,
R.Author AS Book.Author
FROM InputRoot.XMLNS.Invoice.Purchases.Item[] AS R
);
En esta transformación, se asocia una cláusula AS con cada elemento de la cláusula SELECT. Esta cláusula proporciona a cada campo del resultado un nombre explícito en lugar de un nombre de campo que se hereda de la entrada. Estos nombres pueden ser vías de acceso (es decir, una lista de nombres separados por punto), como se muestra en el ejemplo. La estructura del mensaje de salida puede ser diferente de la del mensaje de entrada. Al utilizar el mismo mensaje Invoice, el resultado es:
<Data>
<Output>
<Book>
<Quantity>2</Quantity>
<Author>Neil Bradley</Author>
</Book>
</Output>
<Output>
<Book>
<Quantity>1</Quantity>
<Author>Don Chamberlin</Author>
</Book>
</Output>
<Output>
<Book>
<Quantity>1</Quantity>
<Author>Philip Heller, Simon Roberts</Author>
</Book>
</Output>
</Data>
Las expresiones de la cláusula SELECT pueden tener cualquier nivel de complejidad y no tienen limitaciones especiales. Pueden incluir operadores, funciones y literales y pueden hacer referencia a variables o campos que no están relacionados con el nombre de correlación. El ejemplo siguiente muestra expresiones más complejas:
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 el mismo mensaje Invoice, el resultado de este caso es:
<Data>
<Output>
<Header>Start</Header>
<Book>
<Quantity>Number of books:2</Quantity>
<Author>Neil Bradley:Name and Surname</Author>
</Book>
<Trailer>End</Trailer>
</Output>
<Output>
<Header>Start</Header>
<Book>
<Quantity>Number of books:1</Quantity>
<Author>Don Chamberlin:Name and Surname</Author>
</Book>
<Trailer>End</Trailer>
</Output>
<Output>
<Header>Start</Header>
<Book>
<Quantity>Number of books:1</Quantity>
<Author>Philip Heller, Simon Roberts:Name and Surname</Author>
</Book>
<Trailer>End</Trailer>
</Output>
</Data>
Como se ha mostrado anteriormente, las cláusulas AS de la cláusula SELECT contienen una vía de acceso que describe el nombre completo del campo que se debe crear en el resultado. Estas vías de acceso también pueden especificar (como es normal para vías de acceso) el tipo del campo que se debe crear. La siguiente transformación de ejemplo especifica los tipos de campo. En este caso, los datos XML codificados se transforman en atributos 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
);
Al utilizar el mismo mensaje Invoice, el resultado es:
<Data>
<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, puede utilizar una cláusula WHERE para eliminar algunos de los resultados. En el ejemplo siguiente se utiliza una cláusula WHERE para suprimir los resultados en los que se cumple un criterio específico. Se incluye o excluye un resultado completo:
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 el mismo mensaje de entrada, el resultado será:
<Data>
<Output>
<Book>
<Quantity>2</Quantity>
<Author>Neil Bradley</Author>
</Book>
</Output>
</Data>