Наличие разрывов в результате XML при работе в Oracle

#xml #oracle

#xml #Oracle

Вопрос:

Я пытаюсь создать разрывы в моем результате при создании вывода XML из запроса oracle. Точно знаю, что результат находится в строке.

 SELECT  XMLElement("OtherServices", 
          XMLAttributes('201903' AS "ServiceMonth", 
                         'ClientID' AS "Source",
                         'UniqueFile' as "UniqueFileID"),
            XMLForest ( 

            XMLForest (BillingDriver AS "BillingDriver", 
                      Signum   AS "Signum", 
                      Quantity  AS "Quantity",
                      Billable  AS "Billable") AS "Service"


      ))
      FROM CTE ;
  

Результат является

 <OtherServices ServiceMonth="201903" Source="ClientID" UniqueFileID="UniqueFile">
  <Service>
    <BillingDriver>Central Mgmt Service</BillingDriver>
    <Signum>SE001_RU0973</Signum>
    <Quantity>1</Quantity>
    <Billable>Yes</Billable>
  </Service>
</OtherServices> 
  

Что мне нужно получить, так это

 <OtherServices ServiceMonth="201903" Source ="ClientID" UniqueFileID ="UniqueFile">
   <Service>
      <BillingDriver>ViCS_PV</BillingDriver>
      <Signum-ID>eeditur</Signum-ID>
      <Quantity>1</Quantity>
      <Billable>Yes</Billable>
   </Service>
  

Ответ №1:

Вы можете использовать функцию XMLSeralize, чтобы улучшить свой результат. В качестве демонстрации с вашим текущим результатом в виде литерала:

 select xmlserialize(
  document
  xmltype('<OtherServices ServiceMonth="201903" Source="ClientID" UniqueFileID="UniqueFile"><Service><BillingDriver>Central Mgmt Service</BillingDriver><Signum>SE001_RU0973</Signum><Quantity>1</Quantity><Billable>Yes</Billable></Service></OtherServices>')
  indent size=2
) as result
from dual;

RESULT                                                                               
-------------------------------------------------------------------------------------
<OtherServices ServiceMonth="201903" Source="ClientID" UniqueFileID="UniqueFile">
  <Service>
    <BillingDriver>Central Mgmt Service</BillingDriver>
    <Signum>SE001_RU0973</Signum>
    <Quantity>1</Quantity>
    <Billable>Yes</Billable>
  </Service>
</OtherServices>
  

Таким образом, вы можете сделать:

 SELECT  XMLSERIALIZE(document
          XMLElement("OtherServices", 
            XMLAttributes('201903' AS "ServiceMonth", 
                           'ClientID' AS "Source",
                           'UniqueFile' as "UniqueFileID"),
              XMLForest ( 
                XMLForest (BillingDriver AS "BillingDriver", 
                          Signum   AS "Signum", 
                          Quantity  AS "Quantity",
                          Billable  AS "Billable") AS "Service"
        ))
      indent size=2)
      FROM CTE ;