다음 예를 검토하여 사용자 용도에 맞게 수정하십시오. 이 예는 모두 입력으로 사용된 송장(invoice) 메시지에 기초합니다.
다음의 ESQL을 고려해 보십시오.
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity, R.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R);
송장(invoice) 메시지는 이 ESQL로 처리되며, 다음 출력 메시지가 생성됩니다.
<Data> <Output> <Quantity>2</Quantity> <Autho>Neil Bradley</Autho> </Output> <Output> <Quantity>1</Quantity> <Autho>Don Chamberlin</Autho> </Output> <Output> <Quantity>1</Quantity> <Autho>Philip Heller, Simon Roberts</Autho> </Output> </Data>
각 항목 필드에 하나씩 세 개의 Output 필드가 있습니다. 기본적으로 SELECT는 FROM 목록에 의해 설명된 각 항목에 대해 결과 목록에 한 항목을 작성하기 때문입니다. 각 Output 필드 내에는 SELECT절에 이름 지정된 각 필드에 대한 Field가 있으며 수신되는 메시지에서의 순서가 아니라 SELECT 내에 지정된 순서로 이루어져 있습니다.
마지막 AS 키워드에 의해 도입된 R은 상관 이름으로 알려져 있습니다. 차례대로 FROM절에 의해 언급된 각 필드를 나타내는 로컬 변수입니다. 선택된 이름은 중요하지 않습니다. 간단하게 말해서 이 단순 변환은 두 가지 역할을 합니다.
다음은 절차 알고리즘에 의해 구현된 동일한 변환입니다.
DECLARE i INTEGER 1; DECLARE count INTEGER CARDINALITY(InputRoot.XML.Invoice.Purchases.Item[]); WHILE (i <= count) SET OutputRoot.XML.Data.Output[i].Quantity = InputRoot.XML.Invoice.Purchases.Item[i].Quantity; SET OutputRoot.XML.Data.Output[i].Author = InputRoot.XML.Invoice.Purchases.Item[i].Author; SET i = i+1; END WHILE;
이러한 예에서는 변환의 SELECT 버전이 훨씬 간단함을 보여줍니다. 또한 보다 빠르게 실행됩니다.
다음 예는 보다 고급화된 변환입니다.
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity AS Book.Quantity, R.Author AS Book.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R );
이 변환에는 SELECT절의 각 항목과 연관된 AS절이 있습니다. 결과의 각 필드에 입력에서 상속되는 이름이 아니라 명확한 이름을 부여합니다. 이러한 이름은 예에 표시된 대로 경로(즉, 점으로 분리된 이름 목록)일 수 있습니다. 따라서 출력 메시지의 구조는 입력 메시지의 구조와 임의로 다를 수 있습니다. 동일한 송장 메시지를 사용하는 경우, 결과는 다음과 같습니다.
<Data> <Output> <Book> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Book> </Output> </Data> <Data> <Output> <Book> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Book> </Output> <Output> <Book> <Quantity>1</Quantity> <Author>Don Chamberlin</Author> </Book> </Output> <Output> <Book> <Quantity>1</Quantity> <Author>Philip Heller, Simon Roberts</Author> </Book> </Output> </Data>
SELECT절의 표현식은 복잡할 수 있으며 특별한 제한이 없습니다. 연산자, 함수, 리터럴이 포함될 수 있으며 상관 이름과 관련되지 않은 필드 또는 변수를 참조할 수 있습니다. 다음 예에서는 보다 복잡한 표현식을 보여줍니다.
SET OutputRoot.XML.Data.Output[] = (SELECT 'Start' AS Header, 'Number of books:' || R.Quantity AS Book.Quantity, R.Author || ':Name and Surname' AS Book.Author, 'End' AS Trailer FROM InputRoot.XML.Invoice.Purchases.Item[] AS R );
동일한 송장 메시지를 사용하는 경우, 결과는 다음과 같습니다.
<Data> <Output> <Header>Start</Header> <Book> <Quantity>Number of books:2</Quantity> <Author>Neil Bradley:Name and Surname</Author> </Book> <Trailer>End</Trailer> </Output> <Output> <Header>Start</Header> <Book> <Quantity>Number of books:1</Quantity> <Author>Don Chamberlin:Name and Surname</Author> </Book> <Trailer>End</Trailer> </Output> <Output> <Header>Start</Header> <Book> <Quantity>Number of books:1</Quantity> <Author>Philip Heller, Simon Roberts:Name and Surname</Author> </Book> <Trailer>End</Trailer> </Output> </Data>
위에 표시된 것처럼 SELECT절의 AS절에는 결과에 작성될 필드의 전체 이름을 설명하는 경로가 포함됩니다. 이러한 경로는 작성될 필드의 유형도 지정할 수 있습니다(경로에서 정상적인 작업임). 다음 변환 예제는 필드 유형을 지정합니다. 이 경우, XML 태그 데이터는 XML 속성으로 변환됩니다.
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity.* AS Book.(XML.Attribute)Quantity, R.Author.* AS Book.(XML.Attribute)Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R );
동일한 송장 메시지를 사용하는 경우, 결과는 다음과 같습니다.
<Data> <Output> <Book Quantity="2" Author="Neil Bradley"/> </Output> <Output> <Book Quantity="1" Author="Don Chamberlin"/> </Output> <Output> <Book Quantity="1" Author="Philip Heller, Simon Roberts"/> </Output> </Data>
마지막으로 WHERE절을 사용하면 일부 결과를 배제할 수 있습니다. 다음 예에서는 WHERE절을 사용하여 특정 기준이 충족된 결과를 제거합니다. 전체 결과가 포함 또는 제외됩니다.
SET OutputRoot.XML.Data.Output[] = (SELECT R.Quantity AS Book.Quantity, R.Author AS Book.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R WHERE R.Quantity = 2 );
동일한 입력 메시지를 사용하는 경우, 결과는 다음과 같습니다.
<Data> <Output> <Book> <Quantity>2</Quantity> <Author>Neil Bradley</Author> </Book> </Output> </Data>