Projekt ilustruje przykładową bazę domowej biblioteczki. Baza ma za zadanie ułatwić skatalogowanie posiadanych książek wraz z podstawowymi informacjami na ich temat. Opis bazy: Książka może mieć wielu autorów oraz autor mógł napisać wiele książek (to oczywiste), więc pomiędzy tabelami ksiazki oraz autorzy występuje powiązanie n-n. Umożliwia to tabela autor_ksiazki. Każda książka posiada jakiś opis_fizyczny, który można odpowiednio dostosować po dodaniu konkretnego egzemplarza do bazy danych. Tabele uwagi i tagi mają służyć do dalszego rozwoju projektu, w obecnej chwili można w nich jedynie umieszczać dodatkowe informacje o danym egzemplarzu. Tabela tagi posiada dynamicznie generowaną listę możliwych wartości. Zdefiniowany jest jedynie jeden widok wszystkie_bez_tagow który ma służyć pomocą przy wypełnianiu informacji o gatunkach książki. Dodane wyzwalacze umożliwiają wykrycie podstawowych błędów przy wprowadzaniu danych: automatyczne zamienianie imion i nazwisk na właściwy format, sprawdzanie poprawności ISBN, Funkcja dodaj_eg umożliwia dodanie wszystkich podstawowych informacji o książce w krótkim czasie. Funkcja tagi_ksiazki wyświetla wszystkie tagi przypisane do konkretnej książki w postaci pojedynczego łańcucha. Obecna praca jest zaledwie częścią projektu i dlatego może nie posiadać pełnej funkcjonalności rzeczywistej bazy bibliotecznej. Poniżej zamieszczam kod źródłowy bazy. Tryb graficzny będzie dostępny na: http://www.math.uni.wroc.pl/~s245528/ -- USUWANIE TABEL - DROP TABLE autor_ksiazki, autorzy, gatunki, ksiazki, opis_fizyczny, uwagi, tagi, wydawnictwo CASCADE; -- DODANIE TABEL - CREATE TABLE ksiazki ( id_ksiazki SERIAL PRIMARY KEY, tytul VARCHAR(100) NOT NULL, podtytul TEXT DEFAULT(''), rok_wydania INTEGER DEFAULT(NULL), ISBN_10 VARCHAR(10) DEFAULT('brak') NOT NULL, ISBN_13 VARCHAR(13) DEFAULT('brak') NOT NULL CREATE TABLE autorzy ( id_autora SERIAL PRIMARY KEY, imie TEXT, nazwisko TEXT CREATE TABLE autor_ksiazki( id_ksiazki INTEGER REFERENCES ksiazki(id_ksiazki)on UPDATE CASCADE ON DELETE CASCADE, id_autora INTEGER REFERENCES autorzy(id_autora)on UPDATE CASCADE ON DELETE CASCADE CREATE TABLE wydawnictwo( CASCADE,
nazwa TEXT CREATE TABLE opis_fizyczny( format_ksiazki VARCHAR(2), rodzaj_okladki TEXT DEFAULT ('MIĘKKA') NOT NULL CHECK(rodzaj_okladki='TWARDA' OR rodzaj_okladki='miękka'), obwoluta BOOLEAN DEFAULT (false) NOT NULL, stan TEXT, CASCADE CREATE TABLE uwagi( uwagi TEXT, CASCADE CREATE TABLE gatunki( gatunek VARCHAR(30) PRIMARY KEY INSERT INTO gatunki VALUES ('brak' CREATE TABLE tagi( CASCADE, gatunek VARCHAR(30) DEFAULT ('brak') REFERENCES gatunki(gatunek) ON UPDATE CASCADE ON DELETE RESTRICT -- Funkcje i wyzwalacze - -- FUNCKCJE--- -- DODANIE EGZEMPLARZA KSIĄŻKI-- DROP FUNCTION dodaj_eg(text,text,int,varchar(10),varchar(13),text,text,text, INT CREATE OR REPLACE FUNCTION dodaj_eg(tytul_ TEXT, podtytul_ TEXT, rok_wydania_ INT, ISBN_10_ VARCHAR(10), ISBN_13_ VARCHAR(13), imie_ TEXT, nazwisko_ TEXT, wydawnictwo_ TEXT, do_zmian INT DEFAULT(0)) RETURNS INTEGER AS $$ DECLARE rec RECORD; id_k INTEGER; id_a INTEGER; INSERT INTO ksiazki (tytul, podtytul, rok_wydania, ISBN_10, ISBN_13) VALUES (tytul_,podtytul_, rok_wydania_, ISBN_10_,ISBN_13_ IF do_zmian=0 THEN SELECT INTO id_k max(id_ksiazki) FROM ksiazki WHERE tytul=tytul_ AND podtytul=podtytul_ AND rok_wydania=rok_wydania_ AND ISBN_10=ISBN_10_ AND ISBN_13=ISBN_13_; ELSE id_k=do_zmian; END if; SELECT INTO id_a min(id_autora) FROM autorzy WHERE imie=imie_ AND nazwisko=nazwisko_; IF id_a IS NULL OR id_a=0 THEN INSERT INTO autorzy (imie, nazwisko) VALUES (imie_, nazwisko_
ELSE SELECT INTO id_a min(id_autora) FROM autorzy WHERE imie=imie_ AND nazwisko=nazwisko_; SELECT INTO id_a min(id_autora) FROM autorzy WHERE imie=imie_ AND nazwisko=nazwisko_; INSERT INTO autor_ksiazki (id_ksiazki,id_autora) VALUES (id_k, id_a INSERT INTO wydawnictwo (id_ksiazki, nazwa) VALUES (id_k,wydawnictwo_ INSERT INTO opis_fizyczny (id_ksiazki) VALUES (id_k INSERT INTO uwagi (id_ksiazki) VALUES (id_k INSERT INTO tagi (id_ksiazki) VALUES (id_k RETURN 0; $$ LANGUAGE'plpgsql'; -- WYLICZENIE CYFRY KONTROLNEJ -- DROP FUNCTION cyfra_kontr(text CREATE OR REPLACE FUNCTION cyfra_kontr(isbn TEXT) RETURNS TEXT AS $$ DECLARE i INTEGER DEFAULT (1 x INTEGER DEFAULT (0 ch TEXT DEFAULT ('' IF char_length(isbn)=10 THEN WHILE char_length(isbn)>i LOOP x := x + i * CAST(substring(isbn from i for 1) AS INT i := i + 1; END LOOP; x := x%11; ELSIF char_length(isbn)=13 THEN WHILE char_length(isbn)>i LOOP x := x + (2+(-1)^i) * CAST(substring(isbn from i for 1) AS INT i := i + 1; END LOOP; x := x%10; ch:=cast(x AS TEXT IF x=10 THEN ch:='x'; RETURN ch; --- WSZYSTKIE TAGI KSIĄŻKI --- CREATE OR REPLACE FUNCTION tagi_ksiazki(id INTEGER) RETURNS TEXT AS $$ --- zrobić wersję z tytułami --- DECLARE rec RECORD; tag TEXT; tag := ''; FOR rec IN SELECT * FROM tagi WHERE tagi.id_ksiazki=id LOOP tag := tag ' ' rec.gatunek; END LOOP; IF tag='' THEN RAISE EXCEPTION 'Podane ID książki jest nieprawidłowe lub nie ma przypisanych tagów'; RETURN tag; --- WYZWALACZE----
--- IMIE I NAZWISKO AUTORA TYLKO Z WIELKIEJ LITERY ---- CREATE OR REPLACE FUNCTION wielka_litera_autor() RETURNS TRIGGER AS $$ NEW.imie:=initcap(NEW.imie NEW.nazwisko:=initcap(NEW.nazwisko--- nie działa na polskie znaki --- RETURN NEW; DROP TRIGGER wielka_litera_autor_wyzwalacz ON autorzy; CREATE TRIGGER wielka_litera_autor_trigger BEFORE INSERT OR UPDATE ON autorzy FOR EACH ROW EXECUTE PROCEDURE wielka_litera_autor( --- WŁAŚCIWY ISBN --- CREATE OR REPLACE FUNCTION poprawny_isbn() RETURNS TRIGGER AS $$ IF (NEW.ISBN_10<>'brak') AND (char_length(new.isbn_10)<>10) AND (NEW.ISBN_10 IS NOT NULL) THEN RAISE EXCEPTION 'Jako ISBN wprowadź tylko same cyfry, bez myślników, albo pozostaw puste pole'; ELSIF (NEW.ISBN_10<>'brak') AND (cyfra_kontr(new.isbn_10)<>substring(new.isbn_10 from char_length(new.isbn_10)for 1) ) THEN RAISE EXCEPTION 'Błąd we wprowadzonym ISBN 10'; IF (NEW.ISBN_13<>'brak') AND (char_length(new.isbn_13)<>13) AND (NEW.ISBN_13 IS NOT NULL) THEN RAISE EXCEPTION 'Jako ISBN wprowadź tylko same cyfry, bez myślników, albo pozostaw puste pole'; ELSIF (NEW.ISBN_13<>'brak') AND (cyfra_kontr(new.isbn_13)<>substring(new.isbn_13 from char_length(new.isbn_13)for 1) ) THEN RAISE EXCEPTION 'Błąd we wprowadzonym ISBN 13'; RETURN NEW; DROP TRIGGER poprawny_isbn_trigger ON ksiazki; CREATE TRIGGER poprawny_isbn_trigger BEFORE INSERT OR UPDATE ON ksiazki FOR EACH ROW EXECUTE PROCEDURE poprawny_isbn( - WIDOKI - DROP VIEW wszystkie_bez_tagow; CREATE VIEW wszystkie_bez_tagow AS SELECT ksiazki.id_ksiazki, ksiazki.tytul, autorzy.imie, autorzy.nazwisko FROM ksiazki JOIN autor_ksiazki USING (id_ksiazki) JOIN autorzy USING (id_autora) JOIN tagi USING (id_ksiazki) WHERE tagi.gatunek='brak'; Przykładowy interfejs graficzny: