複雑なメッセージの変換

Compute ノードに ESQL をコーディングする場合、複雑なメッセージ変換で SELECT 関数を使用できます。

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

この例では、Invoice には不特定の数の項目が含まれます。以下に変換を示します。

SET OutputRoot.XMLNS.Data.Statement[] =
    (SELECT I.Customer.Title                                     AS Customer.Title, 
            I.Customer.FirstName || ' ' || I.Customer.LastName   AS Customer.Name,
            COALESCE(I.Customer.PhoneHome,'')                    AS Customer.Phone,
            (SELECT II.Title                          AS Desc,
                    CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
                    II.Quantity                       AS Qty 
             FROM I.Purchases.Item[] AS II
             WHERE  II.UnitPrice> 0.0              )     AS Purchases.Article[],
            (SELECT SUM( CAST(II.UnitPrice AS FLOAT) *
                    CAST(II.Quantity  AS FLOAT) *
                    1.6                           )
             FROM I.Purchases.Item[] AS II      )       AS Amount,
            'Dollars'                                   AS Amount.(XML.Attribute)Currency
            
            FROM InputRoot.XMLNS.Invoice[] AS I
            WHERE I.Customer.LastName <> 'Brown' 
    );

生成される出力メッセージは次のとおりです。

<Data>
 <Statement>
  <Customer>
   <Title>Mr</Title>
   <Name>Andrew Smith</Name>
   <Phone>01962818000</Phone>
  </Customer>
  <Purchases>
   <Article>
    <Desc Category="Computer" Form="Paperback" Edition="2">The XML Companion</Desc>
    <Cost>4.472E+1</Cost>
    <Qty>2</Qty>
   </Article>
   <Article>
    <Desc Category="Computer" Form="Paperback" Edition="2">
          A Complete Guide to DB2 Universal Database</Desc>
    <Cost>6.872E+1</Cost>
    <Qty>1</Qty>
   </Article>
   <Article>
    <Desc Category="Computer" Form="Hardcover" Edition="0">JAVA 2 Developers Handbook</Desc>
    <Cost>9.5984E+1</Cost>
    <Qty>1</Qty>
   </Article>
  </Purchases>
  <Amount Currency="Dollars">2.54144E+2</Amount>
 </Statement>
</Data>    

この変換にはネストした SELECT 文節があります。 外側のステートメントは、送り状のリストを操作します。 内側のステートメントは、項目のリストを操作します。 内側の SELECT 文節に関連した AS 文節は、配列を予期しています。

            (SELECT II.Title                          AS Desc,
                    CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
                    II.Quantity                       AS Qty 
             FROM I.Purchases.Item[] AS II
             WHERE  II.UnitPrice> 0.0              ) 
            -- Note the use of [] in the next expression
               AS Purchases.Article[],

このステートメントは、外側の SELECT 文節にそれぞれの結果で不特定の数の項目が含まれることを予期するように指示します。 それぞれの SELECT 文節には、それ独自の相関名 (外側の SELECT 文節は I、内側のものは II) があります。 各 SELECT 文節は通常、それ自体の相関名を使用しますが、内側の SELECT 文節の FROM 文節は、外側の SELECT 文節の相関名を参照します。

            (SELECT II.Title                          AS Desc,
                    CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
                    II.Quantity                       AS Qty 
            -- Note the use of I.Purchases.Item in the next expression
             FROM I.Purchases.Item[] AS II
             WHERE  II.UnitPrice> 0.0              ) AS Purchases.Article[],

このステートメントは、内側の SELECT 文節に現行の送り状の項目を使って作業するように指示します。 両方の SELECT 文節に WHERE 文節が含まれています。 外側のものは、1 つの基準を使用して特定の顧客を廃棄し、内側のものは、別の基準を使用して特定の項目を廃棄します。 例ではまた、欠落した入力フィールドが、対応する出力フィールドの欠落を引き起こすことを防ぐための COALESCE の使用法も示しています。 また最後に、列関数 SUM を使用して、それぞれの送り状内のすべての項目の値を合計しています。列関数については、データベース内の列の参照で説明されています。

Desc フィールドが作成されると、タイトル入力フィールド全体、つまり XML 属性とフィールド値がコピーされます。これらの属性を出力メッセージに含めたくない場合、FIELDVALUE 関数を使用して廃棄します。例えば、以下の ESQL をコーディングします。

SET OutputRoot.XMLNS.Data.Statement[] =
    (SELECT I.Customer.Title                                   AS Customer.Title, 
            I.Customer.FirstName || ' ' || I.Customer.LastName AS Customer.Name,
            COALESCE(I.Customer.PhoneHome,'')                  AS Customer.Phone,
            (SELECT FIELDVALUE(II.Title)                       AS Desc,
                    CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
                    II.Quantity                       AS Qty 
             FROM I.Purchases.Item[] AS II
             WHERE  II.UnitPrice> 0.0              )      AS Purchases.Article[],
            (SELECT SUM( CAST(II.UnitPrice AS FLOAT) *
                    CAST(II.Quantity  AS FLOAT) *
                    1.6                           )
             FROM I.Purchases.Item[] AS II        ) AS Amount,
            'Dollars'                               AS Amount.(XML.Attribute)Currency
                    
    FROM InputRoot.XMLNS.Invoice[] AS I
    WHERE I.Customer.LastName <> 'Brown' 
    );

このコードによって、次の出力メッセージが生成されます。

<Data>
 <Statement>
  <Customer>
   <Title>Mr</Title>
   <Name>Andrew Smith</Name>
   <Phone>01962818000</Phone>
  </Customer>
  <Purchases>
   <Article>
    <Desc>The XML Companion</Desc>
    <Cost>4.472E+1</Cost>
    <Qty>2</Qty>
   </Article>
   <Article>
    <Desc>A Complete Guide to DB2 Universal Database</Desc>
    <Cost>6.872E+1</Cost>
    <Qty>1</Qty>
   </Article>
   <Article>
    <Desc>JAVA 2 Developers Handbook</Desc>
    <Cost>9.5984E+1</Cost>
    <Qty>1</Qty>
   </Article>
  </Purchases>
  <Amount Currency="Dollars">2.54144E+2</Amount>
 </Statement>
</Data>
関連概念
メッセージ・フローの概要
ESQL の概要
メッセージのモデル化
関連タスク
メッセージ・フローの設計
メッセージ・フローの内容の定義
ESQL ファイルの管理
大規模な XML メッセージの処理
関連資料
Compute ノード
Database ノード
Filter ノード
ESQL 参照
CAST 関数
COALESCE 関数
SELECT 関数
SET ステートメント
サンプル・メッセージ
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック

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

ak05750_