微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在使用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','[email protected]','1234567')]
);

但是Postgresql说这是一个记录[]而我还没有测试过Loop部分……

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

电话会是:
SELECT insert_info('{"(Arjay,[email protected],1234567)"}'::info[]);

或者使用ARRAY构造函数

SELECT insert_info((ARRAY['(Arjay,1234567)','(Bjay,[email protected],2234567)'])::info[]);

要么:

SELECT insert_info( ARRAY['(Arjay,1234567)'::info,2234567)']);

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

INSERT INTO info(name,contact_no)
SELECT * FROM unnest('{"(Arjay,1234567)","(Bjay,2234567)"}'::info[]);

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

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

同样的电话.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐