CREATE 语句

CREATE 语句创建新的消息字段。

语法

注:
  1. 请不要将 DomainClauseParseClauseFIELD 限定符一起使用。
  2. 请只将 RepeatClausePREVIOUSSIBLINGNEXTSIBLING 限定符一起使用
  3. ParseClause中的每个子子句只能出现一次。

新的消息字段位于给定位置(CREATE FIELD)可相对于当前存在的位置(CREATE ... OF...)放置。只有目标字段引用指向可修改消息,例如,Environment、InputLocalEnvironment、OutputLocalEnvironment、OutputRoot 或 OutputExceptionList 时,才能创建新字段。

如果包含 FIELD 子句,则浏览到“target”指定的字段(必要时创建这些字段),且执行任何 values 子句或 from 子句。注意,这种形式的 CREATE 语句根本不创建任何字段;它只确保给定的字段确实存在。

如果在目标字段引用中使用数组下标,则只能创建特定字段的一个实例。因此,如果您写以下面开始的 SET 语句:
  SET OutputRoot.XML.Message.Structure[2].Field = ...  

消息中必须至少已存在 Structure 的一个实例。即,在树中创建的唯一字段是位于从根到字段引用标识的字段的直接路径上的字段。

如果包含 PREVIOUSSIBLING、NEXTSIBLING、FIRSTCHILD 或 LASTCHILD 子句,则以对 FIELD 字段完全相同的方法浏览到 target 指定的字段(必要时创建这些字段)。然后,将创建新字段并将它连接到指定的位置(例如,象 PREVIOUSSIBLING 或 FIRSTCHILD 那样)。这种形式的 CREATE 语句总是创建新字段,并将它放在指定的位置。

如果使用两个指定同一目标的 CREATE FIRSTCHILD OF 目标语句, 则第二个语句创建一个新字段作为 target 的第一个子代,然后将先前创建的第一个子代在消息树中向右移动(以使它不再是第一个子代)。类似地,CREATE LASTCHILD OF target 浏览到目标字段并添加新字段作为其最右边的子代,将先前的最后一个子代向左移动。

CREATE PREVIOUSSIBLING OF target 在紧靠“target”指定的字段左边创建一个字段(这样,不会更改树的深度);类似地,CREATE NEXTSIBLING OF target 在紧靠 target 指定的字段右边创建一个字段。创建 PREVIOUSSIBLING 或 NEXTSIBLING 时,您可以使用 REPEAT 关键字从当前字段复制新字段的类型和名称。

AS 子句:

如果存在,AS 子句将指定的引用变量移动到指向新创建的字段。这是有用的,因为您可能需要在某些进一步的处理中包含这个新字段。

DOMAIN 子句:

如果存在,DOMAIN 子句将新字段与指定类型的新解析器关联。该子句期待根字段名(例如,XML 或 MQRFH2)。如果存在 DOMAIN 子句,但提供的值是零长度的字符串,将创建与拥有 target 指定的字段的解析器类型相同的新解析器。如果提供的域名不是 CHARACTER 数据类型或它的值为 NULL,则抛出一个异常。请不要将 DOMAIN 子句和 FIELD 子句一起指定;它不包含创建的新字段。

REPEAT 子句:

使用 REPEAT 子句可从目标字段中复制新字段的类型和名称。或者,新字段的类型、名称和值可以是:
  • 从任何现有字段复制(使用 FROM 子句)
  • 显式指定(使用 VALUES 子句)
  • 通过解析位流来定义(使用 PARSE 子句)
对于 FROM 和 PARSE 子句,也可以创建新字段的子代。

VALUES 子句:

对于 VALUES 子句,可使用任何返回合适数据类型(对于类型,为 INTEGER;对于名称,为 CHARACTER;对于值,为任何标量类型)的表达式指定类型、名称和值(或这些的任何子集)。如果提供的值的类型或名称为 NULL,则抛出一个异常。

NAMES 子句:

NAMES 子句使用任何返回类型为字符的非 NULL 值的表达式。如下所示,含义取决于 NAME 和 NAMESPACE 子句的存在:
NAMESPACE NAME 按如下所示命名的元素
该元素没有名称(未自动设定名称标志)
该元素被赋予缺省名称空间的名称
该元素被赋予给定名称空间中的空名称
该元素被赋予给定名称空间中的给定名称

IDENTITY 操作数获取一个路径元素而不是 TYPE 和 NAME 子句,该路径元素最多包含一个类型、一个名称空间、一个名称和一个索引。这些参数指定要创建的元素的类型、名称空间、名称和索引,并遵守有关字段引用的主题中描述的所有规则(请参阅ESQL 字段引用)。例如:

IDENTITY (XML.attribute)Space1:Name1[42]

关于如何使用 IDENTITY 操作数的信息,请参阅下面的示例。

FROM 子句:

对于 FROM 子句,新字段的类型、名称和值从 SourceFieldReference 指向的字段获取。将拆离任何已存在的目标子字段(如果有 FIELD 子句,字段可能已存在),然后新的字段被赋予源字段的子、孙子等等的副本。

PARSE 子句:

如果存在 PARSE 子句,子树从所提供位流的新创建字段下构建。取决于不同的解析器和根据指定的选项,完成此操作的算法是不同的。所有解析器都支持方式 RootBitStream,在这种方式下树创建算法与输入节点使用的算法相同。

有些解析器还支持第二种方式 FolderBitStream,使用这种方式从 ASBITSTREAM 函数(请参阅 ASBITSTREAM 函数)创建的位流生成子树。

当处理语句时,将求值任何 PARSE 子句表达式。如果以下任何表达式没有生成相应类型的非 NULL 值,将抛出异常:

子句 类型 缺省值
Options 整数 RootBitStream & ValidateNone
Encoding 整数 0
Ccsid 整数 0
消息集 字符 零长度字符串
消息类型 字符 零长度字符串
消息格式 字符 零长度字符串

尽管 OPTIONS 子句接受任何返回值的类型为整数的表达式,但是只有从所提供常量的列表中生成选项值才是有效的(如果需要多个选项,使用 BITOR 函数)。

一旦生成,值变成整数,并可保存在变量中,或者作为参数传递给函数,也可以直接与 CREATE 语句一起使用。全局定义的常量列表是:
        验证主选项...
        ValidateContentAndValue
                ValidateValue		-- 可与 ValidateContent 一起使用
                ValidateContent		-- 可与 ValidateValue 一起使用
        ValidateNone

       验证故障操作选项...
                ValidateException
        ValidateExceptionList
                ValidateLocalError
        ValidateUserTrace

       验证值约束选项...
                ValidateFullConstraints
       ValidateBasicConstraints

       验证修正选项...
                ValidateFullFixUp
       ValidateNoFixUp

       Parse timing options...
        ParseComplete
        ParseImmediate
       ParseOnDemand
注:
  1. validateFullFixUp 选项被保留以备将来使用。 选择 validateFullFixUp 会给出与 validateNoFixUp 相同的行为。
  2. 保留 validateFullConstraints 选项以备将来使用。选择 validateFullConstraints 会给出与 validateBasicConstraints 相同的行为。
  3. 有关验证选项的完整详细信息,请参阅MRM 域中消息的验证属性
  4. 验证计时选项对应于解析计时选项,特别地,延迟验证称为按需解析

每个组只能指定一个选项,但 ValidateValue 和 ValidateContent 除外,它们可以一起使用以获取内容和值验证。如果没有指定组中的选项,则使用粗体表示的选项。

ENCODING 子句接受任何返回类型为整数的值的表达式。但是,只有从提供的常量列表中生成选项值才是有意义的:
       MQENC_INTEGER_NORMAL
              MQENC_INTEGER_REVERSED
              MQENC_DECIMAL_NORMAL
              MQENC_DECIMAL_REVERSED
              MQENC_FLOAT_IEEE_NORMAL
              MQENC_FLOAT_IEEE_REVERSED
              MQENC_FLOAT_S390

用于 CCSID 子句的值遵守常规的编号系统。例如,1200 = UCS-2,1208 = UTF-8。

对于没有出现的子句,使用给定的缺省值。请使用 CCSID 和编码缺省值,因为它们从队列管理器的编码和 CCSID 设置中获取值。

类似地,对每个消息集、类型和格式选项使用缺省值是有用的,因为许多解析器不需要消息集、类型或格式信息,因此,任何有效值就足够了。

对任何表达式求值时,使用表达式的结果解析位流。
注: 因为该函数有大量子句,所以支持一种备用的语法,在该语法中参数作为逗号分隔的列表而不是命名的子句提供。在这种情况下,表达式的顺序必须为:
ENCODING -> CCSID -> SET -> TYPE -> FORMAT -> OPTIONS

可在任何一点截断该列表,且可对任何您没有提供值的子句使用完全为空的表达式。

使用 CREATE 语句的示例

  1. 以下示例创建指定的字段:
    CREATE FIELD OutputRoot.XML.Data;
  2. 以下示例创建没有名称、类型或值的字段,将它作为 ref1 的第一个子代:
    CREATE FIRSTCHILD OF ref1;
  3. 以下示例使用指定的类型、名称和值创建字段:
    CREATE NEXTSIBLING OF ref1 TYPE NameValue NAME 'Price' VALUE 92.3;
  4. 以下示例创建带有类型和名称,但没有值的字段;该字段添加到动态引用(ref1)指示的同代之前:
    CREATE PREVIOUSSIBLING OF ref1 TYPE Name NAME 'Quantity';
  5. 以下示例创建名为 Component 的字段;并移动引用变量 targetCursor 以指向它:
    CREATE FIRSTCHILD OF targetCursor AS targetCursor NAME 'Component';
    以下示例创建新字段作为引用变量 targetCursor 指向的字段右边的同代,新字段的类型和名称与指向的字段相同。然后,语句移动 targetCursor 以指向新字段:
      CREATE NEXTSIBLING OF targetCursor AS targetCursor REPEAT;
  6. 以下示例显示了如何使用 PARSE 子句:
    DECLARE bodyBlob BLOB ASBITSTREAM(InputRoot.XML, InputProperties.Encoding,
     InputProperties.CodedCharSetId);
    DECLARE creationPtr REFERENCE TO OutputRoot;
    CREATE LASTCHILD OF creationPtr DOMAIN('XML') PARSE(bodyBlob,
                        InputProperties.Encoding,
     InputProperties.CodedCharSetId);

    可以扩展以下示例来显示字段或文件夹的序列化和解析:

    DECLARE bodyBlob BLOB ASBITSTREAM(InputRoot.XML.TestCase.myFolder,
                        InputProperties.Encoding,
    InputProperties.CodedCharSetId,",",",FolderBitStream);
    DECLARE creationPtr REFERENCE TO OutputRoot;
    CREATE LASTCHILD OF creationPtr DOMAIN('XML') PARSE(bodyBlob,
                        InputProperties.Encoding,
    InputProperties.CodedCharSetId,",",",FolderBitStream);
  7. 以下示例显示了如何使用 IDENTITY 操作数:
    CREATE FIELD OutputRoot.XMLNS.TestCase.Root IDENTITY (XML.ParserRoot)Root;
    CREATE FIELD OutputRoot.XMLNS.TestCase.Root.Attribute
           IDENTITY (XML.Attribute)NSpace1:Attribute VALUE 'Attrib Value';
    CREATE LASTCHILD OF OutputRoot.XMLNS.TestCase.Root
           IDENTITY (XML.Element)NSpace1:Element1[1] VALUE 'Element 1 Value';
    CREATE LASTCHILD OF OutputRoot.XMLNS.TestCase.Root
           IDENTITY (XML.Element)NSpace1:Element1[2] VALUE 'Element 2 Value';

    此语句序列产生以下输出消息:

    <TestCase>
     <Root xmlns:NS1="NSpace1" NS1:Attribute="Attrib Value">
      <NS1:Element1>Element 1 Value</NS1:Element1>
      <NS1:Element1>Element 2 Value</NS1:Element1>
     </Root>
    </TestCase>
  8. 以下示例显示了您如何使用 DOMAIN 子句在发生意外解析器复制时避免丢失对 XML 解析器唯一的信息:
    DECLARE bodyBlob BLOB ASBITSTREAM(InputRoot.XML, InputProperties.Encoding,
    InputProperties.CodedCharSetId);
    CREATE FIELD Environment.Variables.myXMLTree;
    DECLARE creationPtr REFERENCE TO Environment.Variables.myXMLTree;
    CREATE FIRSTCHILD OF creationPtr DOMAIN('XML') PARSE(bodyBlob,
                        InputProperties.Encoding,
    InputProperties.CodedCharSetId);

CREATE 语句的示例

本示例提供 ESQL 和输入消息的样本,它在此示例的结尾处产生输出消息。

CREATE COMPUTE MODULE CreateStatement_Compute
   CREATE FUNCTION Main() RETURNS BOOLEAN
	BEGIN
CALL CopyMessageHeaders();

        CREATE FIELD OutputRoot.XML.TestCase.description TYPE NameValue VALUE 'This is my TestCase' ;
        DECLARE cursor REFERENCE TO OutputRoot.XML.TestCase;
        CREATE FIRSTCHILD OF cursor Domain('XML')
               NAME 'Identifier' VALUE InputRoot.XML.TestCase.Identifier;
        CREATE LASTCHILD OF cursor Domain('XML') NAME 'Sport' VALUE InputRoot.XML.TestCase.Sport;
        CREATE LASTCHILD OF cursor Domain('XML') NAME 'Date' VALUE InputRoot.XML.TestCase.Date;
        CREATE LASTCHILD OF cursor Domain('XML') NAME 'Type' VALUE InputRoot.XML.TestCase.Type;
        CREATE FIELD cursor.Division[1].Number TYPE NameValue VALUE 'Premiership';
        CREATE FIELD cursor.Division[1].Result[1].Number TYPE NameValue VALUE '1' ;
        CREATE FIELD cursor.Division[1].Result[1].Home TYPE Name;
        CREATE LASTCHILD OF cursor.Division[1].Result[1].Home NAME 'Team' VALUE 'Liverpool' ;
        CREATE LASTCHILD OF cursor.Division[1].Result[1].Home NAME 'Score' VALUE '4';
        CREATE FIELD cursor.Division[1].Result[1].Away TYPE Name;
        CREATE LASTCHILD OF cursor.Division[1].Result[1].Away NAME 'Team' VALUE 'Everton';
        CREATE LASTCHILD OF cursor.Division[1].Result[1].Away NAME 'Score' VALUE '0';
        CREATE FIELD cursor.Division[1].Result[2].Number TYPE NameValue VALUE '2';
        CREATE FIELD cursor.Division[1].Result[2].Home TYPE Name;
        CREATE LASTCHILD OF cursor.Division[1].Result[2].Home NAME 'Team' VALUE 'Manchester United';
        CREATE LASTCHILD OF cursor.Division[1].Result[2].Home NAME 'Score' VALUE '2';
        CREATE FIELD cursor.Division[1].Result[2].Away TYPE Name;
        CREATE LASTCHILD OF cursor.Division[1].Result[2].Away NAME 'Team' VALUE 'Arsenal';
        CREATE LASTCHILD OF cursor.Division[1].Result[2].Away NAME 'Score' VALUE '3';
        CREATE FIELD cursor.Division[2].Number TYPE NameValue VALUE '2';
        CREATE FIELD cursor.Division[2].Result[1].Number TYPE NameValue VALUE '1';
        CREATE FIELD cursor.Division[2].Result[1].Home TYPE Name;
        CREATE LASTCHILD OF cursor.Division[2].Result[1].Home NAME 'Team' VALUE 'Port Vale';
        CREATE LASTCHILD OF cursor.Division[2].Result[1].Home NAME 'Score' VALUE '9' ;
        CREATE FIELD cursor.Division[2].Result[1].Away TYPE Name;
        CREATE LASTCHILD OF cursor.Division[2].Result[1].Away NAME 'Team' VALUE 'Brentford';
        CREATE LASTCHILD OF cursor.Division[2].Result[1].Away NAME 'Score' VALUE '5';

	END;

       CREATE PROCEDURE CopyMessageHeaders() BEGIN
              DECLARE I INTEGER 1;
              DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
                         WHILE I < J DO
                                 SET OutputRoot.*[I] = InputRoot.*[I];
SET I = I + 1;
END WHILE;
	END;

END MODULE;
相关概念
ESQL 概述
相关任务
正在开发 ESQL
处理 XML 消息和位流
相关参考
语法图:可用类型
ESQL 语句
ASBITSTREAM 函数
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ak04950_