当您要访问消息的内容以进行读或写时,使用解析器从输入位流创建的树中的元素的结构和排列。从树的顶部开始,按照相关的父子关系向下访问,直至到达所需的元素。
您必须使用这些不同的相关名,因为在 Database 或 Filter 节点中仅有一个要引用的消息;您无法在这些节点中创建新的输出消息。使用 Compute 节点来创建新的输出消息。
假设您已经创建了处理消息 Invoice 的消息流(在编写 ESQL中的图中显示)。例如,如果您要从 Compute 节点内查询元素 CardType,则使用以下语句:
IF InputBody.Invoice.Payment.CardType='Visa' THEN DO; -- more ESQL -- END IF;
如果您要在 Database 或 Filter 节点(到单个输入消息的引用)中进行相同的测试,编码:
IF Body.Invoice.Payment.CardType='Visa' THEN DO; -- more ESQL -- END IF;
如果您要将元素从输入 XML 消息复制到 Compute 节点中的输出消息,而不对其进行更改,则使用以下 ESQL:
SET OutputRoot.XML.Invoice.Customer.FirstName = InputBody.Invoice.Customer.FirstName;
如果您要将元素从输入 XML 消息复制到输出消息,并更新它,例如通过折叠成大写,或通过计算一个新值,则编码:
SET OutputRoot.XML.Invoice.Customer.FirstName = UPPER(InputBody.Invoice.Customer.FirstName); SET OutputRoot.XML.Invoice.InvoiceNo = InputBody.Invoice.InvoiceNo + 1000;
如果您要将 STRING 元素设置为常量值,则编码:
SET OutputRoot.XML.Invoice.Customer.Title = 'Mr';
您还可以使用等价的语句:
SET OutputRoot.XML.Invoice.Customer.Title VALUE = 'Mr';
如果您要更新整数或十进制,例如元素 TillNumber,值为 26,则使用以下赋值(仅在 Compute 节点中有效):
SET OutputRoot.MRM.Invoice.TillNumber=26;
整数数据类型使用 64 位二进制补码格式存储数字,允许的数字范围从 -9223372036854775808 到 9223372036854775807。 您可以为整数指定十六进制符号和常规整数字面值格式。可以用大写或小写书写十六进制字母 A 到 F,也可以在初始的零后跟 X,这是必需的。下面的示例产生与上面所示的示例相同的结果:
SET OutputRoot.MRM.Invoice.TillNumber= 0x1A;
以下示例为在示例 Invoice 消息中不出现的元素类型显示 SET 语句。
要将 FLOAT 元素设置为非整数值,编码:
SET OutputRoot.MRM.FloatElement1 = 1.2345e2;
要将 BINARY 元素设置为常量值,编码:
SET OutputRoot.MRM.BinaryElement1 = X'F1F1';
对于 BINARY 值,您必须使用初始的字符 X(大写或小写),并在单引号中包含十六进制字符(同样用大写或小写),如下所示。
要将 BOOLEAN 元素设置为常量值(值 1 等于 true,值 0 等于 false),编码:
SET OutputRoot.MRM.BooleanElement1 = true;
或
SET OutputRoot.MRM.BooleanElement1 = 1;
您可以使用 SELECT 语句过滤来自输入消息的记录,而无须重新格式化记录,并且不需要每个记录的完整格式的任何知识。请参阅以下示例:
-- Declare local variable DECLARE CurrentCustomer CHAR 'Smith'; -- Loop through the input message SET OutputRoot.XML.Invoice[] = (SELECT I FROM InputRoot.XML.Invoice[] AS I WHERE I.Customer.LastName = CurrentCustomer );
如果符合 WHERE 条件(LastName = Smith),则这导致来自输入 Invoice 消息的所有记录都写到输出消息。所有不符合条件的记录都不会从输入复制到输出。I 用作相关名 InputRoot.XML.Invoice[] 的别名。
在 DECLARE 语句上初始化声明的变量 CurrentCustomer:这是声明已知初始值的变量的最有效的方法。
可将该别名技术与其他 SELECT 结合使用。例如,如果您要选择输入 Invoice 消息的所有记录,并创建其他记录:
-- Loop through the input message SET OutputRoot.XML.Invoice[] = (SELECT I, 'Customer' || I.Customer.LastName AS ExtraField FROM InputRoot.XML.Invoice[] AS I );
您还可以包含 AS 子句将记录放到消息树中的子文件夹中:
-- Loop through the input message SET OutputRoot.XML.Invoice[] = (SELECT I AS Order FROM InputRoot.XML.Invoice[] AS I );
如果要查询或设置包含或可能包含空值的元素,则注意以下注意事项:
例如,您可以检查发票号码是否包含在当前 Invoice 消息中,并附带以下语句:
IF InputRoot.XML.Invoice.InvoiceNo IS NULL THEN DO; -- more ESQL -- END IF;
您还可以使用 ESQL 引用。以下示例对此进行了描述。
DECLARE cursor REFERENCE TO InputRoot.MRM.InvoiceNo; IF LASTMOVE(cursor) = FALSE THEN SET OutputRoot.MRM.Analysis = 'InvoiceNo does not exist in logical tree'; ELSEIF FIELDVALUE(cursor) IS NULL THEN SET OutputRoot.MRM.Analysis = 'InvoiceNo does exist in logical tree but is defined as an MRM NULL value'; ELSE SET OutputRoot.MRM.Analysis = 'InvoiceNo does exist and has a value'; END IF;
有关声明和使用引用的更多信息,请参阅创建动态字段引用。有关 LASTMOVE 和 FIELDVALUE 函数的描述,请参阅LASTMOVE 函数和FIELDTYPE 函数。
如果消息在 MRM 域中,则具有用于基于物理格式查询空元素的其他注意事项。有关更多详细信息,请参阅在 MRM 域中查询消息中的空值。
SET OutputRoot.XML.Invoice.Customer.Title = NULL;
如果消息在 MRM 域中,则具有用于基于物理格式的空值的其他注意事项。有关更多详细信息,请参阅在 MRM 域中设置消息中的空值。
这称为隐式空处理。
SET OutputRoot.XML.Invoice.Customer.Title VALUE = NULL;
SET OutputRoot.XML.Invoice.Customer.Title = NULL;
如果消息在 MRM 域中,则输出位流的内容取决于物理格式空处理属性的设置。有关更多详细信息,请参阅在 MRM 域中设置消息中的空值。
这称为显式空处理。
如果您将 MRM 复杂元素或 XML、XMLNS 或 JMS 父代元素设置为 NULL 而没有使用 VALUE 关键字,则从逻辑树删除该元素和该元素的所有子代。