複雑な XML メッセージの変換

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

以下の例を考慮し、独自にご使用になるために変更を加えてください。 入力は、すべて Invoice メッセージに基づいています。

この例では、Invoice には項目の変数番号が含まれています。以下に変換を示します。

SET OutputRoot.XML.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.XML.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>

この変換は、2 つの 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 には、それ独自の相関名 (外側のものは 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.XML.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.XML.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 ステートメント
サンプル・メッセージ