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

时间:2013-10-08 07:52:16

标签: 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;

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

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

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

我在这个链接中发现了类似的问题:
Declare variable of composite type in PostgreSQL using %TYPE
但它没有使用数组。如果这只是一个重复的问题,也许你们可以指出我正确的方向!

1 个答案:

答案 0 :(得分:11)

电话会是:

SELECT insert_info('{"(Arjay,myEmail@email.com,1234567)"}'::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)']);

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

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 AS
$func$
INSERT INTO info(name, email_add,contact_no)
SELECT * FROM unnest($1)
$func$ LANGUAGE sql;

同一个电话。

您的原始函数将在第一个数组元素btw。

之后返回