Laboratorium 9

Transkrypt

Laboratorium 9
Laboratorium 9
Tabele obiektowe
Korzystamy z wyników pracy na laboratorium 8 (utworzone typy obiektowe razem z metodami).
--Tworzenie obiektu Osoba
CREATE TYPE Osoba AS OBJECT (
id_osoby INTEGER,
imie VARCHAR2(15),
nazwisko VARCHAR2(15))
--Tworzenie tabeli Osoby na bazie obiektu Osoba
CREATE TABLE Osoby OF Osoba;
--Wstawianie danych do tabeli Osoby
INSERT INTO Osoby VALUES(1, 'Jan', 'Kowalski');
INSERT INTO Osoby VALUES(Osoba(2, 'Adam', 'Mickiewicz'));
INSERT INTO Osoby VALUES(Osoba(3, 'Karol', 'Balcerzak'));
--Wyświetlanie danych z tabeli Osoby
SELECT * FROM OSOBY;
SELECT VALUE(os) FROM Osoby os;
SELECT o.imie FROM Osoby o;
DESC Osoby;
--Tworzenie obiektu Pracownik
CREATE TYPE Pracownik AS OBJECT (
id_pracownika INTEGER,
pensja DECIMAL(8),
t_osoba Osoba)
--Tworzenie tabeli Pracownicy na bazie obiektu Pracownik
CREATE TABLE Pracownicy OF Pracownik;
--Wstawianie danych do tabeli Pracownicy
INSERT INTO Pracownicy VALUES(1, 2000, Osoba(3, 'Igor', 'Nowak'));
INSERT INTO Pracownicy VALUES(2, 3000, (SELECT VALUE(os) FROM Osoby os WHERE
os.id_osoby = 2));
INSERT INTO Pracownicy VALUES(2, 5000, (SELECT VALUE(os) FROM Osoby os WHERE
os.id_osoby = 3));
--Wyświetlanie danych z tabeli Pracownicy
SELECT p.pensja, p.t_osoba.imie, p.t_osoba.nazwisko FROM Pracownicy p
WHERE p.id_pracownika = 2;
SELECT pensja, TREAT(t_osoba as Osoba).imie, TREAT(t_osoba as Osoba).nazwisko
FROM pracownicy;
http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/10_objs.htm
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/objects.htm
Zadanie 1
Tworzymy tabelę obiektową ADRESY bazującą na typie T_ADRES (każdy wiersz to jeden obiekt –
ROW OBJECT). Składnia: CREATE TABLE NAZWA_TABELI OF TYP_UZYTKOWNIKA;
Do utworzonej tabeli ADRESY proszę dodać 4 wiersze korzystając z:
• normalnej składni polecenia INSERT (kolejne atrybuty typu T_ADRES to kolejne kolumny
tabeli, do której dodajemy dane)
• konstruktora domyślnego typu T_ADRES,
• konstruktora z trzema parametrami utworzonego na poprzednich laboratoriach
Proszę wyświetlić zawartość tabeli ADRESY. Wyświetlić również jej zawartość traktując każdy wiersz
jako obiekt (funkcja VALUE).
Zadanie 2
a) Wyświetlić wszystkie wartości KOD i POCZTA z tabeli ADRESY wykorzystując:
• atrybuty KOD i POCZTA jako kolumny tabeli,
• atrybuty KOD i POCZTA jako pola obiektu typu T_ADRES2 (korzystamy z funkcji VALUE)
• funkcję KOD_POCZTA.
UWAGA
Gdyby ktoś nie miał metody KOD_POCZTA w typie T_ADRES to należy ją dodać. Niestety zmiana
typu, na bazie którego stworzono inne typy i tabele nie jest możliwa. Można:
• usunąć tabele i typy wykorzystujące ten typ, zmienić T_ADRES i na nowo utworzyć tabelę
ADRESY, czy typ T_OSOBA, T_RODZIC, ...
• utworzyć sobie typ T_ADRES2 i dalsze ćwiczenia wykonywać na tym typie :) W tym jednak
przypadku treść zadania 1 należy jeszcze raz wykonać na typie T_ADRES2. Można stworzyć
tabelę ADRESY2.
Widać tutaj jaki jest koszt zmian w klasach, które są podstawą innych klas czy tabel.
Ja w dalszej części tej instrukcji będę się posługiwał tabelą ADRESY.
Zadanie 3
a) Utworzyć tablę obiektową OSOBY bazującą na typie T_OSOBA z laboratorium 8. Kto nie ma
takiego typu należy go utworzyć zgodnie z laboratorium nr 8.
b) To tabeli OSOBY dodać trzy wiersze:
• korzystając z normalnej składni polecenia INSERT (pole ADRES i tak będzie wymagało
wykorzystania konstruktora T_ADRES)
• wykorzystując konstruktor typu T_OSOBA
• pobierając zapytaniem SELECT jeden z adresów z tabeli ADRESY.
c) Wyświetlić zawartość tabeli OSOBY. Wyświetlić również każde pole adresu (można użyć aliau tabeli,
albo użyć funkcji TREAT).
d) Wykorzystanie UPDATE. Zmienić nazwisko osoby, która ma określony numer domu (trzeba się
odwołać do pola adresu). Zmienić kod pocztowy osoby o wybranym nazwisku (tutaj również trzeba się
odwołać do pola adresu :).
Zadanie 4
a) Proszę utworzyć typ T_STUDENT dziedziczący po typie T_OSOBA zawierający dodatkowo pole
adres_tym będące referencją na typ T_ADRES (adres_tym REF T_ADRES).
b) Stworzyć tabelę STUDENT na podstawie typu T_STUDENT. Dodać do niej dwóch studentów
wykorzystując adresy z tabeli ADRESY (można wykorzystać podzapytanie zwracające obiekt typu
T_ADRES wewnątrz instrukcji INSERT). Warto zadbać, żeby adres tymczasowy studenta był inny niż
jego adres podstawowy.
c) Wyświetlić zawartość tabeli STUDENT łącznie z nazwą ulicy i kodem pocztowym obu adresów
studenta (można wykorzystać DEREF, działa też wykorzystanie aliasu tabeli).
Wyświetlić zawartość tabeli ADRESY, porównać adresy.
d) Zmodyfikować adres podstawowy jednego ze studentów. Wyświetlić zawartość tabeli STUDENT i
ADRESY.
e) Zmodyfikować adres tymczasowy jednego ze studentów za pomocą referencji adres_tym ... Czy da
się to zrobić?
f) Zmodyfikować w tabeli ADRESY jeden z adresów, na który wskazuje referencja w tabeli STUDENT.
Wyświetlić zawartość tabeli STUDENT i ADRESY.
Zadanie 5
a) Utworzyć anonimowy blok kodu PL/SQL, w którym należy pobrać obiekt z tabel ADRESY
(SELECT … INTO …) do zmiennej obiektowej adr. Na zmiennej adr wywołać metodę USTAW_KOD.
Wyświetlić zawartość kodu pocztowego zawartego w zmiennej adr. Sprawdzić zawartość tabeli
ADRESY.
b) Do anonimowego bloku kodu PL/SQL dodać instrukcję UPDATE, która zmieni zawartość jednego z
wierszy tabeli ADRESY na zawartość obiektu adr. Sprawdzić zawartość tabeli ADRESY.