COPY est un peu étrange car il traite en quelque sorte sa query
argument sous forme de chaîne même s'il n'est pas écrit en tant que chaîne. Le résultat est que la query
:
SELECT * FROM retrieve_info($1, $2)
n'est pas exécuté dans le contexte de la fonction, il est exécuté dans le contexte de COPY lui-même. Même si vous dites :
copy (select * from t) ...
il est davantage traité comme si vous écriviez :
copy 'select * from t' ...
donc au moment où la requête est exécutée, les paramètres de la fonction n'ont plus aucun sens, la query
l'argument de COPY peut sembler se comporter comme une fermeture dans d'autres langages mais ce n'est pas le cas, il agit plus comme une chaîne qui est passée à eval
.
Vous pouvez contourner cette étrangeté en utilisant l'habituel Kludge of Last Resort :le SQL dynamique. Vous devriez obtenir de meilleurs résultats si vous écrivez votre fonction pour utiliser le string wrangling et 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;