Plan. Rozszerzenie obiektowe w SZBD Oracle

Podobne dokumenty
Obiektowe bazy danych

Obiektowe bazy danych. Model danych. Wprowadzenie obiektowy model danych. Obiekty w bazie danych definiowanie i przechowywanie składowe i metody

Oracle PL/SQL. Paweł Rajba.

Obiektowe bazy danych Ćwiczenia laboratoryjne (?)

Monika Kruk Mariusz Grabowski. Informatyka Stosowana WFiIS, AGH 13 grudzień 2006

Pakiety podprogramów Dynamiczny SQL

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Obiektowe bazy danych

Język PL/SQL Procedury i funkcje składowane

Post-relacyjne bazy danych

Procedury i funkcje składowane

Plan wykładu BAZY DANYCH II WYKŁAD 9. Dynamiczny SQL. Dynamiczny SQL

PODSTAWY BAZ DANYCH 13. PL/SQL

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Oracle PL/SQL. Paweł Rajba.

Język PL/SQL Pakiety podprogramów

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Bazy danych. Plan wykładu. Diagramy ER. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych

PODSTAWY BAZ DANYCH. 17. Obiektowość w Oracle. 2009/2010 Notatki do wykładu "Podstawy baz danych"

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

1 Wprowadzenie do bloków nazwanych 1. 2 Parametry 2. 3 Procedury i funkcje 3. 4 Pakiety 6. 5 Podsumowanie Źródła 10

Oracle11g: Wprowadzenie do SQL

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Autor: Joanna Karwowska

15. Funkcje i procedury składowane PL/SQL

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Relacyjne bazy danych. Podstawy SQL

Wykład IV Modelowanie danych, projektowanie systemu informatycznego Modelowanie konceptualne implementacyjne Modelowanie pojęciowe na encjach

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne.

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne, perspektywy wbudowane.

Zasady transformacji modelu DOZ do projektu tabel bazy danych

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

ZSBD ćwiczenie 9. Obiektowo relacyjne systemy zarządzania bazą danych. Zaawansowane zagadnienia. Wymagania: ZSBD ćwiczenie 9

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Wykład 8. SQL praca z tabelami 5

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Programowanie obiektowe - 1.

Relacyjne bazy danych. Podstawy SQL

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Język SQL, zajęcia nr 1

BAZA DANYCH SIECI HOTELI

Bloki anonimowe w PL/SQL

Wykład 5. SQL praca z tabelami 2

Bazy danych 6. Klucze obce. P. F. Góra

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

Obiektowe i obiektowo-relacyjne. bazy danych

Dziedziczenie. dr Jarosław Skaruz

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok;

Wykład 05 Bazy danych

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Podprogramy. Rozdział 11 Procedury i funkcje składowane

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Język PL/SQL. Rozdział 4. Procedury i funkcje składowane

Przykładowa baza danych BIBLIOTEKA

ACESS- zadania z wykorzystaniem poleceń SQL

Tworzenie tabel. Bazy danych - laboratorium, Hanna Kleban 1

Zaawansowane bazy danych i hurtownie danych semestr I

Obiektowość BD Powtórka Czas odpowiedzi. Bazy Danych i Systemy informacyjne Wykład 14. Piotr Syga

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Dokumentacja do API Javy.

Tabela wewnętrzna - definicja

Model semistrukturalny

Widok Connections po utworzeniu połączenia. Obszar roboczy

Hurtownia Świętego Mikołaja projekt bazy danych

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia?

Paweł Rajba

Podstawy Programowania Obiektowego

Oracle PL/SQL. Paweł Rajba.

Bazy danych - Materiały do laboratoriów VIII

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

Obiektowe bazy danych Obiektowe i obiektowo-relacyjne bazy danych

Rozszerzenia języka relacyjnych baz danych SQL

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

Język SQL. Rozdział 8. Język manipulowania danymi DML

Paweł Kurzawa, Delfina Kongo

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Przestrzenne bazy danych Podstawy języka SQL

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Bazy danych. Dr inż. Paweł Kasprowski

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Ref. 7 - Język SQL - polecenia DDL i DML

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Wykład 4. SQL praca z tabelami 1

Projektowanie systemów baz danych

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Transkrypt:

Plan Wprowadzenie Rozszerzenie obiektowe w SZBD Oracle obiektowy model danych Obiekty w bazie danych definiowanie i przechowywanie Cześć 1. Deklarowanie typów. Tworzenie instancji typów. Przegląd metod. Dziedziczenie. Polimorfizm. składowe i metody konstruktory referencje dziedziczenie i polimorfizm 1 2 Model danych Model danych to abstrakcyjny opis sposobu reprezentacji i wykorzystania danych Na model danych składają się: struktura: kolekcja struktur wykorzystywanych do przedstawiania obiektów i encji modelowanego mini-świata, ograniczenia: reguły zapewniające spójność i poprawność danych operacje: zbiór operatorów stosowalnych do struktur w celu czytania i pisania danych relacyjny model danych Lew Drapieżnik Krokodyl Zwierzę Roślinożerca Krowa baza danych obiektowy model danych aplikacja 3 Obiektowy model danych - pojęcia Klasa abstrakcyjna reprezentacja "rzeczy", zawiera definicję struktury i zachowania w postaci składowych i metod. Obiekt wystąpienie klasy, reprezentacja konkretnego bytu. Składowa reprezentuje cechę obiektu. Metoda zdolność obiektu do wykonania czynności. Przekazywanie komunikatów sposób przekazywania danych lub wywoływania czynności między obiektami. Dziedziczenie uproszczony sposób specjalizacji klas. Enkapsulacja ukrywanie złożoności obiektu za interfejsem. Polimorfizm zdolność występowania obiektów w kontekście ich klas-przodków. 4

Zalety modelu obiektowego Modelowanie: naturalna reprezentacja złożonych obiektów świata rzeczywistego, naturalna reprezentacja relacji kompozycji, naturalna reprezentacja interakcji między obiektami, bezpośrednie powiązanie operacji z danymi. Programowanie: wielokrotne użycie kodu, modularność i łatwość pielęgnacji, zwiększone bezpieczeństwo i elastyczność, brak konieczności konwersji między modelami danych na styku baza danych aplikacja (ang. O/R impedance mismatch). Model obiektowo-relacyjny Umożliwia wykorzystanie mechanizmów obiektowych wewnątrz relacyjnej bazy danych: abstrakcyjne typy danych definiowane przez użytkownika, predefiniowane typy obiektowe dostarczane przez producentów oprogramowania (multimedia, dane przestrzenne), dziedziczenie, enkapsulacja, polimorfizm, klasy abstrakcyjne, dostępne mechanizmy relacyjne: SQL, przetwarzanie transakcyjne, zarządzanie współbieżnością, ścieżki dostępu, kopie bezpieczeństwa i protokoły odtwarzania spójności, Alternatywa dla systemów odwzorowania obiektoworelacyjnego (O/RM). 5 6 Własności obiektowo-relacyjne w Oracle Abstrakcyjne typy danych użytkownika Obiektowe typy danych użytkownika: metody, składowe, konstruktory, przeciążanie. Współdzielenie obiektów: referencje, nawigacja. Dziedziczenie: polimorfizm, przesłanianie metod, typy abstrakcyjne. nazwisko pensja Pracownik etat data_ur Każdy typ obiektowy składa się z dwóch części: deklaracji(interfejsu): zbioru składowych (pól i sygnatur metod), definicji(ciała): implementacji metod. Kolekcje: tabele o zmiennym rozmiarze, tabele zagnieżdżone. Perspektywy obiektowe. CREATE TYPE Pracownik AS OBJECT ( nazwisko VARCHAR2(20), pensja NUMBER(6,2), etat VARCHAR2(15), data_ur DATE ); 7 8

Trwałość obiektów Obiekty składuje się trwale w dwóch postaciach: obiekty krotkowe(ang. row object), obiekty atrybutowe (ang. column object). Do przechowywania obiektów krotkowych wykorzystuje się tabele obiektów (ang. object table). Obiekty atrybutowe są przechowywane jako wartości atrybutu w zwyczajnej tabeli. PracownicyObjTab Kowalski Nowak Tworzenie obiektów Do tworzenia obiektu służy specjalna metoda konstruktor: zwraca nową instancję typu obiektowego, ustawia wartości pól w nowej instancji. Każdy typ obiektowy posiada konstruktor atrybutowy: lista argumentów zgodna z listą atrybutów typu obiektowego, podczas wywołania należy podać wartości wszystkich atrybutów. Nazwa konstruktora jest identyczna z nazwą typu obiektowego. Wywołanie konstruktora poprzedzamy słowem NEW (opcjonalnie). NEW Pracownik('Kowalski', 1200, 'ASYSTENT', DATE '1963-10-03') ProjektyTab symbol AB 001 XY 222 budzet 20 000 15 000 kierownik Kowalski Nowak Użytkownik może deklarować własne konstruktory. Sposób tworzenia obiektu jest identyczny dla obiektów krotkowych i obiektów atrybutowych. 9 10 Obiekty krotkowe(1) Obiekty krotkowe(2) Utworzenie tabeli obiektów: Wstawienie obiektu krotkowego: CREATE TABLE PracownicyObjTab OF Pracownik; Ograniczenia integralnościowe: INSERT INTO PracownicyObjTab VALUES ( NEW Pracownik('Kowalski', 2500, 'ASYSTENT', DATE'1965-07-01')); CREATE TABLE PracownicyObjTab OF Pracownik( nazwisko CONSTRAINT nazwisko_pk PRIMARY KEY); INSERT INTO PracownicyObjTab VALUES ( Pracownik('Nowak', 3100, 'ADIUNKT', DATE '1973-01-30')); Indeksy: CREATE INDEX PracObjTabEtatIdx ON PracownicyObjTab(etat); 11 12

Obiekty krotkowe(3) Obiekty krotkowe(4) Dostęp obiektowy funkcja VALUE: parametr alias tabeli obiektowej, wartość zwracana instancje obiektów tabeli obiektowej. SELECT VALUE(p) FROM PracownicyObjTab p; SQL> SELECT VALUE(p) FROM PracownicyObjTab p; VALUE(P) --------------------------------------------- PRACOWNIK('Kowalski',2500,'ASYSTENT','1965-07-01') PRACOWNIK('Nowak',3100,'ADIUNKT','1973-01-30') SQL> SELECT * FROM PracownicyObjTab; Dostęp relacyjny: SELECT * FROM PracownicyObjTab; NAZWISKO PENSJA ETAT DATA_UR -------------------- ---------- --------------- -------- Kowalski 2500 ASYSTENT 65/07/01 Nowak 3100 ADIUNKT 73/01/30 13 14 Obiekty krotkowe(5) Obiekty atrybutowe (1) Modyfikowanie obiektu krotkowego: modyfikowanie wartości pól: UPDATE PracownicyObjTab p SET p.etat = 'PROFESOR' WHERE p.nazwisko = 'Kowalski'; zamiana całego obiektu: UPDATE PracownicyObjTab p SET p = Pracownik('Andrzejak',1500,'ASYSTENT',DATE'1980-11-03') WHERE p.nazwisko = 'Kowalski'; Usuwanie obiektu krotkowego: DELETE PracownicyObjTab p WHERE p.nazwisko = 'Andrzejak'; Utworzenie tabeli z obiektami atrybutowymi: CREATE TABLE ProjektyTab ( symbol CHAR(6), nazwa VARCHAR(100), budzet NUMBER, kierownik Pracownik); Ograniczenia integralnościowe: CREATE TABLE ProjektyTab ( symbol CHAR(6) CONSTRAINT proj_pk PRIMARY KEY, nazwa VARCHAR(100), budzet NUMBER, kierownik Pracownik, CONSTRAINT etat_chk CHECK(kierownik.etat in ('ADIUNKT','PROFESOR'))); Indeksy: CREATE INDEX ProjektyTabEtatIdx ON ProjektyTab(kierownik.etat); 15 16

Obiekty atrybutowe (2) Wstawienie rekordu z obiektem atrybutowym: INSERT INTO ProjektyTab VALUES ('AB 001','Projekt X',20000, NEW Pracownik('Nowak',3200,'ADIUNKT',null)); INSERT INTO ProjektyTab VALUES ('XY 003','Projekt Y',45000, Pracownik('Kowalski',2500,'PROFESOR',null)); Obiekt pusty a obiekt z pustymi wartościami pól: INSERT INTO ProjektyTab VALUES ('1','Projekt 1',100, null); Obiekty atrybutowe (3) Dostęp obiektów atrybutowych i ich składowych: SELECT nazwa, kierownik FROM ProjektyTab; SELECT p.kierownik.nazwisko FROM ProjektyTab p; alias jest wymagany w przypadku dostępu do składowych obiektu atrybutowego INSERT INTO ProjektyTab VALUES ('2','Projekt 2',200, PRACOWNIK(null, null, null, null)); 17 18 Obiekty atrybutowe (4) Obiekty atrybutowe (5) SQL> SELECT symbol, kierownik FROM ProjektyTab; Modyfikowanie obiektów atrybutowych: SYMBOL KIEROWNIK ------ ---------------------------------------------------- AB 001 PRACOWNIK('Nowak',3200,'ADIUNKT',NULL) XY 003 PRACOWNIK('Kowalski',2500,'PROFESOR',NULL) SQL> SELECT symbol, p.kierownik.nazwisko AS szef FROM ProjektyTab p; SYMBOL SZEF ------ -------------------- AB 001 Nowak XY 003 Kowalski UPDATE ProjektyTab p SET budzet = budzet * 1.1, p.kierownik.pensja = p.kierownik.pensja * 1.1 WHERE symbol = 'AB 001'; UPDATE ProjektyTab SET kierownik = Pracownik('Andrzejak',1700,'ADIUNKT',null) WHERE symbol = 'XY 003'; 19 20

Definiowanie metod typu obiektowego Typ obiektowy może posiadać następujące rodzaje metod: metody zwykłe (MEMBER) wołane na rzecz konkretnego obiektu (zarówno funkcje jak i procedury), metody statyczne (STATIC) wołanena rzecz całego typu obiektowego (zarówno funkcje jak i procedury), metody porównujące (MAP/ORDER) wykorzystywane w sytuacji konieczności porównania obiektów (tylko funkcje), konstruktory (CONSTRUCTOR) tworzące nowe obiekty (tylko funkcje). Metoda jest definiowana dwukrotnie: w deklaracji typu: sygnatura metody (nazwa i lista argumentów), w definicji typu: ciało metody (implementacja, kod źródłowy). Definiowanie metod typu obiektowego ALTER TYPE Pracownik REPLACE AS OBJECT ( nazwisko VARCHAR2(20), pensja NUMBER(6,2), etat VARCHAR2(15), data_ur DATE, MEMBER FUNCTION wiek RETURN NUMBER, MEMBER PROCEDURE podwyzka(p_kwota NUMBER)); CREATE OR REPLACE TYPE BODY Pracownik AS MEMBER FUNCTION wiek RETURN NUMBER IS RETURN EXTRACT (YEAR FROM CURRENT_DATE) EXTRACT (YEAR FROM data_ur); END wiek; MEMBER PROCEDURE podwyzka(p_kwota NUMBER) IS pensja := pensja + p_kwota; END podwyzka; 21 22 Parametr SELF metody (1) Parametr SELF metody (2) Niejawny parametr każdej metody (z wyłączeniem metod statycznych). MEMBER PROCEDURE podwyzka(pensja NUMBER) to de facto MEMBER PROCEDURE podwyzka(self IN OUT Pracownik, pensja NUMBER) Umożliwia odwołanie z ciała metody do obiektu, dla którego metoda została wywołana. MEMBER PROCEDURE podwyzka(pensja NUMBER) IS SELF.pensja := SELF.pensja + pensja; END podwyzka; 23 Parametr SELF jest domyślnie deklarowany jako przekazywany w trybie IN OUT: wartość parametru jest kopiowana do metody, dla dużych obiektów może to spowolnić wykonanie metody, rozwiązanie: jawna deklaracja parametru SELF z klauzulą NOCOPY: MEMBER PROCEDURE podwyzka(self IN OUT NOCOPY Pracownik, pensja NUMBER).. 24

Wywoływanie metod składowych Metody składowe mogą być uruchamiane: z poziomu SQL (tylko metody będące funkcjami), z poziomu PL/SQL (wszystkie metody). SELECT p.nazwisko, p.data_ur, p.wiek() FROM PracownicyObjTab p; DECLARE l_kierownik Pracownik; SELECT kierownik INTO l_kierownik FROM ProjektyTab WHERE symbol = 'AB 001'; l_kierownik.podwyzka(200); UPDATE ProjektyTab SET kierownik = l_kierownik WHERE symbol = 'AB 001'; Tożsamość obiektów (1) Tożsamość obiektu to unikalny i niezmienny identyfikator związany z obiektem przez cały cykl jego życia: tożsamość posiadają tylko obiekty krotkowe, tożsamość jest zapewniana przez OID (ang. object identifier), rodzaje OID: OID generowany automatycznie (domyślny), unikalny globalnie, zajmuje 16B, OIDgenerowany na podstawie klucza podstawowego, unikalny lokalnie, rozmiar zależy od rozmiaru wartości klucza podstawowego. CREATE TABLE OF typ OBJECT IDENTIFIER IS [SYSTEM GENERATED PRIMARY KEY]; 25 26 Tożsamość obiektów (2) Porównywanie wartości obiektów Aplikacja może wykorzystywać referencje do identyfikatorów, odczytywane za pomocą funkcji REF() funkcja zwraca referencję do obiektu krotkowego. SELECT REF(p) FROM PracownicyObjTab p WHERE p.nazwisko = 'Kowalski'; Wartością obiektu jest zbiór wartości jego składowych: dwa obiekty są równe gdy mają te same wartości składowych, standardowo, operatory = i!= umożliwiają porównywanie obiektów. Porównywanie obiektów najczęściej wymaga sortowania: operatory relacyjne: <, >, <=, >=, operator BETWEEN AND, klauzule ORDER BY, GROUP BY, DISTINCT. Metody porównujące: metoda odwzorowująca i metoda porządkująca. Cechy: typ obiektowy może mieć tylko jedną metodę porównującą, metody odwzorowujące są bardziej efektywne, metody porządkujące są bardziej elastyczne, metody porównujące są wywoływane automatycznie (niejawnie), ale mogą być również wywoływane jawnie. 27 28

Metoda odwzorowująca (1) Funkcja zwracająca dla obiektu wartość, która może służyć do porównywania obiektu z innymi obiektami tego samego typu obiektowego. zwracana wartość jest najczęściej wyliczana na podstawie wartości pól obiektu. Wywołanie niejawne: obiekta > obiektb obiekta.metoda_odwzorujaca() > obiektb.metoda_odwzorujaca() jest równoważne 29 Metoda odwzorowująca (2) Dodanie sygnatury metody do deklaracji typu obiektowego: ALTER TYPE Pracownik ADD MAP MEMBER FUNCTION odwzoruj RETURN NUMBER CASCADE INCLUDING TABLE DATA; Dodanie implementacji metody do definicji typu obiektowego: CREATE OR REPLACE TYPE BODY Pracownik AS MEMBER FUNCTION wiek RETURN NUMBER IS RETURN EXTRACT(YEAR FROM CURRENT_DATE)- EXTRACT(YEAR FROM data_ur); END wiek; MEMBER PROCEDURE podwyzka(p_kwota NUMBER) IS pensja := pensja + p_kwota; END podwyzka; MAP MEMBER FUNCTION odwzoruj RETURN NUMBER IS RETURN ROUND(pensja,-3) + wiek(); END odwzoruj; 30 Metoda odwzorowująca (3) Metoda porządkująca (1) Przykład użycia SQL> SELECT nazwisko, pensja, p.odwzoruj() FROM pracownicyobjtab p; NAZWISKO PENSJA P.ODWZORUJ() -------------------- ---------- ------------ Kowalski 2500 3048 Nowak 3100 3040 SQL> SELECT * FROM pracownicyobjtab p ORDER BY VALUE(p); NAZWISKO PENSJA ETAT DATA_UR -------------------- ---------- --------------- -------- Nowak 3100 ADIUNKT 73/01/30 Kowalski 2500 ASYSTENT 65/07/01 SQL> SELECT * FROM PracownicyObjTab p WHERE VALUE(p) > (SELECT VALUE(r) FROM PracownicyObjTab r WHERE r.nazwisko = 'Nowak'); NAZWISKO PENSJA ETAT DATA_UR -------------------- ---------- --------------- -------- Kowalski 2500 ASYSTENT 65/07/01 31 Porównuje zawsze dwa obiekty: obiekt, dla którego metoda jest wywoływana (obiekt_1), z obiektem przekazanym do metody przez parametr (obiekt_2). Wartości zwracane: jeśli obiekt_1 > obiekt_2: wartość dodatnia, jeśli obiekt_1 < obiekt_2: wartość ujemna, jeśli obiekt_1 = obiekt_2: wartość = 0. Stosowana zwykle wtedy, gdy algorytm porównania obiektów jest zbyt złożony dla funkcji odwzorowującej. 32

Metoda porządkująca (2) Metoda porządkująca (3) ALTER TYPE Pracownik DROP MAP MEMBER FUNCTION odwzoruj RETURN NUMBER CASCADE INCLUDING TABLE DATA; ALTER TYPE Pracownik ADD ORDER MEMBER FUNCTION porzadkuj(prac Pracownik) RETURN NUMBER CASCADE INCLUDING TABLE DATA; CREATE OR REPLACE TYPE BODY Pracownik AS MEMBER FUNCTION wiek RETURN NUMBER IS MEMBER PROCEDURE podwyzka(p_kwota NUMBER) IS ORDER MEMBER FUNCTION porzadkuj(prac Pracownik) RETURN NUMBER IS v_wart1 NUMBER; v_wart2 NUMBER; v_wart1 := ROUND(pensja,-3) + wiek(); v_wart2 := ROUND(prac.pensja,-3) + prac.wiek(); IF v_wart1 > v_wart2 THEN return 1; ELSIF v_wart1 < v_wart2 THEN return -1; ELSE return 0; END IF; END porzadkuj; SQL> SELECT p1.nazwisko AS p1, p2.nazwisko AS p2, p1.porzadkuj(value(p2)) AS porownanie FROM pracownicyobjtab p1 CROSS JOIN pracownicyobjtab p2; P1 P2 POROWNANIE -------------------- -------------------- ---------- Kowalski Kowalski 0 Kowalski Nowak 1 Nowak Kowalski -1 Nowak Nowak 0 SQL> SELECT * FROM PracownicyObjTab p WHERE VALUE(p) > (SELECT VALUE(r) FROM PracownicyObjTab r WHERE r.nazwisko = 'Nowak'); NAZWISKO PENSJA ETAT DATA_UR -------------------- ---------- --------------- -------- Kowalski 2500 ASYSTENT 65/07/01 33 34 Konstruktor (1) Konstruktor to specjalna metoda tworząca nowe obiekty: nazwa konstruktora jest taka sama jak nazwa typu obiektowego, zawsze dostępny domyślny konstruktor atrybutowy: liczba parametrów równa liczbie pól typu obiektowego, ustawia wartości pól wartościami parametrów. użytkownik może definiować własne konstruktory, może także przesłonić domyślny konstruktor atrybutowy, konstruktory ułatwiają inicjalizację i umożliwiają ewolucję obiektów. Sygnatura konstruktora: CONSTRUCTOR FUNCTION nazwa_typu(lista parametrów) RETURN SELF AS RESULT; Konstruktor (2) ALTER TYPE Pracownik ADD CONSTRUCTOR FUNCTION Pracownik(p_nazwisko VARCHAR2) RETURN SELF AS RESULT CASCADE INCLUDING TABLE DATA; CREATE OR REPLACE TYPE BODY Pracownik AS MEMBER FUNCTION wiek RETURN NUMBER IS MEMBER PROCEDURE podwyzka(p_kwota NUMBER) IS ORDER MEMBER FUNCTION porzadkuj(prac Pracownik) RETURN NUMBER IS CONSTRUCTOR FUNCTION Pracownik(p_nazwisko VARCHAR2) RETURN SELF AS RESULT IS SELF.nazwisko := p_nazwisko; SELF.pensja := 1000; SELF.etat := null; SELF.data_ur := null; RETURN; END Pracownik; INSERT INTO PracownicyObjTab VALUES (NEW Pracownik('Kowalski')); 35 36

Metoda statyczna (1) Metoda statyczna (2) Wywoływana dla typu obiektowego a nie instancji obiektu. Może być funkcją lub procedurą. Nie posiada parametru SELF. Sygnatura metody statycznej: STATIC FUNCTION PROCEDURE nazwa_metody(lista parametrów) [RETURN typ]; Składnia wywołania: nazwa_typu.nazwa_metody() ALTER TYPE Pracownik REPLACE AS OBJECT ( nazwisko VARCHAR2(20), STATIC PROCEDURE dodaj_nowego(nazwisko VARCHAR2)); CREATE OR REPLACE TYPE BODY Pracownik AS STATIC PROCEDURE dodaj_nowego(nazwisko VARCHAR2) IS INSERT INTO pracownicyobjtab VALUES (NEW Pracownik(nazwisko)); END dodaj_nowego; Pracownik.dodaj_nowego('Jackowski'); 37 38 Współdzielenie i zagnieżdżanie obiektów Kowalska Kolejowa Kowalski Kowalska Kowalski Kolejowa Kolejowa CREATE TYPE TAdres AS OBJECT ( ulica VARCHAR2(15), dom NUMBER(4), mieszkanie NUMBER(3)); CREATE TYPE Osoba AS OBJECT ( nazwisko VARCHAR2(20), imie VARCHAR2(15), adres TAdres); CREATE TYPE Osoba AS OBJECT ( nazwisko VARCHAR2(20), imie VARCHAR2(15), adres REF TAdres); 39 Wiązanie obiektów współdzielonych Utworzenie tabel obiektowych: CREATE TABLE AdresyObjTab OF TAdres; CREATE TABLE OsobyObjTab OF Osoba; ALTER TABLE OsobyObjTab ADD SCOPE FOR(adres) IS AdresyObjTab; Wstawienie obiektów: INSERT INTO AdresyObjTab VALUES (NEW TAdres('Kolejowa',2,18)); INSERT INTO OsobyObjTab VALUES (NEW Osoba('Kowalska','Anna',null)); INSERT INTO OsobyObjTab VALUES (NEW Osoba('Kowalski','Jan',null)); UPDATE OsobyObjTab o SET o.adres = ( SELECT REF(a) FROM AdresyObjTab a WHERE a.ulica = 'Kolejowa' ); aby zawęzić zakres referencji tabela OsobyObjTab musi być pusta 40

Wykorzystanie referencji do nawigacji Referencje można wykorzystać w następujący sposób: nawigacja jawna przez wywołanie funkcji DEREF(): SELECT o.imie, o.nazwisko, DEREF(o.adres) FROM OsobyObjTab o; nawigacja niejawna przez notację kropkową: SELECT o.imie, o.nazwisko, o.adres.ulica, o.adres.dom FROM OsobyObjTab o; operacja połączenia tabel przez porównanie referencji: SELECT o.imie, o.nazwisko, a.ulica, a.dom, a.mieszkanie FROM OsobyObjTab o JOIN AdresyObjTab a ON o.adres = REF(a); Wiszące referencje Usunięcie obiektu nie usuwa referencji do obiektu Kowalski Kowalska Kowalski Kowalska Kolejowa? DELETE FROM AdresyObjTab a WHERE a.ulica = 'Kolejowa'; SELECT * FROM OsobyObjTab o WHERE o.adres IS NULL; SELECT * FROM OsobyObjTab o WHERE o.adres IS DANGLING; 41 42 Słownik bazy danych Perspektywy USER_TYPES i USER_SOURCE słownika SELECT type_name,typecode,attributes,methods FROM user_types; SELECT text FROM user_source WHERE name = 'PRACOWNIK'; Dziedziczenie (1) Dziedziczenie polega na definiowaniu nowego typu obiektowego w oparciu o istniejący typ obiektowy: nowy typ stanowi podtyp (specjalizację) swojego nadtypu(przodka), podtyp dziedziczy wszystkie składowe i metody MEMBER i STATIC, podtyp może dodawać nowe składowe i przesłaniać metody, każdy podtyp może mieć tylko jeden nadtyp, podtyp może dziedziczyć tylko z nadtypuktóry został zadeklarowany jako NOT FINAL (uwaga: domyślnie każdy typ jest FINAL). Pracownik Dydaktyk Administrator Profesor 43 44

Składnia: Dziedziczenie (2) CREATE TYPE podtyp UNDER nadtyp () [FINAL NOT FINAL]; Przykład: ALTER TYPE Pracownik NOT FINAL CASCADE; CREATE TYPE Dydaktyk UNDER Pracownik ( tytul VARCHAR2(10), Metody w podtypie (1) Metoda definiowana w podtypie: nie ma odpowiednika w żadnej z metod nadtypu. Metoda przesłaniania w podtypie: nadpisują metodę z nadtypu, jej sygnatura jest identyczną z sygnaturą metody z nadtypu, deklarowana z dodatkową klauzulą OVERRIDING. Metoda przeciążana w podtypie: ma taką samą nazwę jak metoda z nadtypuale inną sygnaturę. 45 46 Metody w podtypie (2) przesłonięcie metody CREATE TYPE Dydaktyk UNDER Pracownik ( tytul VARCHAR2(10), OVERRIDING MEMBER FUNCTION wiek RETURN NUMBER, MEMBER FUNCTION wiek(l_data DATE) RETURN NUMBER); CREATE TYPE BODY Dydaktyk AS OVERRIDING MEMBER FUNCTION wiek RETURN NUMBER IS RETURN ROUND(MONTHS_BETWEEN(CURRENT_DATE, data_ur)); END wiek; MEMBER FUNCTION wiek(l_data DATE) RETURN NUMBER IS RETURN EXTRACT(YEAR FROM l_data) EXTRACT(YEAR FROM data_ur); END wiek; przeciążenie metody Metody w podtypie (3) Ograniczenia mechanizmu przesłaniania: redefiniowane mogą być tylko metody zadeklarowane w nadtypie jako NOT FINAL (domyślnie), przykład: CREATE TYPE Pracownik ( FINAL MAP MEMBER FUNCTION ); metoda porządkująca może być zdefiniowana tylko w korzeniu hierarchii nie może być redefiniowana w podtypach, 47 48

Metody w podtypie (4) Ograniczenia mechanizmu przesłaniania (cd): metoda statyczna w podtypie nie może redefiniować zwykłej metody nadtypu, zwykła metoda w podtypie nie może redefiniować metody statycznej nadtypu, jeśli nadpisywana metoda ma wartość domyślną dla jakiegokolwiek parametru, metoda nadpisująca musi zapewnić tą samą wartość domyślną w podtypie. Konstruktor podtypu Domyślny konstruktor atrybutowy: wszystkie pola nadtypu + pola podtypu. DECLARE dydaktyk_1 Dydaktyk := Dydaktyk( 'Kowalski', 3500, pola nadtypu (Pracownik) 'ADIUNKT', DATE '1972-02-27', 'dr inż.'); pole podtypu (Dydaktyk) Konstruktoryużytkownika z nadtypunie są dziedziczone do podtypu dlatego nie mogą być przesłaniane w podtypie. 49 50 Wywołanie metody z nadtypu(1) Pozwala dla obiektu-podtypu wywołać metodę z nadtypu Konstrukcja: (obiekt AS nadtyp).metoda Przykład 1.: DECLARE d1 Dydaktyk := new Dydaktyk('Kowalski',3500,'ADIUNKT', DATE '1972-02-27','dr inż.'); DBMS_OUTPUT.PUT_LINE('wiek w miesiącach: ' d1.wiek()); DBMS_OUTPUT.PUT_LINE('wiek w latach: ' (d1 AS Pracownik).wiek()); Wywołanie metody z nadtypu(2) Przykład 2.: CREATE TYPE BODY Dydaktyk AS OVERRIDING MEMBER FUNCTION wiek RETURN NUMBER IS v_wiek_w_latach NUMBER(3); v_wiek_w_latach := (SELF AS Pracownik).wiek(); RETURN 12 * v_wiek_w_latach; END wiek; 51 52

Abstrakcyjny typ obiektowy Typ, będący korzeniem hierarchii, deklaruje się często jako typ abstrakcyjny: nie można tworzyć instancji tego typu, jest szablonem zbioru pól i metod dla podtypów, deklarowany z klauzulą NON INSTANTIABLE, musi mieć dodatkowo klauzulę NOT FINAL. CREATE TYPE Osoba AS OBJECT ( pesel char(11), imie VARCHAR2(100), nazwisko VARCHAR2(100), data_ur date, MEMBER FUNCTION wiek RETURN number) NOT INSTANTIABLE NOT FINAL; CREATE TYPE BODY Osoba ( MEMBER FUNCTION wiek RETURN number ); Abstrakcyjna metoda Metoda bez implementacji: klauzula NON INSTANTIABLE w sygnaturze. Typ zawierający metodę abstrakcyjną sam musi być typem abstrakcyjnym. Jeśli podtyp nie redefiniuje metody abstrakcyjnej odziedziczonej z nadtypu, sam musi zostać zadeklarowany jako abstrakcyjny. CREATE TYPE Osoba AS OBJECT ( pesel char(11), imie VARCHAR2(100), nazwisko VARCHAR2(100), data_ur date, NOT INSTANTIABLE MEMBER FUNCTION wiek RETURN number) NOT INSTANTIABLE NOT FINAL; 53 54 Polimorfizm (1) Polimorfizm (2) Polimorfizm powoduje, że obiekty podtypu mogą zachowywać się jak obiekty swojego nadtypu: zamiast obiektu nadtypumożna wykorzystać obiekt podtypu, wybór wersji metody przeciążonej następuje w momencie wykonania programu (metody są wirtualne). CREATE TABLE pracownicyidydaktycyobjtab OF Pracownik; INSERT INTO pracownicyidydaktycyobjtab VALUES (NEW Pracownik('Bolek',2000,'ASYSTENT',DATE '1969-09-03')); INSERT INTO pracownicyidydaktycyobjtab VALUES (NEW Dydaktyk('Lolek',5000,'PROF.',DATE '1949-11-13','dr')); SELECT p.nazwisko, p.wiek() FROM pracownicyidydaktycyobjtab p; NAZWISKO P.WIEK() ---------- ---------- Bolek 44 Lolek 768 55 Funkcja TREAT-umożliwia zmianę typu wyrażenia do innego typu, cele stosowania: odwołanie do obiektu, będącego wystąpieniem nadtypu, w kontekście podtypu (zawężenie), umożliwienie dostępu do pól lub metod z podtypu zadeklarowanego typu. SELECT p.nazwisko, p.wiek(), p.tytul FROM pracownicyidydaktycyobjtab p; -- BŁĄD SELECT p.nazwisko, p.wiek(), TREAT(VALUE(p) as Dydaktyk).tytul FROM pracownicyidydaktycyobjtab p; -- OK NAZWISKO P.WIEK() TYTUL -------------------- ---------- ---------- Bolek 44 <- Pracownik Lolek 768 dr <- Dydaktyk 56

Polimorfizm (3) Pseudokolumna OBJECT_VALUE umożliwia identyfikację wartości obiektów: działa podobnie do funkcji VALUE. SELECT OBJECT_VALUE FROM pracownicyidydaktycyobjtab p; OBJECT_VALUE --------------------------------------------------------------- PRACOWNIK('Bolek',2000,'ASYSTENT','1969-09-03 00:00:00.0') DYDAKTYK('Lolek',5000,'PROF.','1949-11-13 00:00:00.0','dr') Ewolucja typu (1) Obiekty zależne odwołują się do typu bezpośrednio lub pośrednio. Podczas zmiany typu: zależne: podprogramy, perspektywy, operatory i typy indeksowe są unieważniane, muszą zostać zrekompilowane przed ponownym użyciem, zależne indeksy funkcyjne zostają usunięte lub wyłączone (zależnie od zmiany), muszą zostać odbudowane, zależne tabele obiektowe lub z kolumnami obiektowymi: dodanie pola do obiektu dodaje pustą kolumnę, usunięcie pola usuwa skojarzoną z polem kolumnę, modyfikacja typu pola powoduje modyfikację wartości kolumn (o ile to możliwe). 57 58 Ewolucja typu (2) Ewolucja typu (3) Modyfikacje danych po modyfikacji typu: Modyfikacje danych po modyfikacji typu (cd): ALTER TYPE nazwa INVALIDATE CASCADE [INCLUDING TABLE DATA NOT INCLUDING TABLE DATA] INVALIDATE unieważnienie obiektów zależnych bez kontroli (szybkie działanie), CASCADE modyfikacje mają być propagowane do obiektów zależnych: proces przerywany w przypadku błędu, wymuszenie działania opcją FORCE. INCLUDING TABLE DATA dane w tabelach zależnych mają zostać skonwertowane do nowej postaci typu (domyślne), NOT INCLUDING TABLE DATA dane w tabelach zależnych nie są modyfikowane, modyfikacja może zostać zrealizowana później poleceniami ALTER TABLE UPGRADE INCLUDING DATA i ALTER TABLE DROP UNUSED COLUMNS 59 60