sql >> Databáze >  >> RDS >> PostgreSQL

Rozdělení řetězce odděleného čárkou ve funkci PL/pgSQL

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


  1. Velká tabulka v mysql Aktualizace řádků na základě csv pokaždé

  2. Nefunkční web a Twitter Feed

  3. Oracle:Získejte data za všechny měsíce, 0, pokud žádná data

  4. Jak funguje sys.dm_exec_describe_first_result_set na serveru SQL Server