他の統計プログラムでは、コマンドの結果として発行された出力を示すログファイルを作成することができます。SQLで同様のことを行うことは可能ですか?
特に、多くのクエリを含む単一の.sqlファイルを作成し、各結果をテキストファイルに出力したいと思います。
私はPostgreSQLとNavicatを使用しています。
他の統計プログラムでは、コマンドの結果として発行された出力を示すログファイルを作成することができます。SQLで同様のことを行うことは可能ですか?
特に、多くのクエリを含む単一の.sqlファイルを作成し、各結果をテキストファイルに出力したいと思います。
私はPostgreSQLとNavicatを使用しています。
navicatについてはわかりませんが、psqlを使用して実行できます。ファイルに一時的に出力するだけの場合は、さまざまな--echo-X
コマンドラインオプションとコマンドを確認してください。\o
1つの方法は、SQLスクリプトをplpgsql関数に配置することです。この関数では、ファイルに個々の戻り値を書き込み、COPY
必要に応じて中間結果からレポートをコンパイルできます。
これには、望ましい場合と望ましくない場合がある追加の効果があります。同様に、関数全体に対する権限を任意の役割に付与または取り消すことができます。SECURITY DEFINER
マニュアルでお読みください。また、関数を保存するときに構文が検証されますが、表面的にのみです(将来的に変更する予定です)。dba.SEに関するこの回答の詳細。
基本的な例:
CREATE OR REPLACE FUNCTION func()
RETURNS void AS
$BODY$
BEGIN
COPY (SELECT * FROM tbl WHERE foo) TO '/path/to/my/file/tbl.csv';
COPY (SELECT * FROM tbl2 WHERE NOT bar) TO '/path/to/my/file/tbl2.csv';
END;
$BODY$
LANGUAGE plpgsql;
もちろん、データベースとファイルシステムで必要な権限を持っている必要があります。
シェルから呼び出します。
psql mydb -c 'SELECT func();'
#!/bin/sh
BASEDIR='/var/lib/postgresql/outfiles/'
echo "
\\o $OUTDIR/file1.txt \\\\\\\\ SELECT * FROM tbl1;
\\o $OUTDIR/file2.txt \\\\\\\\ SELECT * FROM tbl2;
\\o $OUTDIR/file3.txt \\\\\\\\ SELECT * FROM tbl3;" | psql event -p 5432 -t -A
そうです、8つの円記号。2回解釈される二重の円記号の結果であるため、2回解釈する必要があります。
メタコマンドに関する マニュアルを引用します\o
:
今後のクエリ結果をファイルfilenameまたは..に保存します。
および\\
:
コマンドは、サーバーによって完全に解析可能な(つまり、psql固有の機能が含まれていない)コマンド文字列か、単一の円記号コマンドのいずれかである必要があります。したがって、SQLとpsqlのメタコマンドをこのオプションと混在させることはできません。これを実現するには、次のように文字列をpsqlにパイプします。echo'\ x \\ SELECT * FROM foo;' | psql。(\\は区切り文字のメタコマンドです。)