At lave opdateringer række for række i en sløjfe er næsten altid en dårlig idé og vil være ekstremt langsom og skalerer ikke. Du bør virkelig finde en måde at undgå det på.
Efter at have sagt det:
Alt din funktion gør er at ændre værdien af kolonneværdien i hukommelsen - du ændrer bare indholdet af en variabel. Hvis du vil opdatere dataene, skal du bruge en update
erklæring:
Du skal bruge en UPDATE
inde i løkken:
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;
Bemærk, at du har for at tilføje en where
betingelse på den primære nøgle til update
ellers ville du opdatere alle rækker for hver iteration af løkken.
En lidt mere effektiv løsning er at bruge en markør og derefter udføre opdateringen ved hjælp af 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. Kaldet til funktionen kører i sammenhæng med den kaldende transaktion. Så du skal commit
efter at have kørt SELECT LoopThroughTable()
hvis du har deaktiveret automatisk commit i din SQL-klient.
Bemærk at sprognavnet er en identifikator, brug ikke enkelte anførselstegn omkring det. Du bør også undgå at bruge søgeord som row
som variabelnavne.
Brug af dollarnotering a> (som jeg gjorde) gør det også nemmere at skrive funktionsteksten