Есть ли простой способ подавить теги строк XML в коллекции в Oracle? - PullRequest
0 голосов
/ 09 февраля 2009

У меня есть запрос, по которому я генерирую 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

Ответы [ 2 ]

1 голос
/ 09 февраля 2009

Вам нужно будет перейти на PL / SQL, где вы сможете лучше контролировать пакет dbms_xmlgen. Например, вот как вы можете изменить поведение тегов строк, которые он устанавливает.

declare
qryctx DBMS_XMLGEN.ctxhandle;
results xmltype;
begin

  qryctx := dbms_xmlgen.newcontext('select foo from bar where id = my_id');
  dbms_xmlgen.SETBINDVALUE(qryctx,'my_id',id);
    dbms_xmlgen.setRowTag(qryCtx,NULL);
    dbms_xmlgen.setRowSetTag(qryCtx,NULL);
  results := dbms_xmlgen.getxmltype(qryctx);
  dbms_xmlgen.closecontext(qryctx);
  return results;
end;

Этот пакет позволит вам не только изменить тег строки, но также тег, который обходит все строки. В приведенном выше примере я подавил тег строки, передав NULL в качестве второго аргумента в вызов dbms_xmlgen.setRowTag. Надеюсь, это поможет.

0 голосов
/ 10 февраля 2009

См. Комментарии, которые я добавил в конце вопроса о том, как я в конечном итоге решил пойти.

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