Din kod ändrar aldrig multiplevalues
array. Det ändrar bara varje element och kastar sedan bort det nya värdet.
Du behöver en variabel där du kan aggregera dina resultat till:
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;
Men detta kan göras lite enklare med en unnest och array_agg och en vanlig SQL-funktion (snarare än PL/pgSQL)
Du måste först avnesta arrayen, trimma värdena och aggregatet som tillbaka till en array.
Jag är inte säker på att jag förstår vad du försöker göra, men detta kommer att trimma alla värden i arrayen och returnera ett nytt:
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;