Массив составного типа в качестве ввода хранимой процедуры
Я создаю хранимую процедуру, используя 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;
Тот же звонок.
Ваша оригинальная функция вернется после первого элемента массива, кстати.