最近看到有网上有很多人问怎么把数据导出到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);
Parameter Description

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

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

  1. 使用layui把数据以Excel格式导出

    昨天领导让我给页面加一个数据导出, 开始我以为是本页导出,我就加一个layui自带的,结果告诉我不行,要导出所有的数据,而且不是页面展示的那个表格的,我就试试 引入layui的JS和CSS就不说了直接 ...

  2. Matlab 2018a与SolidWorks联合仿真——如何将SolidWorks模型以xml格式导出至Matlab中

    Matlab 2018a与SolidWorks联合仿真--如何将SolidWorks模型以xml格式导出至Matlab中   要实现Solidworks与Matlab的联合仿真,需要在Solidwor ...

  3. 【邮件发送】将list数据以html格式的形式展示到邮件正文

    签名:但行好事,莫问前程. 文章目录 前言 一.需求分析 二.代码编写 三.解决思路 四.最终效果 总结 前言 公司产品提出了一个新需求,要求把不满足团购商品利润和库存的Excel里面的数据展示到邮件 ...

  4. 将Java对象序列化成XML格式,将XML反序列化还原为Java对象

    摘要:将Java对象序列化成XML格式,将XML反序列化还原为Java对象. 一:创建Maven工程,引入xstream依赖: <!--xstream--><dependency&g ...

  5. C# 将字符串(符合xml格式)与XML互转

    转自https://blog.csdn.net/u011555996/article/details/53307830 //xml 转 string System.Xml.XmlDocument do ...

  6. python 解析xml格式_Python解析XML文件

    1.概述 Python有三种方法解析XML:SAX,DOM,以及ElementTree: 1.SAX (simple API for XML ) python 标准库包含SAX解析器,SAX用事件驱动 ...

  7. python爬取数据保存为csv时生成编号_将爬取到到数据以CSV格式存储

    CSV文件存储 CSV,全称为Comma-Separated Values,中文可以叫做逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据.该文件是一个字符序列,可以由任意数目的记录组成,记录间以 ...

  8. Python爬虫爬取数据以Json格式保存并解决中文乱码问题

    爬取网站的前端源码: Python代码: import requests from bs4 import BeautifulSoup import jsontarget = 'http://www.h ...

  9. node爬取app数据_node爬取拉勾网数据并导出为excel文件

    前言 之前断断续续学习了node.js,今天就拿拉勾网练练手,顺便通过数据了解了解最近的招聘行情哈!node方面算是萌新一个吧,希望可以和大家共同学习和进步. 一.概要 我们首先需要明确具体的需求: ...

最新文章

  1. 在.net中运用HTMLParser解析网页的原理和方法
  2. 不好意思,我真的不知道MySQL的窗口函数...
  3. 散列函数的应用及其安全性
  4. lua 从一串数字中取出偶数位的数字_为什么JavaScript中 0.1 0.2 不等于0.3?
  5. HDU 2874 Connections between cities(LCA离线算法实现)
  6. python学习笔记2018-9-18
  7. 别人的1024程序员节VS你的1024程序员节
  8. Mac小知识:只需四步,教大家如何修改苹果电脑的DNS
  9. LeetCode刷刷记录
  10. Twitter数据非API采集方法
  11. 将VMware迁移到阿里云分几步?!
  12. mysql管理工具-SQLyog管理工具
  13. 十四代装系统前RAID配置
  14. 雷电4模拟器安装xposed框架(2022年)
  15. 微软输入法数字有间隔_Word 2016中使用微软拼音输入法,换行后输入数字、标点时会没有输入进去,需要再输入一次...
  16. 弘辽科技:多多进宝怎么找团长?多多进宝怎么找推手推广?
  17. matlab postscript,Postscript软件特点全面解析
  18. 研究google搜索框代码
  19. 藏宝阁显示角色可买服务器,梦幻西游:刚买角色的藏宝阁上居然有东西,客服说是原号主出售的...
  20. 如何获取网页真实地址

热门文章

  1. 截取数组的方法slice()/splice()
  2. GIT 撤销revert操作
  3. ceph部分数据所有副本先后故障的抢救
  4. 2022二级建造师《工程法规》考试题目与答案
  5. 8条战术教你正确分析游戏性能问题
  6. 局域网屏幕共享_USB调试和USB网络共享,安卓有线投屏究竟选哪个?
  7. 从零玩转前后端加解密之SM2-sm2
  8. python转行 知乎_黄哥Python提醒:转行当程序员修炼之路
  9. java中类和对象的个人理解
  10. 软件研发的质量理念及管控措施