CREATE ステートメントは新規メッセージ・フィールドを作成します。
>>-CREATE--Qualifier--Target--+----------+----------------------> '-AsClause-' >--+------------------+--+-------------------+----------------->< | (1) | | (2) | '-DomainClause-----' +-RepeatClauses-----+ +-ValuesClauses-----+ +-FromClause--------+ | (3) | '-ParseClause-------' Qualifier |--+-FIELD-------------------+----------------------------------| '-+-PREVIOUSSIBLING-+--OF-' +-NEXTSIBLING-----+ +-FIRSTCHILD------+ '-LASTCHILD-------' AsClause |--AS--AliasFieldReferenceVariable------------------------------| DomainClause |--DOMAIN--expression-------------------------------------------| RepeatClauses |--REPEAT--+---------------------+------------------------------| '-VALUE-- -expression-' ValuesClauses |--+------------------+--+-------------------+------------------| '-| NamesClauses |-' '-VALUE--expression-' NamesClauses (4) |--+-+------------------+--+-----------------------+--+------------------+-----+--| | '-TYPE--Expression-' '-NAMESPACE--Expression-' '-NAME--Expression-' | '-IDENTITY--PathElement-----------------------------------------------------' FromClause |--FROM--SourceFieldReference-----------------------------------| ParseClause |--PARSE--(--BitStreamExpression--+------------------------------+--)--| | .-<<-----------------------. | | V | | '---+-ENCODING--expression-+-+-' +-CCSID--expression----+ +-SET--expression------+ +-TYPE--expression-----+ +-FORMAT--expression---+ '-Options--------------' オプション |--OPTIONS--+------------+--------------------------------------| '-expression-'
新しいメッセージ・フィールドは、指定した位置 (CREATE FIELD) または 既存の位置に対する相対位置 (CREATE... OF...) に配置されます。 新しいフィールドが作成されるのは、ターゲット・フィールド参照が、Environment、InputLocalEnvironment、OutputLocalEnvironment、OutputRoot、または OutputExceptionList など、変更可能なメッセージを指す場合だけです。
FIELD 文節を含める場合、ターゲットで指定されたフィールドにナビゲートされ (必要であれば、フィールドが作成される)、任意の VALUE 文節か FROM 文節が実行されます。 FIELD 文節を含めてもフィールドをまったく作成しないこともあり、確実に行われるのは、指定したフィールドの存在を確認することだけです。
SET OutputRoot.XMLNS.Message.Structure[2].Field = ...
Structure の少なくとも 1 つのインスタンスが、メッセージの中に既に存在していなければなりません。 つまり、作成されるツリー内のフィールドだけが、ルートから、フィールド参照によって示されるフィールドへの、直接パス上にあるものです。
PREVIOUSSIBLING、NEXTSIBLING、FIRSTCHILD、または LASTCHILD 文節を含める場合、FIELD 文節とまったく同じ方法でターゲットで指定されたフィールドにナビゲートされます (必要であれば、フィールドが作成されます)。 次に新しいフィールドが作成され、指定した位置に置かれます (例えば、 PREVIOUSSIBLING または FIRSTCHILD として)。 これらの文節を持つ CREATE ステートメントでは必ず、新しいフィールドが作成され、指定した位置に置かれます。
同じターゲットを指定する 2 つの CREATE FIRSTCHILD OF ターゲット・ステートメントを使用する場合、2 番目のステートメントでは、新しいフィールドがターゲットの最初の子として作成され、以前に作成した最初の子がメッセージ・ツリーの右に置き換えられます (そのため、最初の子ではなくなります)。 同様に、CREATE LASTCHILD OF ターゲットはターゲット・フィールドにナビゲートし、新しいフィールドを右端の子として追加し、以前の最後の子を左に置き換えます。
CREATE PREVIOUSSIBLING OF ターゲットは、ターゲットで指定したフィールドのすぐ左にフィールドを作成します (そのため、ツリーの深さは変わりません)。同じように、CREATE NEXTSIBLING OF ターゲットは、ターゲットで指定したフィールドのすぐ右にフィールドを作成します。 PREVIOUSSIBLING または NEXTSIBLING の作成時に、REPEAT キーワードを使用して、新規フィールドのタイプおよび名前を、現行フィールドからコピーできます。
AS 文節:
AS 文節があれば、名前付き参照変数を、新規に作成されたフィールドを指すように移動します。 後ほどの処理でこの新規フィールドを含めたい場合は、この文節を使用します。
DOMAIN 文節:
DOMAIN 文節がある場合、新しいフィールドを指定したタイプの新しいパーサーに関連付けます。 この文節では、ルート・フィールド名 (例えば、XMLNS や MQRFH2) を指定します。 DOMAIN 文節が存在しても、指定される値がゼロ長の文字ストリングである場合、ターゲットで指定したフィールドを所有するパーサーと同じタイプの新しいパーサーが作成されます。 指定したドメイン名が CHARACTER データ・タイプではないか、値がヌルの場合、例外がスローされます。 FIELD 文節と一緒に DOMAIN 文節は指定しないでください。新規フィールドが作成されない可能性もあります。
REPEAT 文節:
VALUES 文節:
VALUES 文節では、適切なデータ・タイプ (タイプでは INTEGER、名前では CHARACTER、そして値では任意の scalar 型) を戻す任意の式で、タイプ、名前、および値 (または、これらのサブセット) を指定できます。 タイプまたは名前に指定された値がヌルの場合には、例外がスローされます。
NAMES 文節:
NAMESPACE | NAME | エレメントに付けられる名前 |
---|---|---|
いいえ | いいえ | エレメントは名前なし (名前フラグは自動的に設定されない)。 |
いいえ | はい | エレメントは、デフォルトのネーム・スペースで指定された名前。 |
はい | いいえ | エレメントは、指定されたネーム・スペースで指定された空の名前。 |
はい | はい | エレメントは、指定されたネーム・スペースで指定された指定名。 |
IDENTITY オペランドは、TYPE および NAME 文節の代わりに単一のパス・エレメントを使用します。この場合、パス・エレメントには (最大限で) タイプ、ネーム・スペース、名前、および索引が含まれます。 これらのエレメントは、作成されるエレメントのタイプ、ネーム・スペース、名前、および索引を指定するもので、すべてフィールド参照のトピックで説明された規則に従っています (ESQL フィールド参照の概要を参照)。 以下に例を示します。
IDENTITY (XMLNS.attribute)Space1:Name1[42]
IDENTITY オペランドの使用法については、以下の「例」を参照してください。
FROM 文節:
FROM 文節の場合、新規フィールドのタイプ、名前、および値は、SourceFieldReference によって指し示したフィールドから取られます。 ターゲットの既存の子フィールドは切り離され (ただし、FIELD 文節の場合は、フィールドが既に存在している場合もあります)、次いで新しいフィールドに、ソース・フィールドの子フィールドが渡されます。
PARSE 文節:
PARSE 文節がある場合、提供されたビット・ストリームから新たに作成されたフィールドの下にサブツリーが作成されます。 このサブツリーをビルドするアルゴリズムは、パーサーごとに、指定されたオプションごとに異なります。 すべてのパーサーはモード RootBitStream をサポートしていますが、このモードのツリー作成アルゴリズムは入力ノードが使用するものと同じです。
パーサーの中には 2 番目のモード FolderBitStream をサポートしているものもあり、このモードは、同じモードを使用して ASBITSTREAM 関数 (ASBITSTREAM 関数を参照) によって作成されたビット・ストリームからサブツリーを生成します。
PARSE 文節を使用する場合は、BitStreamExpression に解析するビット・ストリームを含んでいるスカラー値を指定します。 メッセージ・ツリー・フィールド参照を使用する場合は、ビット・ストリームを含むスカラー値が含まれていることを確認してください。 InputRoot.XMLNSC などの既存のメッセージ本文フォルダーは、ビット・ストリームを含んでいないため、XMLNS フォルダーの直列化には使用できません。 ビット・ストリームを含むスカラー値以外の値を PARSE 文節の BitStreamExpression に渡すと、メッセージ・フローは BIP2906 エラー・メッセージを生成します。 むしろ、まず先に ASBITSTREAM 関数を呼び出して既存のメッセージ・ツリー・フォルダーを直列化する必要があります。 この ASBITSTREAM 関数の結果は、BitStreamExpression として PARSE 文節に渡すことができます。
DECLARE inCCSID INT InputProperties.CodedCharSetId;
DECLARE inEncoding INT InputProperties.Encoding;
DECLARE inBitStream BLOB ASBITSTREAM(InputRoot.XMLNSC, inEncoding, inCCSID);
CREATE LASTCHILD OF OutputRoot DOMAIN('MRM')
PARSE(inBitStream, inEncoding, inCCSID, 'DP3UK14002001',
'TestCase', 'XML1', options);
PARSE ステートメントが処理されると、すべての PARSE 文節式が評価されます。 次の式のいずれかが適切なタイプのヌル以外の値を結果として渡さないと、例外がスローされます。
文節 | タイプ | デフォルト値 |
---|---|---|
OPTIONS | 整数 | RootBitStream & ValidateNone |
ENCODING | 整数 | 0 |
CCSID | 整数 | 0 |
SET | CHARACTER | ゼロ長ストリング |
TYPE | CHARACTER | ゼロ長ストリング |
FORMAT | CHARACTER | ゼロ長ストリング |
TYPE 節の構文の詳細については、「メッセージ」プロパティーでのネーム・スペースの指定を参照してください。
OPTIONS 文節は、整数タイプの値を戻す式をすべて受け入れます。この文節は、与えられた定数のリストにあるオプション値を生成する場合にのみ有効です (なお、複数のオプションが必要な場合は、BITOR 関数を使用します)。
妥当性検査マスター・オプション...
ValidateContentAndValue
ValidateValue -- ValidateContent と一緒に使用できる
ValidateContent -- ValidateValue と一緒に使用できる
ValidateNone
妥当性検査障害アクション・オプション...
ValidateException
ValidateExceptionList
ValidateLocalError
ValidateUserTrace
妥当性検査タイミング・オプション...
ValidateComplete
ValidateImmediate
ValidateDeferred
C および Java™ の等価 API
各グループから 1 つのオプションだけが指定できます。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 や Encoding のデフォルト値も、キュー・マネージャーの Encoding や CCSID の設定から取られた値なので、そのまま使用してください。
同様に、Message Set、Message Type、および Message Format の各オプションについても、多くのパーサーがメッセージ・セット、メッセージ・タイプ、およびメッセージ形式の情報を必要としない (したがって、有効な値であれば何でもよい) ため、それぞれのデフォルト値を使用すると便利です。
ENCODING -> CCSID -> SET -> TYPE -> FORMAT -> OPTIONS
リストはどこで切り捨ててもよく、値を提供しない文節にはまったく空の式を使用することもできます。
CREATE FIELD OutputRoot.XMLNS.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';
CREATE NEXTSIBLING OF targetCursor AS targetCursor REPEAT;
DECLARE bodyBlob BLOB ASBITSTREAM(InputRoot.XMLNS, InputProperties.Encoding,
InputProperties.CodedCharSetId);
DECLARE creationPtr REFERENCE TO OutputRoot;
CREATE LASTCHILD OF creationPtr DOMAIN('XMLNS') PARSE(bodyBlob,
InputProperties.Encoding,
InputProperties.CodedCharSetId);
この例を拡張して、フィールドかフォルダーの逐次化や構文解析を表示できます。
DECLARE bodyBlob BLOB ASBITSTREAM(InputRoot.XMLNS.TestCase.myFolder,
InputProperties.Encoding,
InputProperties.CodedCharSetId,",",",FolderBitStream);
DECLARE creationPtr REFERENCE TO OutputRoot;
CREATE LASTCHILD OF creationPtr DOMAIN('XMLNS') 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.XMLNS, InputProperties.Encoding,
InputProperties.CodedCharSetId);
CREATE FIELD Environment.Variables.myXMLTree;
DECLARE creationPtr REFERENCE TO Environment.Variables.myXMLTree;
CREATE FIRSTCHILD OF creationPtr DOMAIN('XMLNS') PARSE(bodyBlob,
InputProperties.Encoding,
InputProperties.CodedCharSetId);
この例では、サンプル ESQL と入力メッセージが示されています。この例の最後にこれらの出力メッセージが一緒に生成されます。
CREATE COMPUTE MODULE CreateStatement_Compute
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
CALL CopyMessageHeaders();
CREATE FIELD OutputRoot.XMLNS.TestCase.description TYPE NameValue VALUE 'This is my TestCase' ;
DECLARE cursor REFERENCE TO OutputRoot.XMLNS.TestCase;
CREATE FIRSTCHILD OF cursor Domain('XMLNS')
NAME 'Identifier' VALUE InputRoot.XMLNS.TestCase.Identifier;
CREATE LASTCHILD OF cursor Domain('XMLNS') NAME 'Sport' VALUE InputRoot.XMLNS.TestCase.Sport;
CREATE LASTCHILD OF cursor Domain('XMLNS') NAME 'Date' VALUE InputRoot.XMLNS.TestCase.Date;
CREATE LASTCHILD OF cursor Domain('XMLNS') NAME 'Type' VALUE InputRoot.XMLNS.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;