Ihr Code ändert niemals die multiplevalues
Reihe. Es ändert nur jedes Element und wirft dann diesen neuen Wert weg.
Sie benötigen eine Variable, in der Sie Ihre Ergebnisse aggregieren können:
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;
Dies kann jedoch etwas einfacher mit einem Unnest und array_agg und einer einfachen SQL-Funktion (statt PL/pgSQL) durchgeführt werden
Sie müssen zuerst das Array entschachteln, die Werte zuschneiden und diese wieder in ein Array aggregieren.
Ich bin mir nicht sicher, ob ich verstehe, was Sie versuchen, aber dies wird alle Werte innerhalb des Arrays kürzen und einen neuen zurückgeben:
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;