我在函数中有调试消息。这些消息是这样提出的
RAISE NOTICE 'Value of id : %', id;
我设置了我的日志文件 \o messages.txt
然后我做我需要做的 \i process.sql
当执行终止时,\o
.
问题是我没有将通知引发的消息放入messages.txt。消息显示在屏幕上,但我希望它们写在 messages.txt 中
我怎么能那样做?
我尝试使用RAISE LOG...
并将消息写入日志文件...这不是我想要的。
我有一个工作
plsql -f /path/to/process.sql > messages.txt 2>&1
Run Code Online (Sandbox Code Playgroud)
但我想知道如何在 plsql 客户端上使用 \i 和 \o 将消息放入 \o 中指定的文件中
我的 cygwin 客户端是 psql (PostgreSQL) 8.2.11,服务器版本是 9.0.7
恐怕你不会喜欢这个答案,但目前似乎不可能。从psql 文档:
将未来的查询结果保存到文件 filename 或将未来的结果通过管道传输到单独的 Unix shell 中以执行命令。如果未指定参数,则查询输出将重置为标准输出。
“查询结果”包括从数据库服务器获得的所有表、命令响应和通知,以及查询数据库的各种反斜杠命令(如\d)的输出,但不包括错误消息。
正如您所注意到的,psql
交互使用时无法重定向错误消息。
(我一直在尝试从 \o 进行各种重定向但无济于事。看起来查询输出通道与获取错误消息的通道不同 - 甚至来自服务器的错误和在您的程序中引发的错误也有不同的方式.
test=# SHOW client_min_messages;
client_min_messages
---------------------
notice
-- added the above to show it's not a config problem
CREATE FUNCTION raise_test() RETURNS integer AS
$body$
BEGIN
RAISE NOTICE 'notice';
RETURN 1;
END;
$body$
LANGUAGE plpgsql;
test=# \o | cat > out.sql
test=# SELECT raise_test(); -- you could put this in a file and call \i your_file, it's just the same
NOTICE: notice
test=# \o | cat > out.sql 2>&1
test=# SELECT raise_test();
NOTICE: notice
Run Code Online (Sandbox Code Playgroud)
out.sql 包含
raise_test
------------
1
(1 row)
Run Code Online (Sandbox Code Playgroud)
在这两种情况下。这就是为什么我对用于输出从过程中引发的消息的通道/文件描述符一无所知的原因。))
(有一个关于 PostgreSQL 黑客的线程可能会对此问题有所了解:http : //postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html)
什么人可能做的是开始psql
喜欢
psql test >/tmp/psql.out 2>&1
Run Code Online (Sandbox Code Playgroud)
这会将所有输出重定向到指定的文件。唯一的问题是您甚至没有提示,并且失去了命令行编辑功能。
我们可以使用meta命令直接从psql执行shell命令\!
。
用户@db=# \! psql -U user -h localhost your_db -e '选择 your_function()' &> debug.txt
打开debug.txt
用\e
。
本地主机:5432 user@db=# \e debug.txt
引发消息将显示在您的默认编辑器中。有点棘手,但对于命令行爱好者来说仍然很方便。
归档时间: |
|
查看次数: |
30226 次 |
最近记录: |