5

タイプ配列を渡すことでplpgsqlを使用してストアドプロシージャを作成し、プロシージャ内でループを実行して、各情報タイプを挿入できるようにします

CREATE TYPE info AS(
    name  varchar,
    email_add  varchar,
    contact_no  varchar 
);

CREATE OR REPLACE FUNCTION insert_info(
    info_array  info[]
) RETURNS varchar AS $$
    DECLARE
        info_element  info;
    BEGIN
        FOREACH info_element IN ARRAY info_array
        LOOP
            INSERT INTO info_table(
                name,
                email_add,
                contact_no
            ) VALUES(
                info_element.name,
                info_element.email_add,
                info_element.contact_no
            );
        END LOOP;
        RETURN 'OK';
    END;
$$ LANGUAGE plpgsql;

問題は、配列入力で関数を使用する方法がわからないことです。私はいくつかの実験をしました(いくつかのばかげた入力だけで):

SELECT insert_info(
    ARRAY[('Arjay','myEmail@email.com','1234567')]
);

しかし、PostgreSQLはそれがaでrecord[]あり、私はまだループ部分をテストしていないと言っています...

このリンクで同様の問題を発見しました:
Declare variable of composite type in PostgreSQL using %TYPE
but it did not use arrays. これが単なる重複した質問である場合、皆さんは私を正しい方向に向けることができるかもしれません!

4

1 に答える 1

17

呼び出しは次のようになります (2 つの配列要素を使用):

SELECT insert_info('{"(Arjay,myEmail@email.com,1234567)"
                    ,"(Bjay,my2Email@email.com,2234567)"}'::info[]);

またはARRAY コンストラクターを使用:

SELECT insert_info((ARRAY['(Arjay,myEmail@email.com,1234567)'
                         ,'(Bjay,my2Email@email.com,2234567)'])::info[]);

または:

SELECT insert_info( ARRAY['(Arjay,myEmail@email.com,1234567)'::info
                         ,'(Bjay,my2Email@email.com,2234567)']);

しかし、以下を使用してプレーン SQL を使用すると、操作全体がより効率的になりますunnest()

INSERT INTO info(name, email_add,contact_no)
SELECT * FROM unnest('{"(Arjay,myEmail@email.com,1234567)"
                     , "(Bjay,my2Email@email.com,2234567)"}'::info[]);

関数呼び出しとして必要な場合は、SQL 関数にラップできます...

CREATE OR REPLACE FUNCTION insert_info(info_array info[])
  RETURNS void
  LANGUAGE sql AS
$func$
INSERT INTO info(name, email_add,contact_no)
SELECT * FROM unnest($1)
$func$;

同じ呼び出し。

元の関数は、最初の配列要素の後に戻ります。

于 2013-10-08T08:13:08.807 に答える