COPY è un po' strano in quanto tratta la sua query
argomento come una stringa anche se non è scritto come una stringa. Il risultato è che la query
:
SELECT * FROM retrieve_info($1, $2)
non viene eseguito nel contesto della funzione, viene eseguito nel contesto di COPY stesso. Anche se dici:
copy (select * from t) ...
è trattato più come se tu scrivessi:
copy 'select * from t' ...
quindi quando la query viene eseguita, i parametri della funzione non hanno più alcun significato, la query
l'argomento in COPY può sembrare che si comporti come una chiusura in altri linguaggi ma non è così, si comporta più come una stringa che viene passata a eval
.
Puoi aggirare questa stranezza usando il solito Kludge di Last Resort:SQL dinamico. Dovresti ottenere risultati migliori se scrivi la tua funzione per utilizzare la modifica delle stringhe ed ESEGUI:
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;