如何使用 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;
/
我打开了一个 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;
/