从Oracle查询生成XML文件

时间:2019-11-03 22:43:28

标签: sql xml oracle performance

我有一个查询,返回5000万行。我想为每一行生成XML文件(文件最大大小为100k)。我当然知道标签,但是我不知道如何以最有效的方式编写标签。有帮助吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我不建议尝试将50M文件写入磁盘,但是您可以使用以下代码来演示为什么这不是一个好主意

1:使用目录将文件写入磁盘的功能

create or replace function WRITETOFILE (dir in VARCHAR2,fn in VARCHAR2, dd IN clob) return clob AS
  ff UTL_FILE.FILE_TYPE;
  l_amt number := 30000;
  l_offset number := 1;
  l_length number := nvl(dbms_lob.getlength(dd),0);
  buf varchar2(30000);
begin   
    ff := UTL_FILE.FOPEN(dir,fn,'W',32760);

    while ( l_offset < l_length ) loop
      buf := dbms_lob.substr(dd,l_amt,l_offset);
      utl_file.put(ff, buf);
      utl_file.fflush(ff);
      utl_file.new_line(ff);
      l_offset := l_offset+length(buf);
    end loop;

    UTL_FILE.FCLOSE(ff);

    return dd; 
END WRITETOFILE;
/

2:使用上面的函数从语句中创建一个包含所有行的表的语句-建议您保持较小的行数以查看其运行方式

create table tmptbl as 
select writetofile('DMP_DIR','xyz-'||level||'.xml', xmlelement("x", level).getClobVal()) tmpcol, systimestamp added_at
from dual CONNECT BY LEVEL <= 10; 

3:删除表以重复创建具有更多行的表语句

drop table tmptbl purge; 

我在10秒钟内完成了10k个文件的处理,这将为1000万个文件提供1000秒的处理时间,为5000万个文件提供50000秒的处理时间(即不到14小时)。