如何将单元格压缩到不同的文件?

时间:2015-06-08 20:19:14

标签: oracle oracle10g sqlplus

是否可以将表的不同行的内容假脱机到不同的文件?

我的表的行数没有固定,它有以下列: ID,NAME,CONTENT_TO_SPOOL

我想每行创建一个输出文件,将CONTENT_TO_SPOOL假脱机到名为NAME.txt的文件

这是我想要实现的一些伪代码:

FOR row IN SELECT * FROM MyTABLE LOOP
   spool row.NAME.txt
       dbms_output.put_line(row.CONTENT_TO_SPOOL);
   spool OFF
END LOOP;

我意识到SPOOL是SQL PLUS的一部分,而FOR LOOP是PL / SQL构造,所以我的伪代码不起作用。 我无法写入服务器,因此UTL_FILE是不可能的。

有没有办法在SQL PLUS中遍历行并使用SPOOL将内容保存到不同的文件中?

2 个答案:

答案 0 :(得分:1)

伪代码并没有说清楚你想要什么,但是这里...... [/ p>

此方法的工作原理是从数据生成脚本,以便为每个不同的NAME使用嵌入的假脱机命令重新查询数据。

set lines 200
set trimspool on
set head off pages 0
-- may need more set stuff to ensure output is clean
spool run_query.sql
select distinct 'spool ' || name || '.txt' || chr(10) ||
                'select content_to_spol from mytable where name = ''' || name || ''';' || chr(10) ||
                'spool off' cmd
from mytable;
spool off
@run_query.sql

答案 1 :(得分:1)

我可以想到一种方法是在SQL Plus中执行此操作。不好,但它的工作原理:1。使用以下内容创建script.sql

set serveroutput on
spool step1.log
declare
begin
  for rec in (select rownum as id, col_a, col_b from mytable)
  loop
    dbms_output.put_line('spool file_'||rec.id||'.log');
    dbms_output.put_line('select '''||rec.col_a|| ''' as vchar_col , '||rec.col_b|| ' as num_col from dual;');
    dbms_output.put_line('spool off');
end loop;
end;
/
spool off
  1. @script.sql;
  2. 现在您的文件step1.log包含以下内容:

    spool file_1.log
    选择'a'作为vchar_col,选择4作为num_col来自dual;
    阀芯关闭 spool file_2.log
    选择'b'作为vchar_col,44作为num_col来自dual;
    假脱机

    PL / SQL程序已成功完成。

    1. 删除最后一行(PL / SQL过程成功完成)并执行@ step1.log
    2. 创建
    3. file_1.log和file_2.log等...每个包含一行表mytable