plpgsql,如何将变量存储到文件中

plpgsql, how to store variable into file

我想创建一个包含来自不同表的数据的自定义变量(字符串)。 我无法在一个查询中完成(特殊存储顺序和动态列)。

有没有办法将变量存储到文件中?

或者使用命令行将一个变量的结果保存到文件中?

因为标签 plpgsql 我假设您正在 plpgsql 函数中执行一些查询,并且保存在变量中的结果应该发送到文件中。

在普通的 SQL 中,您可以使用 copy 命令将文本保存在文件中,如下所示:

copy (select 'some text') to 'c:\data\sample.txt';

在 plpgsql 函数中,您应该使用 execute 命令来 select 变量的值,例如:

create or replace function copy_some_text_to_file(filename text)
returns void language plpgsql
as $$
declare
    var text:= 'some text';
begin
    execute format($fmt$
        copy (select '%s') to '%s'
        $fmt$, var, filename);
end $$;

select copy_some_text_to_file('c:\data\sample.txt')

如果要将多行字符串的变量保存到文件中,可以使用regexp_split_to_table():

create or replace function copy_some_text_to_file(filename text)
returns void language plpgsql
as $$
declare
    var text:= 'first line\nsecond line\nthird line';
begin
    execute format($fmt$
        copy (select regexp_split_to_table(e'%s', e'\n')) to '%s'
        $fmt$, var, filename);
end $$;

注意,字符串不能包含单引号,必须正确转义。虽然在第一个版本中您可以将 '%s' 替换为 %L(如 Erwin 所建议的),但在第二个版本中您不能这样做。

阅读更多:

从 Linux shell 执行 SQL 您可以轻松地将结果重定向到文件:

postgres@db:~$ psql mydb --tuples-only -c 'select 1' > /path/to/myfile.txt

或者对一个文件执行SQL:

postgres@db:~$ psql mydb -t -f /path/to/myscript.sql > /path/to/myfile.txt

或从 psql 内部:

\o /path/to/myfile.txt
\t
SELECT 1;
\o

一切都在the manual for psql中解释。