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-' Values clauses |--+------------------+--+-------------------+------------------| '-| NamesClauses |-' '-VALUE--expression-' NamesClauses |--+-+------------------+--+-----------------------+--+------------------+-+--| | '-TYPE--Expression-' '-NAMESPACE--Expression-' '-NAME--Expression-' | '-IDENTITY--PathElement-------------------------------------------------' FromClause |--FROM--SourceFieldReference-----------------------------------| Parse clause |--PARSE--(--BitStreamExpression--+------------------------------+--)--| | .-<<-----------------------. | | V | | '---+-OPTIONS--expression--+-+-' +-ENCODING--expression-+ +-CCSID--expression----+ +-SET--expression------+ +-TYPE--expression-----+ '-FORMAT--expression---'
新しいメッセージ・フィールドは、指定した位置 (CREATE FIELD) または 既存の位置に対する相対位置 (CREATE... OF...) に配置されます。 . 新しいフィールドが作成されるのは、ターゲットのフィールド参照が、Environment、InputLocalEnvironment、OutputLocalEnvironment、OutputRoot、または OutputExceptionList など、変更可能なメッセージを指す場合だけです。
FIELD 文節を含める場合、ターゲットで指定されたフィールドにナビゲートされ (必要であれば、フィールドが作成される)、任意の VALUE 文節か FROM 文節が実行されます。この形式の CREATE ステートメントでは、フィールドをまったく作成しないこともあり、確実に行われるのは、指定したフィールドの存在を確認することだけです。
SET OutputRoot.XML.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 文節があれば、名前付き参照変数を、新規に作成されたフィールドを指すように移動します。後ほどの処理でこの新規フィールドを含める場合もあるので、こうしておくと役立ちます。
DOMAIN 文節がある場合、新しいフィールドを指定したタイプの新しいパーサーに関連付けます。この文節では、ルート・フィールド名 (たとえば、XML や MQRFH2) を指定します。DOMAIN 文節が存在しても、指定される値がゼロ長の文字ストリングである場合、ターゲットで指定したフィールドを所有するパーサーと同じタイプの新しいパーサーが作成されます。指定したドメイン名が CHARACTER データ・タイプではないか、値がヌルの場合、例外がスローされます。FIELD 文節と一緒に DOMAIN 文節は指定しないでください。新規フィールドが作成されない可能性もあります。
VALUES 文節では、適切なデータ・タイプ (タイプでは INTEGER、名前では CHARACTER、そして値では任意の scalar 型) を戻す任意の式で、タイプ、名前、および値 (または、これらのサブセット) を指定できます。タイプまたは名前に指定された値がヌルの場合には、例外がスローされます。
NAMESPACE | NAME | エレメントに付けられる名前 |
---|---|---|
いいえ | いいえ | エレメントは名前なし (名前フラグは自動的に設定されない) |
いいえ | はい | エレメントは、デフォルトのネーム・スペースで指定された名前 |
はい | いいえ | エレメントは、指定されたネーム・スペースで指定された空の名前 |
はい | はい | エレメントは、指定されたネーム・スペースで指定された指定名 |
IDENTITY 文節は TYPE および NAME 文節の代わりに単一のパス・エレメントを取り、フィールド参照に関する部分で説明されている規則すべてに従います (ESQL フィールド参照を参照してください)。
FROM 文節の場合、新規フィールドのタイプ、名前、および値は、SourceFieldReference によって指し示したフィールドから取られます。ターゲットの既存の子フィールドは切り離され (ただし、FIELD 文節の場合は、フィールドがすでに存在している場合もあります)、次いで新しいフィールドに、ソース・フィールドの子フィールド (および孫など) のコピーが渡されます。
PARSE 文節がある場合、提供されたビット・ストリームから新たに作成されたフィールドの下にサブツリーが作成されます。このことを実行するアルゴリズムは、パーサーごとに、指定されたオプションごとに異なります。すべてのパーサーはモード RootBitStream をサポートしていますが、このモードのツリー作成アルゴリズムは入力ノードが使用するものと同じです。
パーサーの中には 2 番目のモード FolderBitStream をサポートしているものもあり、このモードは、同じモードを使用して ASBITSTREAM 関数 (ASBITSTREAM 関数を参照) によって作成されたビット・ストリームからサブツリーを生成します。
ステートメントが処理されると、すべての PARSE 文節式が評価されます。次の式のいずれかが適切なタイプのヌル以外の値を結果として渡さないと、例外がスローされます。
文節 | タイプ | デフォルト値 |
---|---|---|
Options | 整数 | RootBitStream & ValidateNone |
Encoding | 整数 | 0 |
Ccsid | 整数 | 0 |
Message set | 文字 | ゼロ長ストリング |
Message type | 文字 | ゼロ長ストリング |
Message format | 文字 | ゼロ長ストリング |
OPTIONS 文節は、整数タイプの値を戻す式をすべて受け入れます。この文節は、与えられた定数のリストにあるオプション値を生成する場合にのみ有効です (なお、複数のオプションが必要な場合は、BITOR 関数を使用します)。
妥当性検査マスター・オプション... ValidateContentAndValue ValidateValue -- ValidateContent と一緒に使用できる ValidateContent -- ValidateValue と一緒に使用できる ValidateNone 妥当性検査障害アクション・オプション... ValidateException ValidateExceptionList ValidateLocalError ValidateUserTrace 妥当性検査の値制約オプション... ValidateFullConstraints ValidateBasicConstraints 妥当性検査の修正オプション... ValidateFullFixUp ValidateNoFixUp 妥当性検査タイミング・オプション... ValidateComplete ValidateImmeditate ValidateDeferred
各グループから 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.XML.Data;次の例は、名前、タイプ、または値を指定しないで、ref1 の最初の子としてフィールドを作成する場合です。
CREATE FIRSTCHILD OF ref1;次の例は、指定したタイプ、名前、および値のフィールドを作成します。
CREATE NEXTSIBLING OF ref1 TYPE NameValue NAME 'Price' VALUE 92.3;次の例では、タイプと名前を指定し、値は指定しないでフィールドを作成します。そのフィールドは、動的参照 (ref1) の指す兄弟の前に追加されます。
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;
次の例は、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);
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;