oracle 10g 用dbms_xmlgen将数据表转成xml格式

来源:互联网 发布:淘宝详情页美工 编辑:程序博客网 时间:2024/06/05 03:42
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出于什么目的,待考
原创粉丝点击