Как создать XML с использованием DBMS_XMLGEN, а затем извлечь и распечатать с помощью одного SYS_REFCURSOR? - PullRequest
0 голосов
/ 24 октября 2018

У меня открыт SYS_REFCURSOR для какого-то запроса.Я делаю XML для всех записей в SYS_REFCURSOR, используя DBMS_XMLGEN.Также я пытаюсь извлечь записи в переменную записи, а затем распечатать OUTPUT.Проблема в том, что если я создаю только XML из SYS_REFCURSOR или если я только извлекаю информацию, она работает просто отлично.Но если я пытаюсь сделать и то, и другое, он выбрасывает ошибку из последовательности.

Пожалуйста, помогите.Ниже приведен пример кода.

Я объявил 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;
    /

1 Ответ

0 голосов
/ 24 октября 2018

Сначала выполните обычную выборку, а затем используйте 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;
/
...