sql >> Database teknologi >  >> RDS >> PostgreSQL

Gentag gennem tabellen, udfør beregning på hver række

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



  1. Codeigniter Active Record HAVING / WHERE db.field =db.field

  2. Forbind iPhone-appen til PostgreSQL ved hjælp af Libpq

  3. Sådan returneres forespørgselsresultater som en kommasepareret liste i PostgreSQL

  4. Fejl ved installation af mysql2 gem (Windows 8)