Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Postgres trigger
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
Ogotay
Witam Wszystkich:

Nie mam wielkiego doswiadczenia w pl/sql i mam klopot. sad.gif

mam tabele:

odp

id_odp
id_ocena
id_pyt
odp

ocena

id_ocena
id_ankieta

pyt

id_pyt
id_ankieta
pytanie
numer_w_ankiecie

chodzi o to by wstawiajac nowy wiersz do tabeli ocena wstwiec do tabeli odp tyle wierszy ile pytan jest w danej ankiecie a odpowiedzi ustawic na null
SongoQ
Tworzysz trigger i funkcje do triggera, nic prostrzego. Radze uzyc pl/pgsql'a. Jesli masz problem jak to zrobic to wszystko masz w manualu, jesli cos nei bedziesz wiedzial to pisz.
Ogotay
no wlasnie o to chodzi ze nie bardzo wiem jak sadsmiley02.gif

begin
INSERT INTO odp (id_ocena, id_pyt, odpowiedz)
VALUES (NEW.id_ocena, '?', null);
return NEW;
end;


Jak to zrobic w petli i jakie dac warunki, zeby zamiast "?" wstawic id odpowiednich pytan?
SongoQ
Jakiej petli? Jeden rekord odpowiada jednemu rekordowi w innej tabeli, ze tego co zrozumialem.

W taki sposob jak masz zaprojektowana bazke nie zrobisz aby trigger wstawial pyt_id, bo poprostu go nie masz. Musisz zmienic schemat, aby np w ocenie bylo pytanie.
Ogotay
  1. declare
  2. zbiornik record;
  3. begin FOR zbiornik IN SELECT id_pytanie, nr_w_ankieta
  4. FROM pytanie p, ocena o, ankieta a
  5. WHERE o.id_ocena=NEW.id_ocena AND p.id_ankieta=o.id_ankieta AND o.id_ankieta=a.id_ankieta ORDER BY nr_w_ankieta LOOP
  6.  
  7. INSERT
  8. INTO odpowiedz (id_ocena, id_pytanie, odpowiedz, nr_w_ankieta)
  9. VALUES (NEW.id_ocena, zbiornik.id_pytanie, NULL, zbiornik.nr_w_ankieta);
  10.  
  11. END LOOP;
  12. RETURN NEW;
  13. end;


schemat musi zostac tak jak jest.
jedna ocena zawiera wiele odpowiedzi na pytania z jednej ankiety.

dziala rolleyes.gif
SongoQ
Zastosuj Cursor
Ogotay
dziala lokalnie przez pgadmin III, przez phppgadmin juz nie mad.gif
zrobilem import bazy, wklejam fragment odpowiedzialny za tworzenia funkcji i triggera i wywala blad.
  1. CREATE FUNCTION funkcja_ocena_odp() RETURNS "trigger" AS $$declare
  2. zbiornik RECORD;
  3. begin FOR zbiornik IN SELECT id_pytanie, nr_w_ankieta
  4. FROM pytanie p, ocena o, ankieta a
  5. WHERE o.id_ocena=NEW.id_ocena AND p.id_ankieta=o.id_ankieta AND o.id_ankieta=a.id_ankieta ORDER BY nr_w_ankieta
  6. LOOP
  7. INSERT
  8. INTO odpowiedz (id_ocena, id_pytanie, odpowiedz, nr_w_ankieta)
  9. VALUES (NEW.id_ocena, zbiornik.id_pytanie, NULL, zbiornik.nr_w_ankieta);
  10. END LOOP;
  11. RETURN NEW;
  12. end;$$
  13. LANGUAGE plpgsql;
  14.  
  15.  
  16. ALTER FUNCTION public.funkcja_ocena_odp() OWNER TO postgres;


A cursor jak wykorzystac?
SongoQ
Moze zamiast $$declare ' lub '', bo w niektorych wersjacha inaczej nie wchodzi.
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.