暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 创建SQL以获取表的所有记录并将其分块以写入平面文件。

askTom 2017-02-15
765

问题描述

嗨,

我想创建SQL来获取表的所有记录,并将它们块起来写入平面文件。
假设以一个例子为例,如果表内容2000记录,则写入sql以获取所有记录并将1000记录写入一个平面文件中,其他1000记录写入另一个平面文件中。

我是Oracle的新手。如果有人帮我,我很感激。

专家解答

如果这是将数据下载到您的计算机的一次性过程,那么我会使用SQL Developer或SQLcl。

这使您能够通过在SQL查询中放置注释来以给定格式 (csv,json,xml,...) 输出数据。然后,您可以使用前N个查询一次对结果1000行进行假脱机:

exec :st := 1;
exec :en := 1000;
spool file_1.txt
select /*csv*/* from (
  select t.*, 
        row_number() over (order by ...) rn
 from t
)
where rn between :st and :en;
spool off

exec :st := 1001;
exec :en := 2000;
spool file_2.txt
select /*csv*/* from (
  select t.*, 
        row_number() over (order by ...) rn
 from t
)
where rn between :st and :en;
spool off
...
复制


显然,您可以编写一个脚本,调用上述传递参数的文件名和开始/结束。

您可以在以下位置阅读有关格式化输出的更多信息:

http://www.thatjeffsmith.com/archive/2012/05/formatting-query-results-to-csv-in-oracle-sql-developer/

和前N个查询:

http://www.oracle.com/technetwork/issue-archive/2007/07-jan/o17asktom-093877.html

或者在12c上,您可以使用fetch first语法:

http://www.oracle.com/technetwork/issue-archive/2013/13-sep/o53asktom-1999186.html

如果这将是一个重复的过程和/或您想将文件写入数据库服务器,我会创建一个PL/SQL过程:

-批量收集一次1,000行的数据
-每次使用utl_file将其写入新文件

例如:

declare
  cursor cur is 
    select ...
    from   ...
    order  by ...;
  
  type tp is table of cur%rowtype index by binary_integer;
  arr  tp;
begin
  open cur;
  loop
    fetch cur bulk collect into arr limit 1000;
    ... process to write file ...
    exit when arr.count = 0;
  close cur;
end;
/
复制


您可以在以下位置找到使用UTL_file的示例:

https://oracle-base.com/articles/9i/generating-csv-files#custom-plsql
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论