PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Iterieren Sie durch die Tabelle, führen Sie die Berechnung für jede Zeile durch

Aktualisierungen Zeile für Zeile in einer Schleife durchzuführen, ist fast immer eine schlechte Idee und wird extrem langsam sein und nicht skalieren. Du solltest wirklich einen Weg finden, das zu vermeiden.

Nachdem Sie das gesagt haben:

Alles, was Ihre Funktion tut, ist, den Wert des Spaltenwerts im Speicher zu ändern - Sie ändern nur den Inhalt einer Variablen. Wenn Sie die Daten aktualisieren möchten, benötigen Sie ein update Aussage:

Sie müssen ein UPDATE verwenden innerhalb der Schleife:

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;

Beachten Sie, dass Sie haben um ein where hinzuzufügen Bedingung für den Primärschlüssel zum update -Anweisung andernfalls würden Sie alle aktualisieren Zeilen für jeden Iteration der Schleife.

A leicht Eine effizientere Lösung besteht darin, einen Cursor zu verwenden und dann die Aktualisierung mit where current of durchzuführen

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;

Nein. Der Aufruf der Funktion läuft im Kontext der aufrufenden Transaktion. Sie müssen also commit nach dem Ausführen von SELECT LoopThroughTable() wenn Sie Auto-Commit in Ihrem SQL-Client deaktiviert haben.

Beachten Sie, dass der Sprachname ein Bezeichner ist, verwenden Sie keine einfachen Anführungszeichen um ihn herum. Vermeiden Sie auch die Verwendung von Schlüsselwörtern wie row als Variablennamen.

Verwenden von Dollar-Quoting (wie ich es getan habe) erleichtert auch das Schreiben des Funktionskörpers