Oracle:将树结构转换为XML
我有一个简单的树结构,其中子元素连接到父元素,我需要将其转换为XML 目前,我使用递归函数调用来实现这一点,即检索给定元素的子元素,这似乎不是最聪明的方法。包含CONNECT BY PREVIOR的语句将输出结果,但我不知道如何将其转换为XML 我的简化数据结构:Oracle:将树结构转换为XML,xml,oracle,hierarchical-data,Xml,Oracle,Hierarchical Data,我有一个简单的树结构,其中子元素连接到父元素,我需要将其转换为XML 目前,我使用递归函数调用来实现这一点,即检索给定元素的子元素,这似乎不是最聪明的方法。包含CONNECT BY PREVIOR的语句将输出结果,但我不知道如何将其转换为XML 我的简化数据结构: CREATE TABLE ENTRY ( "ID" NUMBER(10,0) NOT NULL ENABLE, "PARENT_ID" NUMBER(10,0), "TAG" VA
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>
您的XML格式不好,并且似乎无法表示有意义的层次结构。您需要提供一个真实的输出,让我们有机会理解您的问题。好的,现在提供了完整的XML。谢谢,这是我使用递归函数调用的近似方法。有没有一种方法可以使用一个SELECT语句来实现这一点是的,使用不同的方法,请参见示例