obiektowość w obiektowo-relacyjnych bazach danych na przykładzie oracle
DESCRIPTION
Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle. Wyk ł ad 4. Rodzaje obiekt ó w. Obiekty typ ó w obiektowych Duże obiekty LOB Java składowana w bazie danych. Zasadnicze pytanie. Bazy danych są na ogół relacyjne, a aplikacje klienckie obiektowe. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/1.jpg)
1SZB, L.Banachowski
Obiektowość w obiektowo-relacyjnych bazach danych
na przykładzie Oracle
Wykład 4
![Page 2: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/2.jpg)
2SZB, L.Banachowski
Rodzaje obiektów
1. Obiekty typów obiektowych
2. Duże obiekty LOB
3. Java składowana w bazie danych
![Page 3: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/3.jpg)
3SZB, L.Banachowski
Zasadnicze pytanie
Bazy danych są na ogół relacyjne, a aplikacje klienckie obiektowe.
Dlaczego nie przejść na bazy danych obiektowe?
1. Prawe wszystkie dane są aktualnie przechowywane w tabelach relacyjnych.
2. Obiektowe bazy danych wydają się być mniej wydajne.
3. Relacyjne bazy danych mogą być projektowane i używane przez osoby, które nie są programistami.
Jak zbliżyć do siebie oba niespójne względem siebie modele danych?
![Page 4: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/4.jpg)
4SZB, L.Banachowski
AtrAtryybutbut
MetodMetodaa
Id_zamId_zamInfoInfo_klient_klient
PozycjePozycjeStatusStatus
ZatrzymajZatrzymaj
Wyś
wW
yśw
__ Sta
tus
Sta
tus
An
ulu
jA
nu
luj
WyślijWyślij
Typ obiektowy
• Złożony typ danych definiowany przez użytkownika.
• Hermetyzuje strukturę danych łącznie z metodami potrzebnymi do operowania na strukturze danych.
![Page 5: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/5.jpg)
5SZB, L.Banachowski
CiałCiała metoda metod
PublicPublicznyznyinterfinterfejsejs
PrPrywywatatnana implementaimplementacjacja
DDeekklaralaracje atrybutcje atrybutóóww
SSpecpecyyfifikkaacje metodcje metod
SpecSpecyyfifikkaacja typucja typu
CiałoCiało typu typu
Struktura typu obiektowego
![Page 6: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/6.jpg)
6SZB, 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, . . .)]
SSkkłładniaadniaSSkkłładniaadnia
Tworzenie specyfikacji typu obiektowego
![Page 7: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/7.jpg)
7SZB, L.Banachowski
SSkkłładniaadniaSSkkłładniaadnia
CREATE TYPE BODY nazwa_typu AS [MEMBER procedura1 | funkcja1 body, procedura2 | funkcja2 body, . . .]END
CREATE TYPE BODY nazwa_typu AS [MEMBER procedura1 | funkcja1 body, procedura2 | funkcja2 body, . . .]END
Tworzenie ciała typu obiektowego
![Page 8: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/8.jpg)
8SZB, L.Banachowski
SQL> CREATE TYPE name_typ AS OBJECT(
f_name VARCHAR2(25),
l_name VARCHAR2(25),
initials VARCHAR2(7),
MEMBER FUNCTION full_name RETURN VARCHAR2,
PRAGMA RESTRICT_REFERENCES( full_name,
WNDS, RNDS, WNPS, RNPS ));
Przykład
![Page 9: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/9.jpg)
9SZB, L.Banachowski
SQL> CREATE TYPE BODY name_typ AS
MEMBER FUNCTION full_name RETURN VARCHAR2
IS
BEGIN
RETURN (l_name || ' ' || f_name );
END full_name;
END;
Przykład
![Page 10: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/10.jpg)
10SZB, L.Banachowski
SQL> CREATE TYPE emp_typ AS OBJECT(
emp_id NUMBER(7),
name name_typ, -- typ obiektowy
street VARCHAR2(25),
city VARCHAR2(15),
state CHAR(2),
zip INTEGER,
MEMBER FUNCTION get_name RETURN VARCHAR2,
PRAGMA RESTRICT_REFERENCES(get_name,
WNDS, RNDS, WNPS, RNPS),
MEMBER PROCEDURE set_l_name (v_name VARCHAR2));
Przykład
![Page 11: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/11.jpg)
11SZB, L.Banachowski
SQL> CREATE TYPE BODY emp_typ AS
MEMBER FUNCTION get_name RETURN VARCHAR2
IS
BEGIN
RETURN (name.l_name ||' '|| name.f_name);
END;
MEMBER PROCEDURE set_l_name (v_name VARCHAR2)
IS
BEGIN
name.l_name := v_name;
END;
END;
Przykład
![Page 12: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/12.jpg)
12SZB, L.Banachowski
Rodzaje metod
MEMBER – z niejawnym pierwszym parametrem SELF – definiowanego typu danych.– Metody służące do porównywania obiektów.
STATIC – bez SELF; wywoływane type_name.method (np. metody konstruktorów obiektów definiowane przez użytkowników).
Implementowane w PL/SQL, Java, C.
![Page 13: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/13.jpg)
13SZB, L.Banachowski
Rodzaje metod
Metody konstruktorów obiektów – jeden zdefiniowany przez system (parametrami są atrybuty obiektu), inne przez użytkownika.
Metody porównywania:– MAP – przez odwzorowanie układu wartości
atrybutów na liczbę;– ORDER – bezpośrednio wylicza wynik
porównania dwóch obiektów < to -1, = to 0, > to 1.
![Page 14: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/14.jpg)
14SZB, L.Banachowski
MAP
CREATE TYPE rectangle_typ AS OBJECT ( len NUMBER, wid NUMBER, MAP MEMBER FUNCTION area RETURN NUMBER);
CREATE TYPE BODY rectangle_typ AS MAP MEMBER FUNCTION area RETURN NUMBER IS BEGIN RETURN len * wid; END area; END;
![Page 15: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/15.jpg)
15SZB, L.Banachowski
ORDERCREATE TYPE location_typ AS OBJECT( building_no NUMBER, city VARCHAR2(40), ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER );
CREATE TYPE BODY location_typ AS ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER IS BEGIN IF building_no < l.building_no THEN RETURN -1; ELSIF building_no > l.building_no THEN RETURN 1; ELSE RETURN 0; END IF; END; END;
![Page 16: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/16.jpg)
16SZB, L.Banachowski
SQL> CREATE TYPE Person AS OBJECT (
first VARCHAR2(50),
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 (jednokrotne)
NOT FINAL – wymagane aby móc definiować podtypy.
![Page 17: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/17.jpg)
17SZB, L.Banachowski
Typ bez instancji NOT INSTANTIABLE
Nie posiada konstruktora. Nie można tworzyć obiektów tego typu.
CREATE TYPE Address_t AS OBJECT(...) NOT INSTANTIABLE NOT FINAL;
CREATE TYPE USAddress_t UNDER Address_t(...);
CREATE TYPE IntlAddress_t UNDER Address_t(...);
![Page 18: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/18.jpg)
18SZB, L.Banachowski
Metoda bez instancji NOT INSTANTIABLE
Typ nie dostarcza implementacji metody.
Typ, który zawiera metody bez instancji, musi sam być NOT INSTANTIABLE.
Typ bez instancji może być definiowany jako podtyp typu z instancjami.
Typ bez instancji nie może być FINAL.
![Page 19: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/19.jpg)
19SZB, L.Banachowski
Polimorfizm
Przedefiniując dziedziczone metody w podtypie mamy możliwość zdefiniowania innego sposobu wykonania metod na obiektach podtypu.
Obiekt podtypu może być użyty w kodzie w miejsce obiektu nadtypu – definiując dla różnych podtypów różne działania.
![Page 20: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/20.jpg)
20SZB, 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
![Page 21: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/21.jpg)
21SZB, 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 Oracle
![Page 22: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/22.jpg)
22SZB, L.Banachowski
SQL> CREATE TABLE name_table OF name_typ;
SQL> INSERT INTO name_table
VALUES('Marilyn','Monroe','MM');
SQL> SELECT nt.f_name, nt.full_name()
FROM name_table nt;
Tworzenie tabeli obiektowej i wywoływanie metod
![Page 23: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/23.jpg)
23SZB, L.Banachowski
Widoki tabeli obiektowej
Tabela jedno-kolumnowa: każdy wiersz jest obiektem; można wykonywać operacje obiektowe.
Tabela wielokolumnowa: każdemu atrybutowi obiektu odpowiada jedna kolumna.
Rodzaje obiektów1. wierszowe2. kolumnowe
![Page 24: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/24.jpg)
24SZB, L.Banachowski
SQL> CREATE TYPE tv_type AS OBJECT (
tv_category VARCHAR2(20),
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 obiektu
SQL> CREATE TABLE tv OF tv_type;
SQL> INSERT INTO tv VALUES(tv_type('Color tv', '28'));
![Page 25: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/25.jpg)
25SZB, L.Banachowski
SELECT VALUE(p) FROM name_table p WHERE p.l_name LIKE 'M%';
SELECT * FROM name_table p WHERE p.l_name LIKE 'M%';
SELECT na tabeli obiektowej
Wynikiem zbiór wierszy:Wynikiem zbiór wierszy:
Wynikiem zbiór obiektWynikiem zbiór obiektóów:w:
„Kanoniczna” reprezentacja obiektu w SQL*Plus: -- NAME_TYP('Marilyn','Monroe','MM')
![Page 26: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/26.jpg)
26SZB, L.Banachowski
BEGIN INSERT INTO name_table VALUES(name_typ('Marilyn','Monroe','MM'));END;
BEGIN INSERT INTO name_table VALUES('Marilyn','Monroe','MM');END;
INSERT do tabeli obiektowej
Z uZ użżyciem konstruktora typu obiektowegoyciem konstruktora typu obiektowego:
BezpoBezpośśrednirednioo::
![Page 27: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/27.jpg)
27SZB, L.Banachowski
BEGIN UPDATE name_table p SET p = name_typ('Janusz','Kowalski','JK') WHERE p.l_name = 'Jan';END;
BEGIN UPDATE name_table p SET p.l_name = 'Janusz' WHERE p.l_name = 'Jan';END;
UPDATE na tabeli obiektowej
Z uZ użżyciem konstruktora typu obiektowegoyciem konstruktora typu obiektowego:
![Page 28: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/28.jpg)
28SZB, L.Banachowski
BEGIN DELETE FROM name_table p WHERE p.l_name = 'Janusz';END;
DELETE na tabeli obiektowej
![Page 29: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/29.jpg)
29SZB, L.Banachowski
Funkcja VALUE i pseudokolumna OBJECT_VALUE
SELECT VALUE(p) SELECT OBJECT_VALUEFROM person_obj_table p; FROM person_obj_table;Można ograniczyć do obiektów z podtypu: SELECT VALUE(p) FROM person_obj_table p WHERE VALUE(p) IS OF (part_time_student_typ); -- lubSELECT VALUE(p) FROM person_obj_table p WHERE VALUE(p) IS OF (ONLY part_time_student_typ); Można użyć do UPDATE:UPDATE person_obj_table p SET VALUE(p) = person_typ(12, 'Bob Jones', '1-800-555-1243') WHERE p.idno = 12;
![Page 30: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/30.jpg)
30SZB, L.Banachowski
Tabela relacyjna
CREATE TABLE Emp1( Empno NUMBER PRIMARY KEY, Name Name_typ, -- kolumna typu obiektowego Sal NUMBER, Kier REFERENCES Emp1);
![Page 31: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/31.jpg)
31SZB, L.Banachowski
OID, REF
Każdy obiekt wierszowy jest jednoznacznie identyfikowany przez swój systemowy, obiektowy identyfikator OID, 16 bajtowy – stanowiący dodatkową, indeksowaną, jednoznaczną kolumnę w tabeli obiektowej (opcja OBJECT IDENTIFIER IS SYSTEM GENERATED w CREATE TABLE) – opcja domyślna.
Gdy istnieje klucz główny, można jego wartości użyć jako OID (opcja OBJECT IDENTIFIER IS PRIMARY KEY w CREATE TABLE).
Referencja REF – logiczny wskaźnik do obiektu wierszowego konstruowany z OID obiektu i metadanych.
![Page 32: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/32.jpg)
32SZB, L.Banachowski
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;
![Page 33: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/33.jpg)
33SZB, L.Banachowski
Użycie referencji
SELECT o.name, o.Dept_Ref.name FROM
obj_emp o
NAME DEPT_REF.NAME -------------------- ------------------------- KOWALSKI KADRY
![Page 34: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/34.jpg)
34SZB, L.Banachowski
Użycie referencji
DECLARE x REF Dept_Type;BEGIN SELECT REF(o) INTO x FROM obj_dept o WHERE o.name='KADRY'; INSERT INTO obj_emp VALUES('KOWALSKI',2000,x);END;
Operatory:
REF(o) – referencja do obiektu o
DEREF(x) – obiekt o referencji x.
![Page 35: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/35.jpg)
35SZB, L.Banachowski
Tworzenie tabeli obiektowej z obiektami różnych podtypów
CREATE TABLE person_obj_table OF person_typ;
INSERT INTO person_obj_table VALUES (person_typ(12, 'Bob Jones', '111-555-121'));
INSERT INTO person_obj_table VALUES (student_typ(5, 'Joe Lan', ‘6555-131', 12, 'HISTORY'));
INSERT INTO person_obj_table VALUES (employee_typ(55, 'Jane Smith', ‘6555-776', 100, 'Jennifer Nelson'));
INSERT INTO person_obj_table VALUES (part_time_student_typ(52, 'Kim Patel', '1555-1232', 14, 'PHYSICS', 20));
![Page 36: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/36.jpg)
36SZB, L.Banachowski
Ograniczanie wartości w kolumnie tabeli obiektowej
CREATE TYPE office_typ AS OBJECT (office_id VARCHAR(10), location location_typ, occupant person_typ ) NOT FINAL;
CREATE TABLE office_tab OF office_typ COLUMN occupant IS OF (ONLY employee_typ);
![Page 37: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/37.jpg)
37SZB, L.Banachowski
Kolekcje
Atrybut typu obiektowego lub kolumna tabeli
może być typu kolekcji:
1. VARRAY – typ tablicy jednowymiarowej
(jak wektor) o ustalonym maksymalnym
rozmiarze;
2. TABLE – typ tabeli zagnieżdżonej o nie
ustalonym maksymalnym rozmiarze.
![Page 38: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/38.jpg)
38SZB, L.Banachowski
Przykład
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);
![Page 39: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/39.jpg)
39SZB, L.Banachowski
Przykład c.d.
INSERT INTO Wydziały VALUES(1,'Informatyka',100000, Lista(Projekt(1,'Analiza',123), Projekt(2,'Projekt',456)));
SELECT w.Projekty FROM Wydziały wWHERE w.Nazwa = ‘Informatyka’;
Projekty-------------------------------------------------------------------------------LISTA(PROJEKT(1,'Analiza',123),PROJEKT(2,'Projekt',456))
![Page 40: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/40.jpg)
40SZB, L.Banachowski
Kolekcje w PL/SQL
CREATE OR REPLACE PROCEDURE Wypisz AS lis Lista;BEGIN FOR z IN (SELECT * FROM Wydzialy) LOOP DBMS_OUTPUT.Put_line('Proj. Wydziału: '||z.Nazwa); lis:=z.Projekty; FOR i IN 1..lis.Count LOOP DBMS_OUTPUT.Put_line(lis(i).Num_proj||' '||lis(i).Tytul); END LOOP; END LOOP;END;
![Page 41: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/41.jpg)
41SZB, L.Banachowski
Cykliczność powiązań
CREATE TYPE Dept_Type; -- niepełna specyfikacja typu Dept_Type
CREATE TYPE Emp_TypeAS OBJECT( Name VARCHAR2(20), Sal NUMBER, Dept_ref REF Dept_Type);
CREATE TYPE Pracownicy AS VARRAY(100) OF REF Emp_Type;
![Page 42: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/42.jpg)
42SZB, L.Banachowski
CREATE TYPE Dept_Type -- powtórna, pełna specyfikacja typu Dept_TypeAS OBJECT( Name VARCHAR2(10), Loc VARCHAR2(50), Kadra Pracownicy);
CREATE TABLE Obj_Dept OF Dept_Type;
CREATE TABLE Obj_Emp OF Emp_Type(Dept_ref SCOPE IS Obj_Dept);
![Page 43: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/43.jpg)
43SZB, L.Banachowski
Składowanie obiektów
Każdy obiektowy typ danych określa drzewo, w którego liściach znajdują się:
• atrybuty prostych typów danych jak NUMBER, VARCHAR2 lub REF;
• atrybuty typów kolekcji;
• atrybuty typów obiektowych rozwijają się w poddrzewa odpowiadające ich typom, jak również w poddrzewa wszystkich podtypów ich typów.
Tabela obiektowa jest reprezentowana przez tabelę relacyjną, której kolumny odpowiadają atrybutom tego drzewa plus kolumny odpowiadające atrybutom drzew wszystkich podtypów danego typu.
![Page 44: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/44.jpg)
44SZB, L.Banachowski
Składowanie obiektów
• Oracle dodaje dodatkowe kolumny do tworzonej tabeli relacyjnej:
• dla generowanego przez system OID obiektu;
• dla każdego reprezentowanego typu – wartość logiczna czy NULL;
• dla każdego reprezentowanego typu posiadającego podtypy kolumnę określającą podtyp aktualnego obiektu (typeid).
• VARRAY jest zapisywane jako pojedyncza wartość INLINE lub BLOB.
• Dla kolumny typu tabeli zagnieżdżonej jest określona jedna tabela relacyjna z wierszami wszystkich tabel zagnieżdżonych zapisywanej w tej kolumnie.
![Page 45: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/45.jpg)
45SZB, L.Banachowski
Perspektywy obiektowe
Alternatywnie, można samemu zdefiniować relacyjną bazę danych i udostępniać ją jako obiektową za pomocą perspektyw obiektowych.
1. Zdefiniowanie typu obiektowego: atrybuty odpowiadają istniejącym kolumnom tabel relacyjnych.
2. Zapisanie zapytania określającego jak wydobywać dane z tabel relacyjnych – kolumny w takiej kolejności jak atrybuty typu obiektowego.
3. Określenie jednoznacznego identyfikatora umożliwiającego tworzenie wskaźników do obiektów w perspektywie (np. istniejący klucz główny).
4. W przypadku złożonej perspektywy można użyć wyzwalaczy INSTEAD OF do przeprowadzania modyfikacji danych w perspektywie obiektowej.
![Page 46: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/46.jpg)
46SZB, L.Banachowski
Przykład
1. CREATE TABLE emp_table (empnum NUMBER (5), ename VARCHAR2 (20), salary NUMBER (9,2), job VARCHAR2 (20));
2. CREATE TYPE employee_t AS OBJECT (empno NUMBER (5), ename VARCHAR2 (20), salary NUMBER (9,2), job VARCHAR2 (20));
3. CREATE VIEW emp_view OF employee_t WITH OBJECT IDENTIFIER (empno) AS SELECT e.empnum, e.ename, e.salary, e.job FROM emp_table e WHERE e.job = 'Developer';
![Page 47: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/47.jpg)
47SZB, L.Banachowski
REFERENCJE w perspektywie obiektowej
CREATE TYPE dept_t AS OBJECT ( deptno NUMBER, deptname VARCHAR2(20), address address_t);
CREATE VIEW dept_view OF dept_t WITH OBJECT IDENTIFIER (deptno) AS SELECT d.deptno, d.deptname, address_t(d.deptstreet,d.deptcity,d.deptstate,d.deptzip) AS deptaddr FROM dept d;
CREATE TYPE emp_t AS OBJECT ( empno NUMBER, ename VARCHAR2(20), salary NUMBER, deptref REF dept_t);
CREATE OR REPLACE VIEW emp_view OF emp_t WITH OBJECT IDENTIFIER(empno) AS SELECT e.empno, e.empname, e.salary, MAKE_REF(dept_view, e.deptno) FROM emp e;
![Page 48: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/48.jpg)
48SZB, L.Banachowski
Podtabela (nie w Oracle)
CREATE TABLE demo_table ( id INTEGER PRIMARY KEY, txtdata VARCHAR(20)) ; CREATE TABLE demo_sub_table ( new_col VARCHAR(10), UNDER demo_table ) ;
Wiersze wstawione do nad-tabeli demo_table, nie są widoczne przez select na pod-tabeli.
Wiersze wstawione do pod-tabeli są widoczne przez select na nad-tabeli.
W oparciu o: http://docs.openlinksw.com/virtuoso/CREATETABLE.html#under
![Page 49: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/49.jpg)
49SZB, L.Banachowski
Przepis(CLOB)
Foto(BLOB)
FilmFilm(BFILE)(BFILE)
Duże obiekty LOB
• Atrybut typu obiektowego
• Kolumna w tabeli
• Wartość zmiennej w PL/SQL
![Page 50: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/50.jpg)
50SZB, L.Banachowski
DECLARE lobloc BLOB;BEGIN SELECT col1 INTO lobloc FROM LOB_Table WHERE col2=123; END;
WartoWartośćść LOBLOBLLookkatorator LOB LOB
Anatomia obiektu LOB
![Page 51: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/51.jpg)
51SZB, L.Banachowski
Przepis(CLOB)
Foto(BLOB)
Wewnętrzne obiekty LOB
![Page 52: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/52.jpg)
52SZB, 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
![Page 53: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/53.jpg)
53SZB, L.Banachowski
FilmFilm (BFILE) (BFILE)
Zewnętrzne obiekty LOB - zapisywane w pliku systemu operacyjnego
![Page 54: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/54.jpg)
54SZB, L.Banachowski
FilmFilm (BFILE) (BFILE)
DIRECTORYDIRECTORY
lob_path = lob_path = '/oracle/lob/''/oracle/lob/'
Obiekt bazy danych - katalog DIRECTORY
![Page 55: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/55.jpg)
55SZB, L.Banachowski
Posługiwanie się obiektami LOB
• Pakiet DBMS_LOB
• Wsparcie SQL - tabele, funkcje EMPTY_CLOB(), ...
• Katalog DIRECTORY, funkcja BFILENAME
![Page 56: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/56.jpg)
56SZB, L.Banachowski
SQL> UPDATE employee SET resume = 2> (SELECT resume FROM employee 3> WHERE emp_name='Default') 4> WHERE emp_id = 4508;
Wstawianie obiektów LOB
SQL> INSERT INTO employee VALUES 2> (7897,'Jan Kowalski','Znakomity aktor', NULL);
SQL> INSERT INTO employee VALUES 2> (7898,'Marilyn Monroe', EMPTY_CLOB(), 3> BFILENAME('IMG','MARILYN.IMG'));
SQL> INSERT INTO employee VALUES 2> (7898,'Marilyn Monroe', EMPTY_CLOB(), 3> BFILENAME('IMG','MARILYN.IMG'));
![Page 57: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/57.jpg)
57SZB, L.Banachowski
DECLARE lobloc CLOB; -- lokator LOB text VARCHAR2(2000); amount NUMBER; offset INTEGER;BEGIN text := 'tekst do wpisania do CLOB'; 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 w PL/SQL
![Page 58: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/58.jpg)
58SZB, 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
Usunięcie wiersza z obiektem LOB:
Usunięcie obiektu LOB w wierszu:
![Page 59: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/59.jpg)
59SZB, L.Banachowski
COMPARE
FILEGETNAME
INSTR
GETLENGTH
READ
SUBSTR
FILEEXISTS
FILEISOPEN
APPEND
COPY
ERASE
TRIM
WRITE
FILECLOSE
FILECLOSEALL
FILEOPEN
Modyfikacje Tylko-odczyt
Pakiet DBMS_LOB
![Page 60: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/60.jpg)
60SZB, 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
![Page 61: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/61.jpg)
61SZB, L.Banachowski
Programowanie obiektowe w bazie danych - Java składowana w bazie
danych
Kod Javy może być zapisywany w bazie danych oraz może być realizowany na serwerze bazy danych tak jak kod języka SQL – w ramach tej samej sesji i tej samej transakcji.
Obiekty Javy tworzone przy wykonywaniu kodu nie są składowane w bazie danych (tylko kod).
Na serwerze bazy danych można wywołać tylko metody statyczne klas Javy.
![Page 62: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/62.jpg)
62SZB, L.Banachowski
import java.sql.*;import java.io.*;import oracle.jdbc.driver.*;public class GenericDrop {public static void dropIt (String object_type, String object_name) throws SQLException { // Połącz się z bazą danych Oracle używając sterownika JDBC Connection conn = new OracleDriver().defaultConnection(); // Zbuduj instrukcję SQL String sql = "DROP " + object_type + " " + object_name; try { Statement stmt = conn.createStatement(); stmt.executeUpdate(sql); stmt.close(); } catch (SQLException e) {System.err.println(e.getMessage());} }}
![Page 63: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/63.jpg)
63SZB, L.Banachowski
Pierwsza metoda
loadjava -user scott/tiger GenericDrop
W SQL*Plus:
CREATE OR REPLACE PROCEDURE DropIt(obj_type VARCHAR2, obj_name VARCHAR2)AS LANGUAGE JAVANAME 'GenericDrop.dropIt(java.lang.String, java.lang.String)';
CALL DropIt('TABLE', 'Emp');
![Page 64: Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle](https://reader035.vdocuments.site/reader035/viewer/2022062407/56812b28550346895d8f3283/html5/thumbnails/64.jpg)
64SZB, L.Banachowski
Druga metoda
CREATE AND COMPILE JAVA SOURCE NAMED "Hello" ASpublic class hello { public static String world() { return "Hello World"; } };
CREATE OR REPLACE FUNCTION HelloWorld RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'hello.world() return java.lang.string';
myString VARCHAR2;CALL HelloWorld() INTO :myString;PRINT myString;