1

在其他统计程序中,可以创建一个日志文件来显示作为命令的结果发出的输出。是否可以在 SQL 中做类似的事情?

特别是,我希望有一个包含许多查询的单个 .sql 文件,然后将每个结果输出到一个文本文件。

我正在使用 PostgreSQL 和 Navicat。

4

2 回答 2

1

Don't know about navicat, but you can do it with psql. Check the various --echo-X command-line options and the \o command if you just want temporary output to a file.

于 2012-07-04T21:40:34.653 回答
1

plpgsql 函数和 COPY

一种方法是将 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();'

psql 在元命令和 SQL 之间切换

#!/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个反斜杠。双反斜杠的结果会被解释两次,因此您必须将它们加倍。

我引用了有关元命令 的手册\o

将未来的查询结果保存到文件 filename 或 ...

\\

command 必须是服务器完全可解析的命令字符串(即,它不包含特定于 psql 的功能),或者是单个反斜杠命令。因此,您不能将 SQL 和 psql 元命令与此选项混合使用。为此,您可以将字符串通过管道传输到 psql,如下所示: echo '\x \\ SELECT * FROM foo;' | psql。(\\ 是分隔符元命令。)

于 2012-07-04T22:45:33.557 回答