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.