 
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