COPY é um pouco estranho, pois trata sua
query
argumento como uma string mesmo que não seja escrito como uma string. O resultado é que a query
:SELECT * FROM retrieve_info($1, $2)
não é executado no contexto da função, é executado no contexto da própria COPY. Mesmo que você diga:
copy (select * from t) ...
é tratado mais como se você escrevesse:
copy 'select * from t' ...
então, no momento em que a consulta é executada, os parâmetros da função não têm mais significado, a
query
argumento para COPY pode parecer que se comportaria como um encerramento em outras linguagens, mas não funciona, ele age mais como uma string que é passada para eval
. Você pode contornar essa estranheza usando o habitual Kludge of Last Resort:SQL dinâmico. Você deve obter melhores resultados se escrever sua função para usar string wrangling e EXECUTE:
create or replace function print_out(text, text) returns void as $$
begin
execute 'copy ('
|| 'select * from retrieve_info'
|| '(' || quote_literal($1) || ',' || quote_literal($2) || ')'
|| ') to ''myfilepath/test.csv'' with csv header;';
end;
$$ language plpgsql;