Выполните итерацию по аргументу массива и вставьте их

#postgresql

Вопрос:

Я хочу создать вызываемую функцию test_func_from_array(_test_id целое число, _test_array текст[]). Мне нужно вставить данные с одинаковым идентификатором test_id, но разными элементами массива _test_array. _test_array состоит из строк, которые мне нужно разделить и вставить. Я пытался сделать вот так:

 CREATE OR REPLACE FUNCTION public.test_func_from_array(_test_id integer, _test_array text[])
 RETURNS void
 LANGUAGE plpgsql
AS $function$
begin
    foreach i in array _test_array
    loop
        INSERT INTO public.test_func_array_trgt ("_test_id",test_from_array_1, test_from_array_2, test_from_array_3)
            VALUES( insplit_part(i, '/', 1), insplit_part(i, '/', 2), insplit_part(i, '/', 3));
    end loop;
END;
$function$
;
 

Но это дает мне ошибку loop variable of FOREACH must be a known variable or list of variables . Что я делаю не так?
Является ли данный подход правильным или его следует использовать по-другому?

Upd.

Изменено на

 CREATE OR REPLACE FUNCTION public.test_func_from_array(_test_id integer, _test_array text[])
 RETURNS void
 LANGUAGE plpgsql
AS $function$
declare 
    i varchar;
begin
    foreach i in array _test_array
    loop
        INSERT INTO public.test_func_array_trgt (test_id,test_from_array_1, test_from_array_2, test_from_array_3)
            VALUES( "_test_id",split_part(i, '/', 1), split_part(i, '/', 2), split_part(i, '/', 3));
    end loop;
END;
$function$
;
 

Все работает нормально

Ответ №1:

Изменено на

 CREATE OR REPLACE FUNCTION public.test_func_from_array(_test_id integer, _test_array text[])
 RETURNS void
 LANGUAGE plpgsql
AS $function$
declare 
    i varchar;
begin
    foreach i in array _test_array
    loop
        INSERT INTO public.test_func_array_trgt (test_id,test_from_array_1, test_from_array_2, test_from_array_3)
            VALUES( "_test_id",split_part(i, '/', 1), split_part(i, '/', 2), split_part(i, '/', 3));
    end loop;
END;
$function$
;
 

И все работает нормально. Мне нужно было заявить 'i' об 'for' этом раньше.