Как сериализовать данные дерева с функцией XMLAGG в тегах Oracle 11g, а не в дублирующих тегах XML, с вложенной структурой? - PullRequest
1 голос
/ 03 февраля 2020

У меня есть древовидные данные типа: 1 субъект, 2 паспорта, 2 адреса - это одна сущность. Как сериализовать в xml данные дерева с вложенными тегами xml? Тип данных:

enter image description here

Когда я строю xml в clob с XMLAGG, я получаю такую ​​структуру с дублирующимися тегами Пример:

<xml>
<person>
<title></title>
<document1></document1>
<document2></document2>
<adress1></adress1>
<adress2></adress2>
<adress1></adress1>
<phone1></phone1>
<phone2></phone2>
<phone3></phone3>
<phone1></phone1>
<phone2></phone2>
<phone3></phone3>
</person>
</xml> 

Это мой запрос на сборку XML в CLOB:

    ---XMLPERSOM
SELECT XMLELEMENT ("Person",
       XMLELEMENT ("ReferenceCode", SBS.ReferenceCode),
       XMLELEMENT ("LastName", SBS.LastName),
       XMLELEMENT ("FirstName", SBS.FirstName),
       XMLELEMENT ("MiddleName", SBS.MiddleName),
       XMLELEMENT ("BirthDate", SBS.BirthDate),
       XMLELEMENT ("BirthPlace", SBS.BirthPlace),
       XMLELEMENT ("sourceCode", SBS.sourceCode),
       XMLELEMENT ("GroupCode", SBS.GroupCode),
--XMLDOCUMENTS       
       XMLELEMENT ("Documents",  
       XMLAGG(
       XMLELEMENT ("Document",
       XMLELEMENT ("Type", DCS.Type),
       XMLELEMENT ("Series", DCS.Series),
       XMLELEMENT ("Number", DCS.NumberID),
       XMLELEMENT ("IssueDate", DCS.IssueDate),
       XMLELEMENT ("IssueAuthority", DCS.IssueAuthority)))),

       XMLELEMENT ("Addresses",
       XMLAGG(
       XMLELEMENT ("Address",
       XMLELEMENT ("Type", ADDS.Type),
       XMLELEMENT ("Location", ADDS.Location),
       XMLELEMENT ("Street", ADDS.Street),
       XMLELEMENT ("PostalCode", ADDS.PostalCode),
       XMLELEMENT ("Country", ADDS.RU),
       XMLELEMENT ("Region", ADDS.Region)))), 
       )      

FROM SUBJECT_SEGMENT SBS
LEFT JOIN DOCUMENT_SEGMENT DCS ON SBS.ID = DCS.SUBJECT_ID
LEFT JOIN ADDRESS_SEGMENT ADDS ON SBS.ID = ADDS.SUBJECT_ID
GROUP BY SBS.ReferenceCode, 
         SBS.LastName, 
         SBS.FirstName, 
         SBS.MiddleName, 
         SBS.BirthDate, 
         SBS.BirthPlace,
         SBS.sourceCode,
         SBS.GroupCode

В результате у меня есть дубликаты тегов или дубликат Clob xml. Мне нужно иметь один сабл и не иметь дубликатов тегов. Спасибо за помощь!

1 Ответ

1 голос
/ 03 февраля 2020

Если у кого-то есть три документа и два адреса, ваш запрос выдает 6 строк для этого человека. Вот почему значения повторяются. Вы можете решить эту проблему, например, используя соответствующие подзапросы для документов, адресов и телефонов, как здесь:

SELECT XMLELEMENT ("Person", 
         XMLELEMENT ("ReferenceCode", ReferenceCode), 
         XMLELEMENT ("LastName", LastName),
         XMLELEMENT ("Documents",  
           (select XMLAGG(XMLELEMENT ("Document", XMLELEMENT ("Type", Type), 
                                                  XMLELEMENT ("Number", NumberID)))  
             from doc where referencecode = sbs.referencecode)),
         XMLELEMENT ("Addresses", 
           (select XMLAGG(XMLELEMENT ("Address", XMLELEMENT ("Street", Street))) 
             from adr where referencecode = sbs.referencecode)))
  FROM SBS

dbfiddle demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...