Проблема с получением материалов от Das Interweb заключается в том, что контроль качества может быть очень плохим.В частности, вам нужно обратить внимание на номера версий .Вы на Oracle 10g.Я думаю, что XMLGEN был введен в XDK для Oracle 8i;он был устаревшим в пользу пакета PL / SQL DBMS_XMLGEN в 9i, и (насколько я знаю) не был включен в базу данных в течение нескольких лет.
DBMS_XMLGEN делает подобноечто-то вроде XMLGEN, хотя некоторые из процедур имеют слегка отличающиеся подписи, а некоторые вообще отброшены.Я переписал опубликованный код для использования DBMS_XMLGEN.
create or replace procedure SP_XML_TEST is
xmlString CLOB;
amount integer:= 255;
position integer := 1;
charString varchar2(255);
len pls_integer;
l_ctx dbms_xmlgen.ctxHandle;
begin
l_ctx := dbms_xmlgen.newcontext('select * from apc.emp');
dbms_xmlgen.setRowTag(l_ctx, 'EMP_ROW'); -- we want the row element to be named EMP_ROW.
dbms_xmlgen.setRowsetTag(l_ctx, 'EMP_RESULTS'); -- we want the result document root to be EMP_RESULTS.
dbms_xmlgen.setMaxRows(l_ctx, 3); -- limit the output to 3 rows.
dbms_xmlgen.setskipRows(l_ctx, 2); -- skip the first two rows in the query before outputing results.
xmlString := dbms_xmlgen.getXML(l_ctx ); -- This gets the XML out
dbms_output.put_line('rows read = '||to_char(dbms_xmlgen.GETNUMROWSPROCESSED(l_ctx)));
len := dbms_lob.getlength (xmlString);
dbms_lob.open(xmlString,DBMS_LOB.LOB_READONLY); -- Now open the lob data..
loop
dbms_lob.read(xmlString,amount,position,charString); -- read the lob data
dbms_output.put_line(charString);
position := position + amount;
EXIT when position > len;
end loop;
dbms_lob.close(xmlString);
dbms_xmlgen.closecontext(l_ctx);
end SP_XML_TEST;
/
И вот!
SQL> exec SP_XML_TEST
rows read = 3
<?xml version="1.0"?>
<EMP_RESULTS>
<EMP_ROW>
<EMPNO>8085</EMPNO>
<ENAME>TRICHLER</ENAME>
<JOB>PLUMBER</JOB>
<MGR>8061</MGR>
<HIREDATE>08-APR-10</HIREDATE>
<SAL>3500</SAL>
<DEPTNO>50</DEPTNO>
</EMP_ROW>
<EMP_ROW>
<EMPNO>7369</EMPNO>
<
ENAME>CLARKE</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>17-DEC-80</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</EMP_ROW>
<EMP_ROW>
<EMPNO>7499</EMPNO>
<ENAME>VAN WIJK</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>20
-FEB-81</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</EMP_ROW>
</EMP_RESULTS>
Кстати, кое-что еще, что изменилось с тех пор, как оригинальный кодер взломал эту процедуру, являетсяограничение на буфер DBMS_OUTPUT.В 10 г он может доходить до 32767. Узнать больше .