Blue Star již zmínil, že existuje vestavěná funkce pro převod řetězce odděleného čárkou na pole.
Navrhoval bych však, abyste pro začátek nepředávali řetězec oddělený čárkou. Pokud chcete předat proměnný počet ID, použijte variadic
parametr.
Také nemusíte nejprve spouštět SELECT, můžete se systému zeptat, kolik řádků bylo aktualizováno po příkazu 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
$$;
Můžete jej použít takto:
select update_status('active', 1);
select update_status('active', 5, 8, 42);
Pokud to z nějakého důvodu "musíte" předat jako jediný argument, použijte místo toho skutečné pole:
CREATE FUNCTION update_status(p_status text, p_id integer[])
Pak to předejte takto:
select update_status('active', array[5,8,42]);
nebo
select update_status('active', '{5,8,42}');