`
huoyj
  • 浏览: 88091 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
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 * from xmldemo');
  -- 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;

输出结果:
<?xml version="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(xml handle):=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 * from xmldemo');
  -- 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;

输出结果:
<?xml version="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出于什么目的,待考
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics