単純なメッセージの変換

Compute ノードに ESQL をコーディングする際に、SELECT 関数を使用して単純なメッセージを変換できます。

このトピックでは、単純メッセージ変換の例が示されています。例を考慮し、独自にご使用になるために変更を加えてください。入力は、すべて Invoice メッセージに基づいています。

次の ESQL をご覧ください。

 SET OutputRoot.XMLNS.Data.Output[] =
    (SELECT R.Quantity, R.Author FROM InputRoot.XMLNS.Invoice.Purchases.Item[] AS R
    );

このESQL コードが Invoice メッセージを処理すると、次の出力メッセージが生成されます。

<Data>
  <Output>
     <Quantity>2</Quantity>
     <Author>Neil Bradley</Author>
  </Output>
  <Output>
     <Quantity>1</Quantity>
     <Author>Don Chamberlin</Author>
  </Output>
  <Output>
     <Quantity>1</Quantity>
     <Author>Philip Heller, Simon Roberts</Author>
  </Output>
</Data>

それぞれの Item フィールドに 1 つずつ、3 つの Output フィールドが存在します。これは、SELECT が結果リスト内に、FROM リストによって記述された各項目に対して、項目を 1 つずつ作成するためです。 各 Output フィールド内には、SELECT 文節で指定されている各フィールドのためのフィールドが作成されます。 これらのフィールドは着信メッセージにおける順序ではなく、SELECT 文節で指定されている順序で配列されています。

最後の AS キーワードの後にある R は、相関名として知られています。 これは、FROM 文節によってアドレッシングされたフィールドのそれぞれを順番に表すローカル変数です。選択された名前には意味はありません。要約すると、この単純な変換は、次の 2 つの事柄を行います。

  1. 不要なフィールドを廃棄する。
  2. フィールドの順序を確定する。

以下のプロシージャー・アルゴリズムで同じ変換を実行できます。

DECLARE i INTEGER 1;
DECLARE count INTEGER CARDINALITY(InputRoot.XMLNS.Invoice.Purchases.Item[]);

WHILE (i <= count)
   SET OutputRoot.XMLNS.Data.Output[i].Quantity = InputRoot.XMLNS.Invoice.Purchases.Item[i].Quantity;
   SET OutputRoot.XMLNS.Data.Output[i].Author   = InputRoot.XMLNS.Invoice.Purchases.Item[i].Author;
   SET i = i+1;
END WHILE;

以上の例から分かるように、SELECT を使用した変換のほうが、はるかに簡潔です。また、そのほうがより速く実行されます。

次の例は、より高度な変換を示しています。

SET OutputRoot.XMLNS.Data.Output[] =
    (SELECT R.Quantity AS Book.Quantity, 
            R.Author   AS Book.Author
            FROM InputRoot.XMLNS.Invoice.Purchases.Item[] AS R
    );

この変換では、AS 文節が SELECT 文節内の各項目に関連付けられています。 この文節は、結果内の各フィールドに、入力から継承したフィールド名ではなく、明示的な名前を与えます。 これらの名前は、例に示されたようなパス (つまり、ドットで区切られた名前のリスト) であってもかまいません。出力メッセージの構造は、入力メッセージの構造とは異なることがあります。 同じ Invoice メッセージを使用すると、結果は次のようになります。

<Data>
 <Output>
  <Book>
   <Quantity>2</Quantity>
   <Author>Neil Bradley</Author>
  </Book>
 </Output>
</Data>

<Data>
  <Output>
    <Book>
      <Quantity>2</Quantity>
      <Author>Neil Bradley</Author>
    </Book>
  </Output>
  <Output>
    <Book>
      <Quantity>1</Quantity>
      <Author>Don Chamberlin</Author>
    </Book>
  </Output>
  <Output>
    <Book>
      <Quantity>1</Quantity>
      <Author>Philip Heller, Simon Roberts</Author>
    </Book>
  </Output>
</Data>

SELECT 文節内の式は、どれだけ複雑であってもかまわず、特に制約事項はありません。これらには演算子、関数、およびリテラルを組み込むことができ、また、相関名に関連しない変数またはフィールドを参照することができます。次に、さらに複雑な式の例を示します。

SET OutputRoot.XMLNS.Data.Output[] =
    (SELECT 'Start'                          AS Header,
            'Number of books:' || R.Quantity AS Book.Quantity, 
            R.Author || ':Name and Surname'  AS Book.Author,
            'End'                            AS Trailer
            FROM InputRoot.XMLNS.Invoice.Purchases.Item[] AS R
    );

同じ Invoice メッセージを使用すると、この場合の結果は次のようになります。

<Data>
 <Output>
  <Header>Start</Header>
  <Book>
   <Quantity>Number of books:2</Quantity>
   <Author>Neil Bradley:Name and Surname</Author>
  </Book>
  <Trailer>End</Trailer>
 </Output>
 <Output>
  <Header>Start</Header>
  <Book>
   <Quantity>Number of books:1</Quantity>
   <Author>Don Chamberlin:Name and Surname</Author>
  </Book>
  <Trailer>End</Trailer>
 </Output>
 <Output>
  <Header>Start</Header>
  <Book>
   <Quantity>Number of books:1</Quantity>
   <Author>Philip Heller, Simon Roberts:Name and Surname</Author>
  </Book>
  <Trailer>End</Trailer>
 </Output>
</Data>

上記のとおり、SELECT 文節の AS 文節には、結果内に作成されるフィールドの絶対パス名を記述したパスを含めることができます。 これらのパスはまた、作成されるフィールドのタイプを指定することもできます (パスの場合には標準の指定)。フィールド・タイプを指定した変換例を以下に示します。この場合、XML タグ付きデータは、XML 属性に変換されます。

SET OutputRoot.XMLNS.Data.Output[] =
    (SELECT R.Quantity.* AS Book.(XML.Attribute)Quantity, 
            R.Author.*   AS Book.(XML.Attribute)Author
            FROM InputRoot.XMLNS.Invoice.Purchases.Item[] AS R
    );

同じ Invoice メッセージを使用すると、結果は次のようになります。

<Data>
 <Output>
  <Book Quantity="2" Author="Neil Bradley"/>
 </Output>
 <Output>
  <Book Quantity="1" Author="Don Chamberlin"/>
 </Output>
 <Output>
  <Book Quantity="1" Author="Philip Heller, Simon Roberts"/>
 </Output>
</Data>

最後に、WHERE 文節を使用して、結果のいくつかを除去することができます。次の例では、WHERE 文節を使用して、特定の基準に合う結果を除去します。結果全体が組み込まれるか、または除外されます。

SET OutputRoot.XMLNS.Data.Output[] =
    (SELECT R.Quantity AS Book.Quantity, 
            R.Author   AS Book.Author
            FROM InputRoot.XMLNS.Invoice.Purchases.Item[] AS R
            WHERE R.Quantity = 2
    );

同じ入力メッセージを使用すると、結果は次のようになります。

<Data>
 <Output>
  <Book>
   <Quantity>2</Quantity>
   <Author>Neil Bradley</Author>
  </Book>
 </Output>
</Data>
関連概念
メッセージ・フローの概要
ESQL の概要
メッセージのモデル化
関連タスク
メッセージ・フローの設計
メッセージ・フローの内容の定義
ESQL ファイルの管理
関連資料
Compute ノード
Database ノード
Filter ノード
ESQL 参照
CARDINALITY 関数
DECLARE ステートメント
SELECT 関数
SET ステートメント
WHILE ステートメント
サンプル・メッセージ
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
最終更新 : 2009-02-20 12:44:06

ak05740_