PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Iteruj przez tabelę, wykonuj obliczenia w każdym rzędzie

Robienie aktualizacji wiersz po wierszu w pętli jest prawie zawsze złym pomysłem i będzie być bardzo powolny i nie będzie się skalować. Naprawdę powinieneś znaleźć sposób, aby tego uniknąć.

Po tym, jak powiedziałem, że:

Wszystko, co robi twoja funkcja, to zmiana wartości wartości kolumny w pamięci - po prostu modyfikujesz zawartość zmiennej. Jeśli chcesz zaktualizować dane, potrzebujesz update oświadczenie:

Musisz użyć UPDATE wewnątrz pętli:

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;

Pamiętaj, że masz aby dodać where warunek na kluczu podstawowym do update oświadczenie, w przeciwnym razie zaktualizowałbyś wszystkie wiersze dla każdego iteracja pętli.

nieco bardziej wydajnym rozwiązaniem jest użycie kursora, a następnie wykonanie aktualizacji za pomocą 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;

Nie. Wywołanie funkcji jest uruchamiane w kontekście transakcji wywołującej. Musisz więc commit po uruchomieniu SELECT LoopThroughTable() jeśli wyłączyłeś automatyczne zatwierdzanie w swoim kliencie SQL.

Zauważ, że nazwa języka jest identyfikatorem, nie używaj wokół niej pojedynczych cudzysłowów. Należy również unikać używania słów kluczowych, takich jak row jako nazwy zmiennych.

Korzystanie z cytowania w dolarach (tak jak ja) ułatwia również pisanie treści funkcji



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak odczytywać dane z plików wal PostgreSQL? Czy jest jakieś polecenie do konwersji pliku binarnego PostgreSQL na czytelny format tekstowy?

  2. Python łączy się z postgresql za pomocą libpq-pgpass

  3. Mam problem z przeniesieniem mojej aplikacji rails do Heroku/z instalacją klejnotu „pg”?

  4. Jak transponować kolumny i wiersze w PostgreSQL (tzn. jak przełączać wiersze i kolumny)?

  5. Typowe błędy podczas migracji baz danych PostgreSQL ze środowiska lokalnego do AWS RDS