Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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_Plsql - Fatal编程技术网

使用oracle生成xml

使用oracle生成xml,xml,oracle,plsql,Xml,Oracle,Plsql,我想用oracle生成以下xml <Component ID="600564" asmid="1" def="FactSheet" type="Document"> <Profile> <Port_ID>182</Port_ID> <Inception_Date>31 Dec 1998</Inception_Date> </Profile> <Aver

我想用oracle生成以下xml

<Component ID="600564" asmid="1" def="FactSheet" type="Document">
    <Profile>
        <Port_ID>182</Port_ID>
        <Inception_Date>31 Dec 1998</Inception_Date>
    </Profile>
    <AverageAnnualReturns>
        <TableData>
            <Item>
                <ClassID>33</ClassID>
                <ClassName>A1USD</ClassName>
                <Superscript>2</Superscript>
                <Superscript_TCE/>              
            </Item>
            <Item>
                <ClassID>45</ClassID>
                <ClassName>I1EUR</ClassName>
                <Superscript>1,2</Superscript>
                <Superscript_TCE/>              
            </Item>
        </TableData>
        <SuppressLifeColumn>Yes</SuppressLifeColumn>
        <SuppressBenchColumn10yr>No</SuppressBenchColumn10yr>
        <SuppressBenchColumn5yr>No</SuppressBenchColumn5yr>
        <SuppressBenchColumn3yr>No</SuppressBenchColumn3yr>
        <SuppressBenchColumn1yr>No</SuppressBenchColumn1yr>
    </AverageAnnualReturns>
</Component>
AverageAnnualReturn查询如下

SELECT PCR.PORT_ID,  
to_char(p.port_start_dt, 'dd Mon yyyy') as INCEPTION_DATE 
FROM edp_admin.PORT_CLASS_REPORT PCR 
JOIN edp_admin.PORTFOLIO p on (PCR.PORT_ID = P.PORT_ID and PCR.CLASS_ID = P.BASE_CLASS_ID) 
where PCR.PORT_ID = 182 AND PCR.REPORT_ID = 472
SELECT distinct MPR.PORT_ID, 
MPR.CLASS_ID, 
MPR.CLASS_NAME, 
PCR.VALUE_NUM3 as RANK, 
NVL (NC.SUPERSCRIPT_TEXT,' ') as SUPERSCRIPT_TEXT 
FROM EDP_ADMIN.SYSTEM_VALUE PCR 
LEFT JOIN EDP_ADMIN.MPR_MIL_VIEW MPR ON (PCR.VALUE_NUM1 = MPR.PORT_ID AND PCR.VALUE_NUM2 = MPR.CLASS_ID AND MPR.CLASSIF_ID = 206) 
LEFT JOIN EDP_ADMIN.PORT_CLASS_YIELD PCY ON (PCR.VALUE_NUM1 = PCY.PORT_ID AND PCR.VALUE_NUM2 = PCY.CLASS_ID AND MPR.PROFILE_DATE = PCY.PORT_CLASS_YIELD_DT AND PCY.YIELD_ID = 6) 
LEFT JOIN EDP_ADMIN.PORTFOLIO_CLASS PC ON (PCR.VALUE_NUM1 = PC.PORT_ID AND PCR.VALUE_NUM2 = PC.CLASS_ID) 
LEFT JOIN EDP_ADMIN.PORT_CLASS_MKT_PRICE PCMP ON (PCR.VALUE_NUM1 = PCMP.PORT_ID AND PCR.VALUE_NUM2 = PCMP.CLASS_ID AND PCMP.MKT_PRICE_ID = 12 AND MPR.PROFILE_DATE = PCMP.PORT_CLA_MKT_PRICE_PER_END_DT) 
LEFT JOIN (SELECT DISTINCT R1.PORT_ID, R1.CLASS_ID, R1.PORT_CLASS_EXP_RAT_VALUE, R1.PORT_CLASS_EXP_RAT_DT FROM edp_admin.Port_Class_Expense_Ratio R1 INNER JOIN (SELECT DISTINCT PORT_ID, CLASS_ID, MAX(PORT_CLASS_EXP_RAT_DT) as MONTH_END_DATE FROM EDP_ADMIN.PORT_CLASS_EXPENSE_RATIO GROUP BY PORT_ID, CLASS_ID ) R2 ON (R1.PORT_ID = R2.PORT_ID AND R1.CLASS_ID = R2.CLASS_ID AND R1.PORT_CLASS_EXP_RAT_DT = R2.MONTH_END_DATE) ) PCER ON PCR.VALUE_NUM1 = PCER.PORT_ID and PCR.VALUE_NUM2 = PCER.CLASS_ID 
LEFT JOIN EDP_ADMIN.FN_MIL_FS_CONCAT_NOTES_VIEW NC ON NC.PORT_ID = PCR.VALUE_NUM1 AND NC.CLASS_ID = PCR.VALUE_NUM2 AND NC.HYPO_TYPE = PCR.VALUE_CHAR1 
WHERE PCR.CODE = 'MIL_FS_PERF_CONFIG' AND PCR.VALUE_NUM1 IN (182) AND PCR.VALUE_CHAR1 = 'UK' ORDER BY RANK
我尝试使用oracle sql函数生成xml,如下所示

select dbms_xmlquery.getxml(sql for profile) from dual
<?xml version = '1.0'?>
<ROWSET>
   <ROW num="1">
      <PORT_ID>182</PORT_ID>
      <INCEPTION_DATE>31 Dec 1998</INCEPTION_DATE>      
   </ROW>
</ROWSET>
但它会生成两个额外的xml节点rowset和row,如下所示

select dbms_xmlquery.getxml(sql for profile) from dual
<?xml version = '1.0'?>
<ROWSET>
   <ROW num="1">
      <PORT_ID>182</PORT_ID>
      <INCEPTION_DATE>31 Dec 1998</INCEPTION_DATE>      
   </ROW>
</ROWSET>
它生成如下结构

<Component ID="600564" ASMID="1" DEF="FactSheet" TYPE="Document"><Profile></Profile></Component>


但是我不知道如何在
profile
节点下填充数据,然后
averageannualreturns
您可以使用subselect来获取
profile
averageannualreturns
节点的数据。例如:

select xmlelement("Component",
         xmlattributes('600564' as ID,
                       '1' as asmid,
                       'FactSheet' as def,
                       'Document' as type
         ),
        (
         SELECT XMLELEMENT("Profile",
                  XMLFOREST(
                    'example_port' AS "Port_ID",  
                    '30/11/2016' as "Inception_Date" 
                  )
                )
         FROM dual
        )                                 
) from dual;
我相信这是您需要的(尽管我没有您的表可供测试):

使用appendChildXML和plsql的解决方案:

DECLARE
  lComponentXML xmltype;
  lProfileXML   xmltype;
BEGIN
  --generate the component xml
  select xmlelement("Component",
           xmlattributes('600564' as ID,
                         '1' as asmid,
                         'FactSheet' as def,
                         'Document' as type
           )
         )
  INTO lComponentXML
  FROM dual;

  --generate the profile xml
  SELECT XMLELEMENT("Profile",
           XMLFOREST(
             PCR.PORT_ID AS "Port_ID",  
             to_char(p.port_start_dt, 'dd Mon yyyy') as "Inception_Date"
           )
         )
  INTO lProfileXML
  FROM edp_admin.PORT_CLASS_REPORT PCR 
  JOIN edp_admin.PORTFOLIO p on (PCR.PORT_ID = P.PORT_ID and PCR.CLASS_ID = P.BASE_CLASS_ID) 
  where PCR.PORT_ID = 182 AND PCR.REPORT_ID = 472;

  --append the profile xml to the component
  lComponentXML := lComponentXML.appendChildXML('//Component',lProfileXML);
END;

您可以使用Subselect来获取
概要文件
averageannualreturns
节点的数据。例如:

select xmlelement("Component",
         xmlattributes('600564' as ID,
                       '1' as asmid,
                       'FactSheet' as def,
                       'Document' as type
         ),
        (
         SELECT XMLELEMENT("Profile",
                  XMLFOREST(
                    'example_port' AS "Port_ID",  
                    '30/11/2016' as "Inception_Date" 
                  )
                )
         FROM dual
        )                                 
) from dual;
我相信这是您需要的(尽管我没有您的表可供测试):

使用appendChildXML和plsql的解决方案:

DECLARE
  lComponentXML xmltype;
  lProfileXML   xmltype;
BEGIN
  --generate the component xml
  select xmlelement("Component",
           xmlattributes('600564' as ID,
                         '1' as asmid,
                         'FactSheet' as def,
                         'Document' as type
           )
         )
  INTO lComponentXML
  FROM dual;

  --generate the profile xml
  SELECT XMLELEMENT("Profile",
           XMLFOREST(
             PCR.PORT_ID AS "Port_ID",  
             to_char(p.port_start_dt, 'dd Mon yyyy') as "Inception_Date"
           )
         )
  INTO lProfileXML
  FROM edp_admin.PORT_CLASS_REPORT PCR 
  JOIN edp_admin.PORTFOLIO p on (PCR.PORT_ID = P.PORT_ID and PCR.CLASS_ID = P.BASE_CLASS_ID) 
  where PCR.PORT_ID = 182 AND PCR.REPORT_ID = 472;

  --append the profile xml to the component
  lComponentXML := lComponentXML.appendChildXML('//Component',lProfileXML);
END;

它工作了,但是如果我在sql中使用distinct或ORDERBY,它就不工作了。在sql for Average中,使用了distinct和order by,这在执行时失败。我最想知道的一件事是,在生成每个sql的xml等效结构之前,如何将业务条件应用到每个sql。如果您使用plsql,我添加了一个额外的解决方案,允许您在xml周围应用业务条件,在将其附加到XML主体之前。我可能只建议单独构建每个XML块,并逐渐添加它。这样,您可以使用order by和distinct子句使每个小数据块工作,并逐渐将它们添加到inNope中,即使我单独执行这些子选择,那么distinct也不支持,将错误作为缺少的表达式抛出。不幸的是,没有您的表结构,任何示例数据,或者您试图运行以生成XML的查询,我很难提供帮助。我唯一想到的是使用
和。。。作为
语句。i、 e.
使用年报作为
然后使用distinct和order by子句执行现有查询。然后,您可以查询年度报表以生成XML。这是有效的,但如果在sql中使用distinct或ORDERBY,则不起作用。在sql for Average中,使用了distinct和order by,这在执行时失败。我最想知道的一件事是,在生成每个sql的xml等效结构之前,如何将业务条件应用到每个sql。如果您使用plsql,我添加了一个额外的解决方案,允许您在xml周围应用业务条件,在将其附加到XML主体之前。我可能只建议单独构建每个XML块,并逐渐添加它。这样,您可以使用order by和distinct子句使每个小数据块工作,并逐渐将它们添加到inNope中,即使我单独执行这些子选择,那么distinct也不支持,将错误作为缺少的表达式抛出。不幸的是,没有您的表结构,任何示例数据,或者您试图运行以生成XML的查询,我很难提供帮助。我唯一想到的是使用
和。。。作为
语句。i、 e.
使用年报作为
然后使用distinct和order by子句执行现有查询。然后,您可以查询年度报表以生成XML。