다음 예를 검토하여 사용자 용도에 맞게 수정하십시오. 이 예는 모두 입력으로 사용된 송장 메시지에 기초합니다.
이 예의 경우, 송장(Invoice)에는 다양한 수의 항목이 있습니다. 변환은 아래와 같이 표시됩니다.
SET OutputRoot.XML.Data.Statement[] = (SELECT I.Customer.Title AS Customer.Title, I.Customer.FirstName || ' ' || I.Customer.LastName AS Customer.Name, COALESCE(I.Customer.PhoneHome,'') AS Customer.Phone, (SELECT II.Title AS Desc, CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost, II.Quantity AS Qty FROM I.Purchases.Item[] AS II WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[], (SELECT SUM( CAST(II.UnitPrice AS FLOAT) * CAST(II.Quantity AS FLOAT) * 1.6 ) FROM I.Purchases.Item[] AS II ) AS Amount, 'Dollars' AS Amount.(XML.Attribute)Currency FROM InputRoot.XML.Invoice[] AS I WHERE I.Customer.LastName <> 'Brown' );
생성된 출력 메시지는 다음과 같습니다.
<Data> <Statement> <Customer> <Title>Mr</Title> <Name>Andrew Smith</Name> <Phone>01962818000</Phone> </Customer> <Purchases> <Article> <Desc Category="Computer" Form="Paperback" Edition="2">The XML Companion</Desc> <Cost>4.472E+1</Cost> <Qty>2</Qty> </Article> <Article> <Desc Category="Computer" Form="Paperback" Edition="2"> A Complete Guide to DB2 Universal Database</Desc> <Cost>6.872E+1</Cost> <Qty>1</Qty> </Article> <Article> <Desc Category="Computer" Form="Hardcover" Edition="0">JAVA 2 Developers Handbook</Desc> <Cost>9.5984E+1</Cost> <Qty>1</Qty> </Article> </Purchases> <Amount Currency="Dollars">2.54144E+2</Amount> </Statement> </Data>
이 변환은 두 개의 SELECT가 서로 중첩되어 있습니다. 바깥의 것은 Invoice 목록에서 작동됩니다. 안의 것은 Item의 목록에서 작동됩니다. 안의 SELECT와 연관된 AS절에서는 배열이 예상됩니다.
(SELECT II.Title AS Desc, CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost, II.Quantity AS Qty FROM I.Purchases.Item[] AS II WHERE II.UnitPrice > 0.0 ) -- Note the use of [] in the next expression AS Purchases.Article[],
이것은 각 결과에서 외부 SELECT에 다양한 수의 Item이 예상됨을 말해 줍니다. 각 SELECT에 자체의 상관 이름이 있습니다. 외부 SELECT의 경우 I이고 내부 SELECT의 경우 II입니다. 일반적으로 각 SELECT는 고유 상관 이름을 사용하지만 내부 SELECT의 FROM절은 외부 SELECT의 상관 이름을 참조합니다.
(SELECT II.Title AS Desc, CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost, II.Quantity AS Qty -- Note the use of I.Purchases.Item in the next expression FROM I.Purchases.Item[] AS II WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],
이것은 내부 SELECT에 현재 Invoice의 Item에 대해 작업하도록 지시합니다. 두 SELECT에 모두 WHERE절이 있습니다. 외부 SELECT는 하나의 기준을 사용하여 특정 고객을 제거하고 내부 SELECT는 다른 기준을 사용하여 특정 Item을 제거합니다. 예에서는 입력 필드 누락으로 인해 해당 출력 필드가 누락되는 것을 방지하기 위한 COALESCE의 사용도 보여줍니다. 마지막으로 열 함수 SUM을 사용하여 각 Invoice의 모든 Item 값을 더합니다. 열 함수는 데이터베이스에서 참조 열에 설명되어 있습니다.
필드 Desc가 작성되면, 입력 Title 필드의 전체가 복사됩니다(XML 속성 및 필드 값). 출력 메시지에서 이러한 속성을 원하지 않는 경우, FIELDVALUE 함수를 사용하여 이 속성을 제거할 수 있으며 다음과 같은 코드 ESQL 예가 있습니다.
SET OutputRoot.XML.Data.Statement[] = (SELECT I.Customer.Title AS Customer.Title, I.Customer.FirstName || ' ' || I.Customer.LastName AS Customer.Name, COALESCE(I.Customer.PhoneHome,'') AS Customer.Phone, (SELECT FIELDVALUE(II.Title) AS Desc, CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost, II.Quantity AS Qty FROM I.Purchases.Item[] AS II WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[], (SELECT SUM( CAST(II.UnitPrice AS FLOAT) * CAST(II.Quantity AS FLOAT) * 1.6 ) FROM I.Purchases.Item[] AS II ) AS Amount, 'Dollars' AS Amount.(XML.Attribute)Currency FROM InputRoot.XML.Invoice[] AS I WHERE I.Customer.LastName <> 'Brown' );
그러면 다음 출력 메시지를 생성합니다.
<Data> <Statement> <Customer> <Title>Mr</Title> <Name>Andrew Smith</Name> <Phone>01962818000</Phone> </Customer> <Purchases> <Article> <Desc>The XML Companion</Desc> <Cost>4.472E+1</Cost> <Qty>2</Qty> </Article> <Article> <Desc>A Complete Guide to DB2 Universal Database</Desc> <Cost>6.872E+1</Cost> <Qty>1</Qty> </Article> <Article> <Desc>JAVA 2 Developers Handbook</Desc> <Cost>9.5984E+1</Cost> <Qty>1</Qty> </Article> </Purchases> <Amount Currency="Dollars">2.54144E+2</Amount> </Statement> </Data>