SBD, L.Banachowski
Obiektowość w obiektowo-
Obiektowość w obiektowo-
relacyjnych bazach danych
relacyjnych bazach danych
na
na
przykładzie Oracle
przykładzie Oracle
Wykład 9
SBD, L.Banachowski
Rodzaje obiekt
Rodzaje obiekt
ó
ó
w
w
1. Obiekty typów obiektowych
2. Duże obiekty LOB
SBD, L.Banachowski
Znaczenie obiektowości w
Znaczenie obiektowości w
bazach danych
bazach danych
Na modelu obiektowo-relacyjnym oparty jest
Standard języka SQL:1999.
Typy obiektowe realizują zasadę abstrakcji w
dwóch postaciach:
–
abstrakcji proceduralnej polegającej na ukryciu
szczegółów złożonych algorytmów poprzez
opakowanie ich w procedury i funkcje; gdy w razie
potrzeby zmieniamy procedurę - nie musimy
modyfikować aplikacji jej używających;
–
abstrakcji danych polegającej na ukryciu złożoności
struktury danych przed użytkownikiem, który
korzysta z tych danych; podobnie jak poprzednio,
gdy w razie potrzeby zmieniamy strukturę danych –
nie musimy modyfikować aplikacji jej używających.
SBD, L.Banachowski
Znaczenie obiektowości w
Znaczenie obiektowości w
bazach danych
bazach danych
Zalety użycia obu rodzajów abstrakcji w
bazach danych:
–
Ułatwione modelowanie rzeczywistych obiektów
biznesowych.
–
Zmniejszenie złożoności tworzenia aplikacji przez
podział zadania na części. Ułatwienie dokonywania
zmian. Ukrycie szczegółów implementacyjnych przed
użytkownikiem. Modularność aplikacji i możliwość
wielokrotnego użycia komponentów w tej samej lub
w różnych aplikacjach.
–
Zgrupowanie używanego kodu po stronie serwera
wokół obiektów, na których kod działa. Uzyskanie
większej kontroli nad kodem.
–
Zastosowanie obiektowo-relacyjnego modelu danych
prowadzi do zmniejszenia rozbieżności w modelach
danych samej bazy danych i aplikacji bazodanowej
napisanej w obiektowym języku programowania. Oba
modele można oprzeć o te same pojęcia: klasy (typu
obiektowego) i instancji klasy (obiektu).
SBD, L.Banachowski
Atrybut
Atrybut
Metoda
Metoda
Id_zam
Id_zam
Info_klient
Info_klient
Pozycje
Pozycje
Status
Status
Zatrzymaj
Zatrzymaj
W
y
ś
w
W
y
ś
w
_S
ta
tu
s
_S
ta
tu
s
A
n
u
lu
j
A
n
u
lu
j
Wyślij
Wyślij
Typ obiektowy
Typ obiektowy
• Złożony typ danych definiowany przez
użytkownika (odpowiadający pojęciu klasy w
obiektowych językach programowania).
• Hermetyzuje strukturę danych łącznie z
metodami potrzebnymi do operowania na
strukturze danych.
Typ obiektowy:
Zamówienia
SBD, L.Banachowski
Ciał
Ciał
a metod
a metod
Publiczny
Publiczny
interfejs
interfejs
Prywatna
Prywatna
implementacj
implementacj
a
a
Deklaracje atrybut
Deklaracje atrybut
ó
ó
w
w
Specyfikacje metod
Specyfikacje metod
Specyfikacja typu
Specyfikacja typu
Ciało
Ciało
typu
typu
Struktura typu
Struktura typu
obiektowego
obiektowego
SBD, L.Banachowski
CREATE TYPE nazwa_typu AS OBJECT
[(atrybut1 typdanych,
atrybut2 typdanych,
. . .]
[MEMBER procedura1 | funkcja1 spec,
procedura2 | funkcja2 spec,
. . .)]
CREATE TYPE nazwa_typu AS OBJECT
[(atrybut1 typdanych,
atrybut2 typdanych,
. . .]
[MEMBER procedura1 | funkcja1 spec,
procedura2 | funkcja2 spec,
. . .)]
Sk
Sk
ł
ł
adnia
adnia
Tworzenie specyfikacji typu
Tworzenie specyfikacji typu
obiektowego
obiektowego
SBD, L.Banachowski
Sk
Sk
ł
ł
adnia
adnia
CREATE TYPE BODY nazwa_typu AS
[MEMBER procedura1 | funkcja1 spec,
procedura2 | funkcja2 spec,
. . .)]
CREATE TYPE BODY nazwa_typu AS
[MEMBER procedura1 | funkcja1 spec,
procedura2 | funkcja2 spec,
. . .)]
Tworzenie cia
Tworzenie cia
ł
ł
a typu
a typu
obiektowego
obiektowego
SBD, L.Banachowski
SQL> CREATE TYPE name_typ AS OBJECT(
2
f_name
VARCHAR2(25),
3 l_name VARCHAR2(25),
4 initials
varchar2(7),
5 MEMBER FUNCTION full_name return
varchar2,
6 PRAGMA RESTRICT_REFERENCES( full_name,
7 WNDS, RNDS, WNPS, RNPS ));
Przyk
Przyk
ł
ł
ad
ad
– specyfikacja typu
– specyfikacja typu
nazwisk
nazwisk
SBD, L.Banachowski
SQL> CREATE TYPE BODY name_typ AS
2 MEMBER FUNCTION full_name RETURN VARCHAR2
3 IS
4 BEGIN
5 RETURN (l_name || ' ' || f_name );
6 END full_name;
7 END;
Przyk
Przyk
ł
ł
ad
ad
– implementacja typu
– implementacja typu
nazwisk
nazwisk
SBD, L.Banachowski
SQL> CREATE TYPE emp_typ AS OBJECT(
2
emp_id NUMBER(7),
3
name name_typ,
--datatype is object type
4
street VARCHAR2(25),
5
city VARCHAR2(15),
6
state CHAR(2),
7
zip INTEGER,
8
MEMBER FUNCTION get_name RETURN VARCHAR2,
9 PRAGMA RESTRICT_REFERENCES(get_name,
10 WNDS, RNDS, WNPS, RNPS),
11
MEMBER PROCEDURE set_l_name (v_name
VARCHAR2));
Przyk
Przyk
ł
ł
ad
ad
– specyfikacja typu
– specyfikacja typu
pracowników
pracowników
SBD, L.Banachowski
SQL> CREATE TYPE BODY emp_typ AS
2 MEMBER FUNCTION get_name RETURN VARCHAR2
3 IS
4 BEGIN
5 RETURN (name.l_name ||' '|| name.f_name );
6 END;
7 MEMBER PROCEDURE set_l_name (v_name VARCHAR2)
8 IS
9 BEGIN
10 name.l_name := v_name;
11 END;
12
END;
Przyk
Przyk
ł
ł
ad
ad
– implementacja typu
– implementacja typu
pracowników
pracowników
SBD, L.Banachowski
Metody
Metody
Metody to funkcje lub procedury, które
tworzymy w definicji typu obiektowego w celu
zaimplementowania zachowania się obiektów
danego typu. Aplikacja wywołuje metody, aby
uzyskać w efekcie to zachowanie. Są trzy typy
metod: metody składowe obiektów (metody
typu MEMBER), metody konstruktorów
obiektów (metody typu CONSTRUCTOR) oraz
metody statyczne, czyli odnoszące się do
całego typu (metody typu STATIC). W tym
wykładzie rozważamy tylko metody składowe
obiektów oraz metody konstruktora obiektów
implementowane przez system – oprócz tego
są jeszcze metody konstruktorów definiowane
przez użytkowników.
SBD, L.Banachowski
SQL> CREATE TYPE Person AS OBJECT (
2 firt VARCHAR2(50),
3 last VARCHAR2(50)) NOT FINAL;
SQL> CREATE TYPE Emp UNDER Person (
salary NUMBER) FINAL;
SQL> DECLARE
x Emp:=Emp('Jan','Kowalski', 10000);
BEGIN
DBMS_OUTPUT.Put_line(x.first||' '||x.last
||' '||x.salary);
END;
Dziedziczenie (9i)
Dziedziczenie (9i)
SBD, L.Banachowski
Dla typów obiektowych, które mogą być
wzorcami dla podtypów podlegając dalszemu
dziedziczeniu, czyli takich, które nie są
końcowe w hierarchii dziedziczenia,
wymagana jest specyfikacja NOT FINAL.
Domyślną specyfikacją jest FINAL - typ
obiektowy nie podlega dalszemu
dziedziczeniu.
Dziedziczenie (9i)
Dziedziczenie (9i)
SBD, L.Banachowski
CREATE TYPE Figure AS OBJECT (
NOT INSTANTIABLE MEMBER FUNCTION area RETURN NUMBER
) NOT INSTANTIABLE NOT FINAL;
CREATE TYPE Rect UNDER Figure (
x NUMBER, y NUMBER,
OVERRIDING MEMBER FUNCTION area RETURN NUMBER);
CREATE TYPE BODY Rect AS
OVERRIDING MEMBER FUNCTION area RETURN NUMBER IS
BEGIN RETURN x*y; END;
END;
Przesłanianie
Przesłanianie
(9i)
(9i)
SBD, L.Banachowski
Definicja metody area w podtypie Rect
przesłania jej specyfikację w nadtypie Figure.
Wymagane jest słowo kluczowe
OVERRIDING. Domyślną specyfikacją
metody jest NOT OVERRIDING.
Słowo kluczowe NOT INSTANTIABLE dla
typu obiektowego oznacza, że nie można
tworzyć instancji danego typu obiektowego,
a dla metody - brak implementacji.
Domyślną specyfikacją w obu przypadkach
jest INSTANTIABLE.
Przesłanianie
Przesłanianie
(9i)
(9i)
SBD, L.Banachowski
Informacje o typach obiektowych znajdują się w
• USER_OBJECTS
Informacje o metodach typów obiektowych
znajdują się w
• USER_METHOD_PARAMS
• USER_METHOD_RESULTS
• USER_TYPE_METHODS
Informacje w słowniku danych
Informacje w słowniku danych
Oracle
Oracle
SBD, L.Banachowski
Usuwanie typów
Usuwanie typów
obiektowych
obiektowych
Usuwanie typu obiektowego
(specyfikacji i implementacji):
DROP TYPE typ;
Usuwanie implementacji typu
obiektowego z pozostawieniem
specyfikacji:
DROP TYPE BODY typ_obiektowy;
W tym momencie do istniejących
obiektów tego typu nie można
zastosować żadnej z metod!
SBD, L.Banachowski
Tworzenie tabeli obiektowej i
Tworzenie tabeli obiektowej i
wywoływanie metod
wywoływanie metod
• Zdefiniowanego typu obiektowego można
używać do tworzenia tabel obiektowych tego
typu.
• W utworzonej tabeli obiektowej są
zapisywane obiekty typu obiektowego na tej
samej zasadzie co wiersze tabeli relacyjnej.
To znaczy, wartości atrybutów tworzą
wiersz, na którym działają metody określone
w danym typie obiektowym.
SBD, L.Banachowski
CREATE TABLE nazwa_tabeli OF nazwa_typu
[(więzy spójności)];
Tworzenie tabeli obiektowej i
Tworzenie tabeli obiektowej i
wywoływanie metod
wywoływanie metod
SBD, L.Banachowski
SQL>
CREATE TABLE name_table OF name_typ;
SQL>
INSERT INTO name_table
2
VALUES('Marilyn','Monroe','MM');
SQL>
INSERT INTO name_table
2
VALUES('Brigitte','Bardot','BB');
SQL>
SELECT f_name, l_name, nt.full_name()
2
FROM name_table nt;
Przykład tabeli obiektowej
Przykład tabeli obiektowej
SBD, L.Banachowski
SQL> CREATE TYPE tv_type AS OBJECT (
2 tv_category VARCHAR2(20),
3 screen_size NUMBER(4));
DECLARE
v_new_tv tv_type := tv_type('WEB tv', 32);
v_alt_tv tv_type;
BEGIN
v_alt_tv := tv_type('Big Screen', 72);
END;
Metoda konstruktora
Metoda konstruktora
obiektu
obiektu
SQL> CREATE TABLE tv OF tv_type;
SQL> INSERT INTO tv VALUES(tv_type('Color tv', '28'));
SBD, L.Banachowski
Typ obiektowy
Typ obiektowy
SQL> CREATE TABLE person_tab OF emp_typ;
Tabela obiektowa
Tabela obiektowa
SQL> CREATE TYPE emp_typ AS OBJECT(
2
emp_id NUMBER(7),
3
name name_typ,
--datatype is object type
4
street VARCHAR2(25),
5
city VARCHAR2(15),
6
state CHAR(2),
7
zip INTEGER,
8
MEMBER FUNCTION get_name RETURN VARCHAR2
9 PRAGMA RESTRICT_REFERENCES(get_name,
10 WNDS, RNDS, WNPS, RNPS),
11
MEMBER PROCEDURE set_l_name (v_name
VARCHAR2));
Operowanie obiektami
Operowanie obiektami
SBD, L.Banachowski
SELECT VALUE(p) FROM person_tab p
WHERE p.name.l_name LIKE '%BLAKE’;
SELECT * FROM person_tab p
WHERE p.name.l_name LIKE '%BLAKE’;
SELECT na tabeli
SELECT na tabeli
obiektowej
obiektowej
Wynikiem zbiór wierszy:
Wynikiem zbiór wierszy:
Wynikiem zbiór obiektów reprezentowanych
Wynikiem zbiór obiektów reprezentowanych
przy użyciu konstruktora typu obiektowego:
przy użyciu konstruktora typu obiektowego:
VALUE(p) - oznacza obiekt wskazywany przez p.
SBD, L.Banachowski
INSERT INTO person_tab
VALUES(emp_typ(1, name_typ('Jan', 'Kowalski',
'JK'), 'Andersa', 'Warszawa', 'PL', 1111);
insert into person_tab
values(1, name_typ('Jan', 'Kowalski', 'JK'),
'Andersa', 'Warszawa', 'PL', 1111);
INSERT do tabeli
INSERT do tabeli
obiektowej
obiektowej
Z użyciem konstruktora typu
Z użyciem konstruktora typu
obiektowego:
obiektowego:
Bezpo
Bezpo
ś
ś
redni
redni
o
o
:
:
SBD, L.Banachowski
UPDATE person_tab p
SET p = emp_typ(2, name_typ('Anna', 'Kowalska',
'AK'), 'Świętego Mikołaja', 'Warszawa', 'PL', 1111)
WHERE p.name.f_name = 'Anna';
UPDATE person_tab p
SET p.street = 'Świętego Mikołaja'
WHERE p.name.l_name = 'Kowalska';
UPDATE na tabeli
UPDATE na tabeli
obiektowej
obiektowej
Z u
Z u
ż
ż
yciem konstruktora typu
yciem konstruktora typu
obiektowego
obiektowego:
SBD, L.Banachowski
DELETE FROM person_tab p
WHERE p.street = 'Andersa';
DELETE na tabeli
DELETE na tabeli
obiektowej
obiektowej
SBD, L.Banachowski
Tabela relacyjna w
Tabela relacyjna w
obiektowo-relacyjnej bazie
obiektowo-relacyjnej bazie
danych
danych
Możemy używać tabel relacyjnych z
kolumnami typów obiektowych. Wartościami
wpisywanymi do kolumn tabeli mogą więc być
instancje typów obiektowych.
CREATE TABLE Emp1(
-- tabela relacyjna
Empno NUMBER PRIMARY KEY,
Name Name_typ,
-- kolumna typu obiektowego
Sal NUMBER,
Kier REFERENCES Emp1);
SBD, L.Banachowski
Typ referencyjny
Typ referencyjny
Dla każdego typu obiektowego Type jest
automatycznie definiowany jego typ
referencyjny oznaczany przez REF
Type. Typu tego można używać jako
typu atrybutów obiektów bądź kolumn
w tabeli relacyjnej. Daje to możliwość
wiązania wartości atrybutu bądź
wartości w kolumnie z innym obiektem
podobnie jak klucz obcy odwołuje się do
klucza głównego. Jest to alternatywny
sposób tworzenia powiązań.
SBD, L.Banachowski
Typ referencyjny
Typ referencyjny
CREATE TYPE Dept_Type AS
OBJECT(
Name VARCHAR2(10),
Loc VARCHAR2(50));
CREATE TYPE Emp_Type AS
OBJECT(
Name VARCHAR2(20),
Sal Number,
Dept_ref REF Dept_Type
);
CREATE TABLE Obj_Emp OF
Emp_Type
(Dept_ref SCOPE IS
Obj_Dept)
;
CREATE TABLE
Rel_emp(
Id NUMBER
PRIMARY KEY,
Name
VARCHAR2(20),
Sal Number,
Dept_ref REF
Dept_Type
SCOPE IS
Obj_Dept)
;
CREATE TABLE
Obj_Dept OF
Dept_Type;
SCOPE IS jest
konieczne, ponieważ
istnieje możliwość
tworzenia wielu tabel
jednego typu.
SBD, L.Banachowski
Kolekcje
Kolekcje
Atrybut typu obiektowego lub kolumna może
być typu kolekcji:
1. VARRAY – typ tablicy jednowymiarowej (jak
wektor);
2. TABLE – typ tabeli zagnieżdżonej.
SBD, L.Banachowski
Przykład zastosowania typu
Przykład zastosowania typu
VARRAY
VARRAY
CREATE TYPE Projekt AS
OBJECT ( Num_proj
NUMBER(3),
Tytuł VARCHAR2(35),
Koszt NUMBER(7,2));
CREATE TYPE
Lista AS
VARRAY(3) OF
Projekt;
CREATE TABLE
Wydziały (
Id_wydz NUMBER(2),
Nazwa VARCHAR2(15),
Budżet NUMBER(11,2),
Projekty Lista
);
INSERT INTO Wydziały
VALUES(1,'Informatyka',100000,
Lista(Projekt(1,'Analiza',123),
Projekt(2,'Projekt',456))
);
SBD, L.Banachowski
Przykład zastosowania typu
Przykład zastosowania typu
VARRAY
VARRAY
w kodzie PL/SQL do poszczególnych
elementów kolekcji można dostawać się
używając naturalnej dla tablic składni:
Nazwa_kolekcji(wskaźnik)
CREATE OR REPLACE PROCEDURE Wypisz AS
lis Lista;
BEGIN
FOR z IN (SELECT * FROM Wydziały) LOOP
DBMS_OUTPUT.Put_line('Projekty Wydziału: '||
z.Nazwa);
lis:=z.Projekty;
FOR i IN 1..lis.Count LOOP
DBMS_OUTPUT.Put_line(lis(i).Num_proj||' '||
lis(i).Tytuł);
END LOOP;
END LOOP;
END;
SBD, L.Banachowski
Duże obiekty LOB
Duże obiekty LOB
W Oracle są cztery rodzaje dużych
obiektów LOB:
1.BLOB – binarny duży obiekt - strumień
bitów jak w przypadku LONG RAW.
2.CLOB – znakowy duży obiekt -
strumień znaków (pojedynczych bajtów).
3.NCLOB – uogólniony (dla języków
narodowych wielobajtowych) znakowy
duży obiekt.
4.BFILE – plik binarny przechowywany
poza bazą danych.
SBD, L.Banachowski
Przepis
(CLOB)
Foto
(BLOB)
Film
Film
(BFILE)
(BFILE)
Duże obiekty LOB
Duże obiekty LOB
SBD, L.Banachowski
DECLARE
lobloc BLOB;
BEGIN
SELECT col1 INTO lobloc
FROM LOB_Table WHERE col2=123;
END;
Warto
Warto
ść
ść
LOB
LOB
Lokator
Lokator
LOB
LOB
Anatomia obiektu LOB
Anatomia obiektu LOB
SBD, L.Banachowski
Przepis
(CLOB)
Foto
(BLOB)
Wewnętrzne obiekty LOB
Wewnętrzne obiekty LOB
SBD, L.Banachowski
SQL> CREATE TABLE employee
2 (emp_id NUMBER,
3 emp_name VARCHAR2(35),
4 resume CLOB,
5 picture BLOB);
Tabela z obiektami LOB
Tabela z obiektami LOB
SBD, L.Banachowski
Film
Film
(BFILE)
(BFILE)
•
Atrybut typu
obiektowego
•
Kolumna w tabeli
Zewnętrzne obiekty LOB -
Zewnętrzne obiekty LOB -
zapisywane w pliku systemu
zapisywane w pliku systemu
operacyjnego
operacyjnego
SBD, L.Banachowski
Film (BFILE)
Film (BFILE)
DIRECTOR
DIRECTOR
Y
Y
lob_path =
lob_path =
'/oracle/lob/'
'/oracle/lob/'
Katalog DIRECTORY
Katalog DIRECTORY
SBD, L.Banachowski
Katalog DIRECTORY
Katalog DIRECTORY
Katalog jest to obiekt bazodanowy
reprezentujący katalog systemu
operacyjnego. Służy do
administrowania dostępem do
obiektów bazy danych typu BFILE
przechowywanych w plikach poza bazą
danych. Fizyczny katalog jest tworzony
pod systemem operacyjnym z
uprawnieniami odczytu dla procesów
Oracle. Pliki w tym katalogu nie mogą
być ani zmieniane ani usuwane przez
system Oracle.
SBD, L.Banachowski
Posługiwanie się obiektami
Posługiwanie się obiektami
LOB
LOB
• Pakiet DBMS_LOB
• Wsparcie w SQL - tabele
• Katalog DIRECTORY
SBD, L.Banachowski
SQL> UPDATE employee SET resume =
2> (SELECT resume FROM employee
3> WHERE emp_name='Default')
4> WHERE emp_id = 4508;
SQL> INSERT INTO employee VALUES
2> (7898,'Marilyn Monroe', EMPTY_CLOB(), NULL);
Wstawianie obiektów LOB
Wstawianie obiektów LOB
SQL> INSERT INTO employee VALUES
2> (7897,'Jan Kowalski','Znakomity aktor',
NULL);
SBD, L.Banachowski
DECLARE
lobloc CLOB; --lokator LOB
text VARCHAR2(2000);
amount NUMBER ;
offset INTEGER;
BEGIN
text := 'tekst do wpisania do LOB';
SELECT resume INTO lobloc -- lokator LOB
FROM employee
WHERE emp_id = 5887 FOR UPDATE;
offset := DBMS_LOB.GETLENGTH(lobloc) + 1;
amount := length(text);
DBMS_LOB.WRITE (lobloc, amount, offset, text);
COMMIT;
DBMS_OUTPUT.PUT_LINE('Wpisano ' ||
to_char(amount) ||' znaków');
END;
Dopisywanie do obiektów LOB
Dopisywanie do obiektów LOB
w PL/SQL
w PL/SQL
SBD, L.Banachowski
SQL>DELETE FROM person_tab
2 WHERE pname = 'Opie Griffith';
SQL>UPDATE person_tab SET resume = EMPTY_CLOB()
2 WHERE pname = 'Laura Roshto';
Usuwanie obiektów LOB
Usuwanie obiektów LOB
Usunięcie wiersza z obiektem LOB:
Usunięcie obiektu LOB w wierszu:
SBD, L.Banachowski
COMPARE
FILEGETNAME
INSTR
GETLENGTH
READ
SUBSTR
FILEEXISTS
FILEISOPEN
APPEND
COPY
ERASE
TRIM
WRITE
FILECLOSE
FILECLOSEALL
FILEOPEN
Modyfikacje
Tylko-odczyt
Pakiet DBMS_LOB
Pakiet DBMS_LOB
SBD, L.Banachowski
PROCEDURE READ (
lobsrc IN BFILE|BLOB|CLOB ,
amount IN OUT BINARY_INTEGER,
offset IN INTEGER,
buffer OUT RAW|VARCHAR2 )
PROCEDURE WRITE (
lobdst IN OUT BLOB|CLOB,
amount IN OUT BINARY_INTEGER,
offset IN INTEGER := 1,
buffer IN RAW|VARCHAR2 ) -- RAW dla BLOB
READ i WRITE
READ i WRITE