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