[PSQL] trigger pilnie poszukiwany

0

Witam

Potrzebuję stworzyć trigger do mojej bazy (jezeli będzie poprawnie działał to zaliczę przedmiot bez egzaminu :) ). Niestety jakoś nie mogę chwycić zasad jego działania, a właściwie to funkcji którą ma wykonywać... Na początek więc moze przedstawię okrojony schemat bazy :)

user image

w slotach znajdują się numery id_zamow, kazde id_zamow wskazuje na id_plyty (tabela zamowienia), a do kazdego id_plyty jest osobna cena (tabela plyty). Moj trigger mialby wstawiac do zlecenia.suma sumę cen wszystkich zamowionych plyt po kazdej modyfikacji wiersza (AFTER UPDATE). Zaznaczam, ze kombinacja slotow jest dowolna - moga byc wszystkie pelne, tylko jeden (np.3, niekoniecznie 1), a nawet wszystkie puste (wtedy funkcja moglaby wstawiac 0, ale nie musi ;) )

Najchetniej widzialbym pelen kod funkcji i triggera (bom len, a i duzo roboty z interfejsem w php mnie jeszcze czeka ;) ), ale nie pogardze wszelkimi wskazowkami i linkami do instruktarzy, przy czym zaznaczam, ze przestudiowalem co lepsze wyniki z google, co mi wiele nie wyjasnilo, a az tyle czasu na przekopanie pierwszy 10 stron nie mam (okres przedsesyjny) :/

Dzięki, pozdrawiam :)

0
SELECT suma = sum(pl.cena)
from plyty pl
where pl.id in(select id_plyty
                     from zamowienia
                     where id in(select slot1, slot2, slot3, slot 4 from inserted))

Pisane z głowy pod MSSQL. W tabeli inserted są właśnie wstawiane lub update'owane rekordy.
Podejrzewam, że jeśli to nie będzie to, to coś podobnego.

0

niestety twoj kod nic a nic mi nie mowi, jakies "pl", jakies "id", "inserted" :/ nie widze zadnego returna, a z tego co kojarze w funkcji musi się takowy pojawic :/

0
pesqel napisał(a)

niestety twoj kod nic a nic mi nie mowi, jakies "pl", jakies "id", "inserted" :/ nie widze zadnego returna, a z tego co kojarze w funkcji musi się takowy pojawic :/

Ech...
Jaka funkcja? Triggera chcesz napisać.
Jakie pl? No alias to jest na odpowiednią tabelę. ID, no to chyba jasne - kolumna identyfikująca wiersz. A inserted - tak się nazywa tabela, w której masz zmieniane wartości(insertowane lub updateowane) w triggerach - oczywiście jak wspomniałem w MSSQL.

Czy Ty wiesz w ogóle cokolwiek na temat baz danych?

0

wiem tyle, ze napisalem baze i interfejs do niej z logowaniem uzytkownika, skladaniem zamowien, panelem admina itp. czyli pewnie niewiele, ale jednak cos ;)

CREATE FUNCTION suma ( suma1 , suma2 , suma3 , suma4 )
RETURNS integer
LANGUAGE plpgsql
AS '

declare suma1 integer , suma2 integer , suma3 integer , suma4 integer , suma integer;
BEGIN

Select plyty.cena from plyty, zamowienia, zlecenia WHERE plyty.id_plyty=zamowienia.id_plyty AND zamowienia.id_zamow=zlecenia.slot1 INTO $suma1;

IF $slot1= NULL THEN
$suma1=0;
ELSE
$suma1 = select plyty.cena from plyty, zamowienia, zlecenia WHERE plyty.id_plyty=zamowienia.id_plyty AND zamowienia.id_zamow=zlecenia.slot1;
END IF;

IF $slot2 = NULL THEN $suma2=0;
ELSE
$suma2= SELECT plyty.cena from plyty, zamowienia, zlecenia WHERE plyty.id_plyty=zamowienia.id_plyty AND zamowienia.id_zamow=zlecenia.slot2;
END IF;

IF $slot3 = NULL THEN $suma3=0;
ELSE
$suma3 = SELECT plyty.cena from plyty, zamowienia, zlecenia WHERE plyty.id_plyty=zamowienia.id_plyty AND zamowienia.id_zamow=zlecenia.slot3;
END IF;

IF $slot4 = NULL THEN $suma4=0;
ELSE
$suma4 = SELECT plyty.cena from plyty, zamowienia, zlecenia WHERE plyty.id_plyty=zamowienia.id_plyty AND zamowienia.id_zamow=zlecenia.slot4;
END IF;

$suma = $suma1 + $suma2 +$suma3 +$suma4;

RETURN $suma;
END;
';

z tego co zrozumialem funkcja powinna mniej wiecej tak wygladac, na oko juz sam widze, ze brakuje tu samego inserta do kolumny zlecenia.suma, ale trick poelga na tym, ze errora mi wywala "type suma1 does not exist" czyli juz gdzies na samym poczatku :/

0

niestety, chyba nawet nie zdasz egzaminu...

pesqel napisał(a)

(jezeli będzie poprawnie działał to zaliczę przedmiot bez egzaminu :)

pesqel napisał(a)

Potrzebuję stworzyć trigger do mojej bazy

bez kumatora się nie da:(

0

dobra, odrobiłem lekcje, poprawiłem wszystkie mozliwe błędy, a było ich sporo ;-P nowy kod wygląda następująco:

CREATE OR REPLACE FUNCTION suma ()
RETURNS trigger
AS '

DECLARE suma1 integer;
DECLARE suma2 integer;
DECLARE suma3 integer;
DECLARE suma4 integer;
DECLARE sumaall integer;

BEGIN

IF new.slot1 IS NULL THEN suma1 := 0;
ELSE
suma1 := plyty.cena FROM plyty, zamowienia, zlecenia WHERE plyty.id_plyty=zamowienia.id_plyty AND zamowienia.id_zamow=zlecenia.slot1 AND zlecenia.id_zlec=NEW.id_zlec;
END IF;

IF new.slot2 IS NULL THEN suma2 := 0;
ELSE
suma2 := plyty.cena FROM plyty, zamowienia, zlecenia WHERE plyty.id_plyty=zamowienia.id_plyty AND zamowienia.id_zamow=zlecenia.slot2 AND zlecenia.id_zlec=NEW.id_zlec;
END IF;

IF new.slot3 IS NULL THEN suma3 := 0;
ELSE
suma3 := plyty.cena FROM plyty, zamowienia, zlecenia WHERE plyty.id_plyty=zamowienia.id_plyty AND zamowienia.id_zamow=zlecenia.slot3 AND zlecenia.id_zlec=NEW.id_zlec;
END IF;

IF new.slot4 IS NULL THEN suma4 := 0;
ELSE
suma4 := plyty.cena FROM plyty, zamowienia, zlecenia WHERE plyty.id_plyty=zamowienia.id_plyty AND zamowienia.id_zamow=zlecenia.slot4 AND zlecenia.id_zlec=NEW.id_zlec;
END IF;

sumaall=suma1+suma2+suma3+suma4;

UPDATE zlecenia SET suma=sumaall WHERE zlecenia.id_zlec=NEW.id_zlec;

RETURN NULL;
END' LANGUAGE plpgsql;

i został jeden problem :P końcowy UPDATE teoretycznie mialby update`owac wartość zlecenia.suma, ale niestety gdy ma się wykonywać zmula, jakby się zapętlił (putty zwiesza, firefox "oczekuje na odpowiedz" [interfejs php])... co tu moze być nie tak? :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1