2013-04-22 95 views
2

我有一个简单的树结构,其中子元素连接到父元素,我需要将其转换为XML。Oracle:将树结构转换为XML

目前,我使用递归函数调用来实现这个(即检索给定元素的子元素),这似乎并不是最聪明的方法。涉及CONNECT BY PRIOR的语句将输出结果,但我不知道如何将其转换为XML。

我的简化数据结构:

CREATE TABLE ENTRY 
    (
    "ID"  NUMBER(10,0) NOT NULL ENABLE, 
    "PARENT_ID" NUMBER(10,0), 
    "TAG"  VARCHAR2(1000 CHAR) 
) 

所需的输出:

<?xml version="1.0" encoding="UTF-8"?> 
<entries> 
    <entry> 
     <tag>parent A</tag> 
     <entries> 
      <entry> 
       <tag>child A-1</tag> 
       <entries> 
        <entry> 
         <tag>grandchild A-1</tag> 
        </entry> 
       </entries> 
      </entry> 
      <entry> 
       <tag>child A-2</tag> 
      </entry> 
     </entries> 
    </entry> 
    <entry> 
     <tag>bla parent B</tag> 
     <entries> 
      <entry> 
       <tag>child B-1</tag> 
      </entry> 
     </entries> 
    </entry> 
</entries> 

我在寻找一个SELECT语句做这个工作:)

感谢您的咨询!

+0

你的XML是没有很好地形成,它似乎并不代表一个有意义的分层结构。你需要提供一个真实的输出给我们一个理解你的问题的战斗机会。 – APC 2013-04-22 11:46:39

+0

好的,现在提供了完整的XML。 – 2013-04-22 13:13:28

回答

0

您可以使用递归PL/SQL函数:

SQL> CREATE OR REPLACE FUNCTION getXMLChildren(p_parent_id NUMBER) 
    2  RETURN XMLTYPE IS 
    3  l XMLTYPE; 
    4 BEGIN 
    5  SELECT xmlelement("entries", 
    6      xmlagg(xmlelement("entry", 
    7           xmlelement("tag", tag), 
    8           getXMLChildren(ID)))) 
    9  INTO l 
10  FROM ENTRY 
11  WHERE (p_parent_id IS NOT NULL AND parent_ID = p_parent_id) 
12   OR (p_parent_id IS NULL AND parent_id IS NULL) -- 
13  HAVING COUNT(*) > 0; 
14  RETURN l; 
15 END; 
16/

Function created 

此功能建立的第一级,然后调用本身对孩子:

SQL> select XMLSERIALIZE(document getXMLChildren(NULL) 
    2      as CLOB INDENT SIZE = 2) xml 
    3 from dual; 

XML 
-------------------------------------------------------------------------------- 
<entries> 
    <entry> 
    <tag>bla parent</tag> 
    <entries> 
     <entry> 
     <tag>bla child 1</tag> 
     <entries> 
      <entry> 
      <tag>bla grandchild1</tag> 
      </entry> 
     </entries> 
     </entry> 
     <entry> 
     <tag>bla child 2</tag> 
     </entry> 
    </entries> 
    </entry> 
</entries> 
+0

谢谢,这是约。我的方法与递归函数调用。有没有办法使用单个SELECT语句来实现这个? :) – 2013-04-22 13:16:18

+1

是的,使用不同的方法,请参阅例如[本博客注释](http://odieweblog.wordpress.com/2011/11/24/how-to-generate-a-recursive-xml-structure/) – 2013-04-22 13:17:09