A Blue Star já mencionou que existe uma função interna para converter uma string separada por vírgula em um array.
Mas eu sugiro não passar uma string separada por vírgulas para começar. Se você quiser passar um número variável de IDs, use um
variadic
parâmetro. Você também não precisa executar primeiro um SELECT, você pode perguntar ao sistema quantas linhas foram atualizadas após a instrução 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
$$;
Você pode usar assim:
select update_status('active', 1);
select update_status('active', 5, 8, 42);
Se, por algum motivo, você "tiver" que passar isso como um único argumento, use um array real:
CREATE FUNCTION update_status(p_status text, p_id integer[])
Então passe assim:
select update_status('active', array[5,8,42]);
ou
select update_status('active', '{5,8,42}');