具有子节点的Oracle XML层次结构(NEWCONTEXTFROMHIERARCHY)
我的目标是这样一个具有子节点的Oracle XML层次结构(NEWCONTEXTFROMHIERARCHY),xml,oracle,hierarchy,Xml,Oracle,Hierarchy,我的目标是这样一个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"> <
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>
每个产品
(PRV节点)都有一个基本产品
(PRO节点)和一个产品组
(PGR节点)。PRODUCTGROUPS
是分层的
到目前为止,我得到的是PRODUCTGROUP层次结构的XML
,其中包括:
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层次结构:
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
现在我不知道如何将这两种方法结合起来,用PRODUCTGROUP层次结构
获得所需的XML结构。有没有办法用Oracle XML函数来实现这一点呢?老实说,我从未见过这个函数(NEWCONTEXTFROMHIERARCHY
),但这是我设法做到的。我做了一个函数,它创建了层次结构树所需的部分,并结合了两个附加参数(基本产品和产品)。然后我使用了newcontextfromhierarchy
。这样函数将返回整个节点
create or replace function xml_hier(i_id in varchar2, i_base in varchar2, i_name in varchar2) return xmltype is
v_ret xmltype;
begin
select dbms_xmlgen.getxmltype(dbms_xmlgen.newcontextfromhierarchy('
with t as (
select level lvl, xmlelement("PGR", XMLATTRIBUTES(NAME))
from PRODUCTGROUPS
where id in (select id
from PRODUCTGROUPS
connect by prior PARENTID = ID start with id = '||i_id||')
connect by PARENTID = prior ID
start with parentid is null)
select * from t
union all
select (select max(lvl) + 1 from t), XMLELEMENT("PRO", XMLATTRIBUTES('''||i_base||''' as "name")) from dual
union all
select (select max(lvl) + 2 from t), XMLELEMENT("PRV", XMLATTRIBUTES('''||i_name||''' as "name")) from dual'))
into v_ret
from dual;
return v_ret;
end;
因此,在创建了表之后,我运行:
select p.id,
xmlroot(
xmlelement("IMPORT",
xml_hier(g.id, p.baseproduct, p.name))
, version '1.0" encoding="utf-8') as xml
from products p
join productgroups g on p.productgroupid = g.id;
结果是:
<?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 1"/>
</PRO>
</PGR>
</PGR>
</PGR>
</IMPORT>
为了找到祖先,分层查询首先反向工作。然后它正常运行,只使用已知的id
我希望这有帮助:)老实说,我从未见过这个函数(NEWCONTEXTFROMHIERARCHY
),但这是我设法做到的。我做了一个函数,它创建了层次结构树所需的部分,并结合了两个附加参数(基本产品和产品)。然后我使用了newcontextfromhierarchy
。这样函数将返回整个节点
create or replace function xml_hier(i_id in varchar2, i_base in varchar2, i_name in varchar2) return xmltype is
v_ret xmltype;
begin
select dbms_xmlgen.getxmltype(dbms_xmlgen.newcontextfromhierarchy('
with t as (
select level lvl, xmlelement("PGR", XMLATTRIBUTES(NAME))
from PRODUCTGROUPS
where id in (select id
from PRODUCTGROUPS
connect by prior PARENTID = ID start with id = '||i_id||')
connect by PARENTID = prior ID
start with parentid is null)
select * from t
union all
select (select max(lvl) + 1 from t), XMLELEMENT("PRO", XMLATTRIBUTES('''||i_base||''' as "name")) from dual
union all
select (select max(lvl) + 2 from t), XMLELEMENT("PRV", XMLATTRIBUTES('''||i_name||''' as "name")) from dual'))
into v_ret
from dual;
return v_ret;
end;
因此,在创建了表之后,我运行:
select p.id,
xmlroot(
xmlelement("IMPORT",
xml_hier(g.id, p.baseproduct, p.name))
, version '1.0" encoding="utf-8') as xml
from products p
join productgroups g on p.productgroupid = g.id;
结果是:
<?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 1"/>
</PRO>
</PGR>
</PGR>
</PGR>
</IMPORT>
为了找到祖先,分层查询首先反向工作。然后它正常运行,只使用已知的id
我希望这有帮助:)非常感谢,这似乎完全符合我的需要!非常感谢,这似乎完全符合我的需要!