查看以下示例并对其进行修改以供您自己使用。它们都作为输入而基于发票消息。
请参阅下列 ESQL:
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity, R.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R);
该 ESQL 处理发票消息时,产生下列输出消息:
<Data> <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>
有三个输出字段,每个项字段有一个输出字段。这是因为缺省情况下,SELECT 在其结果列表中为其 FROM 列表描述的每个项创建一个项。在每个输出字段中,SELECT 子句中命名的每个字段有一个字段,它们按在 SELECT 中指定的顺序排列,而不是按出现在消息中的顺序排列。
最后的 AS 关键字引入的 R 称为一个相关名称。 它是一个局部变量,依次表示 FROM 子句处理的每个字段。对所选的名称无效。总之,此简单转换做两件事:
以下是由过程化算法实现的相同转换:
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;
这些示例显示转换的 SELECT 版本更加简明。它还更快速地执行。
以下示例显示更为高级的转换:
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity AS Book.Quantity, R.Author AS Book.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R );
在此转换中,有一个与 SELECT 子句中每个项关联的 AS 子句。它为结果中的每个字段给定一个显式的名称而不是直接从输入继承名称。这些名称可以是路径(即,以点分隔的名称列表),如示例中所示。因此,输出消息的结构可以任意地不同于输入消息的结构。使用相同的 Invoice 消息,结果是:
<Data> <Output> <Book> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Book> </Output> </Data> <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>
SELECT 子句中的表达式可以是任何复杂程度,并且没有特殊的限制。它们可包含运算符、函数和文字,并且它们可以引用变量或与相关名称不相关的字段。以下示例显示更复杂的表达式:
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 );
如果使用相同的发票消息,则此示例的结果是:
<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>
如上述所示,SELECT 子句的 AS 子句包含一个路径,描述在结果中创建的字段全名。 这些路径还指定(对于路径是正常的)要创建的字段类型。下例转换指定字段类型。 在此示例中,XML 标记的数据转换为 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 );
使用相同的 Invoice 消息,结果是:
<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>
最后,您可以使用 WHERE 子句消除某些结果。在下列示例中,WHERE 子句用于除去满足特定标准的结果。包含或不包含整个结果:
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 );
如果使用相同的输入消息,则结果是:
<Data> <Output> <Book> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Book> </Output> </Data>