如何使用 DBMS_XMLGEN 创建一个 XML,然后使用单个 SYS_REFCURSOR 获取和打印?

How to make a create a XML using DBMS_XMLGEN and then fetch and print using a single SYS_REFCURSOR?

我打开了一个 SYS_REFCURSOR 查询。我正在使用 DBMS_XMLGEN 为 SYS_REFCURSOR 中的所有记录创建 XML。此外,我正在尝试将记录提取到记录变量中,然后打印 OUTPUT。问题是如果我只从 SYS_REFCURSOR 创建 XML 或者如果我只是获取,它工作得很好。但是,如果我同时尝试两者,则会引发乱序错误。

请帮忙。下面是我的示例代码。

我已将 p_individual 声明为记录类型。

    set serveroutput on;
    declare 
    l_ctx dbms_xmlgen.ctxhandle;
    l_xmltype clob;
    l_xml xmltype;
    L_REFCURSOR     SYS_REFCURSOR;
    begin

    OPEN L_REFCURSOR FOR select * from some_table;
   //Creating XML 
     L_CTX := dbms_xmlgen.newcontext(L_REFCURSOR);
        dbms_xmlgen.setrowsettag(L_CTX, 'root'); 
                dbms_xmlgen.setrowtag(L_CTX, 'data');
                L_XML := dbms_xmlgen.getXmlType(L_CTX) ;
                dbms_xmlgen.closeContext(L_CTX);
          dbms_output.put_line(L_XML.getclobval());
  //Fetching the same cursor to print output        
           loop
          fetch L_REFCURSOR into p_individual;
          exit when L_REFCURSOR%NOTFOUND;
         dbms_output.put_line(p_individual.id);
          end loop;
             close L_REFCURSOR;
    end;
    /

先进行常规提取,然后使用 DBMS_XMLGEN.RESTARTQUERY 输出为 XML。

根据您的示例,类似这样的事情...

DECLARE
   l_xmltype XMLTYPE;
   l_refcursor SYS_REFCURSOR;
   l_ctxhandle DBMS_XMLGEN.ctxhandle;
   l_record v$version%ROWTYPE;
BEGIN
   OPEN l_refcursor FOR SELECT * FROM v$version;

   -- output conventional
   LOOP
      FETCH l_refcursor INTO l_record;

      EXIT WHEN l_refcursor%NOTFOUND;

      DBMS_OUTPUT.put_line (l_record.banner);
   END LOOP;

   -- output as xml
   l_ctxhandle := DBMS_XMLGEN.newcontext (l_refcursor);

   -- set some format stuff
   DBMS_XMLGEN.setrowsettag (l_ctxhandle, 'root');
   DBMS_XMLGEN.setrowtag (l_ctxhandle, 'data');

   -- cursor already fetched so restart it
   DBMS_XMLGEN.restartquery (l_ctxhandle);

   l_xmltype := DBMS_XMLGEN.getxmltype (l_ctxhandle);

   DBMS_XMLGEN.closecontext (l_ctxhandle);

   IF l_refcursor%ISOPEN THEN
      CLOSE l_refcursor;
   END IF;

    DBMS_OUTPUT.put_line (l_xmltype.getclobval);
END;
/