Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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层次结构(NEWCONTEXTFROMHIERARCHY)_Xml_Oracle_Hierarchy - Fatal编程技术网

具有子节点的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


我希望这有帮助:)

非常感谢,这似乎完全符合我的需要!非常感谢,这似乎完全符合我的需要!