在Oracle 11g中使用Spool

时间:2014-01-31 10:31:29

标签: oracle oracle11g spool

我想在Oracle 11g中使用假脱机功能。

我希望将整个输出假脱机到文件中,并将输出的子集假脱机到单独的文件中。

在下面的示例中,我希望temp_1.txt包含来自A,B,C,D和E的数据

temp_2.txt中,我只想要D的数据。

sqlplus user/pass@inst

spool on temp_1.txt    
select * from A;
select * from B;
select * from C; 
spool on temp_2.txt
select * from D;
spool off temp_2.txt
select * from E;

exit;

注意: - 由于这是非常古老的遗留代码,我无法为D编写单独的sqlplus会话或重新排序选择。

2 个答案:

答案 0 :(得分:3)

如何在sqlplus脚本中完成所有操作。如果您在不同的系统(即Microsoft Windows)上运行,则需要更改主机命令。但是,他们也需要更改shell脚本。

spool all_queries.txt
select * from A;
select * from B;
select * from C;
spool off

spool only_d_query.txt
select * from D;
spool off

host cat only_d_query.txt >>all_queries.txt

spool all_queries.txt append
select * from E;
spool off

答案 1 :(得分:2)

你做不到。 The SPOOL command一次只允许一个打开的文件;你的第二个命令,spool temp_2.txt(没有on)会在打开并开始写入第二个文件之前关闭第一个文件。并且off不会采用任何其他参数。

Usage: SPOOL { <file> | OFF | OUT }
where <file> is file_name[.ext] [CRE[ATE]|REP[LACE]|APP[END]]

一种解决方案是将语句的输出假脱机到不同的文件:

spool temp_1.txt
select * from A;
select * from B;
select * from C;
spool temp_2.txt
select * from D;
spool temp_3.txt
select * from E;
spool off

...然后将所有三个文件合并为一个来自操作系统的文件,以获取“主”输出文件,同时仍然单独保留D-only文件。 e.g:

cat temp_2.txt >> temp_1.txt
cat temp_3.txt >> temp_1.txt
rm temp_3.txt`

如果我理解正确的话,那么temp_1.txttemp_2.txt会留下您想要的内容。如果你在Windows上,当然是不同的方法。

或者,您可以在PL / SQL块中运行查询,并使用UTL_FILE将结果写入两个打开文件中的一个或两个。但这需要更多工作,并且会在服务器上编写文件 - 因此您需要对DIRECTORY对象进行写入权限,并访问指向的底层文件系统目录以便检索文件