Массив составного типа в качестве ввода хранимой процедуры

Я создаю хранимую процедуру, используя 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...

Я нашел похожую проблему в этой ссылке:
Объявите переменную составного типа в PostgreSQL, используя%TYPE
но он не использовал массивы. Если это всего лишь повторяющийся вопрос, возможно, вы, ребята, можете указать мне правильное направление!

1 ответ

Решение

Звонок будет:

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)']);

Но вся операция может быть более эффективной при использовании простого 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 AS
$func$
INSERT INTO info(name, email_add,contact_no)
SELECT * FROM unnest($1)
$func$ LANGUAGE sql;

Тот же звонок.

Ваша оригинальная функция вернется после первого элемента массива, кстати.

Другие вопросы по тегам