【发布时间】:2019-07-27 20:25:56
【问题描述】:
我的目标是像这样的XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<IMPORT>
<PGR name="Product Group 1">
<PGR name="Product Group 1-1">
<PGR name="Product Group 1-1-1">
<PRO name="Product X">
<PRV name="Product Variant X-1" />
</PRO>
</PGR>
</PGR>
</PGR>
</IMPORT>
我的带有示例数据的表格:
create table PRODUCTS
(
id NUMBER(8) not null,
name VARCHAR2(100),
baseproduct VARCHAR2(100),
productgroupid NUMBER(8)
);
insert into PRODUCTS (ID, NAME, BASEPRODUCT, PRODUCTGROUPID)
values (1, 'Product Variant 1', 'Product X', 3);
create table PRODUCTGROUPS
(
id NUMBER(8) not null,
parentid NUMBER(8),
name VARCHAR2(100)
);
insert into PRODUCTGROUPS (ID, PARENTID, NAME)
values (1, null, 'Product Group 1');
insert into PRODUCTGROUPS (ID, PARENTID, NAME)
values (2, 1, 'Product Group 1-1');
insert into PRODUCTGROUPS (ID, PARENTID, NAME)
values (3, 2, 'Product Group 1-1-1');
insert into PRODUCTGROUPS (ID, PARENTID, NAME)
values (4, null, 'Product Group 2');
insert into PRODUCTGROUPS (ID, PARENTID, NAME)
values (5, 4, 'Product Group 2-1');
insert into PRODUCTGROUPS (ID, PARENTID, NAME)
values (6, 5, 'Product Group 2-1-1');
每个PRODUCT(PRV-Node)都有一个BASEPRODUCT(PRO-Node)和一个PRODUCTGROUP(PGR-Node)。 PRODUCTGROUPS 是分层的。
到目前为止,我得到的是 XML 的 PRODUCTGROUP-Hierarchy 与:
select DBMS_XMLGEN.GETXMLTYPE(DBMS_XMLGEN.NEWCONTEXTFROMHIERARCHY('
select level, xmlelement("PGR", XMLATTRIBUTES(NAME))
from PRODUCTGROUPS
start with PARENTID is null
connect by nocycle PARENTID = PRIOR ID')) from dual
我也有所需的 XML 结构,但没有 PRODUCTGROUP-Hierarchy:
select P.ID,
XMLROOT(
XMLELEMENT("IMPORT",
XMLELEMENT("PGR", XMLATTRIBUTES(G.NAME as "name"),
XMLELEMENT("PRO", XMLATTRIBUTES(P.BASEPRODUCT as "name"),
XMLELEMENT("PRV", XMLATTRIBUTES(P.NAME as "name"))
)
)
)
, version '1.0" encoding="utf-8') as XML
from PRODUCTS P join PRODUCTGROUPS G on P.PRODUCTGROUPID = G.ID
现在我不知道如何结合这两种方法来获得所需的XML-Structure 和PRODUCTGROUP-Hierarchy。有没有办法通过Oracle-XML-Functions 得到这个?
【问题讨论】: