COPY agak aneh karena memperlakukan query
its argumen sebagai string meskipun tidak ditulis sebagai string. Hasilnya adalah query
:
SELECT * FROM retrieve_info($1, $2)
tidak dieksekusi dalam konteks fungsi, itu dijalankan dalam konteks SALIN itu sendiri. Meskipun Anda mengatakan:
copy (select * from t) ...
itu diperlakukan lebih seperti Anda menulis:
copy 'select * from t' ...
jadi pada saat kueri dijalankan, parameter fungsi tidak lagi memiliki arti, query
argumen ke COPY mungkin terlihat seperti akan berperilaku seperti penutupan dalam bahasa lain tetapi tidak, ia bertindak lebih seperti string yang diteruskan ke eval
.
Anda dapat mengatasi keanehan ini dengan menggunakan Kludge of Last Resort yang biasa:SQL dinamis. Anda akan mendapatkan hasil yang lebih baik jika Anda menulis fungsi Anda untuk menggunakan string wrangling dan 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;