我想创建一个包含来自不同表的数据的自定义变量(字符串)。 我无法在一个查询中执行此操作(特殊订单存储和动态列)。
有没有办法将变量存储到文件中?
或使用命令行将一个变量的结果保存到文件中?
答案 0 :(得分:3)
由于标记plpgsql
,我假设你在plpgsql函数中执行一些查询,并且保存在变量中的结果应该发送到文件。
在纯SQL中,您可以使用copy
命令将文本保存在文件中,如下所示:
copy (select 'some text') to 'c:\data\sample.txt';
在plpgsql函数中,您应该使用execute
命令来选择变量的值,例如:
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建议的那样),但在第二个版本中则无法执行此操作。
了解更多:
答案 1 :(得分:1)
从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中解释。