Laboratorium 10
Transkrypt
Laboratorium 10
Laboratorium 10 Kolekcja VARRAY w SQL --Tworzymy tabelę Osoby CREATE TABLE Osoby2 ( id_osoby NUMBER(10) PRIMARY KEY, imie VARCHAR2(64) NOT NULL, nazwisko VARCHAR2(128) NOT NULL ); INSERT INTO OSOBY2 VALUES (1,'Jan', 'Kowalski'); INSERT INTO OSOBY2 VALUES (2,'Zofia', 'Nowak'); INSERT INTO OSOBY2 VALUES (3,'Adam', 'Mostowski'); --Tworzymy tabelę Pojazdy CREATE TABLE Pojazdy ( id_pojazdu NUMBER(10) PRIMARY KEY, marka VARCHAR2(64) NOT NULL, model VARCHAR2(128) NOT NULL ); INSERT INTO POJAZDY VALUES (1,'Fiat', '126p'); INSERT INTO POJAZDY VALUES (2,'VW', 'Golf'); INSERT INTO POJAZDY VALUES (3,'Opel', 'Astra'); INSERT INTO POJAZDY VALUES (4,'VW', 'Passat'); --Tworzymy kolekcję 10 liczb wykorzystując kolekcję VARRAY CREATE TYPE T_POJAZDY AS VARRAY(10) OF NUMBER; --Do tabeli Osoby dodajemy kolumnę typu T_SAMOCHODY ALTER TABLE Osoby2 ADD posiadane_pojazdy T_POJAZDY; --Do każdej osoby przypisujemy posiadane samochody UPDATE Osoby2 SET POSIADANE_POJAZDY=T_POJAZDY(2,3) WHERE ID_OSOBY = 1; UPDATE Osoby2 SET POSIADANE_POJAZDY=T_POJAZDY(1) WHERE ID_OSOBY = 2; UPDATE Osoby2 SET POSIADANE_POJAZDY=T_POJAZDY(2,3,4) WHERE ID_OSOBY = 3; --Wyświetlanie zawartości tabeli Osoby2 SELECT * FROM Osoby2; SELECT imie, nazwisko, column_value FROM Osoby2, TABLE(POSIADANE_POJAZDY); https://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems006.htm https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/collections.htm#LNPLS005 Kolekcja NESTED TABLE w SQL --Tworzymy tabelę Osoby CREATE TABLE Osoby2 ( id_osoby NUMBER(10) PRIMARY KEY, imie VARCHAR2(64) NOT NULL, nazwisko VARCHAR2(128) NOT NULL ); INSERT INTO OSOBY2 VALUES (1,'Jan', 'Kowalski'); INSERT INTO OSOBY2 VALUES (2,'Zofia', 'Nowak'); INSERT INTO OSOBY2 VALUES (3,'Adam', 'Mostowski'); --Tworzymy typ T_POJAZD CREATE OR REPLACE TYPE T_POJAZD AS OBJECT ( marka VARCHAR2(64), model VARCHAR2(128) ); --Tworzymy tablicę zagniezdzoną zbudowaną na typie T_POJAZD CREATE OR REPLACE TYPE T_KOLEKCJA_POJAZDOW AS TABLE OF T_POJAZD; ALTER TABLE Osoby2 ADD (POJAZDY T_KOLEKCJA_POJAZDOW) NESTED TABLE POJAZDY STORE AS POJAZDY_NT; --Wprowadzamy pojazdy do zagniezdzonej tabeli UPDATE Osoby2 SET POJAZDY = T_KOLEKCJA_POJAZDOW( T_POJAZD('VW', 'Golf'), T_POJAZD('VW', 'Passat') ) WHERE ID_OSOBY=1; UPDATE Osoby2 SET POJAZDY = T_KOLEKCJA_POJAZDOW( T_POJAZD('VW', 'Golf'), T_POJAZD('Fiat', '126p') ) WHERE ID_OSOBY=2; UPDATE Osoby2 SET POJAZDY = T_KOLEKCJA_POJAZDOW( T_POJAZD('Opel', 'Astra') ) WHERE ID_OSOBY=3; --Wyświetlanie zawartości tabeli Osoby2; SELECT * FROM Osoby2; SELECT imie, nazwisko, marka, model FROM Osoby2 CROSS JOIN TABLE(Osoby2.Pojazdy); SELECT os.imie, os.nazwisko, p.marka, p.model FROM Osoby2 os, TABLE(os.Pojazdy) p WHERE os.id_osoby = 1; http://andrzejklusiewicz.blogspot.com/2011/12/nested-tables-tabele-zagniezdzone.html http://programowanie.opole.pl/archives/1268 Zadanie 1 – Kolekcja VARRAY w SQL i PL/SQL a) Na potstawie tabeli DZIECI tworzymy tabelę DZIECI2 – jedno CREATE TABLE z SELECT. Powinna powstać tabela DZIECI2 mająca takie same typy atrybutów i taką samą zawartość. b) Tworzymy typ T_ZAJECIA_DODATKOWE jako VARRAY o maksymalnie 20 elementach. Elementy to zwykły typ NUMBER przechowujący numery zajęcia dodatkowego dziecka. c) Do tabeli DZIECI2 dodajemy kolumnę o nazwie ZAJECIA_DODATKOWE typu T_ZAJECIA_DODATKOWE. d) Na bazie zawartości tabeli DZIECI_ZAJECIA dodać ręcznie (UPDATE) numery zajęć dodatkowy do pierwszego i drugiego dziecka. Fajnie bybyło jakby było więcej niż jedno zajęcie dodatkowe dal dzieci, do których wstawiamy dane :) Sprawdzić zawartość tabeli DZIECI2 po dodaniu numerów zajęć dodatkowych. e) Napisać funkcję ZAJECIA_DZIECI, która dla podanego jako parametr ID_DZIECKA zwróci kolekcję T_ZAJECIA_DODATKOWE z numerami zajęć dodatkowych tego dziecka. Jeśli dziecko nie ma żadnych zajęć dodatkowych funkcja może zwracać pustą kolekcję. f) Uzupełnić zawartość kolumny ZAJECIA_DODATKOWE dla trzeciego i czwartego dziecka korzystając z UPDATE i utworzonej właśnie funkcji ZAJECIA_DZIECI. Sprawdzamy jaka jest zawartość tabeli DZIECI2. g) Wyświetlić zawartość tabeli DZIECI2 korzystając z operatora TABLE – każdy wiersz tabeli powinien zawierać osobny numer zajęcia dodatkowego, na które zapisane jest dziecko. Imię i nazwisko dziecka może się powtarzać tyle razy ile ma ono zajęć dodatkowych, np.: IMIE NAZWISKO ZAJECIA_DODATKOWE COLUMN_VALUE Jan Kowalski ROBPER.T_ZAJECIA_DODATKOWE(1,7) 1 Jan Kowalski ROBPER.T_ZAJECIA_DODATKOWE(1,7) 7 Zawartość kolekcji z wykorzystaniem operatora TABLE będzie dostępna pod nazwą kolumny COLUMN_VALUE. h) DLA CHĘTNYCH. Napisać procedurę UZUPELNIJ_ZAJECIA_DOD, która korzystając z funkcji ZAJECIA_DZIECI przejdzie przez wszystkie wiersze tabeli DZIECI2, które mają jeszcze wartość NULL w kolumnie ZAJECIA_DODATKOWE i uzupełni je odpowiednimi wartościami. Ja wiem, że procedura jest trochę bez sensu bo można by to zrobić jednym UPDATE ale załóżmy, że mamy do obsługi przedszkola pracownika, który nie zna procedury polecenie UPDATE, ale umie wywołać UZUPELNIJ_ZAJECIA_DOD - wtedy się przyda :) Przetestować, sprawdzić wyniki. Zadanie 2 – Kolekcja NESTED TABLE w SQL i PL/SQL a) Utowrzyć typ obiektowy T_GODZ_DOD zawierający dwa pola: DZIEN jako data LICZBA_GODZIN jako liczba Pola odpowiadają zawartości tabeli GODZINY_DODATKOWE. b) Utworzyć typ T_KOLEKCJA_GODZ_DOD jako tablicę zagnieżdżoną zbudowaną na typie T_GODZ_DOD. c) Do tabeli DZIECI2 dodać kolumnę GODZ_DOD typu T_KOLEKCJA_GODZ_DOD. Będzie to kolumna zawierająca zagnieżdżoną tabelę zawierającą wszystkie godziny dodatkowe każdego z dzieci. Nazwę tabeli zagnieżdżonej utworzonej w naszym schemacie, w której składowane będą dane można wybrać dowolnie – warto sprawdzić czy się utworzyła. d) Dodać/zaktualizować do tabeli DZIECI2 dla pierwszej dwójki dzieci informacje okilku (minimum 3) godzinach dodatkowych spędzonych w przedszkolu w różnych dniach. Warto uważać, żeby nie zaktualizować od razu wszystkich dzieci w tabeli. e) Wyświetlić zawartość tabeli DZIECI2 zarówno w sposób prosty jak i z wykorzystaniem operatora TABLE, który wyświetli informację o zajęciach dodatkowych, z każdego dnia w innym wierszu wynikowym, np.: IMIE NAZWISKO DZIEN LICZBA_GODZIN Jan Kowalski 14/12/12 3 Jan Kowalski 15/05/10 2 Jan Kowalski 14/02/14 4 15/02/14 6 Zofia Nowak