我经常在postgresql中使用copy函数,我想我会创建一个函数来使用它。 所以,假设我有下表
create table users
(
userid serial primary key,
prefix varchar(10) not null,
firstname varchar(255) not null,
lastname varchar(255) not null,
email varchar(500) not null,
password varchar(255) not null,
created timestamp not null,
modified timestamp not null
);
以及以下功能
create function getUsersCSV( )
RETURNS void AS
$BODY$
BEGIN
COPY (select * from users)
TO 'c:\temp\users.csv'
WITH HEADER
CSV QUOTE '"' DELIMITER ',';
END
$BODY$
LANGUAGE PLPGSQL;
功能有效但如果我将功能更改为
create function getUsersCSV( filepath varchar )
RETURNS void AS
$BODY$
BEGIN
COPY (select * from users)
TO filepath
WITH HEADER
CSV QUOTE '"' DELIMITER ',';
END
$BODY$
LANGUAGE PLPGSQL;
它会引发以下语法错误 错误:“filepath”或附近的语法错误 SQL状态:42601
是否有参数化复制命令的目标值?
答案 0 :(得分:3)
您可以使用execute
:
create function get_users_csv(filepath text) returns void as $$
declare
cp_cmd text;
begin
cp_cmd := 'copy (select * from users) to '
|| quote_literal(filepath)
|| ' with header csv quote ''"'' delimiter '',''';
execute cp_cmd;
end;
$$ language plpgsql;
请勿忘记在filepath
上使用quote_literal
以防万一。如果你不喜欢所有加倍的单引号,你也可以使用美元报价:
create function get_users_csv(filepath text) returns void as $$
declare
cp_cmd text;
begin
cp_cmd := $q$copy (select * from users) to $q$
|| quote_literal(filepath)
|| $q$ with header csv quote '"' delimiter ','$q$;
execute cp_cmd;
end;
$$ language plpgsql;
但我发现美元报价对于除文本块以外的任何内容都相当丑陋。