oracle 10g中,有两个包,用于处理xml格式: dbms_xmlgen 和 dbms_xmlstore.
1.创建临时表,写入两条数据:
create table xmldemo (
a number,
b varchar2(10)
);
insert into xmldemo values (10,'first line');
insert into xmldemo values (20,'line 2');
commit;
2.使用dbms_xmlgen生成数据表的xml格式
declare
xmlhdl dbms_xmlgen.ctxtype;
line varchar2(200);
xmltext varchar2(32767);
begin
-- create ctxhandle
xmlhdl := dbms_xmlgen.newcontext('select * fromxmldemo');
--generate xml format data into clob
xmltext :=dbms_xmlgen.getxml(xmlhdl);
--display the xml content
loop
exit when xmltext is null;
line :=substr(xmltext,1,instr(xmltext,chr(10))-1);
dbms_output.put_line(line);
xmltext :=substr(xmltext,instr(xmltext,chr(10))+1);
end loop;
--close ctxhandle
dbms_xmlgen.closecontext(xmlhdl);
end;
输出结果:
<?xmlversion="1.0"?>
<ROWSET>
<ROW>
<A>10</A>
<B>first line</B>
</ROW>
<ROW>
<A>20</A>
<B>line 2</B>
</ROW>
</ROWSET>
3.dbms_xmlgen其它函数
getnumrowsprocessed(xmlhandle):=getxml所处理的实际行数
dbms_xmlgen.setMaxRows(xmlhdl,10):=允许处理最大行数
dbms_xmlgen.setrowsettag(xmlhdl,'Packet'):=重置行集标签rowset
dbms_xmlgen.setrowtag(xmlhdl,'Record'):=重置行标签row
dbms_xmlgen.setnullhandling(xmlhdl,2):=列空值如何表示,如:<A/>
上例修改:
插入空值数据:
insert into xmldemo values ('30',NULL);
insert into xmldemo values (null,'No.4');
commit;
代码修改:
declare
xmlhdl dbms_xmlgen.ctxtype;
line varchar2(200);
xmldoc clob;
xmltext varchar2(32767);
flag boolean;
begin
-- create ctxhandle
xmlhdl := dbms_xmlgen.newcontext('select * fromxmldemo');
--custerm config
dbms_xmlgen.setMaxRows(xmlhdl,10);
dbms_xmlgen.setrowsettag(xmlhdl,'Packet');
dbms_xmlgen.setrowtag(xmlhdl,'Record');
dbms_xmlgen.setnullhandling(xmlhdl,dbms_xmlgen.EMPTY_TAG);
-- generate xml format data into clob
xmldoc :=dbms_xmlgen.getxml(xmlhdl);
--display the xml content
xmltext := dbms_lob.substr(xmldoc);
loop
exit when xmltext is null;
line :=substr(xmltext,1,instr(xmltext,chr(10))-1);
dbms_output.put_line(line);
xmltext :=substr(xmltext,instr(xmltext,chr(10))+1);
end loop;
-- get row count
dbms_output.put_line(dbms_xmlgen.getnumrowsprocessed(xmlhdl));
-- close ctxhandle
dbms_xmlgen.closecontext(xmlhdl);
end;
输出结果:
<?xmlversion="1.0"?>
<Packet>
<Record>
<A>10</A>
<B>first line</B>
</Record>
<Record>
<A>20</A>
<B>line 2</B>
</Record>
<Record>
<A>30</A>
<B/>
</Record>
<Record>
<A/>
<B>No.4</B>
</Record>
</Packet>
4
另:xmlhdl的类型为ctxtype或ctxhandle时,结果是一样的。
不知道oracle出于什么目的,待考