CREATE 语句创建新的消息字段。
新的消息字段位于给定位置(CREATE FIELD)可相对于当前存在的位置(CREATE ... OF...)放置。只有目标字段引用指向可修改消息,例如,Environment、InputLocalEnvironment、OutputLocalEnvironment、OutputRoot 或 OutputExceptionList 时,才能创建新字段。
如果包含 FIELD 子句,则浏览到“target”指定的字段(必要时创建这些字段),且执行任何 values 子句或 from 子句。注意,这种形式的 CREATE 语句根本不创建任何字段;它只确保给定的字段确实存在。
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 子句:
VALUES 子句:
对于 VALUES 子句,可使用任何返回合适数据类型(对于类型,为 INTEGER;对于名称,为 CHARACTER;对于值,为任何标量类型)的表达式指定类型、名称和值(或这些的任何子集)。如果提供的值的类型或名称为 NULL,则抛出一个异常。
NAMES 子句:
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 函数)。
验证主选项... ValidateContentAndValue ValidateValue -- 可与 ValidateContent 一起使用 ValidateContent -- 可与 ValidateValue 一起使用 ValidateNone 验证故障操作选项... ValidateException ValidateExceptionList ValidateLocalError ValidateUserTrace 验证值约束选项... ValidateFullConstraints ValidateBasicConstraints 验证修正选项... ValidateFullFixUp ValidateNoFixUp Parse timing options... ParseComplete ParseImmediate ParseOnDemand
每个组只能指定一个选项,但 ValidateValue 和 ValidateContent 除外,它们可以一起使用以获取内容和值验证。如果没有指定组中的选项,则使用粗体表示的选项。
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 FIELD OutputRoot.XML.Data;
CREATE FIRSTCHILD OF ref1;
CREATE NEXTSIBLING OF ref1 TYPE NameValue NAME 'Price' VALUE 92.3;
CREATE PREVIOUSSIBLING OF ref1 TYPE Name NAME 'Quantity';
CREATE FIRSTCHILD OF targetCursor AS targetCursor NAME 'Component';以下示例创建新字段作为引用变量 targetCursor 指向的字段右边的同代,新字段的类型和名称与指向的字段相同。然后,语句移动 targetCursor 以指向新字段:
CREATE NEXTSIBLING OF targetCursor AS targetCursor REPEAT;
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);
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>
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);
本示例提供 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;