Att göra uppdateringar rad för rad i en slinga är nästan alltid en dålig idé och kommer vara extremt långsam och kommer inte att skala. Du borde verkligen hitta ett sätt att undvika det.
Efter att ha sagt det:
Allt din funktion gör är att ändra värdet på kolumnvärdet i minnet - du ändrar bara innehållet i en variabel. Om du vill uppdatera data behöver du en update
uttalande:
Du måste använda en UPDATE
inuti slingan:
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;
Observera att du har för att lägga till en where
villkor på primärnyckeln till update
uttalande annars skulle du uppdatera alla rader för var och en iteration av slingan.
A något En mer effektiv lösning är att använda en markör och sedan göra uppdateringen med 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;
Nej. Anropet till funktionen körs i samband med den anropande transaktionen. Så du måste commit
efter att ha kört SELECT LoopThroughTable()
om du har inaktiverat automatisk commit i din SQL-klient.
Observera att språknamnet är en identifierare, använd inte enstaka citattecken runt det. Du bör också undvika att använda sökord som row
som variabelnamn.
Använder dollarnotering a> (som jag gjorde) gör det också lättare att skriva funktionskroppen