加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 18:07:46 所属栏目:百科 来源:网络整理
导读:我正在使用plpgsql创建一个存储过程,通过传递一个类型数组并在过程中执行循环,以便我可以插入每个信息类型 CREATE TYPE info AS( name varchar,email_add varchar,contact_no varchar );CREATE OR REPLACE FUNCTION insert_info( info_array info[]) RETURNS
我正在使用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说这是一个记录[]而我还没有测试过Loop部分……

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

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

或者使用ARRAY构造函数:

SELECT insert_info((ARRAY['(Arjay,1234567)','(Bjay,my2Email@email.com,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之后返回.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读