キーワード:PL/pgSQL,RAISE,NOTICE,標準出力,リダイレクトできない
PL/pgSQLのRAISEメッセージは、普通にリダイレクトを使用してもファイルに出力されません。
この問題に対する対処方法を説明します。
1.結論
標準エラー出力を対象にリダイレクトします。
例1:
psql -U postgres -f foo.sql 2> foo.log
例2:
psql -U postgres -f foo.sql > foo.log 2>&1
2.環境
・OS:Windows
・コンソール:コマンドプロンプト
・DB:PostgreSQL 14.7
3.解説
標準出力には以下の2種類があります。
・標準出力(非エラー)
・標準エラー出力
PL/pgSQLのRAISEメッセージは、この内「標準エラー出力」に分類されており、標準出力(非エラー)のリダイレクト対象になりません。
4.実行例
SQLファイル「foo.sql」
SET CLIENT_ENCODING TO 'UTF8';
DO $$
declare
begin
RAISE NOTICE 'test message.';
end;
$$ language plpgsql;
4.1.標準出力(非エラー)を対象にリダイレクトした場合
コマンド
psql -U postgres -f foo.sql > foo.log
実行結果(コンソール)
RAISEメッセージがリダイレクトされず、コンソールに出力されます。
psql:foo.sql:8: NOTICE: test message.
実行結果(出力ファイル「foo.log」)
SET実行ログ等がリダイレクトされます。
SET
DO
4.2.標準エラー出力を対象にリダイレクトした場合
コマンド
psql -U postgres -f foo.sql 2> foo.log
実行結果(コンソール)
SET実行ログ等がリダイレクトされず、コンソールに出力されます。
SET
DO
実行結果(出力ファイル「foo.log」)
RAISEメッセージがリダイレクトされます。
psql:foo.sql:8: NOTICE: test message.
補足
標準出力(非エラー)、標準エラー出力の両方をリダイレクトしたい場合は、以下の方法を取る。
psql -U postgres -f foo.sql > foo.log 2>&1