#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 ;