COPY hơi kỳ cục vì nó xử lý query
đối số dưới dạng một chuỗi mặc dù nó không được viết dưới dạng chuỗi. Kết quả là query
:
SELECT * FROM retrieve_info($1, $2)
không được thực thi trong ngữ cảnh của hàm, nó được thực thi trong ngữ cảnh của chính COPY. Mặc dù bạn nói:
copy (select * from t) ...
nó được đối xử nhiều hơn như thể bạn đã viết:
copy 'select * from t' ...
vì vậy vào thời điểm truy vấn được thực thi, các tham số hàm không còn ý nghĩa nữa, query
đối số đối với COPY có thể trông giống như nó sẽ hoạt động giống như một bao đóng trong các ngôn ngữ khác nhưng không, nó hoạt động giống như một chuỗi được chuyển tới eval
.
Bạn có thể khắc phục sự kỳ lạ này bằng cách sử dụng K bùn thông thường của Last Resort:dynamic SQL. Bạn sẽ nhận được kết quả tốt hơn nếu bạn viết hàm của mình để sử dụng chuỗi bao bọc và THỰC HIỆN:
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;