PODSTAWY BAZ DANYCH 17. Obiektowość w Oracle 1
Obiektowa baza danych Obiektowe bazy danych (OBD) powstały początkowo jako rozwinięcie programowania obiektowego. Bazy danych zorientowane obiektowo przechowują obiekty - kombinacje danych o dowolnej strukturze razem ze skojarzonymi metodami (procedurami). Zalety: 1. Złożone obiekty. 2. Typy danych definiowane przez użytkownika, rozszerzalność. 3. Hierarchia, dziedziczenie. 4. Metody i funkcje przechowywane wraz z danymi. 2
Obiektowa baza danych Wady: 1. Brak optymalizacji zapytań (rozumianej jak w poprzednich modelach). 2. Duże koszty wiążące się z migracją dużych systemów. 3. Brak opracowanych standardów. 4. Mniejsza wydajność (chociaż wciąż rośnie) od RDBMS (relacyjne bazy danych). Obiektowe bazy nie są określone żadnym oficjalnym standardem. Jednym z podstawowych celów modelu obiektowego jest bezpośrednie odwzorowanie obiektów i powiązań między nimi, wchodzących w skład aplikacji, na zbiór obiektów i powiązań w bazie danych. 3
Obiektowa baza danych Dzięki mechanizmom obiektowym można też zwiększyć niezależność danych od aplikacji poprzez przeniesienie procedur obsługi danych (w postaci metod) do systemu zarządzania bazą. W chwili obecnej brak jest profesjonalnych SZBD typowo obiektowych. Niektóre SZBD mają możliwość implementacji modelu obiektowego i dla nich używa się nazwy relacyjno-obiektowe SZBD: Informix Universal Server, DB2 Universal Database (IBM), Oracle, 4
Obiektowa baza danych Obiektowe bazy starają się zachować wiele technologii, które sprawdziły się w systemach relacyjnych, takie jak: architektura klient/serwer, mechanizmy indeksowania, przetwarzanie transakcji, optymalizacja zapytań (???), 5
Obiektowość w Oracle Oto przykłady deklaracji typów Adres i Osoba: CREATE TYPE Adres AS OBJECT ( miasto VARCHAR2(30), ulica VARCHAR2(30), numer VARCHAR2(10), kod CHAR(6) ); CREATE TYPE Osoba AS OBJECT ( imie VARCHAR2(15), nazwisko VARCHAR2(30), dane_adresowe Adres, data_ur DATE ); 6
Obiektowość w Oracle Można tworzyć typ bez specyfikacji i później go modyfikować. CREATE TYPE Osoba; lub CREATE OR REPLACE TYPE Osoba; Usuwanie typu DROP TYPE Osoba; Najprostszym sposobem zmaterializowania typu obiektowego, czyli utworzenia obiektu reprezentującego dany typ, jest posłużenie się programem PL/SQL. 7
Obiektowość w Oracle DECLARE osoba1 Osoba; BEGIN osoba1 := Osoba( Jan, Kowalski, Adres( Łódź, Piotrkowska, 80, 95-100 ), TO_DATE( 21/04/1970, dd/mm/yyyy )); osoba1.dane_adresowe.kod:= 95-200 ; END; Obiekt osoba1 utworzony powyżej ma charakter ulotny, tzn. jego istnienie ogranicza się jedynie do bloku programu PL/SQL i po jego zakończeniu zostaje on usuwany z bazy danych. 8
Obiektowość w Oracle W celu trwałego przechowywania obiektów w bazie danych należy utworzyć tabelę przechowującą obiekty, a następnie wypełniać ją obiektami przy pomocy poleceń INSERT. Oracle udostępnia dwa sposoby do trwałego przechowywania obiektów w tabelach: obiekty kolumnowe, obiekty wierszowe. 9
Obiektowość w Oracle Podczas definicji tabeli, której jeden z atrybutów jest typu obiektowego, tworzy się kolumna składująca obiekty kolumnowe (ang. column objects), np.: CREATE TABLE pracownicy ( numer NUMBER(4), dane_osobowe Osoba, pensja NUMBER(7,2) ); INSERT INTO pracownicy VALUES ( 1234, Osoba( Jan, Kowalski, Adres( Łódź, Piotrkowska, 80, 95-100 ), TO_DATE( 21/04/1970, dd/mm/yyyy )), 1500 ); 10
Obiektowość w Oracle Do tak zapisanych danych można odwoływać się standardowymi poleceniami SELECT, UPDATE, DELETE tak jak gdyby atrybut obiektowy był normalnym atrybutem typu wbudowanego. 11
Obiektowość w Oracle SELECT p.dane_osobowe, p.pensja FROM pracownicy p WHERE p.dane_osobowe.data_ur < TO_DATE('2000/02/02, yyyy/mm/dd ) AND p.dane_osobowe.dane_adresowe.miasto= Łódź ; DANE_OSOBOWE(IMIE, NAZWISKO, DANE_ADRESOWE(MIASTO, ULICA, NUMER, KOD), DATA_UR) --------------------------------------------------------------- PENSJA --------------- OSOBA( Jan', Kowalski', ADRES( Łódź', Piotrkowska', '80/82', '95-100'), '00/01/01') 1500 12
Obiektowość w Oracle Przykład polecenia UPDATE: UPDATE pracownicy p SET p.dane_osobowe.dane_adresowe.miasto = Warszawa WHERE p.dane_osobowe.data_ur < TO_DATE('2000/02/02, yyyy/mm/dd ) AND p.dane_osobowe.dane_adresowe.miasto = Łódź ; 13
Obiektowość w Oracle Drugim sposobem zapewnienia trwałości obiektów w bazie jest zdefiniowanie tzw. tabeli obiektów (ang. object table) przechowującej tzw. obiekty wierszowe (ang. row objects). CREATE TABLE osoby OF Osoba; INSERT INTO osoby VALUES ( Osoba( Jan, Kowalski, Adres( Łódź, Piotrkowska, 80, 95-100 ), TO_DATE( 2000/01/01, yyyy/mm/dd )) ); 14
Obiektowość w Oracle Wydobywanie danych z tabeli obiektów odbywa się na dwa sposoby: relacyjny; obiektowy; pokazane odpowiednio poniżej: Relacyjnie: SELECT * FROM osoby o WHERE o.imie = Jan ; Obiektowo: SELECT VALUE(o) FROM osoby o WHERE o.imie = Jan ; 15
Obiektowość w Oracle W formie relacyjnego zapytania alias o jest niekonieczny (atrybut imie jest jednoznacznie interpretowany jako kolumna tabeli osoby). Alias o zdefiniowany w zapytaniu obiektowym pełni rolę zmiennej korelacyjnej umożliwiającej dostęp do poszczególnych obiektów składowanych w tabeli obiektów. Wbudowana funkcja VALUE zwraca wartość danego obiektu. Alias jest również niezbędny przy modyfikacji obiektów w tabeli obiektów. 16
Obiektowość w Oracle SELECT * FROM osoby o WHERE o.imie='jan'; IMIE NAZWISKO --------------- ------------------------------ DANE_ADRESOWE(MIASTO, ULICA, NUMER, KOD) ---------------------------------------------- DATA_UR -------- Jan Kowalski ADRES('Łódź', 'Piotrkowska', '80', '95-100') 2000/01/01 17
Obiektowość w Oracle SELECT VALUE(o) FROM osoby o WHERE o.imie= Jan'; VALUE(O)(IMIE, NAZWISKO, DANE_ADRESOWE(MIASTO, ULICA, NUMER, KOD), DATA_UR) ----------------------------------------- OSOBA('Jan', 'Kowalski', ADRES( 'Łódź', 'Piotrkowska', '80','95-100'), '2000/01/01') 18
Obiektowość w Oracle SELECT nazwisko FROM osoby o WHERE o.imie = ' Jan' NAZWISKO ------------------------------ Kowalski 19
Obiektowość w Oracle Alias jest również niezbędny przy modyfikacji obiektów w tabeli obiektów: UPDATE osoby o SET o = Osoba('Jan, 'Kowalski, Adres('Łódź,'Piotrkowska,'80, '95-999 ), TO_DATE('2000/02/02, yyyy/mm/dd )) WHERE o.nazwisko = ' Kowalski ; 20
Obiektowość w Oracle - Metody Typ obiektowy oprócz atrybutów może zawierać również metody opisujące zachowanie obiektów (procedury) oraz umożliwiające manipulowanie własnościami obiektów funkcje. Gdy dany typ obiektowy jest już utworzony i zachodzi potrzeba jego modyfikacji w celu dodania do niego metod wykorzystuje się polecenie: 21
Obiektowość w Oracle - Metody ALTER TYPE Osoba REPLACE AS OBJECT ( imie VARCHAR2(15), nazwisko VARCHAR2(30), dane_adresowe Adres, data_ur DATE, MEMBER FUNCTION wiek RETURN NUMBER, MEMBER PROCEDURE z_data_ur(n_data DATE), PRAGMA RESTRICT_REFERENCES (wiek, WNDS,RNPS,WNPS), PRAGMA RESTRICT_REFERENCES (z_data_ur, RNPS,WNPS) ); 22
Obiektowość w Oracle - Metody Warto wyjaśnić w tym momencie użycie dyrektywy PRAGMA. Poziom ten jest wykorzystywany w celu określenia, czy dana metoda może być wywołana w poleceniach SQL bez narażania się na niekorzystne skutki uboczne. A oto cztery opcje dostępne w tej dyrektywie: WNDS bez zapisów do bazy danych (ang. Write No Database State) RNDS bez odczytów z bazy danych (ang. Read No Database State) WNPS bez zapisów do pakietów (ang. Write No Package State) WNPS bez odczytów z pakietów (ang. Read No Package State) W powyższym przykładzie funkcja wiek obiecuje, że nie będzie modyfikować żadnych danych w bazie danych oraz odczytywać i modyfikować danych w zmiennych pakietowych. 23
Obiektowość w Oracle - Metody Specyfikacja typu obiektowego zawiera deklaracje metod, więc należy zdefiniować ciało tego typu definiujące te metody: CREATE OR REPLACE TYPE BODY Osoba IS MEMEBER FUNCTION wiek RETURN NUMBER IS BEGIN RETURN ROUND(MONTHS_BETWEEN(SYSDATE,data_ur)/12); END; MEMEBER PROCEDURE z_data_ur(n_data DATE) IS BEGIN SELF.data_ur := n_data; END; END; 24
Obiektowość w Oracle - Metody Odwołanie do metod typu obiektowego następuje podobnie jak odwołanie do atrybutów tego typu. Należy pamiętać o umieszczeniu nawiasów ( ) po odwołaniu do metody bezargumentowej zostało to wprowadzone w celu uniknięcia niejednoznaczności w odwołaniu do atrybutów i metod. SELECT o.imie, o.nazwisko, o.wiek() FROM osoby o WHERE o.wiek() > 30; 25
PODSTAWY BAZ DANYCH 18. Typy danych typu LOB w Oracle (Large OBject) 26
Typy danych typu LOB Typy danych typu LOB (Large OBject) służą do przechowywania dużych obiektów (do 4GB) binarnych lub tekstowych. Wewnętrzna struktura tych danych nie jest dostępna z poziomu SQL. Dostęp do danych typu LOB odbywa się przy pomocy pewnych procedur i funkcji Oracle. Najważniejsze rodzaje typów LOB zaimplementowanych w Oracle to: BLOB CLOB NLOB BFILE - do składowania danych binarnych (np. zdjęć); - do składowania danych tekstowych (znak 1 bajt); - odpowiednik CLOB do przechowywaniu znaków narodowych wybranych dla bazy danych; - do zarządzania danymi binarnymi znajdującymi się poza bazą danych zapisanych jako pliki na dysku (można je tylko odczytać). 27
Typy danych typu LOB Obiekty typu BLOB, CLOB, NLOB uczestniczą w transakcjach i odtwarzaniu bazy danych po awarii. Tych własności nie posiadają obiekty typu BFILE. Atrybuty BLOB, CLOB, NLOB nie zawierają właściwych danych, a jedynie lokalizatory LOB (odnośniki do miejsca, w którym fizycznie zapisana jest zawartość obiektu). Większą część operacji na obiektach typu LOB wykonywane są przez procedury i funkcje pakietu DBMS_LOB. Do pracy z obiektami typu LOB należy posiadać uprawnienie systemowe CREATE ANY DIRECTORY i uprawnienie obiektowe EXECUTE do biblioteki DBMS_LOB. 28
Typy danych typu LOB Dla obiektów typu LOB lokalizatory tworzy się za pomocą odpowiednich funkcji pakietu DBMS_LOB: empty_clob - dla danych typu CLOB; empty_blob - dla danych typu BLOB; bfilename - dla danych typu BFILE. Funkcje empty_clob, empty_blob są funkcjami bezargumentowe. Funkcja bfilename posiada dwa argumenty typu VARCHAR2: nazwę obiektu katalogu oraz nazwę pliku. Obiekt katalogu reprezentuje w bazie danych fizyczny katalog utworzony w systemie plików serwera. 29
Typy danych typu LOB Obiekt ten tworzy się poleceniem: CREATE DIRECTORY identyfikator_katalogu AS katalog ; Zadanie. Należy wstawić plik foto1.jpg zapisany w katalogu F:\foto do tabeli utworzonej poleceniem CREATE TABLE obrazki (id NUMBER(3) Primary Key, obrazek BFILE); Należy stworzyć obiekt katalogu: CREATE DIRECTORY obrazki AS F:\foto ; a następnie wykonać polecenie: INSERT INTO obrazki VALUES (1, bfilename( obrazki, foto1.jpg )); Na pliku foto1.jpg można wykonywać operacje odczytu i zapisu. 30
Typy danych typu LOB Obiekty typu BLOB i CLOB nie zawierają żadnych danych. Trzeba je do nich załadować. Zadanie. Mamy tabelę utworzoną poleceniem: CREATE TABLE pracownicy ( id NUMBER(3) PRIMARY KEY, nazwisko VARCHAR2(20), zdjecie BLOB ); Do tej tabeli chcemy wstawić nowy wiersz zawierający zdjęcie pochodzące z pliku jan_kowalski.jpg znajdującego się w katalogu F:\foto. Na początku należy utworzyć obiekt katalogu: CREATE DIRECTORY zdjecia AS F:\foto ; 31
Typy danych typu LOB Następnie należy uruchomić następujący skrypt napisany w PL/SQL wykorzystujący bibliotekę DBMS_LOB. DECLARE bl BLOB; bf BFILE; BEGIN INSERT INTO pracownicy VALUES (1, Kowalski Jan, empty_blob()); SELECT zdjecie INTO bl FROM pracownicy WHERE id=1; bf:=bfilename( zdjecia, jan_kowalski.jpg ); DBMS_LOB.loadfromfile(bl,bf,DBMS_LOB.lobmaxsize); END; Zapytanie SELECT * FROM pracownicy; nie powiedzie się, ponieważ danych binarnych nie można wyświetlić w oknie SQL*Plus. 32
Typy danych typu LOB Zadanie. Do tabeli utworzonej poleceniem CREATE TABLE dokumenty ( id NUMBER(3) PRIMARY KEY, dokument CLOB ); można wstawić dowolny wiersz poleceniem INSERT INTO dokumenty VALUES (1, To jest jakiś CLOB ); Do tabeli dokumenty można wykonać polecenie: SELECT * FROM dokumenty; 33