エレメントの不明な複数の出現へのアクセス

反復の回数が不明な反復フィールドを含むメッセージを処理する可能性が非常に高くなります。 この状況は、サンプル・メッセージにあるメッセージ例の Item フィールドで見られます。

Item フィールドのすべてのインスタンスを考慮に入れるフィルターを作成するには、反復フィールドのすべてのインスタンスを繰り返すことができる構造を使用する必要があります。 比較述部を使用すると、反復フィールドのすべてのインスタンスに対して述部を実行して、その結果を照合することができます。

例えば、注文品目の数が 50 を超えるものがないか確認したいとします。 これを行うには、次のように書きます。

FOR ALL Body.Invoice.Purchases."Item"[]
    AS I (I.Quantity <= 50)

比較述部に関してまず、FOR ALL の後ろのフィールド参照の最後にある大括弧 ([]) に注意する必要があります。 これは、Item フィールドのすべてのインスタンスを反復することを示します。

その情報はコンテキストから入手できるため、この構文は不要に思えるかもしれませんが、しかし、これは他の構文との一貫性を保つ役割があります。

AS 文節は、名前 I を反復フィールドの現行のインスタンスと関連付けます。 これは、C++ などのオブジェクト指向言語で使用される iterator クラスの概念と類似しています。 括弧付きの式は、Item フィールドの各インスタンスに対して評価される述部です。

以下は、この例を説明しています。

Body.Invoice 内のフィールド項目のすべてのインスタンスを反復します。 それぞれの反復ごとに、次のことを行います。
  1. 名前 IItem の現行のインスタンスにバインドします。
  2. 述部 I.Quantity <= 50 を評価します。 次のような場合が考えられます。
    • 述部が Item のすべてのインスタンスに対して TRUE と評価される場合、TRUE を戻します。
    • 述部が Item のすべてのインスタンスに対して FALSE の場合、FALSE を戻します。
    • TRUE と UNKNOWN が混在する場合、UNKNOWN を戻します。

上記では、ALL キーワードを使用する場合の述部の評価方法を説明しました。 代わりに、SOME、または ANY (どちらも同じもの) を指定することもできます。 この場合、副述部が反復フィールドのすべてのインスタンスに TRUE を戻すと、比較述部も TRUE を戻します。 比較述部は FALSE を戻すのは、副述部が反復フィールドのすべてのインスタンスに FALSE を戻す場合だけです。 サブ述部から FALSE と UNKNOWN が混在したものが戻されると、全体の値として UNKNOWN が戻されます。

以下のフィルター式で、

FOR ANY Body.Invoice.Purchases."Item"[]
    AS I (I.Title = 'The XML Companion')

副述部は TRUE と評価されます。しかし、次の式では FALSE を戻します。

FOR ANY Body.Invoice.Purchases."Item"[]
    AS I (I.Title = 'C Primer')

これは、C Primer がこの invoice (送り状) の中に含まれていないためです。 invoice (送り状) 内のいくつかの項目がブック・タイトルを指すフィールドに含まれていない場合、副述部は UNKNOWN を戻し、比較述部も UNKNOWN の値を戻します。

ヌル値が出現する可能性を扱うために、このフィルターを作成する際には、以下のようにフィールドの存在を明示的に確認するようにしてください。
FOR ANY Body.Invoice.Purchases."Item"[]
	 AS I (I.Book IS NOT NULL AND I.Book.Title = 'C Primer')

「IS NOT NULL」述部によって確実に、Item フィールドに Book が含まれない場合に、副述部が FALSE の値を戻すようにします。

また、データベース内の列の参照で説明されているように、SELECT 式を使用するメッセージ内のフィールドの任意の繰り返しを操作できます。

インスタンスがいくつあるか分からない場合であっても、[>] および [<] 配列指標を使用して、反復フィールドの最初および最後のインスタンスを固有に参照したり、最初および最後のインスタンスに関連するインスタンスを参照することができます。これらの索引については、エレメントの既知の複数の出現にアクセスするで説明しています。

あるいは、CARDINALITY 関数を使用して、存在する反復フィールドのインスタンスの数を判別できます。 以下に例を示します。

DECLARE I INTEGER CARDINALITY(Body.Invoice.Purchases."Item"[])
関連概念
メッセージ・フローの概要
ESQL の概要
メッセージのモデル化
関連タスク
エレメントの既知の複数の出現にアクセスする
メッセージ・フローの設計
メッセージ・フローの内容の定義
ESQL ファイルの管理
関連資料
Compute ノード
Database ノード
Filter ノード
ESQL 参照
CARDINALITY 関数
DECLARE ステートメント
FOR 関数
サンプル・メッセージ
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
ac16770_