当前位置:  开发笔记 > 后端 > 正文

SQLPlus - 从PL/SQL块假脱机到多个文件

如何解决《SQLPlus-从PL/SQL块假脱机到多个文件》经验,为你挑选了1个好方法。

我有一个查询,将大量数据返回到CSV文件中.事实上,Excel无法打开它 - 行数太多了.有没有办法控制spool在每次处理65000行时假脱机到新文件?理想情况下,我想有我在输出顺序命名的文件,如large_data_1.csv,large_data_2.csv,large_data_3.csv,等...

我可以dbms_output在PL/SQL块中使用来控制输出多少行,但是我如何切换文件,因为spool似乎无法从PL/SQL块访问?

(Oracle 10g)

更新:

我无法访问服务器,因此将文件写入服务器可能无法正常工作.

更新2:

一些字段包含自由格式文本,包括换行符,因此在写入文件后计算换行符并不像在返回数据时计算记录一样简单...



1> FrustratedWi..:

得到了解决方案,不知道为什么我没想到这个...

基本思想是主sqplplus脚本生成一个中间脚本,将输出拆分为多个文件.执行中间脚本将执行多个不同范围的查询rownum,并为每个查询假脱机到另一个文件.

set termout off
set serveroutput on
set echo off
set feedback off
variable v_rowCount number;
spool intermediate_file.sql
declare
     i number := 0;
     v_fileNum number := 1;
     v_range_start number := 1;
     v_range_end number := 1;
     k_max_rows constant number := 65536;
begin
    dbms_output.enable(10000);
    select count(*) 
    into :v_err_count
    from ...
    /* You don't need to see the details of the query... */

    while i <= :v_err_count loop

          v_range_start := i+1;
          if v_range_start <= :v_err_count then
            i := i+k_max_rows;
            v_range_end := i;

            dbms_output.put_line('set colsep ,  
set pagesize 0
set trimspool on 
set headsep off
set feedback off
set echo off
set termout off
set linesize 4000
spool large_data_file_'||v_fileNum||'.csv
select data_string
from (select rownum rn, data_object
      from 
      /* Details of query omitted */
     )
where rn >= '||v_range_start||' and rn <= '||v_range_end||';
spool off');
          v_fileNum := v_fileNum +1;
         end if;
    end loop;
end;
/
spool off
prompt     executing intermediate file
@intermediate_file.sql;
set serveroutput off

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有