【问题标题】:Array of composite type as stored procedure input复合类型数组作为存储过程输入
【发布时间】:2013-10-15 01:03:15
【问题描述】:

我正在使用 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
但它没有使用数组。如果这只是一个重复的问题,也许你们可以指出我正确的方向!

【问题讨论】:

    标签: arrays postgresql stored-procedures plpgsql unnest


    【解决方案1】:

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

    SELECT insert_info('{"(Arjay,myEmail@email.com,1234567)"
                        ,"(Bjay,my2Email@email.com,2234567)"}'::info[]);
    

    或者ARRAY constructor:

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

    同样的电话。

    您的原始函数将在第一个数组元素之后返回,顺便说一句。

    【讨论】:

    • 你的回答很棒! ,它真的帮助了我,unnest() 功能就像魔术一样,非常感谢!
    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多