Blue Star вече спомена, че има вградена функция за преобразуване на низ, разделен със запетая, в масив.
Но бих препоръчал да не предавате низ, разделен със запетая, като начало. Ако искате да подадете променлив брой идентификатори, използвайте variadic
параметър.
Също така не е необходимо първо да стартирате SELECT, можете да попитате системата колко реда са актуализирани след израза 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
$$;
Можете да го използвате по следния начин:
select update_status('active', 1);
select update_status('active', 5, 8, 42);
Ако по някаква причина „трябва“ да предадете това като единичен аргумент, вместо това използвайте реален масив:
CREATE FUNCTION update_status(p_status text, p_id integer[])
След това го предайте така:
select update_status('active', array[5,8,42]);
или
select update_status('active', '{5,8,42}');