BDII Projekt na zaliczenie ksiegarnia internetowa id 82057

background image

Mateusz Macięga, gr.32

Projekt z baz danych

Księgarnia internetowa

v. 1.4

1/49

background image

1. Model bazy danych

2/49

background image

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

background image

"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

background image

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

background image

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

background image

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

background image

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

background image

"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

background image

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

background image

, 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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

--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

background image

(

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

background image

)

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

--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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

(

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

background image

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

background image

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

background image

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

background image

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

background image

);

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

background image

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

background image

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


Document Outline


Wyszukiwarka

Podobne podstrony:
Projekt na zaliczenie
Projekt na zaliczenie
Projekt na zaliczenie przedmiotu Nauka o organizacji
wsb Kufel ekonometria projekt na zaliczenie wykładu
Projekt na zaliczenie
Wymagania odnośnie projektu na zaliczenie wykładu ze Statystyki matematycznej
Pytania z interny na zaliczenie 2007, III rok, Interna, Egzamin, Giełdy
Zagadnienia do przygotowania na zaliczenie wykładu Projektowanie Serwisów WWW, Informatyka WEEIA 201
pytania na zaliczenie wykładu-2, Projektowanie inwestycyjne, Kolokwium
pytania na zaliczenie wykładu, Projektowanie inwestycyjne, Kolokwium
tematy na zaliczenie, Studia, Sem 3, III, III Semestr, Podstawy projektowania architektonicznego, Po
Projektowanie dostępnych i funkcjonalnych aplikacji internetowych na przykładzie bazy pomiarów hy
materialy na zaliczenie toku projektowania
Materiały na zaliczenie zarządzanie projektami
Pytania z interny na zaliczenie 2007, III rok, Interna, Egzamin, Giełdy
(Microsoft Word uwierzytelnianie dokument 363w w projekcie pismo merytoryczne na stron 352 internet

więcej podobnych podstron