2013-03-28 66 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