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