我正在寻找一个查询,该查询可以将层次结构表转换为XML格式。现在,我一直在网上寻找几种解决方案,但似乎无法获得正确的输出。
我有以下内容:
INSERT INTO "NODES" (ID, NAME) VALUES (1, 'test parent');
INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (2,1,'test child 1');
INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (3,1,'test child 2');
INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (4,3,'test child 3');
现在我正在尝试获得以下信息:
<ns:nodes xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
<ns1:node>
<ns2:name>test parent</name>
<!-- extra info -->
<nodes>
<node>
<name>test child 1</name>
<!-- extra info and child nodes -->
</node>
<node>
<name>test child 2</name>
<nodes>
<node>
<name>test child 3</name>
<!-- extra info and child nodes -->
</node>
</nodes>
</node>
</nodes>
</node>
</nodes>
请注意,结点元素是父结点元素中的元素。
这是我到目前为止尝试过的:
SELECT DBMS_XMLGEN.getXMLType(
DBMS_XMLGEN.newContextFromHierarchy('
SELECT LEVEL,
case
when CONNECT_BY_ISLEAF = 1 then
XMLELEMENT("nodes", XMLELEMENT("ns1:node",
xmlattributes(''test'' as "xmlns:ns",
''test1'' as "xmlns:ns1",
''test2'' as "xmlns:ns2"),
xmlelement("ns2:name", n.name)))
when CONNECT_BY_ISLEAF = 0 then
XMLELEMENT("nodes", XMLELEMENT("ns1:node",
xmlattributes(''test'' as "xmlns:ns",
''test1'' as "xmlns:ns1",
''test2'' as "xmlns:ns2"),
xmlelement("ns2:name", n.name)), null)
end
FROM NODES n
START WITH n.id = 1
CONNECT BY PRIOR n.ID = n.PARENTID '
)
) FROM DUAL;
但这给出以下内容:
<nodes>
<ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
<ns2:name>test parent</ns2:name>
</ns1:node>
<nodes>
<ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
<ns2:name>test child 1</ns2:name>
</ns1:node>
</nodes>
<nodes>
<ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
<ns2:name>test child 2</ns2:name>
</ns1:node>
<nodes>
<ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
<ns2:name>test child 3</ns2:name>
</ns1:node>
</nodes>
</nodes>
</nodes>
但是如您所见,nodes元素不在父节点内。此外,还会为每个节点生成节点元素,并且没有分组。在Oracle SQL中有一种简单的方法可以做到这一点吗?
我正在使用Oracle DB 12.2.0.1。
谢谢。