sql >> データベース >  >> RDS >> PostgreSQL

ストアドプロシージャ内のストアドプロシージャの呼び出し

    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;
    


    1. postgresで最大接続数を増やす方法は?

    2. テキスト配列に入力と同様の値が含まれている行を検索する

    3. MySQLでのREGEXP_SUBSTR()関数のしくみ

    4. MySQL:列のテキストの長さを取得する方法