是否可以将表的不同行的内容假脱机到不同的文件?
我的表的行数没有固定,它有以下列: 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
将内容保存到不同的文件中?
答案 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
@script.sql;
现在您的文件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程序已成功完成。