web-dev-qa-db-ja.com

VARIADICパラメータを使用して配列をplpgsql関数に渡す方法

配列を含むいくつかのパラメーターを使用して、Postgresql 10でplpgsql関数を定義しようとしています。

私はすでに関数を定義しました

CREATE OR REPLACE FUNCTION mix_table_fields(input_table_name VARCHAR, output_table_name VARCHAR, VARIADIC field_names VARCHAR[])
[...]

今、それを呼び出そうとすると:

SELECT mix_table_fields('articles'::VARCHAR, 'output_random_articles'::VARCHAR, array['type'::varchar,'colour'::varchar,'size'::varchar,'price'::varchar]) ;

次のエラーが表示されます: "関数mix_table_fields(文字可変、文字可変、文字可変[])が存在しません"。

以前にこのエラーが発生しました。関数の署名(その入力パラメーター)を認識できません。

PgAdmin3を使用して関数定義を確認すると、次のようになります。

CREATE OR REPLACE FUNCTION public.mix_table_fields(
    IN input_table_name character varying,
    IN output_table_name character varying,
    VARIADIC field_names character varying[])

何が悪いのかわかりません。

そして、関数を呼び出すときに各パラメーターで::VARCHARを取り除く方法がある場合は、より簡単です。

2
Darth Kangooroo

VARIADICパラメータに実際のarrayを渡すには、キーワードVARIADIC in the callを使用する必要があります。

SELECT mix_table_fields('art'::VARCHAR
                      , 'out'::VARCHAR
                      , VARIADIC array['type'::varchar,'colour'::varchar,'size'::varchar,'price'::varchar]);

あなたの場合明示的な型キャストなしでも機能します。 関数の型の解決 は、型付けされていない文字列リテラルの最適な候補を曖昧さなく見つけることができます-関数がそうでない限り オーバーロード

SELECT mix_table_fields('art', 'out', VARIADIC array['type','colour','size','price']);

または配列リテラルで:

SELECT mix_table_fields('art', 'out', VARIADIC '{type,colour,size,price}');

キーワードVARIADICがない場合、Postgresは次のような要素値のlistを期待します。

SELECT mix_table_fields('art', 'out', 'type', 'colour', 'size','price');

...これは、VARIADIC関数パラメーターの要点です。要素タイプの可変数のパラメーターで呼び出すことができるため、配列ラッパー。 (また、VARIADICパラメーターがパラメーターリストの最後に来る必要がある理由:そうでない場合、呼び出しがあいまいになる可能性があります。)この機能が必要ない場合は、関数定義でVARIADICなしの単純なvarchar[]パラメーターを使用して開始します。と。

関連:

3