Как передать параметр в команду pgsql внутри функции? - PullRequest
1 голос
/ 11 февраля 2012

Я часто использую функцию копирования в postgresql и думал, что создам функцию, чтобы использовать ее. Допустим, у меня есть следующая таблица

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 Ответ

3 голосов
/ 11 февраля 2012

Вы можете сделать это с 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;

Не забудьте использовать quote_literal на filepath на всякий случай,Вы также можете использовать долларовые котировки, если вам не нравятся все двойные одинарные кавычки:

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;

Но я считаю, что долларовые котировки довольно уродливы для всего, кроме блоков текста.

...