DBMS_XMLGEN.GETXML中的多个ROWSET - Oracle APEX

时间:2017-05-16 12:41:19

标签: xml oracle oracle-apex

在共享组件的报表查询中添加两个查询并下载XML数据时,输出XML结构就像这样(两个ROWSET):



<?xml version="1.0" encoding="UTF-8"?>
<DOCUMENT>
<DATA>
<ROWSET1>
   <ROWSET1_ROW>
      <ID></ID>
      <NAME></NAME>
   </ROWSET1_ROW>
</ROWSET1>
<ROWSET2>
   <ROWSET2_ROW>
      <ID2></ID2>
      <NAME2></NAME2>
   </ROWSET2_ROW>
</ROWSET2>
</DATA>
</DOCUMENT>
&#13;
&#13;
&#13;

我使用DBMS_XMLGEN.GETXML从我的select语句中生成相同的XML内容。我该怎么办?

两个SQL语句是:

SELECT ID, NAME 
FROM TABLE1

SELECT ID2,NAME2 
FROM TABLE2

2 个答案:

答案 0 :(得分:2)

DECLARE
   l_ctx dbms_xmlgen.ctxhandle;
   v_clob clob;
begin 
  l_ctx := dbms_xmlgen.newcontext('select cursor(select * from TABLE1) as rowset1,cursor(select * from TABLE2 ) as rowset2 from dual');
  dbms_xmlgen.setrowsettag(l_ctx, 'DOCUMENT'); 
  dbms_xmlgen.setrowtag(l_ctx, 'DATA');
  v_clob := dbms_xmlgen.getXml(l_ctx);
  dbms_xmlgen.closeContext(l_ctx);
  dbms_output.put_line(v_clob);    
end;

结果是。

<?xml version="1.0"?>
<DOCUMENT>
 <DATA>
  <ROWSET1>
   <ROWSET1_ROW>
    <ID>1</ID>
    <NAME>a</NAME>
   </ROWSET1_ROW>
  </ROWSET1>
  <ROWSET2>
   <ROWSET2_ROW>
    <ID>1</ID>
    <NAME>a</NAME>
   </ROWSET2_ROW>
  </ROWSET2>
 </DATA>
</DOCUMENT>

或者,如果您不必重命名根元素。做选择。

select dbms_xmlgen.getxml('select cursor(select * from TABLE1) as rowset1,cursor(select * from TABLE2 ) as rowset2 from dual') from dual;

结果

<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <ROWSET1>
   <ROWSET1_ROW>
    <ID>1</ID>
    <NAME>a</NAME>
   </ROWSET1_ROW>
  </ROWSET1>
  <ROWSET2>
   <ROWSET2_ROW>
    <ID>1</ID>
    <NAME>a</NAME>
   </ROWSET2_ROW>
  </ROWSET2>
 </ROW>
</ROWSET>

答案 1 :(得分:1)

类似的东西:

SELECT '<?xml version="1.0" encoding="UTF-8"?>'
       || XMLElement(
            "DOCUMENT",
            XMLElement(
              "DATA",
              XMLAggregate(
                row_xml
              )
            )
          ).getClobVal() AS xml
FROM   (
  SELECT XMLElement(
           "ROWSET1",
           XMLAggregate(
             XMLElement(
               "ROWSET1_ROW",
               XMLForest(
                 id,
                 name
               )
             )
           )
         ) AS row_xml
  FROM   table1
  UNION ALL
  SELECT XMLElement(
           "ROWSET2",
           XMLAggregate(
             XMLElement(
               "ROWSET2_ROW",
               XMLForest(
                 id AS "ID2",
                 name AS "NAME2"
               )
             )
           )
         )
  FROM   table2
)