DBMS_XMLGEN.GETXML 中的多个 ROWSET - Oracle APEX

Multiple ROWSETs in DBMS_XMLGEN.GETXML - 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>

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

两个SQL语句是:

SELECT ID, NAME 
FROM TABLE1

SELECT ID2,NAME2 
FROM TABLE2

类似于:

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
)
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.

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>