SET 语句

SET 语句给变量赋值。

语法

介绍

TargetFieldReference 标识赋值目标。目标可以是下面任何一项:
  • 声明的标量变量
  • 声明的行变量
  • 某个预定义的行变量(例如,InputRoot
  • 任何种类行变量中的字段(即,子树或概念上的行)
  • 任何种类行变量中的字段列表(即,概念上的列表)
  • 声明的指向上述任一项的引用变量
目标不能是任何种类的数据库实体。

SourceExpression 是一个表达式,它提供要赋给变量的值。它可以是任何种类的表达式,可以返回标量、行或列表值。

为标量变量赋值

如果目标是声明的标量变量,则对 SourceExpression 求值,并将求值结果赋给此变量。如果需要,则将它的值转换为此变量的数据类型。如果无法进行这种转换,将在部署时发生错误或在运行时发生异常。

null 值的处理方法与其他值完全相同。即,如果表达式的求值结果为 null,则将值“null”赋给变量。

TYPE、NAME、NAMESPACE 和 VALUE 子句对标量变量没有意义,不允许使用。

为行、列表和字段赋值

如果目标是声明的行变量,某个预定义的行变量、任何种类行变量中的字段、任何种类行变量中的字段列表或声明的指向这些项中任何一项的引用变量,则最终目标是字段。在这些情况中,会浏览到目标字段(必要时创建字段)。

如果 TargetFieldReference 中使用了数组下标,则浏览到目标字段只能在从根到目标字段的直接路径上创建字段。例如,以下 SET 语句要求消息中至少存在一个 Structure 实例。

 SET OutputRoot.XML.Message.Structure[2].Field = ...  
目标字段的值是按照一组规则设置的,同时基于:
  1. TYPE、NAME、NAMESPACE 或 VALUE 子句是否存在
  2. 源表达式返回的数据类型
  1. 如果不存在 TYPE、NAME、NAMESPACE 或 VALUE 子句(最常见的情况),输出将取决于 SourceExpression 的求值结果是标量、行还是列表:
    • 如果 SourceExpression 的求值结果是标量,则目标字段的值设置为 SourceExpression 返回的值,但如果结果是 NULL,则废弃目标字段。请注意,该字段的新值可能与它前面的值不属于同一种数据类型。
    • 如果 SourceExpression 的求值结果是行:
      1. 则标识目标字段。
      2. 设置目标字段的值。
      3. 目标字段的子字段被新设置替代,这取决于列表的结构和内容。
    • 如果 SourceExpression 的求值结果是列表:
      1. 则标识目标树中的目标字段集。
      2. 如果目标字段太少,则创建更多字段;如果太多,则除去多余的字段。
      3. 设置目标字段的值。
      4. 目标字段的子字段被新设置替代,这取决于列表的结构和内容。

      有关使用 list 类型元素的更多信息,请参阅处理 xsd:: list 类型的元素

  2. 如果存在 TYPE 子句,则目标字段的类型设置为 SourceExpression 返回的值。如果返回值不是标量,不属于 INTEGER 类型或为 NULL,则抛出异常。
  3. 如果存在 NAMESPACE 子句,则目标字段的名称空间设置为 SourceExpression 返回的值。如果返回值不是标量,不属于 CHARACTER 类型或为 NULL,则抛出异常。
  4. 如果存在 NAME 子句,则目标字段的名称设置为 SourceExpression 返回的值。如果返回值不是标量,不属于 CHARACTER 类型或为 NULL,则抛出异常。
  5. 如果存在 VALUE 子句,则目标字段的值更改为 SourceExpression 返回的值。如果返回的值不是标量,则抛出异常。

在修改消息,更改原始消息中的字段或向原始消息添加新字段的 Compute 节点中,SET 语句特别有用。在 Filter 和 Database 节点中,在 Environment 树或 Local Environment 树中设置声明的变量或字段时,SET 语句也很有用。您可以在修改消息的 Compute 节点中使用如下语句:
SET OutputRoot = InputRoot;
SET OutputRoot.XML.Order.Name = UPPER(InputRoot.XML.Order.Name);

此示例将消息中的一个字段变成大写。第一条语句构造输出消息,它是输入消息的完整副本。第二条语句将 Order.Name 字段的值设置为右边表达式定义的新值。

如果原始输入消息中不存在 Order.Name 字段,第一条语句生成的输出消息中也不会存在。第二条语句右边的表达式将返回 NULL(因为 UPPER 函数调用中引用的字段不存在)。将 NULL 值赋给已存在的字段会导致此字段被删除,从而使第二条语句没作用。

如果要将 NULL 值赋给一个字段同时不删除它,请使用如下语句:
 SET OutputRoot.XML.Order.Name VALUE = NULL;
相关概念
ESQL 概述
相关任务
正在开发 ESQL
访问消息体中的元素
相关参考
语法图:可用类型
ESQL 语句
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ak05140_