2017-03-02 13 views
0

私はcrontabを使用してSQLスクリプトを実行しています。以下は私のスクリプトです:列ヘッダーで、クエリの結果だけをエクスポートする方法Crontabを使用して出力形式をSQLplusに変更

enter image description here

:ファイルの

#!/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 

フォーマットは次のように不要なデータO LOFが含まれていますか? (望ましいですcsv形式)

+0

これはcron自体とは関係ありません。コマンド行から同じことを最初に行うことができます。 SQL \ * Plusから実行するスクリプトではなく、crontab自体にSQLが必要な理由はありますか? –

+0

'sqlplusの後ろに' -Suilent'コマンドを 'sqplus -s user/password'として使うことができます。 – 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 availableおよびformatting 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/.... 

をそして、あなたは、SQLを作るために-sフラグを使用することができます*プラスそのバナーを抑制する:ちなみに

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

、あなたが名前にサービスを提供するためにSIDを使用して切り替えることができれば、あなたが代わりにフルTNSは、接続記述子の短絡「簡易接続」構文を使用することができます。

クイックデモと簡単なクエリ。私は、コマンドライン(ちょうどスクロールを防止するために、2つの行に分割)からこれを行う場合:

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への)コマンド全体をシェルスクリプトに入れておけば、cronからシェルスクリプトを呼び出すことができます。

+0

それはほぼ完璧ですが、私はなぜ2行1列に分割するのか分からないのですか? (私は12 colを持っています) – 4est

+0

@ 4est - おそらくちょうどlinesizeを増やす必要があります。私は 'lines 200'を追加しました。出力の1行がどれくらい長く続くかに合わせてその数を調整します。あまりにも高すぎると、これは本当に傷ついていません。 –

+0

多くのおかげでアレックス、ちょうどテストし、awsome作品! :) – 4est

関連する問題