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