CREATE ステートメント

CREATE ステートメントは新規メッセージ・フィールドを作成します。

構文

注:
  1. FIELD 修飾子と一緒に、DomainClause および ParseClause を使用しないでください。
  2. RepeatClause は、PREVIOUSSIBLING および NEXTSIBLING 修飾子とのみ使用できます。
  3. ParseClause 中で個々の副文節を 1 回のみ使用できます。

新しいメッセージ・フィールドは、指定した位置 (CREATE FIELD) または 既存の位置に対する相対位置 (CREATE... OF...) に配置されます。 . 新しいフィールドが作成されるのは、ターゲットのフィールド参照が、Environment、InputLocalEnvironment、OutputLocalEnvironment、OutputRoot、または OutputExceptionList など、変更可能なメッセージを指す場合だけです。

FIELD 文節を含める場合、ターゲットで指定されたフィールドにナビゲートされ (必要であれば、フィールドが作成される)、任意の VALUE 文節か FROM 文節が実行されます。この形式の CREATE ステートメントでは、フィールドをまったく作成しないこともあり、確実に行われるのは、指定したフィールドの存在を確認することだけです。

ターゲットのフィールド参照の中で配列指標を使用するときは、特定フィールドの 1 つのインスタンスだけを作成できます。したがって、SET ステートメントを書く場合、次のように書き始めます。
 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 文節:

AS 文節があれば、名前付き参照変数を、新規に作成されたフィールドを指すように移動します。後ほどの処理でこの新規フィールドを含める場合もあるので、こうしておくと役立ちます。

DOMAIN 文節:

DOMAIN 文節がある場合、新しいフィールドを指定したタイプの新しいパーサーに関連付けます。この文節では、ルート・フィールド名 (例えば、XML や MQRFH2) を指定します。DOMAIN 文節が存在しても、指定される値がゼロ長の文字ストリングである場合、ターゲットで指定したフィールドを所有するパーサーと同じタイプの新しいパーサーが作成されます。指定したドメイン名が CHARACTER データ・タイプではないか、値がヌルの場合、例外がスローされます。FIELD 文節と一緒に DOMAIN 文節は指定しないでください。新規フィールドが作成されない可能性もあります。

REPEAT 文節:

REPEAT 文節を使用して、ターゲット・フィールドから新規フィールドのタイプおよび名前をコピーできます。あるいは新規フィールドのタイプ、名前、および値を、次のようにすることができます。
  • 既存のフィールドからコピーする (FROM 文節を使用する)
  • 明示的に指定する (VALUES 文節を使用する)
  • ビット・ストリームを解析することによって定義する (PARSE 文節を使用する)
FROM および PARSE 文節による場合は、新しいフィールドの子も作成できます。

VALUES 文節:

VALUES 文節では、適切なデータ・タイプ (タイプでは INTEGER、名前では CHARACTER、そして値では任意の scalar 型) を戻す任意の式で、タイプ、名前、および値 (または、これらのサブセット) を指定できます。タイプまたは名前に指定された値がヌルの場合には、例外がスローされます。

NAMES 文節:

NAMES 文節は、タイプが文字のヌル以外の値を戻すすべての式を取ります。 意味は、NAME および NAMESPACE 文節の有無によって、次のように左右されます。
NAMESPACE NAME エレメントに付けられる名前
いいえ いいえ エレメントは名前なし (名前フラグは自動的に設定されない)
いいえ はい エレメントは、デフォルトのネーム・スペースで指定された名前
はい いいえ エレメントは、指定されたネーム・スペースで指定された空の名前
はい はい エレメントは、指定されたネーム・スペースで指定された指定名

IDENTITY オペランドは、TYPE および NAME 文節の代わりに単一のパス・エレメントを使用します。この場合、パス・エレメントには (最大限で) タイプ、ネーム・スペース、名前、および索引が含まれます。これらは、作成されるエレメントのタイプ、ネーム・スペース、名前、および索引を指定するもので、すべてフィールド参照のトピックで説明された規則に従っています (ESQL フィールド参照を参照)。 以下に例を示します。

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

IDENTITY オペランドの使用法については、下の「例」を参照してください。

FROM 文節:

FROM 文節の場合、新規フィールドのタイプ、名前、および値は、SourceFieldReference によって指し示したフィールドから取られます。ターゲットの既存の子フィールドは切り離され (ただし、FIELD 文節の場合は、フィールドがすでに存在している場合もあります)、次いで新しいフィールドに、ソース・フィールドの子フィールド (および孫など) のコピーが渡されます。

PARSE 文節:

PARSE 文節がある場合、提供されたビット・ストリームから新たに作成されたフィールドの下にサブツリーが作成されます。このことを実行するアルゴリズムは、パーサーごとに、指定されたオプションごとに異なります。すべてのパーサーはモード RootBitStream をサポートしていますが、このモードのツリー作成アルゴリズムは入力ノードが使用するものと同じです。

パーサーの中には 2 番目のモード FolderBitStream をサポートしているものもあり、このモードは、同じモードを使用して ASBITSTREAM 関数 (ASBITSTREAM 関数を参照) によって作成されたビット・ストリームからサブツリーを生成します。

ステートメントが処理されると、すべての PARSE 文節式が評価されます。次の式のいずれかが適切なタイプのヌル以外の値を結果として渡さないと、例外がスローされます。

文節 タイプ デフォルト値
Options 整数 RootBitStream & ValidateNone
Encoding 整数 0
Ccsid 整数 0
Message set 文字 ゼロ長ストリング
Message type 文字 ゼロ長ストリング
Message format 文字 ゼロ長ストリング

OPTIONS 文節は、整数タイプの値を戻す式をすべて受け入れます。この文節は、与えられた定数のリストにあるオプション値を生成する場合にのみ有効です (なお、複数のオプションが必要な場合は、BITOR 関数を使用します)。

生成された値は整数になり、したがってその値は変数に保管したり、パラメーターとして関数に渡したり、CREATE ステートメントで直接使用することもできます。グローバルに定義された定数のリストは次のとおりです。
        妥当性検査マスター・オプション...
        ValidateContentAndValue
        ValidateValue		-- ValidateContent と一緒に使用できる
        ValidateContent		-- ValidateValue と一緒に使用できる
        ValidateNone

       妥当性検査障害アクション・オプション...
        ValidateException
        ValidateExceptionList
        ValidateLocalError
        ValidateUserTrace

       妥当性検査の値制約オプション...
        ValidateFullConstraints
        ValidateBasicConstraints

       妥当性検査の修正オプション...
        ValidateFullFixUp
        ValidateNoFixUp

       構文解析タイミング・オプション...
        ParseComplete
        ParseImmediate
       ParseOnDemand
注 :
  1. validateFullFixUp オプションは将来の利用のために予約済みです。 validateFullFixUp を選択すると、validateNoFixUp と同じ動作になります。
  2. validateFullConstraints オプションは将来の利用のために予約済みです。validateFullConstraints を選択すると、validateBasicConstraints と同じ動作になります。
  3. 妥当性検査オプションについての詳細は、MRM ドメインのメッセージの妥当性検査プロパティーを参照してください。
  4. 妥当性検査タイミング・オプション構文解析タイミング・オプション に対応し、特に妥当性検査据え置きオンデマンド で呼び出されます。

各グループから 1 つのオプションだけが指定できます。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 や Encoding のデフォルト値も、キュー・マネージャーの Encoding や CCSID の設定から取られた値なので、そのまま使用してください。

同様に、Message Set、Message Type、および Message Format の各オプションについても、多くのパーサーがメッセージ・セット、メッセージ・タイプ、およびメッセージ形式の情報を必要としない (したがって、有効な値であれば何でもよい) ため、それぞれのデフォルト値を使用すると便利です。

式が評価されると、その式の結果を使用してビット・ストリームが解析されます。
注: この関数には多数の文節があるため、名前付き文節ではなくコンマ区切りリストでパラメーターを提供する代替構文もサポートされています。この場合、式は次の順番でなければなりません。
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 最終更新: 08/21/2006
ak04950_