使用存储过程将数据以XML格式导出到XML文件

最近看到有网上有很多人问怎么把数据导出到XML文件,大多的解决方法就是 dbms_xmlgen+utl_file,首先要说的是,这种方法确实不错,但是有些缺点。如果系统中需要把数据导出XML文件,通常数据量都比较大, 因此,对于大数据量的导出,UTL_FILE就显得比较苍白了。而且DBMS_XMLGEN获得数据本身就是有格式的,因此UTL_FILE的INSTR 就显得有些多余了。但是,我还要把这个方法记录下来,另外,还有一个是使用DBMS_XSLPROCESSOR包的方法。

一、准备工作

      准备数据:

      CREATE TABLE xml_table(ID VARCHAR2(20),

                                             OBJECT_VALUE VARCHAR2(200));

      导入数据:      

       BEGIN

       FOR i IN 1 .. 100000 LOOP

            INSERT INTO xml_table VALUES (i,'blog.csdn.net/zhangchu_63');

       END LOOP;

       COMMIT;

       END;

       /

      通过上面的操作,我们已经建立了一张名叫xml_table的表,并向里面插入了100000条数据。大家知道XML文件是导出到OS的,因此,需要在ORACLE中为文件创建一个路径:

      CREATE OR REPLACE DIRECTORY D_OUTPUT AS 'D:\TEMP';

     下面是我们就要开始喽。

二、开始干活

      1、dbms_xmlgen+utl_file方式

     create or replace procedure xml_output is
        /**
          本存储过程使用dbms_xmlgen+utl_file两个包来完成数据导出到XML
        */

       xml_ctx dbms_xmlgen.ctxType;
       v_file utl_file.file_type;
       xml_txt varchar2(4000);
       line varchar2(500);
       begin

        xml_ctx := dbms_xmlgen.newContext('select * from xml_table order by id');
       dbms_xmlgen.setRowSetTag(xml_ctx,'DBMS');
       dbms_xmlgen.setRowTag(xml_ctx,'XML_TABLE');
       xml_txt := dbms_xmlgen.getXML(xml_ctx);

       v_file := utl_file.fopen('XML_OUTPUT','test.xml','w');
       loop
 
         line := substr(xml_txt,1,instr(xml_txt,chr(10))-1);
         utl_file.put_line(v_file,line);
         exit when instr(line,'</DBMS>')>0;
         xml_txt := substr(xml_txt,instr(xml_txt,chr(10))+1);
       end loop;
 

       dbms_xmlgen.closeContext(xml_ctx);
       utl_file.fclose(v_file);
    end xml_output ;

      上面就是使用dbms_xmlgen+utl_file方式导出XML的,我的存储过程是没有参数的,如果大家需要可以自己加。

  

     2、dbms_xmlgen+DBMS_XSLPROCESSOR方式

     create or replace procedure xml_print is
        /**
         本存储过程使用dbms_xmlgen+DBMS_XSLPROCESSOR两个包

         来完成数据导出到XML
       */

       xml_ctx dbms_xmlgen.ctxType;
       xml_txt clob;
     begin

       xml_ctx := dbms_xmlgen.newContext('select * from xml_table

                         order by id');

      dbms_xmlgen.setRowSetTag(xml_ctx,'DBMS');
      dbms_xmlgen.setRowTag(xml_ctx,'XML_TABLE');
      xml_txt := to_clob(dbms_xmlgen.getXML(xml_ctx));
      DBMS_XSLPROCESSOR.clob2file

                                  (xml_txt,'XML_OUTPUT','test.xml');

      dbms_xmlgen.closeContext(xml_ctx);

     

     end xml_print;

     这个好处就是它不管xml_txt的格式,直接把所有数据写入test.xml中。

三、方法比较

     dbms_xmlgen+utl_file方式:导出100000条数据,2分钟没导完,我没耐

                                                心等了。

     dbms_xmlgen+DBMS_XSLPROCESSOR方式:导出100000条数据用了

                                                10秒钟。

四、总结

     看了上面我写的过程和比较,不用我说,大家也都知道怎么选了吧。在这里我还是要说,没有最好的办法,只有最合适的办法,根据具体问题具体对待。

      注:我上面的过程是为了简便,所以没有注释,没有EXCEPTION,希望大家别学我,要养成良好的书写习惯。

          为了方便大家学习,我把dbms_xslprocessor中用到的过程描述贴出来,供大家参考:

 

CLOB2FILE Procedure

This procedure writes content of a CLOB into a file.

Syntax

DBMS_XSLPROCESSOR.CLOB2FILE(
  cl          IN  CLOB;
  flocation   IN  VARCHAR2,
  fname       IN  VARCHAR2,
  csid        IN  NUMBER:=0);

 

ParameterDescription

CLOB

File directory

flocation

File directory

fname

File name

csid

Character set id of the file

  • Must be a valid Oracle id; otherwise returns an error

  • If 0 , content of the output file will be in the database character set

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值