Katarzyna Świeczkowska
EiT K-1
nr 125462
SPRAWOZDANIE nr 5
(ćw. 4 NEW)
zad.1 (Stwórz funkcję o nazwie poletrojkata, która wyznaczy pole trójkąta ze wzoru 0.5*a*h, gdzie a jest podstawą a h wysokością trójkąta.)
CREATE FUNCTION poletrojkata (float, float) RETURNS float
LANGUAGE 'plpgsql'
AS '
BEGIN
RETURN 0.5*$1*$2;
END;
';
SELECT poletrojkata (a, h);
zad.2 (Stwórz funkcją, która wyznaczy deltę z równania kwadratowego.)
CREATE FUNCTION delta(float,float, float) RETURNS float
LANGUAGE 'plpgsql'
AS '
BEGIN
RETURN $2*$2-4*$1*$3;
END;
';
SELECT delta (a, b, c);
------------------------------------------------------
zad.1 (Stwórz funkcję i wyzwalacz, która przy próbie wypożyczenia płyty nie pozwoli wypożyczyć nowej płyty użytkownikowi, który ma 5 lub więcej niezwróconych pozycji.)
CREATE FUNCTION wypozyczenie() RETURNS TRIGGER AS '
BEGIN
IF (SELECT id_klienta FROM klient WHERE id_klienta=NEW.kto_wypozyczyl) IS NOT NULL THEN
IF (SELECT COUNT(co_wypozyczyl) FROM wypozyczenie WHERE kto_wypozyczyl=NEW.kto_wypozyczyl) < 5 THEN
RETURN NEW;
ELSE
RAISE NOTICE ''Limit wypozyczen wyczerpany'';
RETURN NULL;
END IF;
ELSE
RAISE NOTICE ''Nie ma takiego klienta w bazie'';
RETURN NULL;
END IF;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER trigger_max BEFORE INSERT ON wypozyczenie FOR EACH ROW EXECUTE PROCEDURE wypozyczenie();
zad.2 (Opisz wszystkie tabele stosownymi komentarzami)
COMMENT ON TABLE klient IS 'Wszyscy Klienci w bazie';
COMMENT ON TABLE Gatunek IS 'Gatunki';
COMMENT ON TABLE plyta IS 'Dostepne tytuly';
COMMENT ON TABLE wypozyczenie IS 'Historia wypożyczeń';
COMMENT ON TABLE jest_pracownikiem IS ' To jest tabela przechowująca listę pracownikow, umozliwia uzyskanie specjalnego rabatu.';
zad.3 (Stwórz funkcję, która pozwoli sprawdzić i naliczyć karę użytkownikowi za zbyt długie przetrzymywanie płyty. Jeżeli przekracza ono 2 tygodnie to za każdy dzień dolicz 10 pln.)
CREATE OR REPLACE FUNCTION zwrot() RETURNS TRIGGER AS '
DECLARE
x int2;
y date;
kara float4;
okres CONSTANT interval:=336;
oplata CONSTANT integer:=10;
BEGIN
y = (SELECT data_wypozyczenia FROM wypozyczenie WHERE co_wypozyczyl = OLD.co_wypozyczyl) + okres;
IF y < current_date THEN
x = current_date - y;
kara = x * oplata;
RAISE NOTICE ''Klient przekroczyl termin oddania plyty o % dni'',x;
RAISE NOTICE ''Plyta zostala oddana'';
RAISE NOTICE ''Kara za przetrzymanie wynosi % zl'',kara;
RETURN OLD;
ELSE
RAISE NOTICE ''Klient nie przekroczyl terminu oddania plyty'';
RAISE NOTICE ''Plyta zostala oddana'';
RAISE NOTICE ''Kara za przetrzymanie wynosi 0 zl'';
RETURN OLD;
END IF;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER t_zwrot BEFORE DELETE ON wypozyczenie FOR EACH ROW EXECUTE PROCEDURE zwrot();
zad.4 (Wewnątrz transakcji dodaj nowego użytkownika i informację, że jest on pracownikiem, przewidź rabat 50%.)
Begin;
INSERT INTO klient(imie,nazwisko) VALUES ('IMIE','NAZWISKO');
INSERT INTO jest_pracownikiem(rabat,id_klienta) VALUES ('50',(SELECT id_klienta FROM klient WHERE imie = 'IMIE' AND nazwisko= 'NAZWISKO'));
COMMIT;