У меня есть запрос, по которому я генерирую XML в Oracle с использованием пакета DBMS_XMLGEN.
В качестве примера я использую курсор следующим образом:
SELECT
A.NAME primaryName,
(CURSOR(SELECT B.NAME AS NAME FROM B WHERE B.ID=A.ID)) SYNONYMS
FROM
A
У меня есть контекст запроса, qtx, и для этого контекста задаю запрос выше. Вызов:
result := DBMS_XMLGEN.getXML(qryCtx);
возвращает меня почти туда, где я хочу быть, с точки зрения сгенерированного XML:
<PRIMARYNAME>Main Name</PRIMARYNAME>
<SYNONYMS>
<SYNONYMS_ROW>
<NAME>Synonym1</NAME>
</SYNONYMS_ROW>
<SYNONYMS_ROW>
<NAME>Synonym2</NAME>
</SYNONYMS_ROW>
</SYNONYMS>
Что я действительно хотел бы сделать, так это подавить тег SYNONYMS_ROW
. Я также попытался (CAST (MULTISET (<query>
)) и получил аналогичные результаты.
Я знаю, что мог бы выполнить поиск и замену CLOB, но похоже, что должен быть немного более простой или лучше спроектированный подход (т. Е. Должен ли я определить желаемый xsd и каким-то образом его использовать?). Я мог бы также сделать полную хранимую процедуру и построить необходимые теги на лету с помощью курсоров, но было бы неплохо иметь вместо этого один оператор SQL. Спасибо за любые предложения
Спасибо Ник - оказалось, что самый простой способ решить проблему, которую я описал, - это использовать функцию XMLAGG и генерировать мой результат XML немного по-другому.
select
XMLELEMENT("primaryName",A.Name),
xmlelement("synonyms",
(SELECT XMLAGG(XMLELEMENT("name",b.name) ) from b
where b.id=a.id and b.type='S') )
from
A