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)