如何运行一系列SQL查询并保存结果?

时间:2012-07-04 20:42:50

标签: postgresql navicat psql

在其他统计程序中,可以创建一个日志文件,显示由于命令而发出的输出。是否可以在SQL中执行类似的操作?

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

我正在使用PostgreSQL和Navicat。

2 个答案:

答案 0 :(得分:1)

不了解navicat,但您可以使用psql进行操作。如果您只想临时输出文件,请检查各种--echo-X命令行选项和\o命令。

答案 1 :(得分:1)

plpgsql函数和COPY

一种方法是将SQL脚本放入plpgsql function,您可以在其中将单个返回值写入COPY的文件,并根据需要从中间结果编译报告。< / p>

这具有可能或可能不期望的额外效果。比如,您可以授予或撤销对任意角色的整个功能的权限。请阅读手册中的SECURITY DEFINER。保存函数时将验证语法 - 但是,只是表面上(有计划在将来更改它)。有关此answer on 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;

当然,您需要在数据库和文件系统中拥有必要的权限 从shell调用它:

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个反斜杠。双反斜杠的结果会被解释两次,所以你必须将它们加倍两倍。

我引用the manual关于元命令\o

  

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

\\

  

命令必须是可完全解析的命令字符串   服务器(即,它不包含psql特定的功能)或单个   反斜杠命令。因此,您不能将SQL和psql元命令混合使用   这个选项。要实现这一点,您可以将字符串传递给psql,   像这样:echo'\ x \\ SELECT * FROM foo;' | PSQL。 (\\ 是个   separator meta-command。)