反復の回数が不明な反復フィールドを含むメッセージを処理する可能性が非常に高くなります。 この状況は、サンプル・メッセージにあるメッセージ例の Item フィールドで見られます。
Item フィールドのすべてのインスタンスを考慮に入れるフィルターを作成するには、反復フィールドのすべてのインスタンスを繰り返すことができる構造を使用する必要があります。 比較述部を使用すると、反復フィールドのすべてのインスタンスに対して述部を実行して、その結果を照合することができます。
例えば、注文品目の数が 50 を超えるものがないか確認したいとします。 これを行うには、次のように書きます。
FOR ALL Body.Invoice.Purchases."Item"[] AS I (I.Quantity <= 50)
比較述部に関してまず、FOR ALL の後ろのフィールド参照の最後にある大括弧 ([]) に注意する必要があります。 これは、Item フィールドのすべてのインスタンスを反復することを示します。
その情報はコンテキストから入手できるため、この構文は不要に思えるかもしれませんが、しかし、これは他の構文との一貫性を保つ役割があります。
AS 文節は、名前 I を反復フィールドの現行のインスタンスと関連付けます。 これは、C++ などのオブジェクト指向言語で使用される iterator クラスの概念と類似しています。 括弧付きの式は、Item フィールドの各インスタンスに対して評価される述部です。
以下は、この例を説明しています。
上記では、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"[])