DBMS Oracle – Programowanie w PL/SQL

Transkrypt

DBMS Oracle – Programowanie w PL/SQL
DBMS Oracle – Programowanie w PL/SQL
v.1.2
Opis problemu
Klienci (tabela klient) kupują towary. Elementy do sprzedaży pobierane są z magazynu produktów (tabela magazyn –
reprezentuje partie przyjmowanego do sprzedaży towaru z tabeli produkt). Produkty można sprzedać, o ile nie są
zarezerwowane i mają prawidłową datę ważności. Jednorazowa sprzedaż (tabele sprzedaz i pozycja_sprzedazy)
dla klienta może obejmować kilka produktów (w tym te same, pochodzące z kilku partii zakupu). Klienci, którzy są
podmiotami gospodarczymi – otrzymują faktury, osoby fizyczne – otrzymują wyłącznie paragony, które nie są
rejestrowane w bazie danych.
W rozwiązaniach zadań:
1. Do generacji unikalnych identyfikatorów użyć sekwencji.
2. Zapewnić poprawną pracę kodu w środowisku wielodostępnym.
3. Podać kod SQL rozwiązania oraz konkretny przykład kodu testującego.
Używając perspektyw, wyzwalaczy oraz procedur składowanych należy zaprogramować następujące reguły biznesowe:
1.
Utworzyć perspektywę KLIENT_PUNKTY zawierający informacje o wszystkich niearchiwalnych
(id_klient_nowy= null) klientach – pola id, nazwa, nip, adres, zalega_z_platnosciami, punkty (zaokrąglona w
dół wartość całkowita). Punkty są przyznawane klientowi na podstawie zrealizowanej na jego konto sprzedaży.
Jeden punkt odpowiada kwocie 10. Dane w perspektywie powinny być posortowane malejąco wg liczby
punktów oraz nazwy (klienci bez punktów na końcu listy). Dla tak zdefiniowanej perspektywy utworzyć
wyzwalacz dla operacji wstawiania wiersza, którego zadaniem będzie wstawienie podanych danych do tabeli
klient z pominięciem pola punkty (zalega_z_platnosciami = ‘2’ i id_klient_nowy = null).
2.
Utworzyć procedurę SPRZEDAZ_PRODUKTU(id_produkt, ilosc, id_klient, symbol_faktury)
realizującą operację sprzedaży. Aby sprzedaż mogła być zrealizowana spełnione muszą być następujące
warunki:
• podany klient (id_klient) jest już zarejestrowany w systemie lub podano null (w przypadku sprzedaży dla
klienta indywidualnego),
• podany produkt id_produkt istnieje w systemie,
• klient nie zalega z płatnościami (pole zalega_z_platnosciami = ‘2’),
• data przydatności sprzedawanego produktu jest ważna,
• sprzedawana ilość produktu nie jest większa od dostępnej w ramach tego produktu (suma kolumn
ilosc_aktualna dla wszystkich rekordów danej pozycji magazynowej),
• sprzedawana ilość produktu nie spowoduje sytuacji, że poczynione wcześniej rezerwacje tego produktu
przez innych klientów nie będą miały odzwierciedlenia w stanie magazynowym (sumaryczna ilość
produktu na magazynie musi być większa bądź równa sumarycznej ilość rezerwacji tego produktu).
• faktura o symbolu symbol_faktury musi być przypisana do klienta id_klient (jeżeli faktury o podanym
symbolu nie ma, to należy ją utworzyć).
Pola id_klient oraz symbol_faktury mogą mieć wartości puste, co oznacza sprzedaż bez faktury dla klienta
indywidualnego. Przy sprzedaży kilku produktów na tę samą fakturę podajemy ten sam symbol_faktury (np.
FV/5/2008). Przy poprawnej sprzedaży należy dodać odpowiednie wpisy do tabeli sprzedaż, opcjonalnie do
tabeli faktura oraz odpowiednio zaktualizować wartości kolumny ilosc_aktualna pozycji magazynowych.
W przypadku błędów wygenerować wyjątek (RAISE_APPLICATION_ERROR).
3.
Utworzyć wyzwalacz, który nie dopuści do aktualizacji danych klienta (nazwa, nip, adres) poprzez perspektywę
KLIENT_PUNKTY, jeśli były na niego wystawione wcześniej jakiekolwiek faktury. Wszystkie wystawione już
faktury powinny być skojarzone z dotychczasowymi danymi klienta. Nowe faktury powinny mieć dane
zaktualizowane. W takim przypadku do bazy klientów powinien być dopisany nowy klient z nowymi danymi, a
historycznym danym klienta powinno zostać przypisane odpowiednie pole id_klient_nowy. Modyfikacja
kolumny zalega_z_platnosciami nie powinna podlegać ograniczeniom, a kolumny id nie zezwalamy
aktualizować w ogóle.
DBMS Oracle – Programowanie w PL/SQL
v.1.2
class Data Mo...
+KLIENT_PK
KLIENT
PRODUKT
1
«column»
+KLIENT_ID_ARCHIWALNY_FK
*PK ID: NUMBER(38)
*
NAZWA: VARCHAR2(20 CHAR)
0..*
*
NIP: VARCHAR2(13 BYTE)
*
ADRES: VARCHAR2(50 CHAR)
*
ZALEGA_Z_PLATNOSCIAMI: CHAR(1 BYTE) = NULL
ID_KLIENT_NOWY: NUMBER(38) = NULL
+KLIENT_PK
1
1 +KLIENT_PK
+PRODUKT_PK
+REZERWACJA_KLIENT_FK
+FAKTURA_KLIENT_FK
0..*
+FAKTURA_PK
+REZERWACJA_PRODUKT_FK
0..*
FAKTURA
«column»
*PK ID: NUMBER(38)
*
SYMBOL: VARCHAR2(30 CHAR)
*
ID_KLIENT: NUMBER(38)
*
DATA_WYSTAWIENIA: DATE
«column»
*PK ID: NUMBER(38)
*
NAZWA: VARCHAR2(30 CHAR)
*
CENA_SPRZEDAZY: NUMBER(38,2)
*
VAT_PROCENT: NUMBER(38) = 22
PKWIU_SWW: VARCHAR2(20 CHAR)
OPIS: VARCHAR2(50 CHAR)
0..*
POZYCJA_MAGAZYNOWA
«column»
*PK ID_KLIENT: NUMBER(38)
*PK ID_PRODUKT: NUMBER(38)
*
ILOSC: NUMBER(38)
*
DATA_WAZNOSCI_REZERWACJI: DATE
«column»
*PK ID: NUMBER(38)
*
ID_PRODUKT: NUMBER(38)
*
CENA_ZAKUPU: NUMBER(38,2)
*
ILOSC_ZAKUPIONA: NUMBER(38)
*
ILOSC_AKTUALNA: NUMBER(38)
DATA_WAZNOSCI: DATE
+POZYCJA_MAGAZYNOWA_PK
+SPRZEDAZ_FAKTURA_FK 0..*
SPRZEDAZ
+SPRZEDAZ_PK
«column»
*PK ID: NUMBER(38)
1
*
DATA_SPRZEDAZY: DATE
ID_FAKTURA: NUMBER(38)
1 +PRODUKT_PK
+POZYCJA_MAGAZYNOWA_PRODUK_FK
0..*
REZERWACJA
1
1
1
+POZ_SPRZEDAZY_POZ_MAGAZYN_FK 0..*
POZYCJA_SPRZEDAZY
+POZ_SPRZEDAZY_ID_SPRZEDAZ_FK «column»
0..* *PK ID_SPRZEDAZ: NUMBER(38)
*PK NUMER_POZYCJI_SPRZEDAZY: NUMBER(38)
*
ID_POZYCJA_MAGAZYNOWA: NUMBER(38)
*
ILOSC: NUMBER(38)

Podobne dokumenty