PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Dividindo string separada por vírgula na função PL/pgSQL


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}');