Systemy baz danych Kolokwium 2 Poziom odniesienia: 55 pkt. Do zdobycia 72 pkt. 1. Utwórz typ obiektowy (specyfikację i implementację) o nazwie Maszyna zawierający następujące atrybuty: - nazwa (V30), 6 pkt. - model (V30), - data_prod (D; data produkcji), oraz - definicję konstruktora domyślnego (nazwa = Prototyp, model = Null, data_prod = 01.01.YYYY gdzie YYYY to aktualny rok), - definicję konstruktora z dwoma parametrami: nazwa i data_produkcji (model = Null), - definicję metody wyświetl - w przypadku braku sprecyzowanej nazwy modelu należy pominąć informację dotyczącą tego argumentu. Rys. 1 Wynik zastosowania bloku testowego (plik SBD_Kol2_nazwisko.sql) 2. Utwórz typ obiektowy o nazwie Samochod dziedziczący po typie Maszyna posiadający następujące atrybuty: 7 pkt. - nr_rej (V10), - data_bad_tech (D; data badania technicznego), oraz - definicję konstruktora domyślnego (nazwa, model i data_prod jak w Zad. 1; nr_rej=sc00000, data_bad_tech = 01.01.YYYY gdzie YYYY to kolejny rok względem aktualnego roku np. data_prod = 1.1.2017 to data_bad_tech = 1.1.2018), - definicję konstruktora z czterema parametrami: nazwa, model, data_prod i nr_rej. Datę badań technicznych (data_bad_tech) ustala się na podstawie daty produkcji (data_prod) i jest ona o rok starsza od niej, - definicję metody Wyświetl (z uwzględnieniem pominięcia atrybutów o niezdefiniowanej wartości czyli NULL), - definicję metody Set_data_bad_tech, która na podstawie parametru wejściowego typu D ustala nową wartość daty badań technicznych (data_bad_tech). Rys. 2 Wynik zastosowania bloku testowego (plik SBD_Kol2_nazwisko.sql) 3. Utwórz tabelę obiektową Tab_Samochody bazującą na typie Samochod. Następnie wprowadź do niej dane umieszczone w poniżej tabeli (10 rekordów) wykorzystując do tego odpowiednie konstruktory typu Samochod (wartości parametrów w pliku SBD_Kol2_nazwisko.sql). 3 pkt. Konstruktor (l. parametrów) 1 0 nazwa model data_prod nr_rej data_bad_tech 2 5 Ford Mondeo 30.04.2010 SK12345 25.04.2017 3 4 Opel Astra 10.03.2014 SCZ4321 4 4 Fiat Punto NULL KR00007 5 4 Audi A6 aktualna GD11111 6 5 Seat Toledo 14.08.2013 PO22222 NULL 7 5 Kia Ceed 17.11.2016 DW33333 NULL 8 4 Renault Laguna 1.09.2012 ZS44444 9 4 Toyota Rav4 1.01.2016 OP55555 10 4 Volkswagen Passat 1.02.2016 EL66666
Rys. 3 Wynik uzyskany dla: select * from Tab_Samochody; 4. Utwórz typ obiektowy o nazwie Kierowca zawierający następujące atrybuty: 2 pkt. - id_kierowcy (N4), - nazwisko (V20), - imię (V20), następnie w oparciu o niego utwórz tabelę Kierowcy, do której wprowadź następujące dane: insert into Kierowcy Values (1001, 'Adamski', 'Adam' ); insert into Kierowcy Values (1002, 'Piotrowski', 'Piotr' ); insert into Kierowcy Values (1003, 'Daniel', 'Danielewski' ); insert into Kierowcy Values (1004, 'Marta', 'Markowska'); 5. Utwórz tabelę obiektową o nazwie Ewidencja zawierającą następujące kolumny: 5 pkt. - id_ewidencji (N) klucz główny, - wlasciciel referencja na typ kierowca, - pojazd referencja na typ samochod, następnie w oparciu o zawartość poniżej tabeli (Rys. 4) dokonaj wpisu do niej 8-u wierszy danych oraz opracuj zapytanie wyświetlające poniższe zestawienie (jak na Rys. 4). Rys. 4 Wynik zwrócony przez zapytanie 6. Jak można zauważyć na Rys. 4 pewne samochody nie mają ustalonego terminu badań technicznych lub ich badania nie są już aktualne. Dokonaj stosownej aktualizacji danych pojazdów, które posiadają właściciela i datę produkcji, według następującego schematu: 3/10 pkt. a) gdy pojazd nie posiada określonej daty badań technicznych (data_bad_tech=null) to data_bad_tech=1.1.yyyy gdzie YYYY to kolejny rok wobec aktualnego roku, b) w pozostałych przypadkach data badań technicznych to dokładnie rok później niż aktualna data. Powyższą operację można zrealizować metodą na piechotę zmieniając kolejno dane w odpowiednich rekordach (3 pkt.) lub za pośrednictwem utworzonej procedury Aktualizuj_Daty_BT, przyjmującej jeden parametry określający nową datę badań technicznych (obowiązuje dla podpunktu b; domyślnie parametr przyjmuje datę dokładnie o rok starszą niż aktualna) (10 pkt.). Rys. 5 Efekt wykonania: execute Aktualizuj_Daty_BT(); (data realizacji 20.01.2017)
Rys. 6 Wynik uzyskany wobec wykonania zapytania z Zad 5 Rys. 7 Wynik uzyskany dla: select * from Tab_Samochody; 7. Usuń wszystkie elementy utworzone w ramach realizacji zadań 1-6. 1 pkt. Część druga 8. Utwórz tabelę Akweny w oparciu o dane zawarte w tabeli Lowisko (id_akwenu = id_lowiska, nazwa, miejscowosc). W tabeli Akweny mają znajdować się dane zbiorników (typ = zbiornik) zarządzanych przez PZW Czestochowa czyli łowiska o id_lowiska rozpoczynającym się na literę C. 2 pkt. Rys. 8 Wynik uzyskany dla: select * from akweny; 9. Utwórz typ T_Gatunki jako VARRAY (tablice o zmiennej długości) o maksymalnie 25-tu elementach. Powyższe elementy to dane typu Varchar2(25) przechowujące informacje o gatunkach ryb jakie występują w danym łowisku (akwenie). 3 pkt. Do tabeli Akweny dodaj kolumnę o nazwie Gatunki typu T_Gatunki a następnie wpisz do niej następujące dane (dla podanych łowisk; dane w pliku SBD_Kol2_nazwisko.sql): C02 - gatunki: Amur, Karp, Ploc, Szczupak, C11 - gatunki: Bolen, Karp, Leszcz, Lin, Sandacz, Szczupak, C36 - gatunki: Amur, Karas, Karp, Leszcz, Sum, Szczupak Rys. 9 Wynik uzyskany dla: select * from akweny; 10. Utwórz typ T_Ograniczenia jako VARRAY (tablice o zmiennej długości) o maksymalnie 20-tu elementach. Powyższe elementy to dane typu Date przechowujące informacje o dniach, w tracie których na danym łowisku (akwenie) obowiązywał zakaz połowu ryb. 3 pkt. Do tabeli Akweny dodaj kolumnę o nazwie Ograniczenia typu T_Ograniczenia a następnie wpisz następujące dane (dla podanych łowisk; dane w pliku SBD_Kol2_nazwisko.sql): C02 - ograniczenia: 01.04.2016, 01.05.2016, 01.06.2016 C11 - ograniczenia: 20.05.2016 C36 - ograniczenia: 10.04.2016, 10.05.2016, 10.06.2016
Rys. 10 Wynik uzyskany dla: select * from akweny; 11. Utwórz typ obiektowy T_Polowy zawierający 4 elementy: 2 pkt. - dzien (D), - gatunek (V25), - dlugosc (N 4,1), - waga (N 6,2), 12. Utwórz typ T_Kolekcja_Polowy jako tabelę zagnieżdżoną zbudowaną na typie T_Polowy 2 pkt. 13. Do tabeli Akweny dodaj kolumnę Polowy typu T_Kolekcja_Polowy, która będzie zawierała tabelę zagnieżdżoną (NESTED TABLE) zawierającą informacje o złowionych rybach na danym łowisku (akwenie). Na podstawie poniższych danych dokonaj aktualizacji zawartości tabeli Akweny w zakresie kolumny Polowy: 4 pkt. C02 - Polowy: (13.04.2016, Karp, 50, 2.8) (01.05.2016, Bolen, 65, 2.1) (23.05.2016, Bolen, 70, 2.8) (03.06.2016, Leszcz, 40, 0.8) C11 - Polowy: (21.04.2016, Amur, 73, 4.1) (11.05.2016, Szczupak, 55, 1.2) (23.05.2016, Szczupak, 55, 1.2) (13.06.2016, Okon, 22, 0.3) C36 - Polowy: (16.03.2016, Karas, 30, 0.6) (11.05.2016, Karp, 35, 0.8) (21.05.2016, Karp, 45, 1.6) (10.06.2016, Leszcz, 50, 1.8) (13.06.2016, Leszcz, 52, 2) 14. Zdefiniuj zapytanie umożliwiające wyświetlenie informacji w formie jak na poniższym Rys. 11 2 pkt. Rys. 11 Wynik zwrócony przez zapytanie 15. Dokonaj aktualizacji danych w tabeli Akweny: 4/8/15 pkt. w pierwszej kolejności na podstawie danych z kolumny Ograniczenia usuń w kolumnie Polowy (dzien, gatunek, dlugosc, waga) wpisy datowane na dni, podczas których obowiązywał zakaz połowu ryb (dwa zdarzenia pola podkreślone na Rys. 10; np. bolen złowiony na C02 w dniu 01.05.2016), następnie w oparciu o dane z kolumny Polowy dokonaj aktualizacji zwartości danych w kolumnie Gatunki poprzez dopisanie brakujących gatunków ryb (cztery zdarzenia pola podkreślone na Rys. 10; dotyczą: Bolen złowiony na C02, Leszcz złowiony na C02, Amur złowiony na C11, Okon złowiony na C11). Możliwe sposoby realizacji zadania: a) forma "na piechotę" poprzez aktualizację stosownych wierszy ( ręczne definiowanie update'ów) 4 pkt. b) utworzenie procedury Aktualizuj_Tab_Akweny posiadającej jeden parametr określający łowisko podlegające aktualizacji (id_akwenu), w ramach której zostaną zrealizowane procedury opisane w powyższym zadaniu (aktualizacja tylko jednej z kolumn / całości). 8/15 pkt. Rys. 12 Wynik zastosowania: execute Aktualizuj_Tab_Akweny('C02');
Rys. 13 Wynik zastosowania: execute Aktualizuj_Tab_Akweny('C11'); Rys. 14 Wynik zastosowania: execute Aktualizuj_Tab_Akweny('C36'); Rys. 15 Wynik uzyskany dla zapytania z zadania 14 16. Na podstawie danych znajdujących się w tabeli Akweny wyświetl listę łowisk uporządkowaną kolejno wg.: id_akwenu a następnie gatunku, zawierającą podsumowanie w zakresie łącznej wagi i liczby złowionych ryb na danym akwenie (jak na Rys. 16). (2 pkt przy braku podsumowania akwen/całość) 2/4 pkt. Rys. 16 Wynik zwrócony przez zapytanie 17. Usuń wszystkie elementy utworzone w ramach realizacji zadań 8-16. 1 pkt.