Compute ノードに ESQL をコーディングする際に、SELECT 関数を使用して単純なメッセージを変換できます。
次の 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 つの事柄を行います。
以下のプロシージャー・アルゴリズムで同じ変換を実行できます。
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>
<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>