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