sql >> Databasteknik >  >> RDS >> PostgreSQL

Iterera genom tabellen, utför beräkning på varje rad

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



  1. Infoga flera värden i flera kolumner från en mängd data med hjälp av en PDO-förberedd sats för MySQL

  2. HTML Form Slider

  3. Ta bort dubbletter i MySQL

  4. Hur gör man en kommentarsvarsfråga i MYSQL?