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中解释。
我想创建一个包含来自不同表的数据的自定义变量(字符串)。 我无法在一个查询中完成(特殊存储顺序和动态列)。
有没有办法将变量存储到文件中?
或者使用命令行将一个变量的结果保存到文件中?
因为标签 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中解释。