PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Fractionner une chaîne séparée par des virgules dans la fonction PL/pgSQL

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