COPY jest nieco dziwne, ponieważ traktuje swoje query
argument jako łańcuch, nawet jeśli nie jest zapisany jako łańcuch. W rezultacie query
:
SELECT * FROM retrieve_info($1, $2)
nie jest wykonywany w kontekście funkcji, jest wykonywany w kontekście samej kopii. Nawet jeśli mówisz:
copy (select * from t) ...
jest to traktowane bardziej tak, jakbyś napisał:
copy 'select * from t' ...
więc do czasu wykonania zapytania parametry funkcji nie mają już żadnego znaczenia, query
argument do COPY może wyglądać tak, jakby zachowywał się jak zamknięcie w innych językach, ale tak nie jest, działa bardziej jak ciąg, który jest przekazywany do eval
.
Możesz obejść tę dziwność, używając zwykłego Kludge of Last Resort:dynamicznego SQL. Lepsze wyniki uzyskasz, jeśli napiszesz swoją funkcję tak, aby używała skręcania łańcuchów i 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;