Obiektowość w Oracle

Transkrypt

Obiektowość w Oracle
PODSTAWY
BAZ DANYCH
17. Obiektowość w Oracle
2009/2010 Notatki do wykładu "Podstawy baz danych"
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.
2009/2010 Notatki do wykładu "Podstawy baz danych"
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.
2009/2010 Notatki do wykładu "Podstawy baz 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,
•
…
2009/2010 Notatki do wykładu "Podstawy baz danych"
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ń (???),
•
…
2009/2010 Notatki do wykładu "Podstawy baz danych"
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
);
2009/2010 Notatki do wykładu "Podstawy baz danych"
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.
2009/2010 Notatki do wykładu "Podstawy baz danych"
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.
2009/2010 Notatki do wykładu "Podstawy baz 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.
2009/2010 Notatki do wykładu "Podstawy baz danych"
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
);
2009/2010 Notatki do wykładu "Podstawy baz danych"
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.
2009/2010 Notatki do wykładu "Podstawy baz danych"
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
2009/2010 Notatki do wykładu "Podstawy baz danych"
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ź‘;
2009/2010 Notatki do wykładu "Podstawy baz danych"
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’))
);
2009/2010 Notatki do wykładu "Podstawy baz danych"
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’;
2009/2010 Notatki do wykładu "Podstawy baz danych"
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.
2009/2010 Notatki do wykładu "Podstawy baz danych"
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
2009/2010 Notatki do wykładu "Podstawy baz danych"
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')
2009/2010 Notatki do wykładu "Podstawy baz danych"
18
Obiektowość w Oracle
SELECT nazwisko
FROM osoby o
WHERE o.imie = ' Jan'
NAZWISKO
-----------------------------Kowalski
2009/2010 Notatki do wykładu "Podstawy baz danych"
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’;
2009/2010 Notatki do wykładu "Podstawy baz danych"
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:
2009/2010 Notatki do wykładu "Podstawy baz danych"
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)
);
2009/2010 Notatki do wykładu "Podstawy baz danych"
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.
2009/2010 Notatki do wykładu "Podstawy baz danych"
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;
2009/2010 Notatki do wykładu "Podstawy baz danych"
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;
2009/2010 Notatki do wykładu "Podstawy baz danych"
25
PODSTAWY
BAZ DANYCH
18. Typy danych typu LOB w Oracle
(Large OBject)
2009/2010 Notatki do wykładu "Podstawy baz danych"
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 - do składowania danych binarnych (np. zdjęć);
• CLOB - do składowania danych tekstowych (znak 1 bajt);
• NLOB - odpowiednik CLOB do przechowywaniu znaków
narodowych wybranych dla bazy danych;
• BFILE - do zarządzania danymi binarnymi znajdującymi się
poza bazą danych zapisanych jako pliki na dysku
(można je tylko odczytać).
2009/2010 Notatki do wykładu "Podstawy baz danych"
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.
2009/2010 Notatki do wykładu "Podstawy baz danych"
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.
2009/2010 Notatki do wykładu "Podstawy baz danych"
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.
2009/2010 Notatki do wykładu "Podstawy baz danych"
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’;
2009/2010 Notatki do wykładu "Podstawy baz danych"
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.
2009/2010 Notatki do wykładu "Podstawy baz danych"
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;
2009/2010 Notatki do wykładu "Podstawy baz danych"
33