2013-03-28 144 views
0

我的脚本正在将某些查询的输出后台处理为文本文件。SQLPlus尾随空白问题

set linesize 200 
set trimspool on 
.... 

spool "C:\someFile.txt" 
SELECT rpad(field1, 50)||rpad(field2, 50) FROM table1; 
SELECT rpad(field3, 200) FROM table2; 
spool off 

我想是在查询1中的每一行输出为100个字符,包括结尾的空白,并在查询2中的每一行输出为200个字符,包括尾随空白。

如果trimspool已关闭,则每行都有200个字符,这不是我想要的。如果它打开,那么在field3只有10个字符长的情况下,输出文件中该行的长度只有60个字符(它需要为100)。每行需要固定长度,因为该文件将被发送到外部服务器,并且将基于假定它是固定长度进行分析。

有没有办法避免修剪我明确输出的空白?

回答

2

这将工作:

set trimspool off 
spool "C:\someFile.txt" 
set linesize 100 
SELECT rpad(field1, 50)||rpad(field2, 50) FROM table1; 
set linesize 200 
SELECT rpad(field3, 200) FROM table2; 
spool off 

输出包括命令本身,所以如果你想摆脱那些和仅包含查询结果,把所有的命令脚本文件,只是执行脚本文件。还要将这些添加到脚本的顶部:

set echo off 
set termout off 
set pagesize 0 
set feedback off 
+0

太好了,谢谢!我不知道你可以像这样在整个过程中使用set。有一种情况不适用于我:'SELECT CASE when field1 = 1 THEN rpad(field2,50)ELSE rpad(field3,200)END END FROM table1'。你知道是否有可能为该查询获得某些功能,以便行数为50或200个字符,而不是总是200? – DiscoInfiltrator

+0

我不知道有什么办法来改变从一个记录到下一个记录的宽度。基本问题是'SELECT'是一个Oracle命令,'SET LINESIZE'是SQL * Plus命令。当“SELECT”正在“Oracle世界”中进行时,您无法接触到“SQL * Plus”世界来切换线路大小。如果你不能使用修剪过的行或一组长度为100,然后是一组长度为200的文件,那么你需要一种新的方法,比如之后对文件进行调整,或者编写一个使用'UTL_File'的存储过程库,或C/Java/C#/ PHP /任何程序将查询和写入。 –

+0

是的,这就是我的想法。没有问题。 – DiscoInfiltrator