Oracle SQL层次结构到特定的XML

时间:2018-07-19 07:58:39

标签: sql xml oracle hierarchy

我正在寻找一个查询,该查询可以将层次结构表转换为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。

谢谢。

0 个答案:

没有答案