Compute ノードに ESQL をコーディングする場合、複雑なメッセージ変換で SELECT 関数を使用できます。
この例では、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>