sql >> Databasteknik >  >> RDS >> PostgreSQL

Dela kommaseparerad sträng i PL/pgSQL-funktionen

Blue Star har redan nämnt att det finns en inbyggd funktion för att konvertera en kommaseparerad sträng till en array.

Men jag skulle föreslå att du inte skickar en kommaseparerad sträng till att börja med. Om du vill skicka ett variabelt antal ID:n använd en variadic parameter.

Du behöver inte heller först köra en SELECT, du kan fråga systemet hur många rader som uppdaterades efter UPDATE-satsen.

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
$$;

Du kan använda det så här:

select update_status('active', 1);
select update_status('active', 5, 8, 42);

Om du av någon anledning "måste" skicka detta som ett enda argument, använd en riktig array istället:

CREATE FUNCTION update_status(p_status text, p_id integer[]) 

Skicka sedan det så här:

select update_status('active', array[5,8,42]);

eller

select update_status('active', '{5,8,42}');


  1. MySQL-datumjämförelse

  2. JQUERY &php post error 500 (internt serverfel)

  3. Påverkas UTC_TIMESTAMP() av ​​sommartid?

  4. Hjälp mig förstå skillnaden mellan CLOBs och BLOBs i Oracle