BDII Projekt na zaliczenie księgarnia internetowa


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


Wyszukiwarka

Podobne podstrony:
Projekt na zaliczenie
Projekt na zaliczenie
materialy na zaliczenie toku projektowania
Pytania testowe na zaliczenie
Pytania na zaliczenie wyk éadu
Czy warto wdrażać ISO 9001 artykuł na podstawie badania internetowego
Kawerny solne – magazynowanie gazu Gazownictwo projekt na 5
Mechanika gruntów Projekt Na 5
Re Prace na zaliczenie domek droga ?zNazwy1
Wzor projektu na 30 maj pdf
zagadnienia na zaliczenie
,,Polityka Oświatowa Samorządu Terytorialnego koncepcja programu ,, opracowanie na zaliczenie POL
ZAGADNIENIA NA ZALICZENIE? SS
Zagadnienia na zaliczenie Zarzadzanie Jakoscia 2014 15

więcej podobnych podstron