COPYは、query
を処理するため、少し奇妙です。 文字列として記述されていなくても、引数を文字列として。その結果、query
:
SELECT * FROM retrieve_info($1, $2)
関数のコンテキストでは実行されず、COPY自体のコンテキストで実行されます。あなたが言っても:
copy (select * from t) ...
あなたが書いたかのように扱われます:
copy 'select * from t' ...
そのため、クエリが実行されるまでに、関数パラメータには意味がなくなります。query
COPYの引数は、他の言語ではクロージャーのように動作するように見えるかもしれませんが、そうではなく、eval
に渡される文字列のように動作します。 。
この奇妙さを回避するには、通常のKludge of Last Resort:動的SQLを使用します。文字列ラングリングと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;