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 说它是一个record[],我还没有测试循环部分......

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

4

1 回答 1

17

调用将是(带有两个数组元素):

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 回答