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