Могу ли я удалить дополнительную вложенность XML при использовании DBMS_XMLGEN.getxml и выражения Cursor? - PullRequest
2 голосов
/ 02 декабря 2011

Я искал документацию и Google, но я не могу найти то, что я ищу; моя версия oracle - 10.2.0.5.

Давайте используем этот простой запрос:

select dbms_xmlgen.getxml('select cursor(select ''1'' "one", ''2''
"two", ''3'' "three" from dual) "numbers" from dual') from dual;

результат:

"<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <numbers>
   <numbers_ROW>
    <one>1</one>
    <two>2</two>
    <three>3</three>
   </numbers_ROW>
  </numbers>
 </ROW>
</ROWSET>
"

Вопрос1: Почему «numbers_row» был создан, когда «numbers» достаточно (по крайней мере, для моих целей)?

Вопрос2: Можно ли избавиться от этой дополнительной вложенности с помощью пакета xmlgen или какого-либо другого пакета? Для этого я использую регулярные выражения, но это кажется немного неразумным.

Спасибо, -joel

1 Ответ

2 голосов
/ 02 декабря 2011

Вам необходимо прочитать эту статью: http://www.orafaq.com/wiki/DBMS_XMLGEN

В ней объясняется, как изменить имена Oracle по умолчанию, сгенерированные пакетом DBMS_XMLGEN.

Ответ на ваш вопрос 1:: это значения и поведение по умолчанию для пакета Oracle DBMS_XMLGEN

Для вопроса 2: Вам потребуется вызвать некоторые дополнительные DBMS_XMLGEN процедуры, чтобы изменить значения по умолчанию, чтобы вам пришлось использовать PL / SQL:

DECLARE
   ctx DBMS_XMLGEN.ctxHandle;
   xml CLOB;
BEGIN
   ctx := dbms_xmlgen.newcontext('select ''1'' "one", ''2'' "two", ''3'' "three" from dual');
   dbms_xmlgen.setRowTag(ctx, 'NUMBERS');
   xml := dbms_xmlgen.getxml(ctx);
   dbms_output.put_line(substr(xml,1,255));
END;

Будет выводить:

<?xml version="1.0"?>
<ROWSET>
 <NUMBERS>
  <one>1</one>
  <two>2</two>
  <three>3</three>
 </NUMBERS>
</ROWSET>

Существуют процедуры для замены значения <ROWSET> на что-то более значимое.

Надеюсь, это поможет ...

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