3

シェル スクリプトを使用してクエリの結果をデータベースにアップロードしています。スクリプトでは、まずクエリの結果を csv ファイルに保存してから、そのファイルを別のデータベースにアップロードします。各ステップの後、通知メールをユーザーに送信します。私が直面している問題は、適切なエラー処理を行うことができないことです。たとえば、次のようなコマンドを使用して csv ファイルを生成します。

/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -o "/data/test.csv" -c "select count(*), month from table1 group by month" 

ディレクトリ「data」が存在しない場合でも、クエリ結果が画面に表示されるため、Unix の終了ステータスは 0 (エラーが発生しても操作は成功) を返します。このようなエラーをどのように処理できますか? スクリプトでキャプチャするには、どのような IF ステートメントを使用する必要がありますか?

どうもありがとう!

4

4 に答える 4

3

これはトリッキーです。

Verticavsqlには変数がON_ERROR_STOPあり、設定するとスクリプトが停止し、エラー コード 3 が返されます。

\set ON_ERROR_STOP on

つまり、 -o オプションを使用しても、エラーは SQL 側にないため、この動作はトリガーされないようです。

その場合、私が提案するのは、Vertica に依頼する代わりに、ごまかして出力をリダイレクトすることです。

/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -A -F, -c "select count(*), month from table1 group by month" > /data/test.csv

csv のような出力を作成するための -F および -A オプションに注意してください。-q (quiet) も同様に、クエリ出力のみを表示し、メッセージを表示しないようにすることができます。

次に、宛先ファイルが存在しない場合は、bash の非 null 終了ステータスが表示されます。

[me@server ~]$/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -A -F, -c "select count(*), month from table1 group by month" > /data/test.csv
-bash: /data/test.csv: No such file or directory
[me@server ~]$ echo $?
1

それ以降は、bash と Vertica の両方をキャッチして、リターン コードを簡単に確認できます。

# your vsql command....
STATUS=$?
if [[ $STATUS -gt 0 ]]
then
    echo oops
    exit
fi

クエリと出力ファイルが多数ある場合は、引数としてクエリと出力ファイルを取る関数を作成することもあるでしょう。

于 2013-09-13T06:05:59.277 に答える
0

私は同様の問題を抱えており、それに取り組む簡単な方法を見つけました。クエリが失敗すると、結果の csv ファイルのサイズが実際には 0 になることに気付きました。結果の csv ファイルのサイズが 0 であるかどうかを確認できます。

vsql -c "クエリ コマンド" -o "/location/of/results"

if [[ -s "/location/of/results" ]]; それから
    some_other_command
フィ
于 2013-11-19T06:37:27.317 に答える
0

さらに、このエラーが発生した場合:ERROR 5286: Unsupported SET option ON_ERROR_STOP

vsql次のオプションを使用できます。vsql -v ON_ERROR_STOP=on

于 2017-10-13T20:20:19.840 に答える