Вашият код никога не променя multiplevalues
масив. Той просто променя всеки елемент, след което изхвърля тази нова стойност.
Имате нужда от променлива, където можете да обедините резултатите си в:
CREATE OR REPLACE FUNCTION manipulate_array(multiplevalues text[])
RETURNS text[] AS
$BODY$
DECLARE
singlevalue text;
l_result text[] := '{}'::text[]; -- initialize with an empty array
BEGIN
FOREACH singlevalue IN ARRAY multiplevalues LOOP
SELECT trim(regexp_replace(singlevalue, '\s+', ' ', 'g')) INTO singlevalue;
l_result := l_result || singlevalue; -- append to the result
END LOOP;
RETURN l_result; -- return the new array, not the old one
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Но това може да се направи малко по-просто с помощта на unnest и array_agg и обикновена SQL функция (вместо PL/pgSQL)
Първо трябва да разместите масива, да отрежете стойностите и агрегата обратно в масив.
Не съм сигурен, че разбирам какво се опитвате да направите, но това ще изреже всички стойности в масива и ще върне нова:
create function trim_all(p_values text[])
returns text[]
as
$$
select array_agg(trim(regexp_replace(t.v, '\s+', ' ', 'g')) order by t.nr)
from unnest(p_values) with ordinality as t(v, nr);
$$
language sql;