从Oracle分层表创建XML

时间:2018-05-04 16:32:33

标签: xml oracle hierarchy

我试图生成一个XML文件,表示Oracle 12c数据库上TABLE1的记录之间的层次关系。此TABLE1的记录之间的关系使用child_id和parent_id列存储在另一个TABLE2中。下面的示例表示我需要使用TABLE1中的一些基本信息生成的典型XML层次结构。

示例XML: X有2个孩子(Y和Z),Z有2个孩子(W和K)

<TABLE1>
    <NAME>X</NAME>
    <TABLE1>
        <NAME>Y</NAME>
    </TABLE1>
    <TABLE1>
        <NAME>Z</NAME>
        <TABLE1>
            <NAME>W</NAME>
        </TABLE1>
        <TABLE1>
            <NAME>K</NAME>
        </TABLE1>
    </TABLE1>
</TABLE1>

生成的XML对表示层次结构上的节点的每个行标签使用TABLE1名称。 XML上的任何其他标记(例如NAME)都是TABLE1中的一列。

我尝试将CONNECT BY与xmlement / xmlconcat / SYS_CONNECT_BY_PATH一起使用但没有成功。

有没有更好的角度来解决这个问题?

1 个答案:

答案 0 :(得分:1)

dbms_xmlgen.newContextFromHierarchy怎么样?

假设您的问题中的ddls看起来像:

create table table1 ( table1_id number, table1_name varchar2(30));
create table table2 (child_id number, parent_id number);

使用样本数据:

insert into table1 values( 1, 'X');
insert into table1 values( 2, 'Y');
insert into table1 values( 3, 'Z');
insert into table1 values( 4, 'W');
insert into table1 values( 5, 'K');
insert into table2 values (1, null);
insert into table2 values (2, 1);
insert into table2 values (3, 1);
insert into table2 values (4, 3);
insert into table2 values (5, 3);

以下查询:

select dbms_xmlgen.newContextFromHierarchy('
  select
    level,
    xmlelement("TABLE1",
      xmlelement("NAME",t1.table1_name)
    )
  from table1 t1
  join table2 t2 on t2.child_id = t1.table1_id
  start with t2.parent_id is null
  connect by prior  t2.child_id = t2.parent_id
  ')
from dual;

应该返回:

<?xml version="1.0"?>
<TABLE1>
    <NAME>X</NAME>
    <TABLE1>
        <NAME>Y</NAME>
    </TABLE1>
    <TABLE1>
        <NAME>Z</NAME>
        <TABLE1>
            <NAME>W</NAME>
        </TABLE1>
        <TABLE1>
            <NAME>K</NAME>
        </TABLE1>
    </TABLE1>
</TABLE1>