Faire des mises à jour ligne par ligne dans une boucle est presque toujours une mauvaise idée et le fera être extrêmement lent et ne pas évoluer. Vous devriez vraiment trouver un moyen d'éviter cela.
Après avoir dit cela :
Tout ce que votre fonction fait est de changer la valeur de la valeur de la colonne en mémoire - vous modifiez simplement le contenu d'une variable. Si vous souhaitez mettre à jour les données, vous avez besoin d'une update
déclaration :
Vous devez utiliser une UPDATE
à l'intérieur de la boucle :
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;
Notez que vous avez pour ajouter un where
condition sur la clé primaire à la update
déclaration sinon vous mettriez à jour tous lignes pour chaque itération de la boucle.
Un légèrement une solution plus efficace consiste à utiliser un curseur, puis à effectuer la mise à jour en utilisant 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;
Non. L'appel à la fonction s'exécute dans le contexte de la transaction appelante. Vous devez donc commit
après avoir exécuté SELECT LoopThroughTable()
si vous avez désactivé la validation automatique dans votre client SQL.
Notez que le nom de la langue est un identifiant, n'utilisez pas de guillemets simples autour de lui. Vous devez également éviter d'utiliser des mots-clés tels que row
comme noms de variables.
Utilisation de guillemets en dollars (comme je l'ai fait) facilite également l'écriture du corps de la fonction