如何将参数传递给函数中的pgsql命令?

时间:2012-02-11 03:28:11

标签: function postgresql plpgsql

我经常在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

是否有参数化复制命令的目标值?

1 个答案:

答案 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;

但我发现美元报价对于除文本块以外的任何内容都相当丑陋。