Blue Star har allerede nævnt, at der er en indbygget funktion til at konvertere en kommasepareret streng til en matrix.
Men jeg vil foreslå, at du ikke sender en kommasepareret streng til at begynde med. Hvis du vil videregive et variabelt antal ID'er, brug en variadic
parameter.
Du behøver heller ikke først at køre en SELECT, du kan spørge systemet, hvor mange rækker der blev opdateret efter UPDATE-sætningen.
CREATE FUNCTION update_status(p_status text, p_id variadic integer[])
RETURNS character varying
LANGUAGE plpgsql
AS
$$
DECLARE
v_row_count bigint DEFAULT 0;
BEGIN
UPDATE test
SET status = p_status,
updated_by = 'admin'
WHERE user_id = any (p_id);
get diagnostics v_row_count = row_count;
if v_row_count = 0 then
return 'User not found';
end if;
return concat(v_row_count, ' users updated');
END
$$;
Du kan bruge det sådan her:
select update_status('active', 1);
select update_status('active', 5, 8, 42);
Hvis du af en eller anden grund "skal" sende dette som et enkelt argument, skal du bruge et rigtigt array i stedet:
CREATE FUNCTION update_status(p_status text, p_id integer[])
Så send det sådan her:
select update_status('active', array[5,8,42]);
eller
select update_status('active', '{5,8,42}');