関数からcopy
コマンドを実行しています
execute 'copy (select * from tableName) to ''/tmp/result.txt'''
正常に動作します。しかし、tableName
は動的であり、より多くのテーブルを持っています(ループで繰り返す)。 result.txt
は最後の反復(テーブル)データのみを持っています。
必要に応じて、コマンドラインから\o
または>>
ファイルに追加する。しかし、私は関数を使用する必要があります。
私は http://shuber.io/reading-from-the-filesystem-with-postgres/ を読みます。一時テーブルを使用するソリューションを提案します。一時テーブルなしで同様のことを行うことはできますか? (アーカイブログは避けなければなりません)。一時テーブルを作成するとアーカイブログが作成されますか?
関数でcopy
コマンドを使用して追加する方法はありますか?
Unixシステムを想定
プログラムとしてcat
を指定したPROGRAM句を使用します。
execute 'copy (select * from tableName) to PROGRAM ''cat >>/tmp/result.txt'''
これにより、ファイルを上書きする代わりに、/tmp/result.txt
の末尾に結果が追加されます。
名前付きパイプは、別のプロセスで結果を連結するために使用できます。例:
$ mkfifo /tmp/pgfifo
$ while true; do cat /tmp/pgfifo >>/tmp/result.txt; done
この最後のコマンドはブロックします。すべての結果が蓄積されるまで実行し、^ Cまたはkillで終了できます。
SQLでは、fifoに以下を供給する必要があります。
execute 'copy (select * from tableName) to ''/tmp/pgfifo'''
私はあなたが(簡単に)それを行うことはできないと思います(少なくともあなたのPostgreSQLバージョンでは、ダニエルの answer を見てください)。ただし、確実にできることはアプローチを変更することであり、COPY
のクエリ部分にあるすべてのテーブルからUNION ALL
を実行します。つまり、ループは発生しませんが、収集したテーブル名からクエリを作成する必要があります。
結果は次のようになります
COPY (SELECT * FROM table1
UNION ALL
SELECT * FROM table2
...)
TO tmp/result.txt;
注:
psql
関数などはありません。 psql
はPostgreSQLのクライアントです。ただし、組み込みコマンド(基本的には\
で始まるすべてのもの)があります。