반복 수를 알 수 없는 반복 필드가 있는 메시지를 처리하는 경우가 있습니다. 이러한 상황은 메시지 예의 Item 필드에서 발생합니다.
Item 필드의 모든 인스턴스를 고려하는 필터를 작성하려면 반복 필드의 모든 인스턴스에서 반복될 수 있는 구조체를 사용해야 합니다. 한정 술어를 통해 반복 필드의 모든 인스턴스에 대해 술어를 실행하고 결과를 조합할 수 있습니다.
예를 들면, 순서가 지정 중인 어느 항목도 수량이 50보다 크지 않음을 확인하고자 할 수도 있습니다. 이를 수행하기 위해 다음을 작성할 수 있습니다.
FOR ALL Body.Invoice.Purchases."Item"[] AS I (I.Quantity <= 50)
한정 술어를 사용할 때, 첫 번째로 주의할 것은 필드 참조 끝에서 FOR ALL 뒤에 있는 대괄호 []입니다. Item 필드의 모든 인스턴스에서 반복하고 있음을 알려줍니다.
컨텍스트에서 해당 정보를 얻을 수 있기 때문에 어떤 경우에는 이 구문이 불필요해 보이지만 다른 구문 조각과의 일관성을 위해 수행됩니다.
AS절은 이름 I를 반복 필드의 현재 인스턴스와 연관시킵니다. 이것은 C++과 같은 일부 오브젝트 지향 언어에서 사용되는 반복자 클래스의 개념과 비슷합니다. 괄호 안의 표현식은 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"[])