COPY er lidt mærkeligt, da det på en måde behandler sin query
argument som en streng, selvom det ikke er skrevet som en streng. Resultatet er, at query
:
SELECT * FROM retrieve_info($1, $2)
udføres ikke i konteksten af funktionen, den udføres i konteksten af selve COPY. Selvom du siger:
copy (select * from t) ...
det behandles mere som om du skrev:
copy 'select * from t' ...
så når forespørgslen udføres, har funktionsparametrene ikke længere nogen betydning, query
argumentet til COPY kan se ud som om det ville opføre sig som en lukning på andre sprog, men det gør det ikke, det fungerer mere som en streng, der sendes til eval
.
Du kan komme uden om denne mærkelighed ved at bruge den sædvanlige Kludge of Last Resort:dynamisk SQL. Du burde få bedre resultater, hvis du skriver din funktion til at bruge string wrangling og 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;