Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sumowanie podczas wypelniania
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
vailor
Wrzucam do tablicy 10k wpisow, kazdy wpis ma indeks i jakas ilosc.
moze sie zdarzyc ze kilka wpisow ma ten sam indeks.

W tablicy chcialbym miec jeden rekord dla jednego indeksu z suma ilosc wpisow o tym samym indeksie.
Zeby to miec musial bym w trakcie wrzucania sprawdzac czy sie juz istnieje taki indeks,
jesli istnieje dodawac ilosc nowego wpisu do juz istniejacego.

Inserty w transakcji.

Probowalem triggerem before insert, sprawdzam czy istnieje jesli istnieje pobieram ilosc do zmiennej sumuje z new zwraca null. Ale nie dziala, dziala tyle ze nie podwaja tych samych indeksow ale nie sumuje.

Trigger dziala w pelni jak robie copy z pliku tekstowego do bazy.

Jakis pomysl?
SongoQ
Cytat
sprawdzam czy istnieje jesli istnieje pobieram ilosc do zmiennej sumuje z new zwraca null

Cos masz nie tak bo jesli zwraca Ci null to w nowym new masz wartosc NULL
vailor
Jesli istnieje taki indeks zwracam Null (przerywam tym insert) , jesli nie znajduje zwracam new.
Najdziwniejsze ze przy copy dziala OK.
Moze cos z transakcja ... chociaz transakcje wylaczylem i tez nie poszlo.
SongoQ
Podeslij na forum kod triggera, wtedy moze komus uda sie pomuc.
vailor
W sumie tak, najwazniejsze smile.gif


  1. CREATE TRIGGER tbl_materialy_dane_tr
  2. BEFORE INSERT ON tbl_materialy_dane
  3. FOR EACH ROW
  4. EXECUTE PROCEDURE func_tr_exist_ideks_dane();
  5.  
  6.  
  7. CREATE OR REPLACE FUNCTION func_tr_exist_ideks_dane()
  8. RETURNS "trigger" AS DECLARE _ilosc numeric(10,2);
  9. DECLARE _ilosc_rez numeric(10,2);
  10.  
  11. BEGIN IF EXISTS
  12. (
  13. SELECT indeks
  14. FROM tbl_materialy_dane WHERE tbl_materialy_dane.indeks = new.indeks
  15. ) THEN
  16.  
  17. SELECT
  18. INTO _ilosc ilosc
  19. FROM tbl_materialy_dane WHERE tbl_materialy_dane.indeks = new.indeks;
  20. SELECT
  21. INTO _ilosc_rez ilosc_rez
  22. FROM tbl_materialy_dane WHERE tbl_materialy_dane.indeks = new.indeks;
  23.  
  24. UPDATE tbl_materialy_dane SET
  25. ilosc=(_ilosc+new.ilosc),
  26. ilosc_rez=(_ilosc_rez+new.ilosc_rez)
  27. WHERE tbl_materialy_dane.indeks = new.indeks;
  28.  
  29. RETURN NULL;
  30.  
  31. END IF;
  32.  
  33. RETURN new;
  34.  
  35. END;
  36.  
  37. LANGUAGE 'plpgsql' VOLATILE;
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.