Я дал следующую таблицу. Эта таблица содержит тег и значение xml, а также ссылку на родительский тег.
CREATE GLOBAL TEMPORARY TABLE XML_TAG_VAL
(
OBJ_ID NUMBER, -- unique for one whole xml document
ID NUMBER, -- unique for every tag
TAG VARCHAR2(1000 BYTE), -- tags name
VAL CLOB, -- tags value
LVL NUMBER, -- depth of the tag
ATTR_ID NUMBER, -- foreign key to tag_attr table (do this later)
PARENT_ID NUMBER -- id of parent tag (xml_tag_val.id)
)
ON COMMIT DELETE ROWS
NOCACHE;
Позволяет вставить несколько очень простых тестовых данных в эту таблицу ...
insert into xml_tag_val values(1,1,'a',null,1,null,null);
insert into xml_tag_val values(1,2,'b','b-value',2,null,1);
insert into xml_tag_val values(1,3,'b','b-value 2',2,null,1);
Теперь мне нужно сгенерировать XML для данного клиентского интерфейса. Таким образом, результат должен быть:
<a>
<b>b-value</b>
<b>b-value 2</b>
</a>
Так что для этого конкретного случая ручной SQL, использующий xmlelement, не будет проблемой. Но как мне выбрать дерево XML, не зная, как далеко пойдет путь? Я знаю только то, что каждый ребенок указывает на своего родителя.
РЕДАКТИРОВАТЬ 1:
Я обнаружил, что есть способ использовать рекурсивные запросы для создания XML, у меня есть следующий запрос:
declare
l_qry_ctx dbms_xmlgen.ctxhandle;
l_result clob;
l_obj_id number := 1;
begin
l_qry_ctx := dbms_xmlgen.newcontextFromHierarchy('
select level,xmlelement(tag, val)
from oranetted_plugin.xml_tag_val
where obj_id = ' || l_obj_id || '
start with parent_id is null
connect by parent_id = prior id'
);
l_result:=dbms_xmlgen.getxml(l_qry_ctx);
dbms_output.put_line(l_result);
end;
/
Проблема в том, что имя тега не может быть передано из результата sqls. Вместо «a» или «b» тег отображается как «тег».
<TAG>
<TAG>b-value</TAG>
<TAG>b-value 2</TAG>
</TAG>
Любые идеи, чтобы обойти это?