我想在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会话或重新排序选择。
答案 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.txt
和temp_2.txt
会留下您想要的内容。如果你在Windows上,当然是不同的方法。
或者,您可以在PL / SQL块中运行查询,并使用UTL_FILE
将结果写入两个打开文件中的一个或两个。但这需要更多工作,并且会在服务器上编写文件 - 因此您需要对DIRECTORY
对象进行写入权限,并访问指向的底层文件系统目录以便检索文件