【问题标题】:Generate XML files from Oracle query从 Oracle 查询生成 XML 文件
【发布时间】:2019-11-03 22:43:28
【问题描述】:

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

谢谢

【问题讨论】:

  • 您要创建 50M 文件吗?这听起来有点奇怪。你到底想完成什么?也许还有其他解决方案。

标签: sql xml oracle performance


【解决方案1】:

我不建议尝试将 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 个文件 - 1M 文件需要 1000 秒,50M 文件需要 50000 秒(即不到 14 小时)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2014-06-14
    • 2012-06-12
    • 1970-01-01
    • 2014-03-22
    • 2013-06-19
    • 2012-06-20
    相关资源
    最近更新 更多