COPY थोड़ा अजीब है क्योंकि यह अपनी query
. के साथ व्यवहार करता है एक स्ट्रिंग के रूप में तर्क, भले ही इसे एक स्ट्रिंग के रूप में नहीं लिखा गया हो। नतीजा यह है कि query
:
SELECT * FROM retrieve_info($1, $2)
फ़ंक्शन के संदर्भ में निष्पादित नहीं किया जाता है, इसे COPY के संदर्भ में ही निष्पादित किया जाता है। भले ही आप कहें:
copy (select * from t) ...
इसके साथ ऐसा व्यवहार किया जाता है जैसे आपने लिखा हो:
copy 'select * from t' ...
इसलिए जब तक क्वेरी निष्पादित की जाती है, तब तक फ़ंक्शन पैरामीटर का कोई अर्थ नहीं रह जाता है, query
COPY के लिए तर्क ऐसा लग सकता है कि यह अन्य भाषाओं में बंद होने जैसा व्यवहार करेगा, लेकिन ऐसा नहीं है, यह एक स्ट्रिंग की तरह अधिक कार्य करता है जो eval
को पास हो जाता है ।
आप लास्ट रिजॉर्ट के सामान्य क्लज:डायनेमिक एसक्यूएल का उपयोग करके इस विचित्रता को दूर कर सकते हैं। यदि आप स्ट्रिंग रैंगलिंग और 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;