COPY е малко странно, тъй като третира query
аргумент като низ, въпреки че не е написан като низ. Резултатът е, че query
:
SELECT * FROM retrieve_info($1, $2)
не се изпълнява в контекста на функцията, изпълнява се в контекста на самото COPY. Въпреки че казвате:
copy (select * from t) ...
третира се по-скоро като че ли си написал:
copy 'select * from t' ...
така че по времето, когато заявката се изпълни, параметрите на функцията вече нямат никакво значение, query
аргументът към COPY може да изглежда така, сякаш би се държал като затваряне на други езици, но не е, той действа по-скоро като низ, който се предава на eval
.
Можете да заобиколите тази странност, като използвате обичайния Kludge of Last Resort:динамичен SQL. Трябва да получите по-добри резултати, ако напишете функцията си да използва спорове на низове и ИЗПЪЛНИТЕ:
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;