2017-03-02 54 views
0

我使用crontab來運行SQL腳本。下面是我的腳本:使用Crontab將輸出格式更改爲SQLplus

#!/bin/sh 
export ORACLE_HOME=/opt/xxx/oracle/client 
date=$(date +%d.%m.%y-%T) 
echo "select col1, col2 from table1;" |/opt/xxx/oracle/client/bin/sqlplus "abc/[email protected](DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=111.0.0.1)(Port=9999))(CONNECT_DATA=(SID=sidX)))" > /usr/users/tuser/temp/file.$date.txt 

文件格式包含LOFØ類似不必要的數據:

enter image description here

如何導出只是結果和列標題的查詢? (最好是csv格式)

+0

這與cron本身無關。您可以先從命令行執行相同的操作。是否有你想在crontab本身中使用SQL的原因,而不是從SQL \ * Plus執行的腳本中? –

+0

您可以在'sqlplus'作爲'sqplus -s用戶/密碼'後使用'-S'命令。 – JSapkota

+0

我有理由 - 該腳本將一次執行 – 4est

回答

1

您可以在回顯字符串中包含SQL * Plus set命令,但也需要嵌入新行;從回聲切換到printf可能會使這個更簡單/清理程序。

然後可以拼接你的列用逗號獲得CSV輸出:

printf "set pages 0 lines 200 trimout on tab off feedback off\nselect col1||','||col2 from table1;exit" | /opt/.... 

根據您的意見,我還增加了行大小。 You can read more about the settings availableformatting in general

如果您的列包含可能包含逗號的字符串,則可以將它們的值用雙引號引起來,這樣可以避免它們被Excel或其他工具誤解爲額外的列。

如果你想CSV頭,以及你可以有一個虛擬的查詢來獲取他們,或使用提示命令添加固定文本:

printf "set pages 0 lines 200 trimout on tab off feedback off\nprompt COL1,COL2\nselect col1||','||col2 from table1;exit" | /opt/.... 

而且你可以使用-s標誌,使SQL *加抑制其橫幅:

... exit" | /opt/xxx/oracle/client/bin/sqlplus -s "abc/[email protected]" 

順便說一句,如果你可以使用SID爲服務名切換,你可以使用短「易連接」的語法,而不是完整TNS連接描述符。

使用簡單查詢進行快速演示;如果我這樣做的命令行(分成兩行只是爲了防止滾動):

printf "set pages 0 feedback off\nprompt Col1,Col2\nselect dummy||','||dummy from dual;" |\ 
    /path/to/sqlplus -s myuser/[email protected]//myhost:myport/myservicename 

整個輸出我得到的是:

Col1,Col2 
X,X 

我會認真考慮把至少SQL命令到一個.sql腳本文件並從SQL * Plus執行;並且可能將整個命令(調用執行腳本的sqlplus)放到shell腳本中 - 然後您可以從cron調用shell腳本。

+0

它幾乎是完美的,但我不知道爲什麼從2行分開一行? (我有12列) – 4est

+0

@ 4est - 你可能只需要增加行數;我添加了'200行',調整該數字以匹配單行輸出可能會持續多久。過高並不會真的傷害到這一點。 –

+0

非常感謝亞歷克斯,只是測試和工作awsome! :) – 4est