【问题标题】:How to run a sequence of SQL queries and save the results?如何运行一系列 SQL 查询并保存结果?
【发布时间】:2012-07-04 20:42:50
【问题描述】:

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

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

我正在使用 PostgreSQL 和 Navicat。

【问题讨论】:

    标签: postgresql navicat psql


    【解决方案1】:

    plpgsql函数和COPY

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

    这具有可能或可能不理想的附加效果。就像,您可以授予或撤销对任意角色的整个函数的权限。阅读手册中的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;
    

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

    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

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

    \\:

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

    【讨论】:

    • 这可能是我收到的最令人惊奇的 stackoverflow 答案......非常感谢! :)
    【解决方案2】:

    不知道navicat,但是你可以用psql来做。如果您只想临时输出到文件,请检查各种 --echo-X 命令行选项和 \o 命令。

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多