2016-06-13 4 views
-2

私はbashシェルから起動され、次の(マッサージ)psqlのスクリプトがあります。psqlクエリからstdoutにテキストを出力するにはどうしたらいいですか?

foo=$(psql -q -t -R $'\x01' -F $'\x02' \ 
       --variable="title=something" \ 
       --variable="severity=level9" \ 
       --pset='format=unaligned' \ 
       <<'EOF' 
SET standard_conforming_strings=on; 
SET myvars.title = :title; 
SET myvars.severity = :severity; 
DO $$ 
BEGIN 
     IF EXISTS (SELECT 1 from my_database 
       WHERE title=current_setting('myvars.title') \ 
       AND severity=current_setting('myvars.severity')) 
     THEN 
       RAISE NOTICE 'Found existing entry'; 
     ELSE 
       RAISE NOTICE 'Did not find existing entry'; 
     END IF; 
END; 
$$; 
EOF 
) 

私はbashの変数「foo」というクエリが成功したかどうかのいくつかの兆候でキャプチャすることを望んでいました。どのRAISE NOTICEステートメントの後にも、psqlステートメントから0または1を出力するような印刷/エコー/リターン/何らかのステートメントを追加できると思ったので、後でbashスクリプトで評価するためにfooにキャプチャできます。

foo=$(psql -q -t -R $'\x01' -F $'\x02' \ 
       --variable="title=something" \ 
       --variable="severity=level9" \ 
       --pset='format=unaligned' \ 
       <<'EOF' 
SET standard_conforming_strings=on; 
SET myvars.title = :title; 
SET myvars.severity = :severity; 
DO $$ 
BEGIN 
     IF EXISTS (SELECT 1 from my_database 
       WHERE title=current_setting('myvars.title') \ 
       AND severity=current_setting('myvars.severity')) 
     THEN 
       RAISE NOTICE 'Found existing entry'; 
       magical_incantation 1; 
     ELSE 
       RAISE NOTICE 'Did not find existing entry'; 
       magical_incantation 0; 
     END IF; 
END; 
$$; 
EOF 
) 

私は過去5時間程度のためpsqlドキュメントを読んでいると、上記の私の想像magical_incantationのコマンド/構文を把握することはできません。

私はpsqlには新しく、他の人のコードを調整しています。私はスクリプトの主な構造を変更することはできません、私はちょうど値を印刷するためのいくつかの方法が必要です。

誰でも正しい方向に向けることができますか?

答えて

1

\echo psqlでstdoutに出力します。私はRAISE NOTICEがstderrに行くと思う。

psql変数を選択してエコーすることは可能です。基本的なランダウンはHow do you use script variables in PostgreSQL?

ですが、現在のところ、クエリ結果を変数にプルする方法がわかりません。

SELECT (EXISTS (....))::int; 
-- true is 1, false is 0 

注意あなたがしなければならないので、DO声明からこれを行う方法はありません:それはちょうどSELECT.

だから、何かのようにあなたが探している答えがされていないと仮定すると

plpgsqlからこれを行う必要がある場合は実際に関数を作成します。

+0

私は '\ echo '1';'(引用符をつけたものとしないもの)を試してみたところ、 '\'に構文エラーがありました。私はpsqlコマンドの最後に '2>&1'を追加しようとしましたが、RAISE NOTICEの出力をキャプチャしませんでした(これは正しい方法ではないようです)。私はどのように変数にクエリ結果をキャプチャするかを理解することができませんでしたが、私はまだ変数の内容を印刷する方法を見つけることができませんでした。私は幸運を伴わずに「SELECT ...」の様々なフレーバーを試しました。もし私があなたが示唆したようにしたら、私はどのようにRAISE NOTICEを組み込むのか分かりません。しかし、ありがとう。 –

+1

\ echoは* psql *コマンドであり、postgresqlコマンドではありません(フロントエンドで、バックエンドではありません)。告発はあなたが望むものではありません。両方を実行する場合は、実際の関数を定義し、そこから選択します。 psqlから直接psql標準出力に書き込むことはできません。結果を選択できるようなもの、つまり関数が必要です。 –

+0

私はちょうど選択コマンド 'SELECT 1 from my_database WHERE title = current_setting( 'myvars.title')とseverity = current_setting( 'myvars.severity')で' DO $$ 'から' $$; 'までのすべてを置き換えました。それはうまくいきましたが、もちろん私はRAISE NOTICEをあきらめなければなりませんでした。ある日、私は座って本当にこのコマンド/言語を学ばなければならないでしょうが、今は私が進める必要があるものを持っています - あなたの助けに感謝します。 –

関連する問題