访问消息体中的元素

当您要访问消息的内容以进行读或写时,使用解析器从输入位流创建的树中的元素的结构和排列。从树的顶部开始,按照相关的父子关系向下访问,直至到达所需的元素。

当您构造字段引用时,使用的名称必须是符合 ESQL 规则的有效 ESQL 标识。如果在双引号中包含了任何内容,则 ESQL 将它作为标识解释。如果您在单引号中包含了任何内 容,则 ESQL 将它作为字符文字解释。您必须在引号中包含所有字符串(字符串、字节字符串或二进制(位)字符串),如下面的示例中所示。要在字符串内包括单或双引号,包含两个连续的单或双引号。
重要: 要获取字段引用语法的全部描 述,请参阅ESQL 字段引用
要获取有关 ESQL 数据类型的更多信息,请参阅消息流中的 ESQL 数据类型

假设您已经创建了处理消息 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
    );

如果要查询或设置包含或可能包含空值的元素,则注意以下注意事项:

查询空值
当您将元素与 ESQL 关键字 NULL 相比较时,这测试在由解析器从输入消息创建的逻辑树中是否存在元素。

例如,您可以检查发票号码是否包含在当前 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 域中查询消息中的空值

设置空值
有两个可用于设置空值的语句。
  1. 如果您使用以下语句将元素设置为 NULL,则从消息树删除该元素:
    SET OutputRoot.XML.Invoice.Customer.Title = NULL;

    如果消息在 MRM 域中,则具有用于基于物理格式的空值的其他注意事项。有关更多详细信息,请参阅在 MRM 域中设置消息中的空值

    这称为隐式空处理。

  2. 如果您按如下所示将元素的值设置为 NULL:
    SET OutputRoot.XML.Invoice.Customer.Title VALUE = NULL;
    将不会从消息树删除元素。而是给元素指派一个特殊的 NULL 值。
    SET OutputRoot.XML.Invoice.Customer.Title = NULL;

    如果消息在 MRM 域中,则输出位流的内容取决于物理格式空处理属性的设置。有关更多详细信息,请参阅在 MRM 域中设置消息中的空值

    这称为显式空处理。

如果您将 MRM 复杂元素或 XML、XMLNS 或 JMS 父代元素设置为 NULL 而没有使用 VALUE 关键字,则从逻辑树删除该元素和该元素的所有子代。

相关概念
消息流概述
相关名
消息建模
相关任务
设计消息流
定义消息流内容
访问 MRM 域中消息里的元素
相关参考
Compute 节点
Database 节点
Filter 节点
ESQL 引用
DECLARE 语句
IF 语句
FIELDVALUE 函数
LASTMOVE 函数
SELECT 函数
SET 语句
ESQL 字段引用
ESQL 保留关键字
示例消息
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ac06010_