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

Iterujte tabulku, proveďte výpočet na každém řádku

Provádět aktualizace řádek po řádku ve smyčce je téměř vždy špatný nápad a bude být extrémně pomalý a nebude se škálovat. Měli byste skutečně najít způsob, jak se tomu vyhnout.

Poté, co řekl:

Vše, co vaše funkce dělá, je změnit hodnotu hodnoty sloupce v paměti - pouze upravujete obsah proměnné. Pokud chcete aktualizovat data, potřebujete update prohlášení:

Musíte použít UPDATE uvnitř smyčky:

CREATE OR REPLACE FUNCTION LoopThroughTable() 
  RETURNS VOID 
AS
$$
DECLARE 
   t_row the_table%rowtype;
BEGIN
    FOR t_row in SELECT * FROM the_table LOOP
        update the_table
            set resid = 1.0
        where pk_column = t_row.pk_column; --<<< !!! important !!!
    END LOOP;
END;
$$ 
LANGUAGE plpgsql;

Všimněte si, že máte přidat where podmínku primárního klíče k update jinak byste aktualizovali vše řádky pro každý iteraci smyčky.

A mírně efektivnější řešení je použít kurzor a poté provést aktualizaci pomocí where current of

CREATE OR REPLACE FUNCTION LoopThroughTable() 
  RETURNS VOID 
AS $$
DECLARE 
   t_curs cursor for 
      select * from the_table;
   t_row the_table%rowtype;
BEGIN
    FOR t_row in t_curs LOOP
        update the_table
            set resid = 1.0
        where current of t_curs;
    END LOOP;
END;
$$ 
LANGUAGE plpgsql;

Ne. Volání funkce probíhá v kontextu volající transakce. Musíte se tedy commit po spuštění SELECT LoopThroughTable() pokud jste v klientovi SQL zakázali automatické potvrzení.

Všimněte si, že název jazyka je identifikátor, nepoužívejte jednoduché uvozovky. Také byste se měli vyvarovat používání klíčových slov jako row jako názvy proměnných.

Použití dolarové kotace (jako já) také usnadňuje psaní těla funkce



  1. Je VARCHAR(20000) platný v MySQL?

  2. Vylučovací řádek MySQL

  3. jak získat nejnovější záznam nebo záznam s maximálním odpovídajícím datem všech různých hodnot ve sloupci v mysql?

  4. Záznam vrácený z funkce má zřetězené sloupce