Oracle:将树结构转换为XML
我有一个简单的树结构,其中子元素连接到父元素,我需要将其转换为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语句做这个工作:)
感谢您的咨询!
您可以使用递归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>
谢谢,这是约。我的方法与递归函数调用。有没有办法使用单个SELECT语句来实现这个? :) – 2013-04-22 13:16:18
是的,使用不同的方法,请参阅例如[本博客注释](http://odieweblog.wordpress.com/2011/11/24/how-to-generate-a-recursive-xml-structure/) – 2013-04-22 13:17:09
你的XML是没有很好地形成,它似乎并不代表一个有意义的分层结构。你需要提供一个真实的输出给我们一个理解你的问题的战斗机会。 – APC 2013-04-22 11:46:39
好的,现在提供了完整的XML。 – 2013-04-22 13:13:28