PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Itérer dans le tableau, effectuer un calcul sur chaque ligne

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