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

更新时间:2023-11-15 02:41:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

使用存储过程将数据以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,'')>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 csid File name 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

本文来源:https://www.bwwdw.com/article/r6mv.html

Top