COPY je trochu zvláštní, protože tak nějak zachází se svým query
argument jako řetězec, i když není zapsán jako řetězec. Výsledkem je query
:
SELECT * FROM retrieve_info($1, $2)
není spuštěn v kontextu funkce, je spuštěn v kontextu samotné COPY. I když říkáte:
copy (select * from t) ...
zachází se s tím spíše, jako byste napsali:
copy 'select * from t' ...
takže v době, kdy je dotaz vykonán, parametry funkce již nemají žádný význam, query
argument pro COPY může vypadat, že by se choval jako uzávěr v jiných jazycích, ale nechová se, chová se spíše jako řetězec, který je předán do eval
.
Tuto podivnost můžete obejít pomocí obvyklého Kludge of Last Resort:dynamického SQL. Měli byste dosáhnout lepších výsledků, pokud napíšete svou funkci tak, aby používala hádání řetězců a 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;