Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle:将树结构转换为XML_Xml_Oracle_Hierarchical Data - Fatal编程技术网

Oracle:将树结构转换为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

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

目前,我使用递归函数调用来实现这一点,即检索给定元素的子元素,这似乎不是最聪明的方法。包含CONNECT BY PREVIOR的语句将输出结果,但我不知道如何将其转换为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>

您的XML格式不好,并且似乎无法表示有意义的层次结构。您需要提供一个真实的输出,让我们有机会理解您的问题。好的,现在提供了完整的XML。谢谢,这是我使用递归函数调用的近似方法。有没有一种方法可以使用一个SELECT语句来实现这一点是的,使用不同的方法,请参见示例