2013-04-22 105 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