Mateusz Macięga, gr.32
Projekt z baz danych
Księgarnia internetowa
v. 1.4
1/49
1. Model bazy danych
2/49
2. Dostępne tabele
a) autorzy
CREATE TABLE "PROJEKT_BZII"."AUTORZY"
(
"ID_AUTORA" NUMBER,
"IMIE" VARCHAR2(50 BYTE),
"NAZWISKO" VARCHAR2(75 BYTE) NOT NULL,
"DATA_URODZENIA" DATE,
"MIEJSCE_URODZENIA" VARCHAR2(100 BYTE),
"OPIS_AUTORA" VARCHAR2(1000 BYTE) NOT NULL,
CONSTRAINT "PK_AUTOR" PRIMARY KEY ("ID_AUTORA"),
CONSTRAINT "UN_OPIS_AUTORA" UNIQUE ("OPIS_AUTORA")
);
COMMENT ON COLUMN "PROJEKT_BZII"."AUTORZY"."ID_AUTORA" IS 'Identyfikator autora';
COMMENT ON COLUMN "PROJEKT_BZII"."AUTORZY"."IMIE" IS 'Imie autora';
COMMENT ON COLUMN "PROJEKT_BZII"."AUTORZY"."NAZWISKO" IS 'Nazwisko autora';
COMMENT ON COLUMN "PROJEKT_BZII"."AUTORZY"."DATA_URODZENIA" IS 'Data urodzenia autora';
COMMENT ON COLUMN "PROJEKT_BZII"."AUTORZY"."MIEJSCE_URODZENIA" IS 'Miejsce urodzenia autora';
COMMENT ON COLUMN "PROJEKT_BZII"."AUTORZY"."OPIS_AUTORA" IS 'Unikalny opis autora dla celów
administracyjnych';
COMMENT ON TABLE "PROJEKT_BZII"."AUTORZY" IS 'Tabela zawierająca autorów książek';
b) autorzy_z_ksiazkami
CREATE TABLE "PROJEKT_BZII"."AUTORZY_Z_KSIAZKAMI"
(
"ID_KSIAZKI" NUMBER NOT NULL,
"ID_AUTORA" NUMBER NOT NULL,
CONSTRAINT "PK_AUTORZY_Z_KSIAZKAMI" PRIMARY KEY ("ID_KSIAZKI", "ID_AUTORA"),
CONSTRAINT "FK_AUTORZY" FOREIGN KEY ("ID_AUTORA")
REFERENCES "PROJEKT_BZII"."AUTORZY" ("ID_AUTORA"),
CONSTRAINT "FK_KSIAZKI" FOREIGN KEY ("ID_KSIAZKI")
REFERENCES "PROJEKT_BZII"."KSIAZKI" ("ID_KSIAZKI")
);
COMMENT ON COLUMN "PROJEKT_BZII"."AUTORZY_Z_KSIAZKAMI"."ID_KSIAZKI" IS 'Identyfikator książki';
COMMENT ON COLUMN "PROJEKT_BZII"."AUTORZY_Z_KSIAZKAMI"."ID_AUTORA" IS 'Identyfikator autora';
COMMENT ON TABLE "PROJEKT_BZII"."AUTORZY_Z_KSIAZKAMI" IS 'Tabela zawierającą spis autorów
przyporządkowanych książkom';
c) kategorie
CREATE TABLE "PROJEKT_BZII"."KATEGORIE"
(
"ID_KATEGORII" NUMBER,
"NAZWA_KATEGORII" VARCHAR2(50 BYTE) NOT NULL,
CONSTRAINT "PK_KATEGORIA" PRIMARY KEY ("ID_KATEGORII"),
CONSTRAINT "UN_NAZWA_KATEGORII" UNIQUE ("NAZWA_KATEGORII")
);
COMMENT ON COLUMN "PROJEKT_BZII"."KATEGORIE"."ID_KATEGORII" IS 'Identyfikator kategorii';
COMMENT ON COLUMN "PROJEKT_BZII"."KATEGORIE"."NAZWA_KATEGORII" IS 'Nazwa kategorii';
COMMENT ON TABLE "PROJEKT_BZII"."KATEGORIE" IS 'Tabela zawierająca kategorie książek';
d) klienci
CREATE TABLE "PROJEKT_BZII"."KLIENCI"
(
"ID_KLIENTA" NUMBER,
"IMIE_KLIENTA" VARCHAR2(50 BYTE) NOT NULL,
"NAZWISKO_KLIENTA" VARCHAR2(75 BYTE) NOT NULL,
"EMAIL" VARCHAR2(90 BYTE) NOT NULL,
"NR_TELEFONU" NUMBER(9,0),
"DATA_URODZENIA" DATE,
"HASLO" VARCHAR2(32 BYTE) NOT NULL,
3/49
"PLEC" CHAR(1 BYTE) NOT NULL,
"ADRES" VARCHAR2(75 BYTE) NOT NULL,
"ADRES_NR_DOMU" VARCHAR2(8 BYTE) NOT NULL,
"ADRES_NR_MIESZKANIA" VARCHAR2(8 BYTE),
"KOD_POCZTOWY" VARCHAR2(12 BYTE) NOT NULL,
"ID_MIEJSCOWOSCI" NUMBER NOT NULL,
CONSTRAINT "PK_KLIENT" PRIMARY KEY ("ID_KLIENTA"),
CONSTRAINT "CK_EMAIL" CHECK (REGEXP_LIKE(email,'^[a-zA-Z][a-zA-Z0-9_\.\-]+@([a-zA-Z0-9-]{2,}\.)+
([a-zA-Z]{2,4}|[a-zA-Z]{2}\.[a-zA-Z]{2})$','i')),
CONSTRAINT "CK_PLEC_KLIENCI" CHECK (plec like 'M' or plec like 'K'),
CONSTRAINT "UN_EMAIL" UNIQUE ("EMAIL"),
CONSTRAINT "FK_ID_MIEJSCOWOSCI_KLIENCI" FOREIGN KEY ("ID_MIEJSCOWOSCI")
REFERENCES "PROJEKT_BZII"."MIEJSCOWOSCI" ("ID_MIEJSCOWOSCI")
);
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."ID_KLIENTA" IS 'Identyfikator klienta';
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."IMIE_KLIENTA" IS 'Imie klienta';
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."NAZWISKO_KLIENTA" IS 'Nazwisko klienta';
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."EMAIL" IS 'E-mail klienta';
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."NR_TELEFONU" IS 'Numer telefonu klienta';
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."DATA_URODZENIA" IS 'Data urodzenia klienta';
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."HASLO" IS 'Hash hasła klienta (MD5)';
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."PLEC" IS 'Pleć klienta';
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."ADRES" IS 'Numer domu klienta';
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."ADRES_NR_DOMU" IS 'Numer domu klienta';
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."ADRES_NR_MIESZKANIA" IS 'Numer mieszkania klienta';
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."KOD_POCZTOWY" IS 'Kod pocztowy adresu klienta';
COMMENT ON COLUMN "PROJEKT_BZII"."KLIENCI"."ID_MIEJSCOWOSCI" IS 'Identyfikator miejscowosci';
COMMENT ON TABLE "PROJEKT_BZII"."KLIENCI" IS 'Tabela zawierającą klientów księgarnii';
e) komentarze_ksiazki
CREATE TABLE "PROJEKT_BZII"."KOMENTARZE_KSIAZKI"
(
"ID_KOMENTARZU" NUMBER NOT NULL,
"ID_KLIENTA" NUMBER NOT NULL,
"DATA_UTWORZENIA" DATE DEFAULT sysdate NOT NULL,
"TRESC_KOMENTARZA" VARCHAR2(1200 BYTE) NOT NULL,
"ID_KSIAZKI" NUMBER NOT NULL,
"DATA_OSTATNIEJ_ZMIANY" DATE NOT NULL,
PRIMARY KEY ("ID_KOMENTARZU"),
CONSTRAINT "FK_ID_KLIENTA_KOMENTARZ" FOREIGN KEY ("ID_KLIENTA")
REFERENCES "PROJEKT_BZII"."KLIENCI" ("ID_KLIENTA"),
CONSTRAINT "FK_ID_KSIAZKI_KOMENTARZE" FOREIGN KEY ("ID_KSIAZKI")
REFERENCES "PROJEKT_BZII"."KSIAZKI" ("ID_KSIAZKI")
);
COMMENT ON COLUMN "PROJEKT_BZII"."KOMENTARZE_KSIAZKI"."ID_KOMENTARZU" IS 'Identyfikator komentarzu';
COMMENT ON COLUMN "PROJEKT_BZII"."KOMENTARZE_KSIAZKI"."ID_KLIENTA" IS 'Identyfikator klienta, który
napisal komentarz';
COMMENT ON COLUMN "PROJEKT_BZII"."KOMENTARZE_KSIAZKI"."DATA_UTWORZENIA" IS 'Data utworzenia komentarzu';
COMMENT ON COLUMN "PROJEKT_BZII"."KOMENTARZE_KSIAZKI"."TRESC_KOMENTARZA" IS 'Treść komentarzu';
COMMENT ON COLUMN "PROJEKT_BZII"."KOMENTARZE_KSIAZKI"."ID_KSIAZKI" IS 'Identyfikator książki';
COMMENT ON COLUMN "PROJEKT_BZII"."KOMENTARZE_KSIAZKI"."DATA_OSTATNIEJ_ZMIANY" IS 'Data ostatniej zmiany
komentarza';
COMMENT ON TABLE "PROJEKT_BZII"."KOMENTARZE_KSIAZKI" IS 'Tabela zawierająca komentarze klientów na temat
książek';
f) koszyki
CREATE TABLE "PROJEKT_BZII"."KOSZYKI"
(
"ID_KOSZYKA" NUMBER NOT NULL,
"ID_KLIENTA" NUMBER CONSTRAINT "NN_ID_KLIENTA_KOSZYK" NOT NULL,
CONSTRAINT "PK_ID_KOSZYKA" PRIMARY KEY ("ID_KOSZYKA"),
CONSTRAINT "FK_ID_KLIENTA_KOSZYK" FOREIGN KEY ("ID_KLIENTA")
REFERENCES "PROJEKT_BZII"."KLIENCI" ("ID_KLIENTA")
);
COMMENT ON COLUMN "PROJEKT_BZII"."KOSZYKI"."ID_KOSZYKA" IS 'Identyfikator koszyka';
COMMENT ON COLUMN "PROJEKT_BZII"."KOSZYKI"."ID_KLIENTA" IS 'Identyfikator klienta koszyka';
COMMENT ON TABLE "PROJEKT_BZII"."KOSZYKI" IS 'Tabela zawierająca koszyki klientów';
4/49
g) kraje
CREATE TABLE "PROJEKT_BZII"."KRAJE"
(
"ID_KRAJU" NUMBER,
"NAZWA_KRAJU" VARCHAR2(50 BYTE) NOT NULL,
CONSTRAINT "PK_KRAJE" PRIMARY KEY ("ID_KRAJU"),
UNIQUE ("NAZWA_KRAJU")
);
COMMENT ON COLUMN "PROJEKT_BZII"."KRAJE"."ID_KRAJU" IS 'Identyfikator kraju';
COMMENT ON COLUMN "PROJEKT_BZII"."KRAJE"."NAZWA_KRAJU" IS 'Nazwa kraju';
COMMENT ON TABLE "PROJEKT_BZII"."KRAJE" IS 'Tabela zawierająca kraje';
h) ksiazki
CREATE TABLE "PROJEKT_BZII"."KSIAZKI"
(
"ID_KSIAZKI" NUMBER,
"TYTUL" VARCHAR2(150 BYTE) NOT NULL,
"ID_WYDAWNICTWA" NUMBER NOT NULL,
"ID_OPRAWY" NUMBER,
"NUMER_WYDANIA" NUMBER(2,0) DEFAULT 1,
"LICZBA_STRON" NUMBER(6,0),
"ISBN" NUMBER(13,0),
"CENA" NUMBER(6,2) NOT NULL,
"OKLADKA" BLOB,
"ISSN" NUMBER(8,0),
"NUMER_TOMU" NUMBER(3,0),
"DATA_WYDANIA" DATE NOT NULL,
"OPIS" VARCHAR2(2500 BYTE),
CONSTRAINT "PK_KSIAZKA" PRIMARY KEY ("ID_KSIAZKI"),
CONSTRAINT "CK_CENA" CHECK (cena > 0),
CONSTRAINT "CK_NUMER_WYDANIA" CHECK (numer_wydania > 0),
CONSTRAINT "CK_LICZBA_STRON" CHECK (liczba_stron >0),
CONSTRAINT "CK_ISBN" CHECK (isbn like '__________' or isbn like '_____________'),
CONSTRAINT "CK_ISSN" CHECK (issn like '________'),
CONSTRAINT "CK_NUMER_TOMU" CHECK (numer_tomu >0),
CONSTRAINT "FK_ID_WYDAWNICTWA_KSIAZKI" FOREIGN KEY ("ID_WYDAWNICTWA")
REFERENCES "PROJEKT_BZII"."WYDAWNICTWA" ("ID_WYDAWNICTWA"),
CONSTRAINT "FK_ID_OPRAWY_KSIAZKI" FOREIGN KEY ("ID_OPRAWY")
REFERENCES "PROJEKT_BZII"."OPRAWY" ("ID_OPRAWY")
);
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."ID_KSIAZKI" IS 'Identyfikator książki';
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."TYTUL" IS 'Tytuł książki';
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."ID_WYDAWNICTWA" IS 'Identyfikator wydawnictwa książki';
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."ID_OPRAWY" IS 'Identyfikator oprawy książki';
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."NUMER_WYDANIA" IS 'Numer wydania książki';
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."LICZBA_STRON" IS 'Liczba stron książki';
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."ISBN" IS 'Kod ISBN książki';
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."CENA" IS 'Cena książki w złotych';
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."OKLADKA" IS 'Okładka książki';
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."ISSN" IS 'Kod ISSN czasopisma';
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."NUMER_TOMU" IS 'Numer tomu książki';
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."DATA_WYDANIA" IS 'Data wydania książki';
COMMENT ON COLUMN "PROJEKT_BZII"."KSIAZKI"."OPIS" IS 'Opis książki';
COMMENT ON TABLE "PROJEKT_BZII"."KSIAZKI" IS 'Tabela przechowuje pozycje ksiazek znajdujace sie w naszej
bazie';
i) magazyn
CREATE TABLE "PROJEKT_BZII"."MAGAZYN"
(
"ID_KSIAZKI" NUMBER NOT NULL,
"SZTUK_KSIAZKI" NUMBER NOT NULL,
CONSTRAINT "CK_SZTUK_KSIAZKI" CHECK (sztuk_ksiazki >=0),
CONSTRAINT "PK_MAGAZYN" PRIMARY KEY ("ID_KSIAZKI"),
CONSTRAINT "FK_KSIAZKI_MAGAZYN" FOREIGN KEY ("ID_KSIAZKI")
REFERENCES "PROJEKT_BZII"."KSIAZKI" ("ID_KSIAZKI")
);
5/49
COMMENT ON COLUMN "PROJEKT_BZII"."MAGAZYN"."ID_KSIAZKI" IS 'Identyfikator książki';
COMMENT ON COLUMN "PROJEKT_BZII"."MAGAZYN"."SZTUK_KSIAZKI" IS 'Liczba sztuk książki w magazynie';
COMMENT ON TABLE "PROJEKT_BZII"."MAGAZYN" IS 'Tabela przechowująca liczbę sztuk poszczególnych książek w
sklepie';
j) miejscowosci
CREATE TABLE "PROJEKT_BZII"."MIEJSCOWOSCI"
(
"ID_MIEJSCOWOSCI" NUMBER NOT NULL,
"NAZWA_MIEJSCOWOSCI" VARCHAR2(100 BYTE) CONSTRAINT "NN_NAZWA_MIEJSCOWOSCI" NOT NULL,
"ID_WOJEWODZCTWA" NUMBER NOT NULL,
CONSTRAINT "PK_ID_MIEJSCOWOSCI" PRIMARY KEY ("ID_MIEJSCOWOSCI"),
CONSTRAINT "FK_ID_WOJEWODZCTWA" FOREIGN KEY ("ID_WOJEWODZCTWA")
REFERENCES "PROJEKT_BZII"."WOJEWODZCTWA" ("ID_WOJEWODZCTWA")
);
COMMENT ON COLUMN "PROJEKT_BZII"."MIEJSCOWOSCI"."ID_MIEJSCOWOSCI" IS 'Identyifkator miejscowości';
COMMENT ON COLUMN "PROJEKT_BZII"."MIEJSCOWOSCI"."NAZWA_MIEJSCOWOSCI" IS 'Nazwa miejscowości';
COMMENT ON COLUMN "PROJEKT_BZII"."MIEJSCOWOSCI"."ID_WOJEWODZCTWA" IS 'Identyfikator wojewódzctwa, w
którym znajduje się miejscowość';
COMMENT ON TABLE "PROJEKT_BZII"."MIEJSCOWOSCI" IS 'Tabela przechowująca miejscowości klientów';
k) oprawy
CREATE TABLE "PROJEKT_BZII"."OPRAWY"
(
"ID_OPRAWY" NUMBER,
"RODZAJ_OPRAWY" VARCHAR2(50 BYTE) NOT NULL,
CONSTRAINT "PK_OPRAWA" PRIMARY KEY ("ID_OPRAWY"),
CONSTRAINT "UN_RODZAJ_OPRAWY" UNIQUE ("RODZAJ_OPRAWY")
);
COMMENT ON COLUMN "PROJEKT_BZII"."OPRAWY"."ID_OPRAWY" IS 'Identyfikator oprawy';
COMMENT ON COLUMN "PROJEKT_BZII"."OPRAWY"."RODZAJ_OPRAWY" IS 'Rodzaj oprawy';
COMMENT ON TABLE "PROJEKT_BZII"."OPRAWY" IS 'Tabela zawierające rodzaje oprawy książek';
l) podkategorie
CREATE TABLE "PROJEKT_BZII"."PODKATEGORIE"
(
"ID_PODKATEGORII" NUMBER,
"ID_KATEGORII" NUMBER NOT NULL,
"NAZWA_PODKATEGORII" VARCHAR2(75 BYTE) NOT NULL,
CONSTRAINT "PK_PODKATEGORIE" PRIMARY KEY ("ID_PODKATEGORII"),
CONSTRAINT "UN_NAZWA_PODKATEGORII" UNIQUE ("NAZWA_PODKATEGORII"),
CONSTRAINT "FK_ID_KATEGORII" FOREIGN KEY ("ID_KATEGORII")
REFERENCES "PROJEKT_BZII"."KATEGORIE" ("ID_KATEGORII")
);
COMMENT ON COLUMN "PROJEKT_BZII"."PODKATEGORIE"."ID_PODKATEGORII" IS 'Identyfikator podkategorii';
COMMENT ON COLUMN "PROJEKT_BZII"."PODKATEGORIE"."ID_KATEGORII" IS 'Identyfikator kategorii, do której
przynależy podkategoria';
COMMENT ON COLUMN "PROJEKT_BZII"."PODKATEGORIE"."NAZWA_PODKATEGORII" IS 'Nazwa podkategorii';
COMMENT ON TABLE "PROJEKT_BZII"."PODKATEGORIE" IS 'Tabela zawierająca podkategorie książek';
m) podkategorie_z_ksiazkami
CREATE TABLE "PROJEKT_BZII"."PODKATEGORIE_Z_KSIAZKAMI"
(
"ID_KSIAZKI" NUMBER NOT NULL,
"ID_PODKATEGORII" NUMBER NOT NULL,
CONSTRAINT "PK_PODKATEGORIE_Z_KSIAZKAMI" PRIMARY KEY ("ID_KSIAZKI", "ID_PODKATEGORII"),
CONSTRAINT "FK_ID_KSIAZKI_PODKATEGORIE" FOREIGN KEY ("ID_KSIAZKI")
REFERENCES "PROJEKT_BZII"."KSIAZKI" ("ID_KSIAZKI"),
CONSTRAINT "FK_ID_PODKATEGORII_KSIAZEK" FOREIGN KEY ("ID_PODKATEGORII")
REFERENCES "PROJEKT_BZII"."PODKATEGORIE" ("ID_PODKATEGORII")
);
COMMENT ON COLUMN "PROJEKT_BZII"."PODKATEGORIE_Z_KSIAZKAMI"."ID_KSIAZKI" IS 'Identyfikator książki';
6/49
COMMENT ON COLUMN "PROJEKT_BZII"."PODKATEGORIE_Z_KSIAZKAMI"."ID_PODKATEGORII" IS 'Identyfikator
podkategorii';
COMMENT ON TABLE "PROJEKT_BZII"."PODKATEGORIE_Z_KSIAZKAMI" IS 'Podkategorie dopasowane do książek';
COMMENT ON COLUMN "PROJEKT_BZII"."PODKATEGORIE_Z_KSIAZKAMI"."ID_KSIAZKI" IS 'Identyfikator książki';
COMMENT ON COLUMN "PROJEKT_BZII"."PODKATEGORIE_Z_KSIAZKAMI"."ID_PODKATEGORII" IS 'Identyfikator
podkategorii';
COMMENT ON TABLE "PROJEKT_BZII"."PODKATEGORIE_Z_KSIAZKAMI" IS 'Podkategorie dopasowane do książek';
n) produkty_w_koszyku
CREATE TABLE "PROJEKT_BZII"."PRODUKTY_W_KOSZYKU"
(
"ID_KOSZYKA" NUMBER NOT NULL,
"ID_KSIAZKI" NUMBER NOT NULL,
"LICZBA_SZTUK" NUMBER(3,0) DEFAULT 1 NOT NULL,
CONSTRAINT "CK_LICZBA_SZTUK" CHECK (liczba_sztuk >=1),
CONSTRAINT "FK_ID_KOSZYKA_PRODUKTY" FOREIGN KEY ("ID_KOSZYKA")
REFERENCES "PROJEKT_BZII"."KOSZYKI" ("ID_KOSZYKA"),
CONSTRAINT "FK_ID_KSIAZKI_PRODUKTY" FOREIGN KEY ("ID_KSIAZKI")
REFERENCES "PROJEKT_BZII"."KSIAZKI" ("ID_KSIAZKI")
);
COMMENT ON COLUMN "PROJEKT_BZII"."PRODUKTY_W_KOSZYKU"."ID_KOSZYKA" IS 'Identyfikator koszyka';
COMMENT ON COLUMN "PROJEKT_BZII"."PRODUKTY_W_KOSZYKU"."ID_KSIAZKI" IS 'Identyfikator książki';
COMMENT ON COLUMN "PROJEKT_BZII"."PRODUKTY_W_KOSZYKU"."LICZBA_SZTUK" IS 'Liczba sztuk książki';
COMMENT ON TABLE "PROJEKT_BZII"."PRODUKTY_W_KOSZYKU" IS 'Tabela zawierająca produkty zawarte w koszykach
klientów';
o) sprzedaze
CREATE TABLE "PROJEKT_BZII"."SPRZEDAZE"
(
"ID_SPRZEDAZY" NUMBER NOT NULL,
"ID_KOSZYKA" NUMBER NOT NULL,
"DATA_SPRZEDAZY" DATE DEFAULT sysdate NOT NULL,
CONSTRAINT "PK_ID_SPRZEDAZY" PRIMARY KEY ("ID_SPRZEDAZY"),
CONSTRAINT "FK_ID_KOSZYKA_SPRZEDAZE" FOREIGN KEY ("ID_KOSZYKA")
REFERENCES "PROJEKT_BZII"."KOSZYKI" ("ID_KOSZYKA")
);
COMMENT ON COLUMN "PROJEKT_BZII"."SPRZEDAZE"."ID_SPRZEDAZY" IS 'Identyfikator sprzedazy';
COMMENT ON COLUMN "PROJEKT_BZII"."SPRZEDAZE"."ID_KOSZYKA" IS 'Identyfikator koszyka';
COMMENT ON COLUMN "PROJEKT_BZII"."SPRZEDAZE"."DATA_SPRZEDAZY" IS 'Data dokonania transakcji';
COMMENT ON TABLE "PROJEKT_BZII"."SPRZEDAZE" IS 'Tabela zawierająca dokonane transakcje';
p) wojewodzctwa
CREATE TABLE "PROJEKT_BZII"."WOJEWODZCTWA"
(
"ID_WOJEWODZCTWA" NUMBER,
"NAZWA_WOJEWODZCTWA" VARCHAR2(50 BYTE) NOT NULL,
"ID_KRAJU" NUMBER NOT NULL,
CONSTRAINT "PK_WOJEWODZCTWA" PRIMARY KEY ("ID_WOJEWODZCTWA"),
UNIQUE ("NAZWA_WOJEWODZCTWA"),
CONSTRAINT "FK_ID_KRAJU" FOREIGN KEY ("ID_KRAJU")
REFERENCES "PROJEKT_BZII"."KRAJE" ("ID_KRAJU")
);
COMMENT ON COLUMN "PROJEKT_BZII"."WOJEWODZCTWA"."ID_WOJEWODZCTWA" IS 'Identyfikator wojewódzctwa';
COMMENT ON COLUMN "PROJEKT_BZII"."WOJEWODZCTWA"."NAZWA_WOJEWODZCTWA" IS 'Nazwa wojewódzctwa';
COMMENT ON COLUMN "PROJEKT_BZII"."WOJEWODZCTWA"."ID_KRAJU" IS 'Identyfikator kraju';
COMMENT ON TABLE "PROJEKT_BZII"."WOJEWODZCTWA" IS 'Tabela zawierającą wojewódzctwa';
r) wydawnictwa
CREATE TABLE "PROJEKT_BZII"."WYDAWNICTWA"
(
"ID_WYDAWNICTWA" NUMBER,
"NAZWA_WYDAWNICTWA" VARCHAR2(80 BYTE) NOT NULL,
CONSTRAINT "PK_WYDAWNICTWO" PRIMARY KEY ("ID_WYDAWNICTWA"),
7/49
CONSTRAINT "UN_NAZWA_WYDAWNICTWA" UNIQUE ("NAZWA_WYDAWNICTWA")
);
COMMENT ON COLUMN "PROJEKT_BZII"."WYDAWNICTWA"."ID_WYDAWNICTWA" IS 'Identyfikator wydawnictwa';
COMMENT ON COLUMN "PROJEKT_BZII"."WYDAWNICTWA"."NAZWA_WYDAWNICTWA" IS 'Nazwa wydawnictwa';
COMMENT ON TABLE "PROJEKT_BZII"."WYDAWNICTWA" IS 'Tabela zawierająca wydawnictwa książek';
s) archiwum_autorzy
CREATE TABLE "PROJEKT_BZII"."ARCHIWUM_AUTORZY"
(
"ID_AUTORA" NUMBER NOT NULL,
"RODZAJ_ZMIANY" VARCHAR2(3 BYTE) NOT NULL,
"DATA_ZMIANY" DATE DEFAULT sysdate NOT NULL,
"ID_UZYTKOWNIKA" VARCHAR2(50 BYTE) NOT NULL,
"IP_KOMPUTERA" VARCHAR2(39 BYTE) NOT NULL,
"STARE_IMIE" VARCHAR2(50 BYTE),
"STARE_NAZWISKO" VARCHAR2(75 BYTE),
"STARA_DATA_URODZENIA" DATE,
"STARE_MIEJSCE_URODZENIA" VARCHAR2(100 BYTE),
"NOWE_IMIE" VARCHAR2(50 BYTE),
"NOWE_NAZWISKO" VARCHAR2(75 BYTE),
"NOWA_DATA_URODZENIA" DATE,
"NOWE_MIEJSCE_URODZENIA" VARCHAR2(100 BYTE)
);
t) archiwum_klienci
CREATE TABLE "PROJEKT_BZII"."ARCHIWUM_KLIENCI"
(
"ID_KLIENTA" NUMBER NOT NULL,
"RODZAJ_ZMIANY" VARCHAR2(3 BYTE) NOT NULL,
"DATA_ZMIANY" DATE DEFAULT sysdate NOT NULL,
"ID_UZYTKOWNIKA" VARCHAR2(25 BYTE) NOT NULL,
"IP_KOMPUTERA" VARCHAR2(39 BYTE) NOT NULL,
"STARE_IMIE_KLIENTA" VARCHAR2(50 BYTE),
"STARE_NAZWISKO_KLIENTA" VARCHAR2(75 BYTE),
"STARY_EMAIL" VARCHAR2(50 BYTE),
"STARY_KRAJ" VARCHAR2(50 BYTE),
"STARE_WOJEWODZCTWO" VARCHAR2(50 BYTE),
"STARA_MIEJSCOWOSC" VARCHAR2(100 BYTE),
"STARY_KOD_POCZTOWY" VARCHAR2(12 BYTE),
"STARY_ADRES" VARCHAR2(100 BYTE),
"STARY_NR_DOMU" VARCHAR2(8 BYTE),
"STARY_NR_MIESZKANIA" VARCHAR2(8 BYTE),
"STARY_NR_TELEFONU" NUMBER(9,0),
"STARE_HASLO" VARCHAR2(32 BYTE),
"NOWE_IMIE_KLIENTA" VARCHAR2(50 BYTE),
"NOWE_NAZWISKO_KLIENTA" VARCHAR2(75 BYTE),
"NOWY_EMAIL" VARCHAR2(50 BYTE),
"NOWY_KRAJ" VARCHAR2(50 BYTE),
"NOWE_WOJEWODZCTWO" VARCHAR2(50 BYTE),
"NOWA_MIEJSCOWOSC" VARCHAR2(100 BYTE),
"NOWY_KOD_POCZTOWY" VARCHAR2(12 BYTE),
"NOWY_ADRES" VARCHAR2(100 BYTE),
"NOWY_NR_DOMU" VARCHAR2(8 BYTE),
"NOWY_NR_MIESZKANIA" VARCHAR2(8 BYTE),
"NOWY_NR_TELEFONU" NUMBER(9,0),
"NOWE_HASLO" VARCHAR2(32 BYTE)
);
u) archiwum_ksiazki
CREATE TABLE "PROJEKT_BZII"."ARCHIWUM_KSIAZKI"
(
"ID_ARCHIWUM_KSIAZKI" NUMBER,
"ID_KSIAZKI" NUMBER NOT NULL,
"RODZAJ_ZMIANY" VARCHAR2(3 BYTE) NOT NULL,
"DATA_ZMIANY" DATE DEFAULT sysdate NOT NULL,
"ID_UZYTKOWNIKA" VARCHAR2(25 BYTE) NOT NULL,
8/49
"IP_KOMPUTERA" VARCHAR2(39 BYTE) NOT NULL,
"STARY_TYTUL" VARCHAR2(150 BYTE),
"STARE_WYDAWNICTWO" VARCHAR2(80 BYTE),
"STARA_OPRAWA" VARCHAR2(50 BYTE),
"STARY_NUMER_WYDANIA" NUMBER(2,0),
"STARA_LICZBA_STRON" NUMBER,
"STARE_ISBN" NUMBER(13,0),
"STARE_ISSN" NUMBER(8,0),
"STARA_CENA" NUMBER(6,2),
"STARY_OPIS" VARCHAR2(2500 BYTE),
"STARA_OKLADKA" BLOB,
"NOWY_TYTUL" VARCHAR2(150 BYTE),
"NOWE_WYDAWNICTWO" VARCHAR2(80 BYTE),
"NOWA_OPRAWA" VARCHAR2(50 BYTE),
"NOWY_NUMER_WYDANIA" NUMBER(2,0),
"NOWA_LICZBA_STRON" NUMBER,
"NOWE_ISBN" NUMBER(13,0),
"NOWE_ISSN" NUMBER(8,0),
"NOWA_CENA" NUMBER(6,2),
"NOWY_OPIS" VARCHAR2(2500 BYTE),
"NOWA_OKLADKA" BLOB,
CONSTRAINT "PK_ARCHIWUM_KSIAZKI" PRIMARY KEY ("ID_ARCHIWUM_KSIAZKI")
)
3. Dostępne widoki
a) v_Archiwum
CREATE OR REPLACE VIEW "PROJEKT_BZII"."V_ARCHIWUM" AS
with tabarch as
(
select 'Archiwum aktorzy ' "Dzial",
' ' ID, ' ' "Rodzaj zmiany", ' ' "Data zmiany", ' ' "ID uzytkownika",
' ' "IP Komputera", 1 ID_tabeli, -1 tab
from dual
union
select ' ' "Dzial", to_char(id_autora) ID, rodzaj_zmiany "Rodzaj zmiany",
to_char(data_zmiany, 'DD-MM-YYYY HH24:MI:SS') "Data zmiany",
ID_uzytkownika "ID uzytkownika",
IP_komputera "IP Komputera", -2 ID_tabeli, 1 tab from archiwum_autorzy
union
select 'Archiwum klienci ' "Dzial",
' ' ID, ' ' "Rodzaj zmiany", ' ' "Data zmiany", ' ' "ID uzytkownika",
' ' "IP Komputera", 2 ID_tabeli, -1 tab
from dual
union
select ' ' "Dzial", to_char(id_klienta) ID, rodzaj_zmiany "Rodzaj zmiany",
to_char(data_zmiany, 'DD-MM-YYYY HH24:MI:SS') "Data zmiany",
ID_uzytkownika "ID uzytkownika",
IP_komputera "IP Komputera", -2 ID_tabeli, 2 tab from archiwum_klienci
union
select 'Archiwum książki ' "Dzial",
' ' ID, ' ' "Rodzaj zmiany", ' ' "Data zmiany", ' ' "ID uzytkownika",
' ' "IP Komputera", 3 ID_tabeli, -1 tab
from dual
union
select ' ' "Dzial", to_char(id_ksiazki) ID, rodzaj_zmiany "Rodzaj zmiany",
to_char(data_zmiany, 'DD-MM-YYYY HH24:MI:SS') "Data zmiany",
ID_uzytkownika "ID uzytkownika",
IP_komputera "IP Komputera", -2 ID_tabeli, 3 tab from archiwum_ksiazki
)
select "Dzial", ID, "Rodzaj zmiany", "Data zmiany", "ID uzytkownika", "IP Komputera" from tabarch
connect
by prior ID_tabeli = tab
start
with tab = -1
order SIBLINGS by "Data zmiany";
b) v_Kategorie
9/49
CREATE OR REPLACE VIEW "PROJEKT_BZII"."V_KATEGORIE" AS
with kateg as
(
select id_kategorii id_podkategorii
, nazwa_kategorii "Nazwa kategorii"
, -1 kat
from kategorie
union
select id_podkategorii
, nazwa_podkategorii "Nazwa kategorii"
, id_kategorii kat
from podkategorie
)
select lpad(' ', level*3)|| "Nazwa kategorii" "Nazwa kategorii"
from kateg
connect
by prior id_podkategorii = kat
start
with kat = -1;
c) v_Klienci
CREATE OR REPLACE FORCE VIEW "PROJEKT_BZII"."V_KLIENCI" AS
select imie_klienta "Imie klienta", nazwisko_klienta "Nazwisko klienta",
plec "Płeć", email "E-mail", nazwa_kraju "Nazwa kraju", nazwa_wojewodzctwa "Nazwa wojewódzctwa",
nazwa_miejscowosci "Miejscowość", kod_pocztowy "Kod pocztowy", adres "Adres",
adres_nr_domu "Nr. domu", nvl(adres_nr_mieszkania, '') "Nr. mieszkania",
nr_telefonu "Numer telefonu", to_char(data_urodzenia, 'DD-MM-YYYY') "Data urodzenia"
from klienci natural join miejscowosci natural join wojewodzctwa natural join kraje order by id_klienta;
d) v_Ksiazki
CREATE OR REPLACE FORCE VIEW "PROJEKT_BZII"."V_KSIAZKI" AS
select id_ksiazki ID, tytul "Tytuł książki",
nvl((select listagg(imie || ' ' || nazwisko,', ') within group (order by nazwisko)
from autorzy_z_ksiazkami natural join autorzy where id_ksiazki = ks.id_ksiazki), ' ')
"Autorzy",
(select listagg(nazwa_podkategorii, ', ') within group (order by nazwa_podkategorii)
from podkategorie_z_ksiazkami natural join podkategorie where id_ksiazki = ks.id_ksiazki)
"Podkategorie",
nazwa_wydawnictwa "Nazwa wydawnictwa", numer_tomu "Numer tomu", numer_wydania "Numer wydania", liczba_stron
"Liczba stron",
to_char( cena, '9999.99' ) "Cena",
(select sztuk_ksiazki from magazyn where id_ksiazki = ks.id_ksiazki) "Liczba sztuk książki",
rodzaj_oprawy "Rodzaj oprawy", data_wydania "Data wydania", ISBN "Kod ISBN", ISSN "Kod ISSN",
opis "Opis"
from ksiazki ks natural join wydawnictwa natural join oprawy order by ID;
e) v_Lokalizacje
CREATE OR REPLACE VIEW "PROJEKT_BZII"."V_LOKALIZACJE" AS
with lokal as
(
select id_kraju id_wojewodzctwa
, nazwa_kraju Nazwa_lok
, -1 kra
from kraje
union
select id_wojewodzctwa
, nazwa_wojewodzctwa Nazwa_lok
, id_kraju kra
from wojewodzctwa
union
select id_miejscowosci id_wojewodzctwa
, nazwa_miejscowosci Nazwa_lok
10/49
, id_wojewodzctwa kra
from miejscowosci natural join wojewodzctwa
)
select lpad(' ', level*3)|| Nazwa_lok as Nazwa
from lokal
start with kra = -1
connect by prior id_wojewodzctwa = kra
order SIBLINGS by Nazwa_lok;
f) v_Sprzedaze
CREATE OR REPLACE VIEW "PROJEKT_BZII"."V_SPRZEDAZE" AS
select id_sprzedazy "Id sprzedaży", id_koszyka "Id koszyka",imie_klienta as "Imie klienta",
nazwisko_klienta as "Nazwisko klienta",
(select sum(liczba_sztuk) from produkty_w_koszyku where id_koszyka = tab.id_koszyka group by id_koszyka)
"Liczba zakupionych sztuk",
(select sum(cena*liczba_sztuk) from produkty_w_koszyku natural join ksiazki where id_koszyka =
tab.id_koszyka group by id_koszyka)
"Suma kosztow",
to_char(data_sprzedazy, 'DD-MM-YYYY HH24:MI:SS') "Data sprzedaży"
from
(select * from sprzedaze natural join koszyki natural join klienci) tab;
g) v_SprzedzazeTop10
CREATE OR REPLACE VIEW "PROJEKT_BZII"."V_SPRZEDAZETOP10" AS
select tytul from (
select tytul, sum(liczba_sztuk) "Sztuk", rank() over (order by sum(liczba_sztuk) desc) as "Pozycja"
from (select * from (select * from produkty_w_koszyku natural join ksiazki) tab
where exists (select id_koszyka from sprzedaze s where s.id_koszyka=tab.id_koszyka)) tab where
rownum <= 10
group by (tytul));
h) v_SprzedazeTop10_men
CREATE OR REPLACE VIEW "PROJEKT_BZII"."V_SPRZEDAZETOP10_MEN" AS
select tytul from (
select tytul, sum(liczba_sztuk) "Sztuk", rank() over (order by sum(liczba_sztuk) desc) as "Pozycja"
from (select * from (select * from produkty_w_koszyku natural join ksiazki natural join koszyki natural join
klienci where plec = 'M') tab
where exists (select id_koszyka from sprzedaze s where s.id_koszyka=tab.id_koszyka)) tab where
rownum <= 10
group by (tytul));
i) v_SprzedazeTop10_women
CREATE OR REPLACE VIEW "PROJEKT_BZII"."V_SPRZEDAZETOP10_WOMEN” AS
select tytul from (
select tytul, sum(liczba_sztuk) "Sztuk", rank() over (order by sum(liczba_sztuk) desc) as "Pozycja"
from (select * from (select * from produkty_w_koszyku natural join ksiazki natural join koszyki natural join
klienci where plec = 'K') tab
where exists (select id_koszyka from sprzedaze s where s.id_koszyka=tab.id_koszyka)) tab where
rownum <= 10
group by (tytul));
4. Dostępne wyzwalacze
a) t_Autorzy – wyzwalacz odpowiedzialny za dodawanie do tabeli archiwum_autorzy dokonanych
zmian w tabeli autorzy
create or replace
trigger t_Autorzy
11/49
after insert or delete or update on autorzy
for each row
declare
uzytkownik archiwum_autorzy.id_uzytkownika%type;
ip archiwum_autorzy.ip_komputera%type;
liczba_wystapien number;
begin
SELECT USER into uzytkownik FROM DUAL; --wyciagamy uzytkownika
select SYS_CONTEXT('USERENV', 'IP_ADDRESS', 15) into ip from dual; --wyciagamy IP
if inserting then
insert into archiwum_autorzy values (:new.id_autora, 'INS', sysdate, uzytkownik,
ip, null, null,null,null, :new.imie, :new.nazwisko, :new.data_urodzenia, :new.miejsce_urodzenia);
elsif updating then
insert into archiwum_autorzy values (:new.id_autora, 'UPD', sysdate, uzytkownik,
ip, :old.imie, :old.nazwisko, :old.data_urodzenia, :old.miejsce_urodzenia,
:new.imie, :new.nazwisko, :new.data_urodzenia, :new.miejsce_urodzenia);
elsif deleting then
insert into archiwum_autorzy values (:old.id_autora, 'DEL', sysdate, uzytkownik,
ip, :old.imie, :old.nazwisko, :old.data_urodzenia, :old.miejsce_urodzenia,
null,null,null,null);
end if;
end;
b) t_Autorzy_before – wyzwalacz odpowiedzialny za dodawanie liczebników po nazwisku autora
w przypadku istnieniu już w tabeli autorzy autora z takim samym imieniem i nazwiskiem
create or replace
trigger t_Autorzy_before
before insert on autorzy
for each row
declare
liczba_wystapien number;
begin
select count(*) into liczba_wystapien from autorzy where imie=:new.imie and (nazwisko like :new.nazwisko ||
' (%' or nazwisko =:new.nazwisko);
if (liczba_wystapien >0) then
if inserting then
:new.nazwisko := :new.nazwisko || ' (' || liczba_wystapien || ')';
end if;
end if;
end;
c) t_Klienci - wyzwalacz odpowiedzialny za dodawanie do tabeli archiwum_klienci dokonanych
zmian w tabeli klienci
create or replace
trigger t_Klienci
after insert or delete or update on klienci
for each row
declare
uzytkownik archiwum_klienci.id_uzytkownika%type;
ip archiwum_klienci.ip_komputera%type;
nkraj archiwum_klienci.nowy_kraj%type;
12/49
nwojewodzctwo archiwum_klienci.nowe_wojewodzctwo%type;
nmiejscowosc archiwum_klienci.nowa_miejscowosc%type;
skraj archiwum_klienci.stary_kraj%type;
swojewodzctwo archiwum_klienci.stare_wojewodzctwo%type;
smiejscowosc archiwum_klienci.stara_miejscowosc%type;
begin
SELECT USER into uzytkownik FROM DUAL; --wyciagamy uzytkownika
select SYS_CONTEXT('USERENV', 'IP_ADDRESS', 15) into ip from dual; --wyciagamy IP
if inserting then
select nazwa_miejscowosci, nazwa_wojewodzctwa,
nazwa_kraju into nmiejscowosc,nwojewodzctwo,nkraj from miejscowosci natural join
wojewodzctwa natural join kraje where id_miejscowosci = :new.id_miejscowosci;
insert into archiwum_klienci values (:new.id_klienta, 'INS', sysdate, uzytkownik,ip,
/* stare */
null, null, null, null,null,null,null,null,null,null,null,null,
/* nowe */
:new.imie_klienta, :new.nazwisko_klienta,
:new.email,nkraj,nwojewodzctwo,nmiejscowosc, :new.kod_pocztowy, :new.adres, :new.adres_nr_domu,
:new.adres_nr_mieszkania, :new.nr_telefonu, :new.haslo);
elsif updating then
select nazwa_miejscowosci, nazwa_wojewodzctwa,
nazwa_kraju into nmiejscowosc,nwojewodzctwo,nkraj from miejscowosci natural join
wojewodzctwa natural join kraje where id_miejscowosci = :new.id_miejscowosci;
select nazwa_miejscowosci, nazwa_wojewodzctwa,
nazwa_kraju into smiejscowosc,swojewodzctwo,skraj from miejscowosci natural join
wojewodzctwa natural join kraje where id_miejscowosci = :old.id_miejscowosci;
insert into archiwum_klienci values (:new.id_klienta, 'UPD', sysdate, uzytkownik, ip,
/* stare */
:old.imie_klienta, :old.nazwisko_klienta,
:old.email,skraj,swojewodzctwo,smiejscowosc, :old.kod_pocztowy, :old.adres, :old.adres_nr_domu,
:old.adres_nr_mieszkania, :old.nr_telefonu, :old.haslo,
/* nowe */
:new.imie_klienta, :new.nazwisko_klienta,
:new.email,nkraj,nwojewodzctwo,nmiejscowosc, :new.kod_pocztowy, :new.adres, :new.adres_nr_domu,
:new.adres_nr_mieszkania, :new.nr_telefonu, :new.haslo);
elsif deleting then
select nazwa_miejscowosci, nazwa_wojewodzctwa,
nazwa_kraju into smiejscowosc,swojewodzctwo,skraj from miejscowosci natural join
wojewodzctwa natural join kraje where id_miejscowosci = :old.id_miejscowosci;
insert into archiwum_klienci values (:old.id_klienta, 'DEL', sysdate, uzytkownik, ip,
/* stare */
:old.imie_klienta, :old.nazwisko_klienta,
:old.email,skraj,swojewodzctwo,smiejscowosc, :old.kod_pocztowy, :old.adres, :old.adres_nr_domu,
:old.adres_nr_mieszkania, :old.nr_telefonu, :old.haslo,
/* nowe */
null, null, null, null,null,null,null,null,null,null,null,null);
end if;
end;
d) t_Koszyki – wyzwalacz odpowiedzialny za usunięcie wszystkich produktów z koszyka po
usunięciu danego koszyka z bazy
create or replace
trigger t_Koszyki
13/49
after delete on koszyki
for each row
declare
begin
if deleting then
delete from produkty_w_koszyku where id_koszyka = :old.id_koszyka;
end if;
end;
e) t_Ksiazki - wyzwalacz odpowiedzialny za dodawanie do tabeli archiwum_ksiazki dokonanych
zmian w tabeli ksiazki
create or replace
trigger t_Ksiazki
after insert or delete or update on ksiazki
for each row
declare
uzytkownik archiwum_ksiazki.id_uzytkownika%type;
ip archiwum_ksiazki.ip_komputera%type;
nwydawnictwo archiwum_ksiazki.nowe_wydawnictwo%type;
noprawa archiwum_ksiazki.nowa_oprawa%type;
swydawnictwo archiwum_ksiazki.stare_wydawnictwo%type;
soprawa archiwum_ksiazki.stara_oprawa%type;
begin
SELECT USER into uzytkownik FROM DUAL; --wyciagamy uzytkownika
select SYS_CONTEXT('USERENV', 'IP_ADDRESS', 15) into ip from dual; --wyciagamy IP
if inserting then
select nazwa_wydawnictwa into nwydawnictwo from wydawnictwa where id_wydawnictwa = :new.id_wydawnictwa;
select rodzaj_oprawy into noprawa from oprawy where id_oprawy = :new.id_oprawy;
insert into archiwum_ksiazki values
(
s_archiwum_ksiazki.nextval, :new.id_ksiazki, 'INS', sysdate, uzytkownik,ip,
/* stare */
null, null, null, null,null,null,null,null,null,null,
/* nowe */
:new.tytul, nwydawnictwo,
noprawa, :new.numer_wydania, :new.liczba_stron,
:new.isbn, :new.issn, :new.cena, :new.opis, :new.okladka
);
elsif updating then
select nazwa_wydawnictwa into nwydawnictwo from wydawnictwa where id_wydawnictwa = :new.id_wydawnictwa;
select rodzaj_oprawy into noprawa from oprawy where id_oprawy = :new.id_oprawy;
select nazwa_wydawnictwa into swydawnictwo from wydawnictwa where id_wydawnictwa = :old.id_wydawnictwa;
select rodzaj_oprawy into soprawa from oprawy where id_oprawy = :old.id_oprawy;
insert into archiwum_ksiazki values
(
s_archiwum_ksiazki.nextval, :new.id_ksiazki, 'UPD', sysdate, uzytkownik, ip,
/* stare */
:old.tytul, swydawnictwo, soprawa, :old.numer_wydania, :old.liczba_stron,
:old.isbn, :old.issn, :old.cena, :old.opis, :old.okladka,
/* nowe */
:new.tytul,nwydawnictwo, noprawa, :new.numer_wydania, :new.liczba_stron,
:new.isbn, :new.issn, :new.cena, :new.opis, :new.okladka
);
elsif deleting then
14/49
select nazwa_wydawnictwa into swydawnictwo from wydawnictwa where id_wydawnictwa = :old.id_wydawnictwa;
select rodzaj_oprawy into soprawa from oprawy where id_oprawy = :old.id_oprawy;
insert into archiwum_ksiazki values
(
s_archiwum_ksiazki.nextval, :old.id_ksiazki, 'DEL', sysdate, uzytkownik, ip,
/* stare */
:old.tytul, swydawnictwo, soprawa, :old.numer_wydania, :old.liczba_stron,
:old.isbn, :old.issn, :old.cena, :old.opis, :old.okladka,
/* nowe */
null,null,null,null,null,null,null,null,null,null
);
delete autorzy_z_ksiazkami where id_ksiazki = :old.id_ksiazki;
delete podkategorie_z_ksiazkami where id_ksiazki = :old.id_ksiazki;
delete magazyn where id_ksiazki = :old.id_ksiazki;
end if;
end;
5. Dostępne paczki
a) autoryzacja - paczka odpowiedzialna na logowanie oraz wygenerowanie hash'u MD5 dla
podanego hasła.
create or replace
package autoryzacja as
--definicja wyjątków paczki
NIE_POPRAWNE_HASLO exception;
PRAGMA EXCEPTION_INIT(NIE_POPRAWNE_HASLO, -20009);
NIE_ISTNIEJE_EMAIL exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_EMAIL, -20010);
--logowanie
function loguj
(
emailf klienci.email%type,
haslof varchar2
)
return number;
FUNCTION dajMD5
(
str IN VARCHAR2
)
RETURN VARCHAR2;
end autoryzacja;
create or replace
package body autoryzacja as
--logowanie
function loguj
(
emailf klienci.email%type,
haslof varchar2
)
return number as
czy_istnieje_email number;
czy_poprawne_haslo number;
begin
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
select count(*) into czy_istnieje_email from klienci where email = emailf;
if (czy_istnieje_email = 0) then
15/49
raise_application_error( -20010, 'Podany email nie istnieje w bazie' );
end if;
select count(*) into czy_poprawne_haslo from klienci where email = emailf and haslo = dajmd5(haslof);
if (czy_poprawne_haslo = 0) then
raise_application_error( -20009, 'Nieprawidlowe haslo' );
end if;
commit;
return 0;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
FUNCTION dajMD5 (str IN VARCHAR2)
RETURN VARCHAR2
IS v_checksum VARCHAR2(32);
BEGIN
v_checksum :=
LOWER( RAWTOHEX( UTL_RAW.CAST_TO_RAW( sys.dbms_obfuscation_toolkit.md5(input_string => str) ) ) );
RETURN v_checksum;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
return SQLCODE;
END dajMD5;
end autoryzacja;
b) statystyka - paczka odpowiedzialna za przechowywanie funkcji statystycznych oraz
analitycznych
create or replace
package statystyka as
--definicja wyjątków paczki
BRAK_SPRZEDAZY_MIESIAC exception;
PRAGMA EXCEPTION_INIT(BRAK_SPRZEDAZY_MIESIAC, -20035);
NIEPRAWIDLOWA_PLEC exception;
PRAGMA EXCEPTION_INIT(NIEPRAWIDLOWA_PLEC, -20036);
Function sredniaSprzedazMiesiac(miesiac number default to_number(to_char(sysdate,'MM')), rok number
default to_number(to_char(sysdate,'YYYY')))
return number;
Function zyskISprzedaz(liczba_ksiazek_f OUT number, zysk_f OUT number, termin_od date, termin_do date
default sysdate)
return number;
Function top10sprzedazy(miesiac number default to_number(to_char(sysdate, 'MM')), rok number default
to_number(to_char(sysdate, 'YYYY')))
return number;
Function top10sprzedazy(plecf varchar2, miesiac number default to_number(to_char(sysdate, 'MM')), rok
number default to_number(to_char(sysdate, 'YYYY')))
return number;
end statystyka;
create or replace
package body statystyka as
Function sredniaSprzedazMiesiac(miesiac number default to_number(to_char(sysdate,'MM')), rok number
default to_number(to_char(sysdate,'YYYY')))
16/49
return number as
czy_istnieje number;
suma number;
liczba number;
srednia number;
begin
set transaction read only;
select count(*) into czy_istnieje from sprzedaze where to_number(to_char(data_sprzedazy,'MM')) = miesiac
and to_number(to_char(data_sprzedazy,'YYYY')) = rok;
if (czy_istnieje = 0) then
raise_application_error( -20035, 'Brak sprzedazy w podanym miesiacu!');
else
select count(*) into liczba from sprzedaze
where to_number(to_char(data_sprzedazy,'MM')) = miesiac
and to_number(to_char(data_sprzedazy,'YYYY')) = rok;
--select sum(suma_koszt) into suma from sprzedaze
--where to_number(to_char(data_sprzedazy,'MM')) = miesiac
--and to_number(to_char(data_sprzedazy,'YYYY')) = rok;
commit;
return suma/liczba;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
Function zyskISprzedaz(liczba_ksiazek_f OUT number, zysk_f OUT number, termin_od date, termin_do date
default sysdate)
return number as
begin
set transaction read only;
if (termin_od >= termin_do) then
commit;
raise_application_error( -20044, 'Nie prawidlowy okres czasu');
else
select sum(liczba_sztuk) into liczba_ksiazek_f from produkty_w_koszyku where
id_koszyka = any (select id_koszyka from sprzedaze where data_sprzedazy >= termin_od
and data_sprzedazy <= termin_do);
select sum(liczba_sztuk*cena) into liczba_ksiazek_f from produkty_w_koszyku natural join ksiazki where
id_koszyka = any (select id_koszyka from sprzedaze where data_sprzedazy >= termin_od
and data_sprzedazy <= termin_do);
commit;
return 0;
end if;
null;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
Function top10sprzedazy(miesiac number default to_number(to_char(sysdate, 'MM')), rok number default
to_number(to_char(sysdate, 'YYYY')))
return number as
cursor kurs is
select rank() over (order by sum(liczba_sztuk) desc) as "Pozycja", tytul, sum(liczba_sztuk) "Sztuk"
from produkty_w_koszyku natural join ksiazki where id_koszyka = any
(
select id_koszyka
from sprzedaze
where
17/49
to_number(to_char(data_sprzedazy,'MM')) = miesiac and to_number(to_char(data_sprzedazy,'YYYY')) = rok)
group by tytul;
tytulf ksiazki.tytul%type;
sztukf number;
pozycjaf number;
czy_istnieje number;
begin
set transaction read only;
select count(*) into czy_istnieje from sprzedaze where to_number(to_char(data_sprzedazy,'MM')) = miesiac
and to_number(to_char(data_sprzedazy,'YYYY')) = rok;
if (czy_istnieje = 0) then
commit;
raise_application_error( -20035, 'Brak sprzedazy w podanym miesiacu!');
else
open kurs;
dbms_output.put_line('TOP10 - ' || miesiac || '.' || rok);
loop
fetch kurs into pozycjaf, tytulf, sztukf;
exit when kurs%notfound;
dbms_output.put_line(pozycjaf || '. Tytul: ' || tytulf || ', ' || sztukf || ' sztuk');
end loop;
close kurs;
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
Function top10sprzedazy(plecf varchar2, miesiac number default to_number(to_char(sysdate, 'MM')), rok
number default to_number(to_char(sysdate, 'YYYY')))
return number as
cursor kurs is
select rank() over (order by sum(liczba_sztuk) desc) as "Pozycja", tytul, sum(liczba_sztuk) "Sztuk"
from produkty_w_koszyku natural join ksiazki where id_koszyka = any
(
select id_koszyka
from sprzedaze natural join koszyki natural join klienci
where
to_number(to_char(data_sprzedazy,'MM')) = 5 and to_number(to_char(data_sprzedazy,'YYYY')) = 2013
and plec = plecf)
group by tytul;
tytulf ksiazki.tytul%type;
sztukf number;
pozycjaf number;
czy_istnieje number;
begin
set transaction read only;
if (upper(plecf) != 'M' and upper(plecf) != 'K') then
raise_application_error( -20036, 'Nieprawidlowa plec!');
end if;
select count(*) into czy_istnieje from sprzedaze natural join koszyki natural join klienci where
to_number(to_char(data_sprzedazy,'MM')) = miesiac and to_number(to_char(data_sprzedazy,'YYYY')) = rok and
plec = upper(plecf);
if (czy_istnieje = 0) then
commit;
raise_application_error( -20035, 'Brak sprzedazy w podanym miesiacu!');
else
open kurs;
dbms_output.put_line('TOP10 - ' || miesiac || '.' || rok);
loop
fetch kurs into pozycjaf, tytulf, sztukf;
18/49
exit when kurs%notfound;
dbms_output.put_line(pozycjaf || '. Tytul: ' || tytulf || ', ' || sztukf || ' sztuk');
end loop;
close kurs;
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
end statystyka;
c) zarzadzanieAutorami - paczka odpowiedzialna za zarządzanie autorami w bazie danych.
create or replace
package zarzadzanieAutorami as
--definicja wyjątków paczki
ISTNIEJE_AUTOR exception;
PRAGMA EXCEPTION_INIT(ISTNIEJE_AUTOR, -20007);
NIE_ISTNIEJE_AUTOR exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_AUTOR, -20008);
--dodaj autora wszystkie informacje
function dodaj
(
imief autorzy.imie%type,
nazwiskof autorzy.nazwisko%type,
data_urodzenia date,
miejsce_urodzenia autorzy.miejsce_urodzenia%type,
opis_autoraf autorzy.opis_autora%type
)
return number;
--dodaj autora bez imienia
function dodaj
(
nazwiskof autorzy.nazwisko%type,
data_urodzenia date,
miejsce_urodzenia autorzy.miejsce_urodzenia%type,
opis_autoraf autorzy.opis_autora%type
)
return number;
--usuwanie autora po ID
function usun
(
id_autoraf autorzy.id_autora%type
)
return number;
--zmień dane autora
function modyfikuj
(
id_autoraf autorzy.id_autora%type,
imief autorzy.imie%type,
nazwiskof autorzy.nazwisko%type,
opis_autoraf autorzy.opis_autora%type
)
return number;
end zarzadzanieAutorami;
create or replace
package body zarzadzanieAutorami as
19/49
--dodaj autora wszystkie informacje
function dodaj
(
imief autorzy.imie%type,
nazwiskof autorzy.nazwisko%type,
data_urodzenia date,
miejsce_urodzenia autorzy.miejsce_urodzenia%type,
opis_autoraf autorzy.opis_autora%type
)
return number as
begin
insert into autorzy values
(
s_autorzy.nextval, imief, nazwiskof, data_urodzenia, miejsce_urodzenia,opis_autoraf
);
commit;
return 0;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--dodaj autora bez imienia
function dodaj
(
nazwiskof autorzy.nazwisko%type,
data_urodzenia date,
miejsce_urodzenia autorzy.miejsce_urodzenia%type,
opis_autoraf autorzy.opis_autora%type
)
return number as
begin
insert into autorzy values
(
s_autorzy.nextval, null, nazwiskof, data_urodzenia, miejsce_urodzenia,opis_autoraf
);
commit;
return 0;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--usuwanie autora po ID
function usun
(
id_autoraf autorzy.id_autora%type
)
return number as
begin
delete from autorzy where id_autora = id_autoraf;
if SQL%notfound then
raise_application_error( -20008, 'Nie istnieje autor o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--zmień dane autora
function modyfikuj
20/49
(
id_autoraf autorzy.id_autora%type,
imief autorzy.imie%type,
nazwiskof autorzy.nazwisko%type,
opis_autoraf autorzy.opis_autora%type
)
return number as
temp autorzy.id_autora%type;
begin
lock table autorzy in row share mode;
update autorzy set imie = imief, nazwisko = nazwiskof, opis_autora = opis_autoraf
where id_autora = id_autoraf;
if SQL%notfound then
raise_application_error( -20008, 'Nie istnieje autor o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
end zarzadzanieAutorami;
d) zarzadzanieKategoriami – paczka odpowiedzialna za zarządzanie dostępnymi kategoriami
książek.
create or replace
package zarzadzanieKategoriami as
--definicja wyjątków paczki
NIE_ISTNIEJE_KATEGORIA exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_KATEGORIA, -20011);
ISTNIEJE_KATEGORIA exception;
PRAGMA EXCEPTION_INIT(ISTNIEJE_KATEGORIA, -20012);
--dodaj kategorie
function dodaj
(
nazwa_kategoriif kategorie.nazwa_kategorii%type
)
return number;
--usuwanie kategorii po ID
function usun
(
id_kategoriif kategorie.id_kategorii%type
)
return number;
--zmień nazwe kategorii
function modyfikuj
(
id_kategoriif kategorie.id_kategorii%type,
nazwa_kategoriif kategorie.nazwa_kategorii%type
)
return number;
end zarzadzanieKategoriami;
create or replace
package body zarzadzanieKategoriami as
--dodaj kategorie
function dodaj
(
nazwa_kategoriif kategorie.nazwa_kategorii%type
21/49
)
return number as
czy_istnieje number;
begin
select count(*) into czy_istnieje from kategorie where upper(nazwa_kategorii) =
upper(nazwa_kategoriif);
if(czy_istnieje != 0) then
raise_application_error( -20012, 'Istnieje już taka kategoria' );
else
insert into kategorie values
(
s_kategorie.nextval, nazwa_kategoriif
);
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--usuwanie kategorii po ID
function usun
(
id_kategoriif kategorie.id_kategorii%type
)
return number as
begin
delete from kategorie where id_kategorii = id_kategoriif;
if SQL%notfound then
raise_application_error( -20011, 'Nie istnieje kategoria o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--zmień nazwe kategorii
function modyfikuj
(
id_kategoriif kategorie.id_kategorii%type,
nazwa_kategoriif kategorie.nazwa_kategorii%type
)
return number as
czy_istnieje number;
czy_istnieje_id number;
cursor kurs is select id_kategorii from kategorie where id_kategorii = id_kategoriif FOR UPDATE OF
nazwa_kategorii;
tmp kategorie.id_kategorii%type;
begin
select count(*) into czy_istnieje from kategorie where upper(nazwa_kategorii) =
upper(nazwa_kategoriif);
if(czy_istnieje != 0) then
raise_application_error( -20012, 'Istnieje już taka kategoria' );
end if;
select count(*) into czy_istnieje_id from kategorie where id_kategorii = id_kategoriif;
if(czy_istnieje = 0) then
raise_application_error( -20011, 'Nie istnieje kategoria o takim ID' );
22/49
end if;
open kurs;
fetch kurs into tmp;
update kategorie set nazwa_kategorii = nazwa_kategoriif
WHERE CURRENT OF kurs;
close kurs;
commit;
return 0;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
end zarzadzanieKategoriami;
e) zarzadzanieKlientami – paczka odpowiedzialna za zarządzanie klientami w bazie danych.
create or replace
package zarzadzanieKlientami as
--definicja wyjątków paczki
ISTNIEJE_KLIENT exception;
PRAGMA EXCEPTION_INIT(ISTNIEJE_KLIENT, -20000);
EMAIL_ZAJETY exception;
PRAGMA EXCEPTION_INIT(EMAIL_ZAJETY, -20001);
NIEPRAWIDLOWA_DATA_UR exception;
PRAGMA EXCEPTION_INIT(NIEPRAWIDLOWA_DATA_UR, -20002);
NIE_ISTNIEJE_KLIENT exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_KLIENT, -20003);
--dodaj klienta wszystkie informacje
function dodaj
(
imie_klientaf klienci.imie_klienta%type,
nazwisko_klientaf klienci.nazwisko_klienta%type,
emailf klienci.email%type,
kod_pocztowyf klienci.kod_pocztowy%type,
nr_telefonuf klienci.nr_telefonu%type,
data_urodzeniaf klienci.data_urodzenia%type,
haslof varchar2,
miejscowoscf varchar2,
id_wojewodzctwaf number,
id_krajuf number,
adresf klienci.adres%type,
adres_nr_domuf klienci.adres_nr_domu%type,
adres_nr_mieszkaniaf klienci.adres_nr_mieszkania%type,
plecf klienci.plec%type
)
return number;
--dodaj klienta bez telefonu
function dodaj
(
imie_klientaf klienci.imie_klienta%type,
nazwisko_klientaf klienci.nazwisko_klienta%type,
emailf klienci.email%type,
kod_pocztowyf klienci.kod_pocztowy%type,
data_urodzeniaf klienci.data_urodzenia%type,
haslof varchar2,
miejscowoscf varchar2,
id_wojewodzctwaf number,
id_krajuf number,
adresf klienci.adres%type,
adres_nr_domuf klienci.adres_nr_domu%type,
adres_nr_mieszkaniaf klienci.adres_nr_mieszkania%type,
23/49
plecf klienci.plec%type
)
return number;
--usuwanie klienta po ID
function usun
(
id_klientaf klienci.id_klienta%type
)
return number;
--zmień dane użytkownika
function modyfikuj
(
id_klientaf klienci.id_klienta%type,
imie_klientaf klienci.imie_klienta%type,
nazwisko_klientaf klienci.nazwisko_klienta%type,
emailf klienci.email%type,
kod_pocztowyf klienci.kod_pocztowy%type,
nr_telefonuf klienci.nr_telefonu%type,
data_urodzeniaf klienci.data_urodzenia%type,
haslof varchar2,
miejscowoscf varchar2,
id_wojewodzctwaf number,
id_krajuf number,
adresf klienci.adres%type,
adres_nr_domuf klienci.adres_nr_domu%type,
adres_nr_mieszkaniaf klienci.adres_nr_mieszkania%type,
plecf klienci.plec%type
)
return number;
end zarzadzanieKlientami;
create or replace
package body zarzadzanieKlientami as
--dodaj klienta wszystkie informacje
function dodaj
(
imie_klientaf klienci.imie_klienta%type,
nazwisko_klientaf klienci.nazwisko_klienta%type,
emailf klienci.email%type,
kod_pocztowyf klienci.kod_pocztowy%type,
nr_telefonuf klienci.nr_telefonu%type,
data_urodzeniaf klienci.data_urodzenia%type,
haslof varchar2,
miejscowoscf varchar2,
id_wojewodzctwaf number,
id_krajuf number,
adresf klienci.adres%type,
adres_nr_domuf klienci.adres_nr_domu%type,
adres_nr_mieszkaniaf klienci.adres_nr_mieszkania%type,
plecf klienci.plec%type
)
return number as
czy_email_zajety number;
czy_istnieje number;
czy_istnieje_miejscowosc number;
id_miejscowoscf_tmp number;
begin
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
select count(*) into czy_istnieje from klienci natural join miejscowosci natural join wojewodzctwa
natural join kraje
where
upper(imie_klienta) = upper(imie_klientaf) and upper(nazwisko_klienta) = upper(nazwisko_klientaf) and
id_wojewodzctwa = id_wojewodzctwaf and upper(nazwa_miejscowosci) = upper(miejscowoscf) and
kod_pocztowy = kod_pocztowyf and
data_urodzenia = data_urodzeniaf and id_kraju = id_krajuf and id_wojewodzctwa = id_wojewodzctwaf
24/49
and upper(adres) = upper(adresf);
select count(*) into czy_email_zajety from klienci where email = emailf;
if(czy_istnieje != 0) then
raise_application_error( -20000, 'Istnieje już taki klient' );
elsif(czy_email_zajety !=0) then
raise_application_error( -20001, 'Ten email już jest zajęty' );
elsif(data_urodzeniaf >= sysdate) then
raise_application_error( -20002, 'Nieprawidlowa data urodzenia' );
else
select count(*) into czy_istnieje_miejscowosc from miejscowosci natural join wojewodzctwa
where upper(nazwa_miejscowosci) = upper(miejscowoscf) and id_wojewodzctwa = id_wojewodzctwaf and
id_kraju = id_krajuf;
if(czy_istnieje_miejscowosc != 0) then
select id_miejscowosci into id_miejscowoscf_tmp from miejscowosci natural join wojewodzctwa
where upper(nazwa_miejscowosci) = upper(miejscowoscf) and id_wojewodzctwa = id_wojewodzctwaf and
id_kraju = id_krajuf;
else
insert into miejscowosci values (s_miejscowosci.nextval, miejscowoscf, id_wojewodzctwaf)
returning id_miejscowosci into id_miejscowoscf_tmp;
end if;
insert into klienci values
(
s_klienci.nextval, imie_klientaf, nazwisko_klientaf, emailf,
nr_telefonuf, data_urodzeniaf, autoryzacja.dajmd5(haslof), upper(plecf), adresf,
adres_nr_domuf, adres_nr_mieszkaniaf, kod_pocztowyf, id_miejscowoscf_tmp
);
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--dodaj klienta bez telefonu
function dodaj
(
imie_klientaf klienci.imie_klienta%type,
nazwisko_klientaf klienci.nazwisko_klienta%type,
emailf klienci.email%type,
kod_pocztowyf klienci.kod_pocztowy%type,
data_urodzeniaf klienci.data_urodzenia%type,
haslof varchar2,
miejscowoscf varchar2,
id_wojewodzctwaf number,
id_krajuf number,
adresf klienci.adres%type,
adres_nr_domuf klienci.adres_nr_domu%type,
adres_nr_mieszkaniaf klienci.adres_nr_mieszkania%type,
plecf klienci.plec%type
)
return number as
czy_email_zajety number;
czy_istnieje number;
czy_istnieje_miejscowosc number;
id_miejscowoscf_tmp number;
begin
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
select count(*) into czy_istnieje from klienci natural join miejscowosci natural join wojewodzctwa
natural join kraje
25/49
where
upper(imie_klienta) = upper(imie_klientaf) and upper(nazwisko_klienta) = upper(nazwisko_klientaf) and
id_wojewodzctwa = id_wojewodzctwaf and upper(nazwa_miejscowosci) = upper(miejscowoscf) and
kod_pocztowy = kod_pocztowyf and
data_urodzenia = data_urodzeniaf and id_kraju = id_krajuf and id_wojewodzctwa = id_wojewodzctwaf
and upper(adres) = upper(adresf);
select count(*) into czy_email_zajety from klienci where email = emailf;
if(czy_istnieje != 0) then
raise_application_error( -20000, 'Istnieje już taki klient' );
elsif(czy_email_zajety !=0) then
raise_application_error( -20001, 'Ten email już jest zajęty' );
elsif(data_urodzeniaf >= sysdate) then
raise_application_error( -20002, 'Nieprawidlowa data urodzenia' );
else
select count(*) into czy_istnieje_miejscowosc from miejscowosci natural join wojewodzctwa
where upper(nazwa_miejscowosci) = upper(miejscowoscf) and id_wojewodzctwa = id_wojewodzctwaf and
id_kraju = id_krajuf;
if(czy_istnieje_miejscowosc != 0) then
select id_miejscowosci into id_miejscowoscf_tmp from miejscowosci natural join wojewodzctwa
where upper(nazwa_miejscowosci) = upper(miejscowoscf) and id_wojewodzctwa = id_wojewodzctwaf and
id_kraju = id_krajuf;
else
insert into miejscowosci values (s_miejscowosci.nextval, miejscowoscf, id_wojewodzctwaf)
returning id_miejscowosci into id_miejscowoscf_tmp;
end if;
insert into klienci values
(
s_klienci.nextval, imie_klientaf, nazwisko_klientaf, emailf,
null, data_urodzeniaf, autoryzacja.dajmd5(haslof), upper(plecf), adresf,
adres_nr_domuf, adres_nr_mieszkaniaf, kod_pocztowyf, id_miejscowoscf_tmp
);
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--usuwanie klienta po ID
function usun(id_klientaf klienci.id_klienta%type)
return number as
czy_miejscowosc_uzywana number;
id_miejscowoscif number;
begin
select id_miejscowosci into id_miejscowoscif from klienci where id_klienta = id_klientaf;
delete from klienci where id_klienta = id_klientaf;
if SQL%notfound then
raise_application_error( -20003, 'Nie istnieje klient o takim ID' );
else
select count(*) into czy_miejscowosc_uzywana from klienci
where id_miejscowosci = id_miejscowoscif;
if(czy_miejscowosc_uzywana = 0) then
delete from miejscowosci where id_miejscowosci = id_miejscowoscif;
end if;
commit;
return 0;
26/49
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--zmień dane użytkownika
function modyfikuj
(
id_klientaf klienci.id_klienta%type,
imie_klientaf klienci.imie_klienta%type,
nazwisko_klientaf klienci.nazwisko_klienta%type,
emailf klienci.email%type,
kod_pocztowyf klienci.kod_pocztowy%type,
nr_telefonuf klienci.nr_telefonu%type,
data_urodzeniaf klienci.data_urodzenia%type,
haslof varchar2,
miejscowoscf varchar2,
id_wojewodzctwaf number,
id_krajuf number,
adresf klienci.adres%type,
adres_nr_domuf klienci.adres_nr_domu%type,
adres_nr_mieszkaniaf klienci.adres_nr_mieszkania%type,
plecf klienci.plec%type
)
return number as
czy_email_zajety number;
czy_istnieje number;
czy_istnieje_miejscowosc number;
id_miejscowoscf_tmp number;
czy_miejscowosc_uzywana number;
sid_miejscowoscif number;
begin
lock table klienci in row share mode;
select id_miejscowosci into sid_miejscowoscif from klienci where id_klienta = id_klientaf;
select count(*) into czy_istnieje from klienci natural join miejscowosci natural join wojewodzctwa
natural join kraje
where
upper(imie_klienta) = upper(imie_klientaf) and upper(nazwisko_klienta) = upper(nazwisko_klientaf) and
id_wojewodzctwa = id_wojewodzctwaf and upper(nazwa_miejscowosci) = upper(miejscowoscf) and
kod_pocztowy = kod_pocztowyf and
data_urodzenia = data_urodzeniaf and id_kraju = id_krajuf and id_wojewodzctwa = id_wojewodzctwaf
and upper(adres) = upper(adresf) and id_klienta <> id_klientaf;
select count(*) into czy_email_zajety from klienci where email = emailf and id_klienta <> id_klientaf;
if(czy_istnieje != 0) then
raise_application_error( -20000, 'Istnieje już taki klient' );
elsif(czy_email_zajety !=0) then
raise_application_error( -20001, 'Ten email już jest zajęty' );
elsif(data_urodzeniaf >= sysdate) then
raise_application_error( -20002, 'Nieprawidlowa data urodzenia' );
else
select count(*) into czy_istnieje_miejscowosc from miejscowosci natural join wojewodzctwa
where upper(nazwa_miejscowosci) = upper(miejscowoscf) and id_wojewodzctwa = id_wojewodzctwaf and
id_kraju = id_krajuf;
if(czy_istnieje_miejscowosc != 0) then
select id_miejscowosci into id_miejscowoscf_tmp from miejscowosci natural join wojewodzctwa
where upper(nazwa_miejscowosci) = upper(miejscowoscf) and id_wojewodzctwa = id_wojewodzctwaf and
id_kraju = id_krajuf;
else
insert into miejscowosci values (s_miejscowosci.nextval, miejscowoscf, id_wojewodzctwaf)
returning id_miejscowosci into id_miejscowoscf_tmp;
27/49
end if;
update klienci set imie_klienta = imie_klientaf, nazwisko_klienta = nazwisko_klientaf,
email = emailf, data_urodzenia = data_urodzeniaf,
haslo = autoryzacja.dajmd5(haslof), nr_telefonu = nr_telefonuf,
plec = upper(plecf), adres = adresf, adres_nr_domu = adres_nr_domuf, adres_nr_mieszkania =
adres_nr_mieszkaniaf,
kod_pocztowy = kod_pocztowyf, id_miejscowosci = id_miejscowoscf_tmp
where id_klienta = id_klientaf;
if SQL%notfound then
raise_application_error( -20003, 'Nie istnieje klient o takim ID' );
else
select count(*) into czy_miejscowosc_uzywana from klienci
where id_miejscowosci = sid_miejscowoscif;
if(czy_miejscowosc_uzywana = 0) then
delete from miejscowosci where id_miejscowosci = sid_miejscowoscif;
end if;
commit;
return 0;
end if;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
end zarzadzanieKlientami;
f) zarzadzanieKomentarzami – paczka odpowiedzialna za zarządzanie komentarzami na temat
książek w bazie danych
create or replace
package zarzadzanieKomentarzami as
--definicja wyjątków paczki
NIE_ISTNIEJE_KOMENTARZ exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_KOMENTARZ, -20088);
NIE_PRAWIDLOWA_DATA exception;
PRAGMA EXCEPTION_INIT(NIE_PRAWIDLOWA_DATA, -20089);
--dodaj komentarz
function dodaj
(
id_klientaf number,
tresc_komentarzaf komentarze_ksiazki.tresc_komentarza%type,
id_ksiazkif number
)
return number;
--usun komentarz po ID
function usun
(
id_komentarzuf komentarze_ksiazki.id_komentarzu%type
)
return number;
--modyfikuj komentarz
function modyfikuj
(
id_komentarzuf komentarze_ksiazki.id_komentarzu%type,
tresc_komentarzaf komentarze_ksiazki.tresc_komentarza%type
)
return number;
end zarzadzanieKomentarzami;
28/49
create or replace
package body zarzadzanieKomentarzami as
--dodaj komentarz
function dodaj
(
id_klientaf number,
tresc_komentarzaf komentarze_ksiazki.tresc_komentarza%type,
id_ksiazkif number
)
return number as
begin
insert into komentarze_ksiazki values
(
s_komentarze_ksiazki.nextval, id_klientaf, sysdate, tresc_komentarzaf,
id_ksiazkif, sysdate
);
commit;
return 0;
exception
when others then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
function usun
(
id_komentarzuf komentarze_ksiazki.id_komentarzu%type
)
return number as
begin
delete from komentarze_ksiazki where id_komentarzu = id_komentarzuf;
if SQL%notfound then
raise_application_error( -20088, 'Nie istnieje komentarz o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--modyfikuj komentarz
function modyfikuj
(
id_komentarzuf komentarze_ksiazki.id_komentarzu%type,
tresc_komentarzaf komentarze_ksiazki.tresc_komentarza%type
)
return number as
czy_istnieje number;
begin
lock table komentarze_ksiazki in row share mode;
update komentarze_ksiazki set tresc_komentarza = tresc_komentarzaf, data_ostatniej_zmiany = sysdate
where id_komentarzu = id_komentarzuf;
if SQL%notfound then
raise_application_error( -20088, 'Nie istnieje komentarz o takim ID' );
else
commit;
return 0;
end if;
exception
29/49
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return sqlcode;
end;
end zarzadzanieKomentarzami;
g) zarzadzanieKrajami – paczka odpowiedzialna za zarządzanie krajami w bazie danych.
create or replace
package zarzadzanieKrajami as
--definicja wyjątków paczki
NIE_ISTNIEJE_KRAJ exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_KRAJ, -20015);
ISTNIEJE_KRAJ exception;
PRAGMA EXCEPTION_INIT(ISTNIEJE_KRAJ, -20016);
--dodaj kraj
function dodaj
(
nazwa_krajuf kraje.nazwa_kraju%type
)
return number;
--usuwanie kraju po ID
function usun
(
id_krajuf kraje.id_kraju%type
)
return number;
--zmień nazwe kraju
function modyfikuj
(
id_krajuf kraje.id_kraju%type,
nazwa_krajuf kraje.nazwa_kraju%type
)
return number;
end zarzadzanieKrajami;
create or replace
package body zarzadzanieKrajami as
--dodaj kraj
function dodaj
(
nazwa_krajuf kraje.nazwa_kraju%type
)
return number as
czy_istnieje number;
begin
select count(*) into czy_istnieje from kraje where upper(nazwa_kraju) = upper(nazwa_krajuf);
if(czy_istnieje != 0) then
raise_application_error( -20015, 'Istnieje już taki kraj' );
else
insert into kraje values
(
s_kraje.nextval, nazwa_krajuf
);
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
30/49
--usuwanie kraju po ID
function usun
(
id_krajuf kraje.id_kraju%type
)
return number as
begin
delete from kraje where id_kraju = id_krajuf;
if SQL%notfound then
raise_application_error( -20016, 'Nie istnieje kraj o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--zmień nazwe kraju
function modyfikuj
(
id_krajuf kraje.id_kraju%type,
nazwa_krajuf kraje.nazwa_kraju%type
)
return number as
czy_istnieje number;
begin
lock table kraje in row share mode;
select count(*) into czy_istnieje from kraje where upper(nazwa_kraju) = upper(nazwa_krajuf);
if(czy_istnieje != 0) then
raise_application_error( -20015, 'Istnieje już taki kraj' );
else
update kraje set nazwa_kraju = nazwa_krajuf
where id_kraju = id_krajuf;
end if;
if SQL%notfound then
raise_application_error( -20016, 'Nie istnieje kraj o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
end zarzadzanieKrajami;
h) zarzadzanieKsiazkami – paczka odpowiedzialna za zarządzanie ksiazkami w bazie danych.
create or replace
package zarzadzanieKsiazkami as
--definicja wyjątków paczki
NIE_ISTNIEJE_KSIAZKA exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_KSIAZKA, -20005);
NIE_PRAWIDLOWY_ROK_WYDANIA exception;
PRAGMA EXCEPTION_INIT(NIE_PRAWIDLOWY_ROK_WYDANIA, -20006);
IST_DOPASOWANIE_PODKATEGORII exception;
PRAGMA EXCEPTION_INIT(IST_DOPASOWANIE_PODKATEGORII, -20041);
31/49
NIST_DOPASOWANIE_PODKATEGORII exception;
PRAGMA EXCEPTION_INIT(NIST_DOPASOWANIE_PODKATEGORII, -20042);
NIE_ISTNIEJE_POWIAZANIE exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_POWIAZANIE, -20017);
ISTNIEJE_POWIAZANIE exception;
PRAGMA EXCEPTION_INIT(ISTNIEJE_POWIAZANIE, -20018);
--dodaj ksiazke
function dodaj
(
tytulf ksiazki.tytul%type,
id_wydawniaf ksiazki.id_wydawnictwa%type,
id_oprawyf ksiazki.id_ksiazki%type,
numer_wydaniaf ksiazki.numer_wydania%type,
numer_tomuf ksiazki.numer_tomu%type,
liczba_strongf ksiazki.liczba_stron%type,
data_wydaniaf ksiazki.data_wydania%type,
isbnf ksiazki.isbn%type,
issnf ksiazki.issn%type,
cenaf ksiazki.cena%type,
opisf ksiazki.opis%type,
okladkaf varchar2
)
return number;
--dodaj ksiazke bez okladki
function dodaj
(
tytulf ksiazki.tytul%type,
id_wydawniaf ksiazki.id_wydawnictwa%type,
id_oprawyf ksiazki.id_ksiazki%type,
numer_wydaniaf ksiazki.numer_wydania%type,
numer_tomuf ksiazki.numer_tomu%type,
liczba_strongf ksiazki.liczba_stron%type,
data_wydaniaf ksiazki.data_wydania%type,
isbnf ksiazki.isbn%type,
issnf ksiazki.issn%type,
cenaf ksiazki.cena%type,
opisf ksiazki.opis%type
)
return number;
--usuwanie ksiazki po ID
function usun
(
id_ksiazkif ksiazki.id_ksiazki%type
)
return number;
--zmień dane ksiązki
function modyfikuj
(
id_ksiazkif ksiazki.id_ksiazki%type,
tytulf ksiazki.tytul%type,
id_wydawnictwaf ksiazki.id_wydawnictwa%type,
id_oprawyf ksiazki.id_ksiazki%type,
numer_wydaniaf ksiazki.numer_wydania%type,
numer_tomuf ksiazki.numer_tomu%type,
liczba_stronf ksiazki.liczba_stron%type,
data_wydaniaf ksiazki.data_wydania%type,
isbnf ksiazki.isbn%type,
issnf ksiazki.issn%type,
cenaf ksiazki.cena%type,
opisf ksiazki.opis%type,
okladkaf varchar2
)
return number;
--dodaj podkategorie do ksiazki
function dodajPodkategorie
(
32/49
id_ksiazkif ksiazki.id_ksiazki%type,
id_podkategoriif podkategorie.id_podkategorii%type
)
return number;
--usun podkategorie z ksiazki
function usunPodkategorie
(
id_ksiazkif ksiazki.id_ksiazki%type,
id_podkategoriif podkategorie.id_podkategorii%type
)
return number;
--dodaj autora do ksiazki
function dodajAutora
(
id_ksiazkif autorzy_z_ksiazkami.id_ksiazki%type,
id_autoraf autorzy_z_ksiazkami.id_autora%type
)
return number;
--usuwanie autora z ksiazki po ID
function usunAutora
(
id_ksiazkif autorzy_z_ksiazkami.id_ksiazki%type,
id_autoraf autorzy_z_ksiazkami.id_autora%type
)
return number;
end zarzadzanieKsiazkami;
create or replace
package body zarzadzanieKsiazkami as
--dodaj ksiazke
function dodaj
(
tytulf ksiazki.tytul%type,
id_wydawniaf ksiazki.id_wydawnictwa%type,
id_oprawyf ksiazki.id_ksiazki%type,
numer_wydaniaf ksiazki.numer_wydania%type,
numer_tomuf ksiazki.numer_tomu%type,
liczba_strongf ksiazki.liczba_stron%type,
data_wydaniaf ksiazki.data_wydania%type,
isbnf ksiazki.isbn%type,
issnf ksiazki.issn%type,
cenaf ksiazki.cena%type,
opisf ksiazki.opis%type,
okladkaf varchar2
)
return number as
znak varchar2(1);
folder varchar2(100);
nazwa_pliku varchar2(100);
indeks_ostatni_slash number;
indeks_przedostatni_slash number;
czy_istnieje number;
nazwa_directory varchar2(100);
polecenie varchar2(100);
plik bfile;
bl blob:=empty_blob();
wielkosc number;
begin
savepoint poczatek;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
if (data_wydaniaf > sysdate) then
raise_application_error( -20006, 'Nie prawidlowy rok wydania' );
else
for i in 1..length(okladkaf) loop
znak := substr (okladkaf, i, 1);
33/49
if znak = '\' then
indeks_przedostatni_slash := indeks_ostatni_slash;
indeks_ostatni_slash := i;
end if;
end loop;
folder := substr(okladkaf, 1, indeks_ostatni_slash-1);
nazwa_pliku := substr(okladkaf, indeks_ostatni_slash+1);
nazwa_directory := substr(okladkaf, indeks_przedostatni_slash+1, indeks_ostatni_slash-
indeks_przedostatni_slash-1);
SELECT count(*) into czy_istnieje FROM all_directories
where directory_path = folder;
if (czy_istnieje = 0) then
polecenie := 'create directory ' || nazwa_directory ||' as ''' || folder || '''';
dbms_output.put_line (polecenie);
EXECUTE IMMEDIATE polecenie;
else
SELECT directory_name into nazwa_directory FROM all_directories where directory_path = folder;
end if;
plik:=bfilename(upper(nazwa_directory),nazwa_pliku);
If Dbms_Lob.Fileexists(plik)=0 Then
raise_application_error( -20030, 'Nie istnieje ten plik na dysku' );
end if;
wielkosc:=dbms_lob.getlength(plik);
insert into ksiazki values
(
s_ksiazki.nextval, tytulf,id_wydawniaf,id_oprawyf,numer_wydaniaf,liczba_strongf,
isbnf,cenaf,opisf,bl,issnf, numer_tomuf, data_wydaniaf
) returning okladka into bl;
--otwieramy oba pliki
dbms_lob.open(plik,dbms_lob.lob_readonly);
dbms_lob.open(bl,dbms_lob.lob_readwrite);
--ladowanie danych
dbms_lob.loadfromfile(bl,plik, wielkosc);
--zamykamy pliki
dbms_lob.close(bl);
dbms_lob.close(plik);
commit;
return 0;
end if;
exception
when OTHERS then
rollback to poczatek;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--dodaj ksiazke bez okladki
function dodaj
(
tytulf ksiazki.tytul%type,
id_wydawniaf ksiazki.id_wydawnictwa%type,
id_oprawyf ksiazki.id_ksiazki%type,
numer_wydaniaf ksiazki.numer_wydania%type,
numer_tomuf ksiazki.numer_tomu%type,
liczba_strongf ksiazki.liczba_stron%type,
data_wydaniaf ksiazki.data_wydania%type,
isbnf ksiazki.isbn%type,
issnf ksiazki.issn%type,
cenaf ksiazki.cena%type,
opisf ksiazki.opis%type
)
return number as
34/49
begin
savepoint poczatek;
if (data_wydaniaf > sysdate) then
raise_application_error( -20006, 'Nie prawidlowy rok wydania' );
else
insert into ksiazki values
(
s_ksiazki.nextval, tytulf,id_wydawniaf,id_oprawyf,numer_wydaniaf,liczba_strongf,
isbnf,cenaf,opisf,null,issnf, numer_tomuf, data_wydaniaf
);
commit;
return 0;
end if;
exception
when OTHERS then
rollback to poczatek;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--usuwanie ksiazki po ID
function usun
(
id_ksiazkif ksiazki.id_ksiazki%type
)
return number as
begin
delete from ksiazki where id_ksiazki = id_ksiazkif;
if SQL%notfound then
raise_application_error( -20005, 'Nie istnieje ksiazka o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--zmień dane ksiązki
function modyfikuj
(
id_ksiazkif ksiazki.id_ksiazki%type,
tytulf ksiazki.tytul%type,
id_wydawnictwaf ksiazki.id_wydawnictwa%type,
id_oprawyf ksiazki.id_ksiazki%type,
numer_wydaniaf ksiazki.numer_wydania%type,
numer_tomuf ksiazki.numer_tomu%type,
liczba_stronf ksiazki.liczba_stron%type,
data_wydaniaf ksiazki.data_wydania%type,
isbnf ksiazki.isbn%type,
issnf ksiazki.issn%type,
cenaf ksiazki.cena%type,
opisf ksiazki.opis%type,
okladkaf varchar2
)
return number as
begin
begin
lock table ksiazki in row share mode;
if (data_wydaniaf > sysdate) then
raise_application_error( -20006, 'Nie prawidlowy rok wydania' );
35/49
else
update ksiazki set tytul = tytulf, id_wydawnictwa = id_wydawnictwaf,
id_oprawy = id_oprawyf, numer_wydania = numer_wydaniaf, liczba_stron = liczba_stronf,
isbn = isbnf, cena = cenaf, opis = opisf,
okladka = okladkaf, issn = issnf, numer_tomu = numer_tomuf, data_wydania = data_wydaniaf
where id_ksiazki = id_ksiazkif;
end if;
if SQL%notfound then
raise_application_error( -20005, 'Nie istnieje ksiazka o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
end;
--dodaj podkategorie do ksiazki
function dodajPodkategorie
(
id_ksiazkif ksiazki.id_ksiazki%type,
id_podkategoriif podkategorie.id_podkategorii%type
)
return number as
czy_istnieje number;
begin
select count(*) into czy_istnieje from podkategorie_z_ksiazkami where id_podkategorii = id_podkategorii
and id_ksiazki = id_ksiazkif;
if (czy_istnieje != 0) then
raise_application_error( -20041, 'Ta podkategoria zostala juz dopasowana do tej ksiazka' );
end if;
insert into podkategorie_z_ksiazkami values (id_ksiazkif, id_podkategoriif);
commit;
return 0;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--dodaj podkategorie do ksiazki
function usunPodkategorie
(
id_ksiazkif ksiazki.id_ksiazki%type,
id_podkategoriif podkategorie.id_podkategorii%type
)
return number as
czy_istnieje number;
begin
delete from podkategorie_z_ksiazkami where id_ksiazki = id_ksiazkif and id_podkategorii =
id_podkategoriif;
if SQL%notfound then
raise_application_error( -20042, 'Ta podkategoria nie zostala dopasowana do tej ksiazka' );
else
commit;
return 0;
end if;
36/49
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--dodaj autora do ksiazki
function dodajAutora
(
id_ksiazkif autorzy_z_ksiazkami.id_ksiazki%type,
id_autoraf autorzy_z_ksiazkami.id_autora%type
)
return number as
czy_istnieje number;
czy_pierwszy_autor number;
begin
select count(*) into czy_istnieje from autorzy_z_ksiazkami where
id_ksiazki = id_ksiazkif and id_autora = id_autoraf;
if(czy_istnieje != 0) then
raise_application_error( -20018, 'Ten autor zostal juz dodany do ksiazki' );
end if;
insert into autorzy_z_ksiazkami values
(
id_ksiazkif, id_autoraf
);
commit;
return 0;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--usuwanie autora z ksiazki po ID
function usunAutora
(
id_ksiazkif autorzy_z_ksiazkami.id_ksiazki%type,
id_autoraf autorzy_z_ksiazkami.id_autora%type
)
return number as
czy_istnieje_autor number;
begin
delete from autorzy_z_ksiazkami where id_ksiazki = id_ksiazkif and id_autora = id_autoraf;
if SQL%notfound then
raise_application_error( -20017, 'Ten autor nie zostal dodany do tej ksiazki' );
end if;
commit;
return 0;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
end zarzadzanieKsiazkami;
i) zarzadzanieMagazynem – paczka odpowiedzialna za zarządzanie magazynem w bazie danych.
create or replace
package zarzadzanieMagazynem as
--definicja wyjątków paczki
NIE_ISTNIEJE_KSIAZKA exception;
37/49
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_KSIAZKA, -20026);
--dodaj sztuki ksiazki do magazynu
function dodaj
(
id_ksiazkif magazyn.id_ksiazki%type,
sztuk magazyn.sztuk_ksiazki%tyipe
)
return number;
--usuwanie sztuk ksiazki z magazynu po ID
function odejmij
(
id_ksiazkif magazyn.id_ksiazki%type,
sztuk magazyn.sztuk_ksiazki%type default 1
)
return number;
end zarzadzanieMagazynem;
create or replace
package body zarzadzanieMagazynem as
--dodaj sztuki
function dodaj
(
id_ksiazkif magazyn.id_ksiazki%type,
sztuk magazyn.sztuk_ksiazki%type
)
return number as
sztuk_ksiazkif magazyn.sztuk_ksiazki%type;
czy_istnieje number;
begin
lock table magazyn in row share mode;
select count(*) into czy_istnieje from magazyn where id_ksiazki = id_ksiazkif;
if(czy_istnieje = 0) then
insert into magazyn values (id_ksiazkif, sztuk_ksiazkif);
else
select sztuk_ksiazki into sztuk_ksiazkif from magazyn where id_ksiazki = id_ksiazkif;
update magazyn set sztuk_ksiazki = sztuk_ksiazkif + sztuk where id_ksiazki = id_ksiazkif;
if SQL%notfound then
raise_application_error( -20026, 'Nie istnieje ksiazki w magazynie o takim ID' );
else
commit;
return 0;
end if;
end if;
return 0;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--usuwanie kategorii po ID
function odejmij
(
id_ksiazkif magazyn.id_ksiazki%type,
sztuk magazyn.sztuk_ksiazki%type default 1
)
return number as
sztuk_ksiazkif magazyn.sztuk_ksiazki%type;
begin
lock table magazyn in row share mode;
select sztuk_ksiazki into sztuk_ksiazkif from magazyn where id_ksiazki = id_ksiazkif;
update magazyn set sztuk_ksiazki = sztuk_ksiazkif - sztuk where id_ksiazki = id_ksiazkif;
if SQL%notfound then
raise_application_error( -20026, 'Nie istnieje ksiazka w magazynie o takim ID' );
38/49
else
commit;
return 0;
end if;
return 0;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
end zarzadzanieMagazynem;
j) zarzadzanieOprawami – paczka odpowiedzialna za zarządzanie oprawami w bazie danych.
create or replace
package zarzadzanieOprawami as
--definicja wyjątków paczki
NIE_ISTNIEJE_OPRAWA exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_OPRAWA, -20017);
ISTNIEJE_OPRAWA exception;
PRAGMA EXCEPTION_INIT(ISTNIEJE_OPRAWA, -20018);
--dodaj oprawe
function dodaj
(
rodzaj_oprawyf oprawy.rodzaj_oprawy%type
)
return number;
--usuwanie oprawy po ID
function usun
(
id_oprawyf oprawy.id_oprawy%type
)
return number;
--zmień rodzaj oprawy
function modyfikuj
(
id_oprawyf oprawy.id_oprawy%type,
rodzaj_oprawyf oprawy.rodzaj_oprawy%type
)
return number;
end zarzadzanieOprawami;
create or replace
package body zarzadzanieOprawami as
--definicja wyjątków paczki
NIE_ISTNIEJE_OPRAWA exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_OPRAWA, -20017);
ISTNIEJE_OPRAWA exception;
PRAGMA EXCEPTION_INIT(ISTNIEJE_OPRAWA, -20018);
--dodaj oprawe
function dodaj
(
rodzaj_oprawyf oprawy.rodzaj_oprawy%type
)
return number as
czy_istnieje number;
begin
select count(*) into czy_istnieje from oprawy where upper(rodzaj_oprawy) = upper(rodzaj_oprawyf);
if(czy_istnieje != 0) then
raise_application_error( -20017, 'Istnieje już taki rodzaj oprawy' );
39/49
else
insert into oprawy values
(
s_oprawy.nextval, rodzaj_oprawyf
);
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--usuwanie oprawy po ID
function usun
(
id_oprawyf oprawy.id_oprawy%type
)
return number as
begin
delete from oprawy where id_oprawy = id_oprawyf;
if SQL%notfound then
raise_application_error( -20018, 'Nie istnieje oprawa o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--zmień rodzaj oprawy
function modyfikuj
(
id_oprawyf oprawy.id_oprawy%type,
rodzaj_oprawyf oprawy.rodzaj_oprawy%type
)
return number as
czy_istnieje number;
begin
lock table oprawy in row share mode;
select count(*) into czy_istnieje from oprawy where upper(rodzaj_oprawy) = upper(rodzaj_oprawyf);
if(czy_istnieje != 0) then
raise_application_error( -20017, 'Istnieje już taki rodzaj oprawy' );
else
update oprawy set rodzaj_oprawy = rodzaj_oprawyf
where id_oprawy = id_oprawyf;
end if;
if SQL%notfound then
raise_application_error( -20016, 'Nie istnieje oprawa o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
end zarzadzanieOprawami;
40/49
k) zarzadzaniePodkategoriami – paczka odpowiedzialna za zarządzanie podkategoriami książek w
bazie danych.
create or replace
package zarzadzaniePodkategoriami as
--definicja wyjątków paczki
NIE_ISTNIEJE_PODKATEGORIA exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_PODKATEGORIA, -20013);
ISTNIEJE_PODKATEGORIA exception;
PRAGMA EXCEPTION_INIT(ISTNIEJE_PODKATEGORIA, -20014);
--dodaj podkategorie
function dodaj
(
id_kategoriif podkategorie.id_kategorii%type,
nazwa_podkategoriif podkategorie.nazwa_podkategorii%type
)
return number;
--usuwanie podkategorii po ID
function usun
(
id_podkategoriif podkategorie.id_podkategorii%type
)
return number;
--zmień nazwe kategorii
function modyfikuj
(
id_podkategoriif podkategorie.id_podkategorii%type,
id_kategoriif podkategorie.id_kategorii%type,
nazwa_podkategoriif podkategorie.nazwa_podkategorii%type
)
return number;
end zarzadzaniePodkategoriami;
create or replace
package body zarzadzaniePodkategoriami as
--dodaj podkategorie
function dodaj
(
id_kategoriif podkategorie.id_kategorii%type,
nazwa_podkategoriif podkategorie.nazwa_podkategorii%type
)
return number as
czy_istnieje number;
begin
select count(*) into czy_istnieje from podkategorie where upper(nazwa_podkategorii) =
upper(nazwa_podkategoriif);
if(czy_istnieje != 0) then
raise_application_error( -20014, 'Istnieje już taka podkategoria' );
else
insert into podkategorie values
(
s_podkategorie.nextval, id_kategoriif, nazwa_podkategoriif
);
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--usuwanie podkategorii po ID
function usun
41/49
(
id_podkategoriif podkategorie.id_podkategorii%type
)
return number as
begin
delete from podkategorie where id_podkategorii = id_podkategoriif;
if SQL%notfound then
raise_application_error( -20013, 'Nie istnieje podkategoria o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--zmień nazwe kategorii
function modyfikuj
(
id_podkategoriif podkategorie.id_podkategorii%type,
id_kategoriif podkategorie.id_kategorii%type,
nazwa_podkategoriif podkategorie.nazwa_podkategorii%type
)
return number as
czy_istnieje number;
begin
lock table podkategorie in row share mode;
select count(*) into czy_istnieje from podkategorie where upper(nazwa_podkategorii) =
upper(nazwa_podkategoriif);
if(czy_istnieje != 0) then
raise_application_error( -20014, 'Istnieje już taka podkategoria' );
else
update podkategorie set nazwa_podkategorii = nazwa_podkategoriif, id_kategorii = id_kategoriif
where id_podkategorii = id_podkategoriif;
end if;
if SQL%notfound then
raise_application_error( -20013, 'Nie istnieje podkategoria o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
end zarzadzaniePodkategoriami;
l) zarzadzanieSprzedazami - paczka odpowiedzialna za zarządzanie sprzedażami książek oraz
koszykami w bazie danych.
create or replace
package zarzadzanieSprzedazami as
--definicja wyjątków paczki
NIE_ISTNIEJE_SPRZEDAZ exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_SPRZEDAZ, -20033);
NIE_PRAWIDLOWA_DATA exception;
PRAGMA EXCEPTION_INIT(NIE_PRAWIDLOWA_DATA, -20034);
NIE_PRAWIDLOWA_SZTUK exception;
42/49
PRAGMA EXCEPTION_INIT(NIE_PRAWIDLOWA_SZTUK, -20035);
ISTNIEJE_SPRZEDAZ exception;
PRAGMA EXCEPTION_INIT(ISTNIEJE_SPRZEDAZ, -20036);
NIE_ISTNIEJE_KOSZYK exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_KOSZYK, -20044);
function stworzKoszyk
(
id_klientaf koszyki.id_klienta%type
)
return number;
--dodanie produktu do koszyka po ID
function dodajProduktDoKoszyka
(
id_koszykaf koszyki.id_klienta%type,
id_ksiazkif ksiazki.id_ksiazki%type,
liczba_sztukf produkty_w_koszyku.liczba_sztuk%type default 1
)
return number;
--usuwanie produktu z koszyka po ID
function usunProduktZKoszyka
(
id_koszykaf koszyki.id_klienta%type,
id_ksiazkif ksiazki.id_ksiazki%type
)
return number;
--wyczyszczenie koszyka
function wyczysckoszyk
(
id_koszykaf koszyki.id_klienta%type
)
return number;
--usuwanie koszyka po ID
function usunkoszyk
(
id_koszykaf koszyki.id_klienta%type
)
return number;
--finalizacja koszyka
function sfinalizujkoszyk
(
id_koszykaf koszyki.id_klienta%type
)
return number;
--usun sprzedaz
function usun
(
id_sprzedazyf sprzedaze.id_sprzedazy%type
)
return number;
end zarzadzanieSprzedazami;
create or replace
package body zarzadzanieSprzedazami as
function stworzKoszyk
(
id_klientaf koszyki.id_klienta%type
)
return number as
begin
43/49
insert into koszyki values (s_koszyki.nextval, id_klientaf);
commit;
return 0;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--dodaj produkt do koszyka
function dodajProduktDoKoszyka
(
id_koszykaf koszyki.id_klienta%type,
id_ksiazkif ksiazki.id_ksiazki%type,
liczba_sztukf produkty_w_koszyku.liczba_sztuk%type default 1
)
return number as
czy_istnieje number;
begin
if (liczba_sztukf <1) then
raise_application_error( -20035, 'Liczba sztuk musi być dodatnia');
end if;
insert into produkty_w_koszyku values (id_koszykaf, id_ksiazkif, liczba_sztukf);
commit;
return 0;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return sqlcode;
end;
--usuwanie sprzedazy po ID
function usunProduktZKoszyka
(
id_koszykaf koszyki.id_klienta%type,
id_ksiazkif ksiazki.id_ksiazki%type
)
return number as
begin
delete from produkty_w_koszyku where id_koszyka = id_koszykaf and id_ksiazki = id_ksiazkif;
if sql%notfound then
raise_application_error( -20044, 'Nie istnieje ksiazka w koszyku o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return sqlcode;
end;
--wyczyszczenie koszyka
function wyczysckoszyk
(
id_koszykaf koszyki.id_klienta%type
)
return number as
begin
delete from produkty_w_koszyku where id_koszyka = id_koszykaf;
44/49
if SQL%notfound then
raise_application_error( -20044, 'Nie istnieje koszyk o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return sqlcode;
end;
--usuwanie koszyka po ID
function usunkoszyk
(
id_koszykaf koszyki.id_klienta%type
)
return number as
begin
delete from koszyki where id_koszyka = id_koszykaf;
if SQL%notfound then
raise_application_error( -20044, 'Nie istnieje koszyk o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return sqlcode;
end;
--finalizacja koszyka
function sfinalizujkoszyk
(
id_koszykaf koszyki.id_klienta%type
)
return number as
begin
insert into sprzedaze values (s_sprzedaze.nextval, id_koszykaf, sysdate);
commit;
return 0;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return sqlcode;
end;
--usun sprzedaz
function usun
(
id_sprzedazyf sprzedaze.id_sprzedazy%type
)
return number as
begin
delete from sprzedaze where id_sprzedazy = id_sprzedazyf;
if sql%notfound then
raise_application_error( -20005, 'Nie istnieje sprzedaz o takim ID' );
else
commit;
45/49
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return sqlcode;
end;
end zarzadzanieSprzedazami;
m) zarzadzanieWojewodzctwami – paczka odpowiedzialna za zarządzanie wojewodzctwami w
bazie danych.
create or replace
package zarzadzanieWojewodzctwami as
--definicja wyjątków paczki
NIE_ISTNIEJE_WOJEWODZCTWO exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_WOJEWODZCTWO, -20015);
ISTNIEJE_WOJEWODZCTWO exception;
PRAGMA EXCEPTION_INIT(ISTNIEJE_WOJEWODZCTWO, -20016);
--dodaj wojewodzctwo
function dodaj
(
id_krajuf wojewodzctwa.id_kraju%type,
nazwa_wojewodzctwaf wojewodzctwa.nazwa_wojewodzctwa%type
)
return number;
--usuwanie wojewodzctwa po ID
function usun
(
id_wojewodzctwaf wojewodzctwa.id_wojewodzctwa%type
)
return number;
--zmień nazwe kategorii
function modyfikuj
(
id_wojewodzctwaf wojewodzctwa.id_wojewodzctwa%type,
id_krajuf wojewodzctwa.id_kraju%type,
nazwa_wojewodzctwaf wojewodzctwa.nazwa_wojewodzctwa%type
)
return number;
end zarzadzanieWojewodzctwami;
create or replace
package body zarzadzanieWojewodzctwami as
--dodaj wojewodzctwo
function dodaj
(
id_krajuf wojewodzctwa.id_kraju%type,
nazwa_wojewodzctwaf wojewodzctwa.nazwa_wojewodzctwa%type
)
return number as
czy_istnieje number;
begin
select count(*) into czy_istnieje from wojewodzctwa where upper(nazwa_wojewodzctwa) =
upper(nazwa_wojewodzctwaf);
if(czy_istnieje != 0) then
raise_application_error( -20015, 'Istnieje już takie wojewodzctwo' );
else
insert into wojewodzctwa values
(
s_wojewodzctwa.nextval, nazwa_wojewodzctwaf, id_krajuf
46/49
);
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--usuwanie wojewodzctwa po ID
function usun
(
id_wojewodzctwaf wojewodzctwa.id_wojewodzctwa%type
)
return number as
begin
delete from wojewodzctwa where id_wojewodzctwa = id_wojewodzctwaf;
if SQL%notfound then
raise_application_error( -20016, 'Nie istnieje wojewodzctwo o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--zmień nazwe kategorii
function modyfikuj
(
id_wojewodzctwaf wojewodzctwa.id_wojewodzctwa%type,
id_krajuf wojewodzctwa.id_kraju%type,
nazwa_wojewodzctwaf wojewodzctwa.nazwa_wojewodzctwa%type
)
return number as
czy_istnieje number;
begin
lock table wojewodzctwa in row share mode;
select count(*) into czy_istnieje from wojewodzctwa where upper(nazwa_wojewodzctwa) =
upper(nazwa_wojewodzctwaf);
if(czy_istnieje != 0) then
raise_application_error( -20015, 'Istnieje już takie wojewodzctwo' );
else
update wojewodzctwa set id_kraju = id_krajuf, nazwa_wojewodzctwa = nazwa_wojewodzctwaf
where id_wojewodzctwa = id_wojewodzctwaf;
end if;
if SQL%notfound then
raise_application_error( -20016, 'Nie istnieje wojewodzctwo o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
end zarzadzanieWojewodzctwami;
47/49
n) zarzadzanieWydawnictwami – paczka odpowiedzialna za zarządzanie wydawnictwami w bazie
danych.
create or replace
package zarzadzanieWydawnictwami as
--definicja wyjątków paczki
NIE_ISTNIEJE_WYDAWAWNITWO exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_WYDAWAWNITWO, -20023);
ISTNIEJE_WYDAWNICTWO exception;
PRAGMA EXCEPTION_INIT(ISTNIEJE_WYDAWNICTWO, -20024);
--dodaj wydawnictwo
function dodaj
(
nazwa_wydawnictwaf wydawnictwa.nazwa_wydawnictwa%type
)
return number;
--usuwanie wydawnictwa po ID
function usun
(
id_wydawnictwaf wydawnictwa.id_wydawnictwa%type
)
return number;
--zmień nazwe wydawnictwa
function modyfikuj
(
id_wydawnictwaf wydawnictwa.id_wydawnictwa%type,
nazwa_wydawnictwaf wydawnictwa.nazwa_wydawnictwa%type
)
return number;
end zarzadzanieWydawnictwami;
create or replace
package body zarzadzanieWydawnictwami as
--definicja wyjątków paczki
NIE_ISTNIEJE_WYDAWAWNITWO exception;
PRAGMA EXCEPTION_INIT(NIE_ISTNIEJE_WYDAWAWNITWO, -20023);
ISTNIEJE_WYDAWNICTWO exception;
PRAGMA EXCEPTION_INIT(ISTNIEJE_WYDAWNICTWO, -20024);
--dodaj wydawnictwo
function dodaj
(
nazwa_wydawnictwaf wydawnictwa.nazwa_wydawnictwa%type
)
return number as
czy_istnieje number;
begin
select count(*) into czy_istnieje from wydawnictwa where upper(nazwa_wydawnictwa) =
upper(nazwa_wydawnictwaf);
if(czy_istnieje != 0) then
raise_application_error( -20024, 'Istnieje już takie wydawnictwo' );
else
insert into wydawnictwa values
(
s_wydawnictwa.nextval, nazwa_wydawnictwaf
);
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
48/49
end;
--usuwanie wydawnictwa po ID
function usun
(
id_wydawnictwaf wydawnictwa.id_wydawnictwa%type
)
return number as
begin
delete from wydawnictwa where id_wydawnictwa = id_wydawnictwaf;
if SQL%notfound then
raise_application_error( -20023, 'Nie istnieje wydawnictwo o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
--zmień nazwe wydawnictwa
function modyfikuj
(
id_wydawnictwaf wydawnictwa.id_wydawnictwa%type,
nazwa_wydawnictwaf wydawnictwa.nazwa_wydawnictwa%type
)
return number as
begin
lock table wydawnictwa in row share mode;
update wydawnictwa set nazwa_wydawnictwa = nazwa_wydawnictwaf
where id_wydawnictwa = id_wydawnictwaf;
if SQL%notfound then
raise_application_error( -20023, 'Nie istnieje wydawnictwo o takim ID' );
else
commit;
return 0;
end if;
exception
when OTHERS then
rollback;
dbms_output.put_line(SQLERRM);
return SQLCODE;
end;
end zarzadzanieWydawnictwami;
49/49