复合类型数组作为存储过程输入

meg*_*oth 5 arrays postgresql stored-procedures plpgsql unnest

我正在使用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;
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何使用数组输入的函数.我做了一些实验(只有一些愚蠢的输入):

SELECT insert_info(
    ARRAY[('Arjay','myEmail@email.com','1234567')]
);
Run Code Online (Sandbox Code Playgroud)

但PostgreSQL说这是一个record[],我还没有测试Loop部分...

我在这个链接中发现了一个类似的问题:
使用%TYPE在PostgreSQL中声明复合类型的变量,
但它没有使用数组.如果这只是一个重复的问题,也许你们可以指出我正确的方向!

Erw*_*ter 12

电话会是:

SELECT insert_info('{"(Arjay,myEmail@email.com,1234567)"}'::info[]);
Run Code Online (Sandbox Code Playgroud)

或者使用ARRAY构造函数:

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

要么:

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

但是使用纯SQL可以提高整个操作的效率unnest():

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

如果你需要它作为函数调用,你可以将它包装成一个SQL函数...

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

同样的电话.

您的原始函数将在第一个数组元素btw之后返回.