Blue Star a déjà mentionné qu'il existe une fonction intégrée pour convertir une chaîne séparée par des virgules en un tableau.
Mais je suggérerais de ne pas passer une chaîne séparée par des virgules pour commencer. Si vous souhaitez transmettre un nombre variable d'identifiants, utilisez un variadic
paramètre.
Vous n'avez pas non plus besoin d'exécuter d'abord un SELECT, vous pouvez demander au système combien de lignes ont été mises à jour après l'instruction UPDATE.
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
$$;
Vous pouvez l'utiliser comme ceci :
select update_status('active', 1);
select update_status('active', 5, 8, 42);
Si pour une raison quelconque, vous "devez" passer ceci comme un seul argument, utilisez plutôt un vrai tableau :
CREATE FUNCTION update_status(p_status text, p_id integer[])
Ensuite, passez-le comme ceci :
select update_status('active', array[5,8,42]);
ou
select update_status('active', '{5,8,42}');