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

Podobne dokumenty