字段引用由后跟零个或多个以点(.)分隔的路径字段的相关名称组成。相关名指示众所周知的起点,必须是常量名、已声明的变量(标量行或引用)或某个预定义起点;例如,InputRoot。路径字段定义了起点至所需字段的路径。
InputRoot.XML.Data.Invoice使代理从位置 InputRoot(即,Compute 节点的输入消息的根)开始,然后执行浏览序列。首先,它从根浏览到第一个子字段 XML,然后浏览到 XML 字段的第一个子字段 Data。最后,代理浏览到 Data 字段 Invoice 的第一个子字段。每当在 ESQL 程序中出现该字段引用时,将访问 invoice 字段。
InputRoot.XML."Customer Data".Invoice如果您需要引用包含引号的字段,请在引用上使用两对引号。例如:
Body.Message."""hello"""
某些标识作为关键字保留,但除了相关名,您可以在字段引用中使用它们,而无需使用双引号
InputRoot.XML."Customer Data".{'Customer-' || CurrentCustomer}.Invoice其中,invoice 包含在名称由将字符文字“Customer-”和“CurrentCustomer”(此示例中,它必须是类型为字符的声明的变量)中的值连接而形成的文件夹中。
在路径元素中,您可以使用星号(*)通配符来匹配任何名称。也可以使用“*”来指定部分名称。例如,Prefix* 匹配以“Prefix”开始的任何名称。
注意,在 ESQL 中,将任何东西包含在双引号中,使它成为标识;将任何东西包含在单引号中,使它成为字符文字。必须把所有的字符串包含在单引号标记中。
InputRoot.XML.Data[1].Invoice InputRoot.XML.Data.Invoice[1]此构造最常见的用法是与索引变量一起使用,这样循环将经过这样的字段。例如:
WHILE count < 32 DO SET TOTAL = TOTAL + InputRoot.XML.Data.Invoice[count].Amount; SET COUNT = COUNT + 1 END WHILE;小心使用这种类型的构造,因为它暗示每次经过循环的开头,代理必须计数字段。如果重复计数很大,性能将降低。在这样的情况下,更好的替换方法是使用字段引用变量。
InputRoot.XML.Data.Invoice -- Selects the first InputRoot.XML.Data.Invoice[1] -- Selects the first InputRoot.XML.Data.Invoice[>] -- Selects the first InputRoot.XML.Data.Invoice[>1] -- Selects the first InputRoot.XML.Data.Invoice[>2] -- Selects the second InputRoot.XML.Data.Invoice[<] -- Selects the fourth InputRoot.XML.Data.Invoice[<1] -- Selects the fourth InputRoot.XML.Data.Invoice[<2] -- Selects the third InputRoot.XML.Data.Invoice[<3] -- Selects the second索引子句也可由空方括号对([])组成。它会选择具有匹配名称的所有字段。使用这种具有需要您提供列表的函数和语句的构造(例如,SELECT、CARDINALITY、SINGULAR 和 EXISTS 函数,或 SET 语句)。
字段引用的每个字段都可以包含一个类型子句。这些子句使用括号(())表示,且接受任何返回类型为整数的非空值的表达式。类型表达式的存在限制字段选择为匹配类型的字段。该结构最常用于一般 XML,其中有许多字段类型,并且一个 XML 字段可能包含属性和带有相同名称的子 XML 字段。
<Item Value = '1234' > <Value>5678</Value> </Item>
此处,XML 字段项有两个子字段,名称都是“Value”。可通过使用类型子句来区分子字段:使用 Item.(<Domain>.Attribute)Value 选择属性,使用 Item.(XML.Element)Value 选择字段,其中 <Domain> 是 XML、XMLNS 或 XMLNSC,这由源代码的消息域确定。
通常,类型约束会抽取引用的标量值(抽取方法与 FIELDVALUE 函数类似),如果引用类型不正确,则会抛出异常。根据定义,由于不存在的字段相当于 NULL,因此会对这些字段抛出异常。这在消息中缺少重要字段时提供了一个快速便捷导致异常的方法。
但是,当要被传递到数据库(例如,在 WHERE 子句中)的表达式中出现类型约束时,该信息用于确定表达式是否可以提供给数据库。如果 WHERE 子句在数据库表列上包含一个 CAST 操作,则这可能会很重要。如果缺少类型约束,则这样的表达式无法提供给数据库,因为代理无法告之数据库是否能够执行所需的约束。但是请注意:您在对列值使用类型强制转换操作时应该始终很小心,因为某些数据库具有非常有限的数据约束能力。
在所有先前的例子中,包含在花括号({})中的表达式提供的名称或名称空间等同于作为标识提供的名称。
根据定义,notarget 名称空间的名称为空字符串。可通过求值为空字符串的表达式、空标识“”或对定义为空字符串的名称空间常量的引用来选择该空字符串。
使用字段引用通常暗示要搜索已存在的字段。但是,如果必需的字段不存在(通常是 SET 语句的目标的字段引用和 SELECT 函数的 AS 子句中的那些字段引用),则创建它们。
如果没有类型规范,元素的类型将不会是 Name 或 NameValue,它实际上表明新字段是没有名称的。
.这些缺省值可从字段名称、列名派生而来,或就是生成的顺序名称。如果它是字段名称(这实际上是树复制),名称空间名称按上面那样复制。
否则,新创建的字段的名称空间将通过搜索路径派生而来,即,这些名称将作为它们是字段引用的 NameId 语法对待。
SET OutputRoot.XML.Msg.Data.Name = NULL; -- this deletes the field
SET OutputRoot.XML.Msg.Data.Name VALUE = NULL; -- this assigns a NULL value to a field without deleting it
出于向下兼容的考虑,仍支持 LAST 关键字,但不推荐使用它。LAST 不能用作为索引表达式的一部分:[LAST] 是有效的,它等价于 [<],但 [LAST3] 是无效的。
Field [ > ] -- The first field, equivalent to [ 1 ] Field [ > (a + b) * 2 ] Field [ < ] -- The last field, equivalent to [ LAST ] Field [ < 1 ] -- The last field, equivalent to [ LAST ] Field [ < 2 ] -- The last but one field Field [ < (a + b) / 3 ]