Documente Academic
Documente Profesional
Documente Cultură
Curs
2 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Cuprins
Cuprins............................................................................................................... 2
Schi general .................................................................................................. 3
1. Introducere.................................................................................................... 4
1.1. Obiecte i tipuri obiect Oracle ................................................................................... 4
1.2. Avantajele utilizrii obiectelor................................................................................... 5
1.3. Modelul relaional orientat pe obiecte ....................................................................... 7
2. Ce aduce nou Oracle9i? ............................................................................. 11
3. Componente de baz n Oracle Objects ..................................................... 14
3.1. Noiuni relaionale orientate pe obiecte ................................................................... 14
3.2. Definirea tipurilor obiect i colecie......................................................................... 16
3.3. Tipul de date referin .............................................................................................. 22
3.4. Definirea tabelelor obiect......................................................................................... 28
3.5. Metode ..................................................................................................................... 39
3.6. Tipuri colecie .......................................................................................................... 47
3.7. Motenirea tipurilor.................................................................................................. 57
4. Gestiunea obiectelor n Oracle................................................................... 72
4.1. Modificarea dinamic a tipurilor.............................................................................. 72
4.2. Eliminarea tipurilor obiect ....................................................................................... 80
4.3. Dependene i tipuri incomplete............................................................................... 81
4.4. Privilegii asupra tipurilor obiect i a metodelor lor ................................................. 84
4.5. Utilitare .................................................................................................................... 87
4.6. Tipuri generice i tranzitorii..................................................................................... 87
4.7. Stocarea obiectelor ................................................................................................... 91
4.8. Indeci ...................................................................................................................... 93
4.9. Partiionarea tabelelor care conin obiecte ............................................................... 96
4.10. Funcii i predicate utile ......................................................................................... 97
5. Vizualizri obiect ...................................................................................... 102
5.1. Definirea vizualizrilor obiect................................................................................ 103
5.2. Utilizarea vizualizrilor obiect n aplicaii............................................................. 106
5.3. Ierarhii de vizualizri obiect................................................................................... 116
5.4. Modificarea vizualizrilor obiect ........................................................................... 122
6. Large Objects............................................................................................ 124
Bibliografie ....................................................................................................137
Orientare pe obiecte n Oracle9i 3
Schi general
1. Prezentarea general a unui sistem de gestiune a bazelor de date relaionale orentate pe
obiecte. ([6])
2. Principalele caracteristici ale tehnologiei obiectuale (tipuri, obiecte, referine, date
complexe, ncapsulare, motenire, polimorfism).([7])
3. Tehnici de proiectare ale bazelor de date relaionale orientate obiect. Direcii de abordare.
Comparaie cu modelul relaional.([8])
4. Tipuri abstracte de date. Referine. Colecii. ([1])
5. Tehnici de abordare obiectual a aplicaiilor pstrnd modelul de date relaional.
Vizualizri obiect. ([1])
6. Gesiunea i manipularea obiectelor. ([1])
7. Gestiunea datelor nestructurate. Large Objects.([1])
4 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
1. Introducere
Tipurile de date folosite n modelarea bazelor de date care sunt definite de standardul SQL92
(SQL2) se numesc tipuri simplu structurate. Tehnologia obiectual a fost implementat n SQL3 prin
introducerea tipurilor complex structurate (tipuri obiect, referin i colecie) i a tipurilor
nestructurate LOB (Large OBjects).
Noile tipuri pot fi create folosind orice tip structurat sau nestructurat, predefinit sau definit de
utilizator. Tipurile definite de utilizator pot fi utilizate n aceeai manier ca i cele predefinite (de
exemplu, pentru definirea coloanelor n cadrul tabelelor relaionale). Definiia unui astfel de tip
trebuie s ncapsuleze atribute i operaii ntr-o singur entitate. n SQL3, un tip de date trebuie definit
prin specificarea:
atributelor care reprezint valoarea tipului;
relaiilor de egalitate i ordine dintre obiectele de acel tip;
operaiilor care i definesc comportamentul.
Tipurile abstracte de date pot fi extinse prin intermediul subtipurilor, care motenesc structura
i comportamentul de la supertip. Instanele tipurilor pot fi stocate persistent n baza de date doar prin
intermediul coloanelor din tabele.
Metadatele (informaiile din dicionarul datelor) pentru tipurile definite de utilizator sunt
stocate ntr-o schem care este disponibil interfeelor de programare existente (SQL, PL/SQL, Java
etc.).
Tipurile obiect Oracle sunt tipuri de date definite de utilizator care fac posibil modelarea
unor entiti complexe din lumea real, astfel nct s fie considerate entiti unitare (obiecte) n baza
de date.
Tipurile i caracteristicile obiect asigur metode eficiente de organizare i accesare a
informaiilor din baza de date. n spatele nivelului obiectual, n reprezentarea intern, informaiile sunt
stocate n coloane i tabele. Avantajul este c utilizatorul poate lucra cu acestea n termeni de entiti
ale lumii reale, fapt ce d mai mult semnificaie datelor. Poate fi abordat att varianta relaional de
interogare a tabelelor, care caracterizeaz o entitate prin valorile atributelor ei, ct i varianta
obiectual, care consider entitatea ca fiind un obiect unitar.
ntr-un sistem relaional orientat pe obiecte sunt posibile trei modaliti de abordare a
modelrii bazei de date:
utilizarea n paralel a caracteristicilor obiectuale i a celor relaionale, prin crearea de
vizualizri obiect asupra datelor relaionale existente, pentru a le reprezenta i accesa n
concordan cu un model obiectual;
abordarea relaional, prin tehnici clasice de proiectare care utilizeaz exclusiv tipurile
simplu structurate pentru stocarea datelor;
abordarea orientat pe obiecte, prin stocarea datelor n cadrul tabelelor obiect unde fiecare
linie reprezint un obiect.
aplicaii s acceseze n mod direct structurile de date utilizate. Nu este necesar un nivel intermediar de
asociere ntre obiectele client/server i coloanele sau tabelele bazei de date relaionale. Abstractizarea
obiectelor i ncapsularea comportamentului acestora fac aplicaiile uor de neles i de ntreinut,
acestea rspunznd n mod eficient la modificri sau extinderi ulterioare.
Eficiena
ntr-un tip obiect, metodele sunt stocate mpreun cu datele, fiind disponibile oricrei aplicaii
care trebuie s le utilizeze. Dezvoltatorii pot beneficia de funcionalitatea tipurilor, deja implementat
la nivelul bazei de date. n acest fel nu este necesar crearea de structuri similare n fiecare modul al
aplicaiei.
Mai multe obiecte nrudite pot fi ncrcate i prelucrate ca un ntreg. O singur cerere ctre
server pentru ncrcarea unui obiect poate returna i alte obiecte care sunt legate de acesta prin
referine obiect. De exemplu, se selecteaz un obiect galerie i se invoc metoda de obinere a
numelui acesteia, a cldirii din care face parte i a mai multor componente ale obiectului adresa
corespunztor. Toate aceste informaii sunt obinute printr-o singur transmisie de la server-ul de baze
de date ctre maina client.
Motenirea tipurilor
Sistemul Oracle suport motenirea simpl. Dintr-un tip se pot deriva unul sau mai multe
subtipuri. Motenirea simpl a tipurilor presupune crearea ierarhiilor de tipuri, prin definirea de
niveluri succesive de subtipuri specializate care deriv dintr-un tip printe comun. Numrul de
niveluri dintr-o ierarhie este nelimitat.
Subtipurile derivate motenesc proprietile tipului obiect printe pe care l extind. De
exemplu, din tipul obiect general organizator se pot deriva tipuri specializate de organizatori,
organizator_particular i organizator_de_stat, fiecare cu atribute i metode specifice. Tipurile
specializate pot adauga noi atribute sau redefini metode motenite de la tipul printe. Ierarhia de
tipuri rezultat furnizeaz un nivel ridicat de abstractizare pentru gestiunea complexitii unui model
de date.
n sistemul Oracle, motenirea la nivel de client se realizeaz prin integrarea de cod C++ i
Java n baza de date. Pentru C++ se folosete Object Modelling Option din Oracle Designer n
vederea producerii de comenzi LDD i de cod C++ bazat pe diagramele de clase specificate n UML
(Universal Modelling Language). Pentru Java se folosete caracteristica custom datum din driver-ul
Oracle JDBC. Metoda de motenire la nivel de server este asigurat n Java de ctre Oracle 9iJVM.
Vizualizri obiect
O vizualizare obiect este o modalitate de a accesa datele relaionale utiliznd metode
caracteristice modelului obiectual. Vizualizrile obiect sunt tabele obiect virtuale. Aceste obiecte ale
schemei dau posibilitatea de a dezvolta aplicaii orientate pe obiecte fr a schimba schema relaional
iniial.
Pe lng stocarea nativ a datelor obiectuale pe server, sistemul Oracle permite crearea unei
abstractizri obiectuale a datelor relaionale existente, prin mecanismul vizualizrilor obiect. Liniile
obiect care aparin unei vizualizri obiect pot fi accesate n aceeai manier ca i liniile dintr-un tabel
obiect. Pot fi create vizualizri obiect corespunztoare tipurilor definite de utilizator, care se refer la
datele stocate n schema relaional.
Vizualizrile obiect permit valorificarea polimorfismului implementat n cadrul ierarhiilor de
tipuri. O expresie polimorfic poate lua o valoare de tipul declarat al expresiei sau de orice subtip al
tipului respectiv. Se poate construi o ierarhie de vizualizri obiect care oglindete o parte sau ntreaga
structur a unei ierarhii de tipuri. n acest context, se pot executa cereri asupra unei vizualizri din
ierarhie pentru a accesa date, la nivelul de specializare dorit. De asemenea, dac se interogheaz o
vizualizare obiect care are subvizualizri, se obin date polimorfice (linii obiect din vizualizarea
interogat i din subvizualizrile sale).
Proceduri externe
Funciile, procedurile sau metodele unui tip obiect pot fi implementate n limbajul procedural
PL/SQL, dar i n Java sau C ca subprograme externe. Procedurile externe sunt potrivite pentru sarcini
care pot fi executate mai rapid sau implementate mai uor n alt limbaj de programare. De exemplu,
limbajul C este eficient la calcule n dubl precizie, astfel nct anumite operaii care necesit vitez
de calcul, precum transformarea Fourier sau conversia formatului unei imagini, sunt mai eficiente n
programe C. Procedurile externe sunt executate n condiii de maxim securitate n afara adreselor
server-ului Oracle.
Tipul generic este predefinit i permite unei proceduri s lucreze cu date de orice tip,
predefinit sau definit de utilizator. Se pot scrie proceduri externe generice care s declare unul sau mai
muli parametri de tip generic.
Sinonime de tipuri
ncepnd cu versiunea Oracle9i, se pot defini sinonime pentru tipurile definite de utilizator.
Acestea ofer aceleai avantaje ca i sinonimele asociate celorlalte obiecte ale unei scheme, i anume
simplitatea i flexibilitatea referirii unui tip obiect. Astfel, aplicaiile care utilizeaz sinonime de tipuri
pot funciona cu modificri minime n diferite scheme de obiecte.
Large Objects
Sistemul Oracle9i aduce mbuntiri semnificative tipurilor de date LOB i modalitilor de
utilizare a acestora.
Pentru a asista utilizatorii n procesul de migrare de la datele stocate n format LONG la cele
n format LOB, au fost introduse o serie de faciliti. Au fost extinse comenzile ALTER TABLE i
ALTER INDEX, tranziia avnd implicaii minime asupra datelor stocate n tabele. Aplicaiile care
utilizeaz coloane migrate necesit modificri minore. Majoritatea subprogramelor predefinite ce
acioneaz asupra obiectelor de tip LONG au fost extinse s accepte tipul LOB.
Orientare pe obiecte n Oracle9i 13
n Oracle9i, obiectele LOB persistente se pot accesa folosind funciile i operatorii standard
corespunztori tipului VARCHAR2 (SUBSTR, INSTR etc.). Aceti operatori sunt recomandai mai ales
atunci cnd valorile LOB sunt de dimensiune redus (ntre 10 i 100 KB).
Interfeele OCCI, JDBC i OLE DB au fost mbuntite astfel nct s suporte accesul i
prelucrarea datelor de tip LOB.
n ceea ce privete pachetul predefinit DBMS_LOB, au fost introduse proceduri care permit
ncrcarea difereniat a obiectelor de tip BLOB, respectiv CLOB din fiiere ale sistemului de operare,
care sunt accesate folosind tipul BFILE. De asemenea, sistemul Oracle9i elimin multe restricii
asupra tipurilor LOB, existente n versiunile precedente
14 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Tipuri obiect
Un tip obiect este o abstractizare a unei entiti din lumea real. El reprezint un tip de date
complex structurat, stocat ntr-o schem a bazei de date. Tipurile obiect au urmtoarele componente:
un nume, care identific n mod unic tipul respectiv n cadrul schemei;
atribute, care modeleaz structura i starea entitii reprezentate;
metode, care implementeaz comportamentul entitii respective.
Atributele conin informaii referitoare la caracteristicile obiectelor de tipul respectiv (de
exemplu, un tip obiect opera poate avea atributele nume, tip, autor, data_achizitiei etc.). Tipul de date
declarat al unui atribut poate fi tot un tip obiect. Atributele instanei unui obiect constituie datele
obiectului respectiv.
Metodele sunt proceduri sau funcii care implementeaz comportamentul obiectelor,
permind aplicaiilor s execute operaiile necesare asupra atributelor unui obiect. Spre deosebire de
atribute, metodele nu sunt obligatorii.
Tipurile obiect se pot utiliza n acelai fel n care sunt utilizate i tipurile de date simplu
structurate (NUMBER, VARCHAR2, DATE etc.). De exemplu, aceste tipuri pot fi folosite pentru
definirea coloanelor ntr-un tabel relaional sau pentru declararea de variabile. O valoare de tip obiect
se numete instan a acelui tip sau, simplu, obiect.
Exist cteva diferene ntre tipurile obiect i celelalte tipuri de date specifice unei baze
relaionale:
nu exist tipuri obiect predefinite incluse la instalarea bazei, ele putnd fi definite de ctre
utilizatori;
tipurile obiect au o structur complex, neuniform (atribute, metode);
tipurile obiect sunt mai puin generice dect tipurile native, acesta fiind unul dintre marile
avantaje.
Tipurile obiect pot fi imaginate ca un plan de structur, iar obiectul ca fiind produsul concret
construit conform planului. Aceste tipuri sunt obiecte persistente ale schemei bazei de date, subiect al
acelorai categorii de controale administrative ca i celelalte obiecte ale schemei.
Orientare pe obiecte n Oracle9i 15
Prin crearea tipurilor obiect se poate modela structura unor entiti din lumea real, cu care
programele de aplicaii s lucreze n mod direct. Aceast abordare permite gestiunea simplificat i
intuitiv a datelor.
O schem relaional, cu tabele i coloane de tipuri native, proiecteaz modelul ntr-un cadru
bidimensional.
Tipurile obiect permit captarea relaiilor structurale interne dintre obiecte i atribute. Cu
ajutorul tipurilor obiect se pot stoca pri nrudite de date, mpreun cu operaiile specifice acestora. n
cadrul aplicaiilor, obiectele pot fi captate i prelucrate ca nite uniti atomice.
Motenirea tipurilor
Un tip obiect poate fi specializat prin crearea de subtipuri. Un subtip adaug unele
caracteristici care l difereniaz de tipul iniial i anume, atribute sau metode adiionale. Operaia de
creare a subtipurilor se numete derivare, iar tipul obiect printe poart numele de supertip sau
generalizare a subtipului derivat.
Subtipurile, fiind versiuni specializate ale printelui lor, conin att atributele i metodele
printelui, ct i pe cele definite local. Subtipurile i supertipurile sunt conectate prin relaia de
motenire i definesc n acest fel o ierarhie de tipuri.
Obiecte
La iniializarea unei variabile de tip obiect se creeaz o instan a acelui tip sau, altfel spus, se
instaniaz un obiect. Un obiect conine atributele i metodele definite de tipul su. Spre deosebire de
tipul obiect care reprezint schia unui model de date, instana este o structur concret care conine
informaii. Obiectele sunt stocate n baza de date. Prin urmare, atributele unei instane au valori, iar
metodele ei pot fi apelate n concordan cu acestea.
Obiectele sunt gestionate nativ de ctre server-ul de baze de date. Tipurile obiect pot fi
folosite ca tipuri de coloane (pentru stocarea coloanelor obiect) sau ca tipuri de tabele obiect (pentru
stocarea liniilor obiect). Atunci cnd sunt folosite pentru coloane obiect, tipurile obiect se comport ca
nite domenii relaionale clasice n cadrul unor tabele relaionale. n plus, fiecare linie obiect are
asociat un identificator unic, numit identificator obiect (Object IDentifier), care poate fi folosit pentru
referirea oricrui obiect stocat ntr-un tabel obiect.
Obiectele sunt componente ale schemei i sunt integrate complet mpreun cu celelalte
obiecte din cadrul acesteia. Ele pot fi indexate i partiionate. De asemenea, cererile care implic
obiecte pot fi paralelizate i sunt optimizate de ctre optimizorul pe baz de costuri, care utilizeaz
statisticile meninute de sistem.
Fundamentate n cadrul server-ului de baze de date Oracle, obiectele sunt gestionate la
acelai nivel ridicat de fiabilitate, disponibilitate i scalabilitate ca i datele relaionale.
Metode
Metodele sunt funcii sau proceduri declarate n definiia unui tip obiect pentru a implementa
un anumit comportament.
Una dintre principalele utilizri a metodelor este aceea de a asigura accesul la date. n acest
fel este furnizat un control sporit asupra accesului la informaii i un grad ridicat de securitate.
Atunci cnd sunt definite metode pentru operaiile previzibile asupra obiectelor, aplicaiile nu
mai trebuie s implementeze n mod redundant acelai comportament n mai multe module, ci doar s
apeleze metoda corespunztoare unui anumit obiect. n acest fel, pe lng posibilitatea reutilizrii
16 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Colecii
Pentru modelarea relaiilor one-to-many, sistemul Oracle asigur dou tipuri colecie, vector
i tablou imbricat. Tipurile colecie pot fi utilizate la fel ca i celelalte tipuri de date pentru a defini
tipul atributelor, coloanelor etc. De exemplu, se poate asocia unui obiect de tip t_opera_de_arta un
atribut de tip tablou imbricat care s conin colecia de polie de asigurare corespunztoare sau un
atribut de tip vector de dimensiune trei care s conin dimensiunile obiectului respectiv.
Tabele obiect
Un tabel obiect este un tabel special n care fiecare linie reprezint un obiect. Obiectele
stocate trebuie s existe n cadrul schemei curente sau ntr-una asupra creia utilizatorul are
privilegiile necesare. Tabelul obiect are o singur coloan de tip obiect.
Tabelele obiect pot fi privite din dou puncte de vedere diferite:
obiectual, ca un tabel cu o singur coloan n care fiecare linie este o instan a tipului
obiect asociat;
relaional, ca un tabel multicoloan n care fiecare atribut al tipului asociat reprezint o
coloan.
Obiectele care ocup linii complete n tabelele obiect se numesc linii obiect. Obiectele care
ocup coloane n cadrul tabelelor relaionale sau sunt atribute de tip obiect se numesc coloane obiect.
metode, atunci nu mai este necesar o comand CREATE TYPE BODY. Acelai lucru este valabil i la
crearea unui tip obiect SQLJ, implementarea tipului fiind specificat de ctre o clas Java sau de o
structur C.
n mod implicit, sistemul Oracle definete o metod constructor pentru fiecare tip definit de
utilizator. Un constructor este o funcie furnizat de sistem care este folosit n comenzi SQL sau
blocuri PL/SQL pentru a construi o instan a unui tip obiect. Numele constructorului este acelai cu
numele tipului asociat. Sistemul permite utilizatorului s defineasc propriul constructor.
Parametrii metodei constructor a tipului obiect corespund atributelor tipului respectiv i
respect ordinea acestora din definiia tipului. n cazul unui tip colecie, parametrii constructorului
reprezint elementele coleciei respective.
Un tip incomplet este un tip creat nainte de a i se specifica definiia, pentru a putea fi referit
n alte structuri. Se numete incomplet pentru c are un nume, dar nu are atribute sau metode. Acest
tip poate fi referit de alte tipuri i este folosit la definirea tipurilor care se refer unul pe cellalt (cross
reference). De remarcat c este obligatorie specificarea n ntregime a definiiei unui tip, nainte de a-l
utiliza la crearea unui tabel sau a unei coloane obiect.
Pentru crearea unui tip obiect se utilizeaz urmtoarea sintax1:
CREATE [OR REPLACE] TYPE [schema.]nume_tip
[AUTHID {CURRENT_USER | DEFINER}
{ {IS | AS} OBJECT | UNDER [schema.]nume_supertip}
( {atribut1 tip_de_date1 | spec_metoda1}
[, {atribut2 tip_de_date2 | spec_metoda2] )
[ [NOT] FINAL]
[ [NOT] INSTANTIABLE];
La recrearea unui tip, cu ajutorul clauzei OR REPLACE, sistemul dezactiveaz indecii bazai
pe funcii ce depind de tipul respectiv.
Dac se omite numele schemei, sistemul creeaz tipul n schema curent. Eventualele erori
aprute la crearea tipului pot fi consultate cu ajutorul comenzii SHOW ERRORS din SQL*Plus.
Clauzele referitoare la drepturile de invocare (AUTHID) specific dac metodele tipului
obiect se execut cu privilegiile i n schema utilizatorului curent (CURRENT_USER) sau cu
privilegiile i n schema proprietarului (DEFINER). Corespunztor celor dou opiuni disponibile
tipul este creat cu drepturi de apelant, respectiv cu drepturile proprietararului. Aceast specificaie se
aplic i pentru corpul tipului. De asemenea, clauza determin modalitatea n care sistemul Oracle
identific numele externe din cererile, operaiile LMD i comenzile SQL dinamice aflate n metodele
membre ale tipului.
Restriciile referitoare la clauza de invocare sunt urmtoarele:
se poate specifica doar pentru tipuri obiect, nu i pentru tipurile colecie (tablouri
imbricate sau vectori);
se poate specifica n definiia subtipurilor, dar numai pentru claritate cu aceeai valoare
din supertip, deoarece subtipurile motenesc modelul de acordare de drepturi al
supertipului lor (schimbarea acestei opiuni n cadrul subtipului duce la eroarea PLS-
00722: supertypes's AUTHID is different than subtype's AUTHID);
dac supertipul a fost creat cu drepturi DEFINER, subtipurile trebuie create n aceeai
1
Pentru a ctiga claritate i simplitate au fost eliminate elementele de sintax proprii caracteristicilor SQLJ ce permit
asocierea claselor Java i structurilor C cu tipuri obiect persistente Oracle.
18 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
schem ca i supertipul.
Clauza AS OBJECT permite crearea unui tip obiect rdcin, iar UNDER se utilizeaz pentru
a defini un subtip al unui tip specificat. n acest ultim caz, supertipul existent trebuie s fie un tip
obiect care s permit crearea de subtipuri (NOT FINAL), altfel este returnat eroarea PLS-00590:
attempting to create a subtype UNDER a FINAL type. Un subtip motenete caracteristicile
supertipului su i, pentru a se distinge de acesta, trebuie s suprascrie sau s adauge proprieti.
Atributele care formeaz structura obiectului sunt cmpuri de date caracterizate prin nume i
tip. Pentru orice tip obiect trebuie specificat cel puin un atribut. Dac se creeaz un subtip, numele
noilor atribute nu pot fi identice cu numele atributelor sau metodelor din supertip.
Tipurile de date ale atributelor pot fi predefinite sau definite de utilizator. Restriciile relative
la atribute sunt:
nu sunt permise atribute de tip ROWID, LONG, LONG RAW sau UROWID;
pentru un atribut de tip referin, obiectul int trebuie s aib un identificator obiect;
la crearea unui tip colecie nu se pot specifica elemente de tip generic2.
Clauza NOT FINAL permite extinderea tipului respectiv (valoarea implicit este FINAL).
Clauza NOT INSTANTIABLE specific dac pot fi construite instane ale obiectului respectiv
(valoarea implicit este INSTANTIABLE). Se specific NOT INSTANTIABLE dac nu exist
constructor (definit de utilizator sau implicit) pentru tipul respectiv. Trebuie specificate aceste cuvinte
cheie pentru tipurile care au toate metodele neinstaniabile (motenite sau specificate n definiie) sau
care nu definesc nici un atribut nou.
Sintaxa detaliat pentru specificaia unei metode (spec_metoda) este:
[ [ [NOT] OVERRIDING] [ [NOT] FINAL] [ [NOT] INSTANTIABLE]
{ {MEMBER | STATIC}
{PROCEDURE nume_proc
[ (parametru tip_de_date [, parametru tip_de_date] ) ]
[ {IS | AS} specificaie_apelare]
| FUNCTION nume_functie
[ (parametru tip_de_date [, parametru tip_de_date] ) ]
RETURN tip_de_date [ {IS | AS} specificaie_apelare] }
| [FINAL] [INSTANTIABLE]
CONSTRUCTOR FUNCTION tip_obiect
[ ( [SELF IN OUT tip_obiect,]
parametru tip_de_date [, parametru tip_de_date] ) ]
RETURN SELF AS RESULT [ {IS | AS} specificaie_apelare] }
| {MAP | ORDER} MEMBER FUNCTION nume_funcie
[ (parametru tip_de_date [, parametru tip_de_date] ) ]
RETURN tip_de_date [ {IS | AS} specificaie_apelare] }
[, {clauze_subprogram | specif_map_order}]
[, PRAGMA RESTRICT_REFERENCES
( {nume_metoda | DEFAULT}, lista_constrngeri) ]
Clauzele de motenire specificate la nivel de tip (FINAL, INSTANTIABLE) permit stabilirea
relaiei dintre supertipuri i subtipuri. La definirea metodelor exist opiuni de motenire similare,
intervenind n plus clauza OVERRIDING.
2
Tipurile generice vor fi prezentate ntr-o seciune special a acestui capitol.
Orientare pe obiecte n Oracle9i 19
3
n Oracle nu este recomandat folosirea clauzei PRAGMA, n afara cazurilor n care este absolut necesar pentru
compatibilitate cu aplicaiile mai vechi. Ea va fi depreciat, pentru c ncepnd cu Oracle9i, acest tip de verificri se fac
automat la momentul execuiei.
20 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
avnd acelai tip de date. Trebuie specificate un nume i o limit pozitiv a numrului de elemente.
Limita trebuie s fie un literal ntreg. Sistemul Oracle nu suport vectori anonimi, adic fr nume.
Numele tipului de date al obiectelor coninute n vector poate fi un tip predefinit, referin sau un tip
definit de utilizator.
Crearea unui tip tablou imbricat se face cu ajutorul comenzii urmtoare:
CREATE [OR REPLACE] TYPE [schema.]nume_tip_tabimbricat
{AS | IS} TABLE OF tip_de_date;
Atunci cnd tipul elementelor este un tip obiect, tipul tablou imbricat descrie un tablou ale
crui coloane sunt n coresponden cu numele i atributele tipului obiect. Dac tipul elementelor este
scalar, atunci tipul tablou imbricat descrie un tablou cu o singur coloan de tip scalar, numit
COLUMN_VALUE.
Exemplu:
S se defineasc tipurile obiect t_artist, t_polita_asigurare, t_polite_ti, t_dim_v i
t_opera_de_arta. Tipul t_polite_ti este un un tip tablou imbricat. Dintre atributele tipului
t_opera_de_arta, se remarc artist care este de tip referin la un obiect de tip t_artist, polite de tip
tabel imbricat t_polite_ti i dimensiuni de tip t_dim_v, un vector de dimensiune trei. Fiecare linie din
tabloul imbricat t_polite_ti este un obiect de tip t_polita_asigurare.
CREATE TYPE t_artist AS OBJECT (
nume VARCHAR2(30),
prenume VARCHAR2(30),
anul_nasterii VARCHAR2(4),
anul_mortii VARCHAR2(4),
nationalitate VARCHAR2(40),
observatii VARCHAR2(2000));
/
CREATE TYPE t_polita_asigurare AS OBJECT (
cod_polita VARCHAR2(30),
descriere VARCHAR2(200),
firma VARCHAR2(50),
valoare NUMBER,
data_contract DATE);
/
CREATE TYPE t_polite_ti AS TABLE OF t_polita_asigurare;
/
CREATE TYPE t_dim_v AS VARRAY(3) OF NUMBER;
/
CREATE TYPE t_opera_de_arta AS OBJECT (
cod_opera NUMBER,
tip VARCHAR2(10),
titlu VARCHAR2(200),
artist REF t_artist,
data_crearii DATE,
data_achizitiei DATE,
valoare NUMBER,
polite t_polite_ti,
dimensiuni t_dim_v,
MEMBER FUNCTION get_titlu RETURN VARCHAR2);
Orientare pe obiecte n Oracle9i 21
/
Acest exemplu este prezentat ntr-o manier simplificat. El nu conine specificarea
implementrii metodei get_titlu, care trebuie creat prin comanda CREATE OR REPLACE TYPE
BODY. Definirea corpului unui tip va fi detaliat n seciunea dedicat metodelor.
De remarcat c definirea unui tip obiect nu implic alocarea unui spaiu de stocare (ulterior,
instanierea tipurilor implic alocare de spaiu). Odat definite tipurile obiect, ele pot fi utilizate n
comenzi SQL la fel ca tipurile de date native.
Noile tipuri obiect definite de utilizator pot fi utilizate pentru crearea de tabele relaionale sau
obiect. Comanda CREATE TABLE a fost completat cu noi opiuni n acest sens. Cu ajutorul acestei
comenzi se pot crea tabele obiect asociate tipurilor obiect existente. Sintaxa simplificat a unei
comenzi de creare a unui tabel obiect este urmtoarea:
CREATE TABLE [schema.]tabel OF [schema.]tip_obiect;
Exemplu:
S se creeze un tabel obiect tab_artisti destinat artitilor care expun lucrri n cadrul
muzeului. S se insereze nregistrri n acesta, abordnd tabelul att din punct de vedere obiectual, ct
i relaional. De asemenea, s se creeze un tabel relaional cumparari pentru a menine o istorie a
achiziiilor de opere de art.
CREATE TABLE tab_artisti OF t_artist;
INSERT INTO tab_artisti
VALUES (t_artist ('Francisco', 'Goya', 1746, 1828,
'spaniola', NULL));
INSERT INTO tab_artisti
VALUES ('Henri', 'Matisse', 1869, 1954, 'franceza', NULL);
CREATE TABLE cumparari (
opera t_opera_de_arta,
data_cumpararii DATE,
pret NUMBER,
vanzator VARCHAR2(100))
NESTED TABLE opera.polite STORE AS tstoc_polite;
Tabelul cumparari este un tabel relaional cu o coloan de tip obiect. Dac nu se specific
tabelul de stocare pentru tabloul imbricat din componena tipului t_opera_de_arta, opera.polite de tip
t_polite_ti, atunci apare eroarea ORA-22913: must specify table name for nested table column or
attribute.
O coloan a unui tabel, un obiect, un atribut al unui obiect, o colecie sau un element al unei
colecii are valoarea null dac a fost iniializat cu null sau dac nu a fost iniializat deloc.
Un obiect a crui valoare este null se numete obiect automat null. Un astfel de obiect este
diferit de unul ale crui atribute au valoarea null. Atunci cnd toate atributele unui obiect sunt null, ele
pot fi modificate i metodele sale pot fi apelate. n schimb, un obiect automat null nu permite aceste
operaii.
Exemplu:
Comenzile urmtoare ilustreaz comentariile referitoare la valorile null. Ele furnizeaz
rezultate diferite. Prima comand INSERT introduce o valoare diferit de null pentru coloana opera,
iar a doua introduce o valoare null.
INSERT INTO cumparari
22 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
este predefinit n Oracle. De obicei, tipul de date REF i coleciile de obiecte de acest tip modeleaz
relaiile dintre entiti (relaiile many-to-one sau one-to-many) nlocuind necesitatea definirii cheilor
externe relaionale.
Referinele asigur un mecanism simplu pentru regsirea obiectelor stocate n tabelele obiect,
utiliznd notaia cu punct. n acest caz, sistemul gestioneaz automat legtura ctre tabelul obiect
referit.
O referin obiect identific n mod unic un obiect stocat ntr-un tabel sau vizualizare obiect.
De obicei, o valoare de tip referin este caracterizat de:
identificatorul unic al obiectului referit (OID - Object IDentifier);
identificatorul unic asociat tabelului obiect referit;
identificatorul liniei (ROWID) din tabelul obiect n care este stocat obiectul
(identificatorul ROWID este de obicei folosit pentru accesul rapid la obiectele stocate).
Similar cheilor externe, referinele obiect sunt utile n modelarea relaiilor complexe dintre
entiti. Ele sunt mai flexibile dect cheile externe deoarece:
sunt puternic tipizate, asigurnd o verificare mai riguroas i mai rapid a tipului, la
momentul compilrii;
permit modelarea optim (spaiu de stocare i timp de acces) a relaiilor one-to-many, prin
intermediul coleciilor de referine obiect;
asigur referirea i obinerea eficient a obiectelor fr a construi comenzi SQL complexe;
permit evitarea join-urilor multitabel;
permit aplicaiilor s obin toate obiectele care sunt n relaie, prin intermediul unei
singure cereri ctre server.
Pentru ca referinele obiect s poat implementa chei externe, trebuie ca obiectele referite s
fac parte din vizualizri sau tabele obiect cu identificatori bazai pe cheia primar. Atunci cnd se
definesc vizualizri obiect pe baza tabelelor relaionale, identificatorii obiectelor construite sunt de
obicei bazai pe cheile primare ale tabelelor relaionale de la care s-a pornit. De asemenea, la definirea
unui tabelul obiect, sistemul Oracle permite utilizarea valorilor cheii primare ca identificatori obiect
ai liniilor obiect, n locul identificatorilor implicii, generai de sistem.
FROM tab_angajati a
WHERE UPPER(a.nume) = 'GEORGESCU';
S se selecteze numele directorului salariatului Alecu.
SELECT a.director.nume "Directorul lui Alecu este"
FROM tab_angajati a
WHERE INITCAP(a.nume) = 'Alecu';
Aflarea valorii referin ce adreseaz o linie obiect se face prin selectarea instanei din tabelul
obiect care conine obiectul de refereniat i aplicarea operatorului REF.
Exemplu:
S se obin o referin ctre specialistul cu numele Gabriel Liiceanu. De remarcat c cererea
trebuie s returneze exact o linie.
SET SERVEROUTPUT ON
DECLARE
v_SpecRef REF t_specialist;
BEGIN
SELECT REF(s) INTO v_SpecRef
FROM tab_specialisti s
WHERE LOWER(s.nume) = 'liiceanu'
AND LOWER(s.prenume) = 'gabriel';
DBMS_OUTPUT.PUT_LINE('Exista o singura intrare' ||
' cu acest nume.');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('Nu exista in baza de date');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE ('Exista mai multi cu acest nume');
END;
/
Funcia MAKE_REF creeaz o referin ctre o linie a unui tabel sau vizualizare obiect al
crei identificator obiect este bazat pe cheia primar. Pentru fiecare linie rezultat a unei cereri,
pseudocoloana ROWNUM returneaz un numr ce indic ordinea n care sistemul Oracle selecteaz
liniile dintr-un tabel sau dintr-o mulime de linii ale unui join. Numerotarea ncepe de la 1.
Exemplu:
S se adauge un nou atribut (cod) tipului t_angajat i s se completeze valoarea acestuia
utiliznd instanele deja existente n tabelul tab_angajati. S se adauge tabelului o constrngere de
cheie primar care s includ coloanele cod i nume. S se creeze o vizualizare obiect asupra
tabelului, cu identificatori obiect bazai pe concatenarea dintre cod i nume. S se arate modalitatea de
creare a unei referine ctre o anumit linie obiect din cadrul vizualizrii, linie unic determinat de
dou valori ale atributelor cod i nume.
--se adauga atributul cod tipului creat anterior t_angajat
ALTER TYPE t_angajat
ADD ATTRIBUTE (cod NUMBER)
CASCADE;
--se propaga schimbarea catre toate obiectele dependente
--(tab_angajati) si se populeaza atributul cod
UPDATE tab_angajati
SET cod = ROWNUM;
COMMIT;
ALTER TABLE tab_angajati
Orientare pe obiecte n Oracle9i 27
Pachetul UTL_REF
Pachetul predefinit UTL_REF conine proceduri pentru operaiile cu referine. Spre deosebire
de comenzile LMD, procedurile din pachetul UTL_REF prezint avantajul c nu necesit specificarea
tabelului obiect din care face parte obiectul referit. UTL_REF poate fi utilizat att n subprogramele i
pachetele PL/SQL stocate pe server, ct i n aplicaiile PL/SQL de pe client (de exemplu, Oracle
Forms).
Pachetul conine urmtoarele proceduri:
SELECT_OBJECT, care primete ca parametru de intrare o referin i returneaz
obiectul referit;
LOCK_OBJECT, care permite blocarea unui obiect, specificnd referina corespunztoare
acestuia (procedura este suprancrcat astfel nct, opional, obiectul s poat fi reinut
ntr-o variabil);
UPDATE_OBJECT, care permite modificarea unui obiect, dat fiind o referin la acesta;
DELETE_OBJECT, care primete ca parametru de intrare o referin i are ca rezultat
suprimarea obiectului referit de aceasta.
Exemplu:
S se modifice toate adresele din Romnia asociate unor specialiti, astfel nct codul potal
s fie 7000. De asemenea, s se tearg toate adresele izolate.
DECLARE
v_adresa t_adresa;
CURSOR c_adrese IS
SELECT REF(a) ref_adr
FROM tab_adrese a
WHERE REF(a) IN (SELECT DISTINCT s.adresa
FROM tab_specialisti s)
AND INITCAP (tara) = 'Romania';
CURSOR c_adrese_izolate IS
SELECT REF(a) ref_adr
FROM tab_adrese a
WHERE NOT EXISTS (SELECT DISTINCT s.adresa
FROM tab_specialisti s
WHERE s.adresa = REF(a));
BEGIN
FOR v_rec IN c_adrese LOOP
-- se obtine obiectul referit prin v_rec.ref_adr
UTL_REF.SELECT_OBJECT (v_rec.ref_adr, v_adresa);
DBMS_OUTPUT.PUT_LINE (' Cod: '|| v_adresa.cod_adresa);
-- se blocheaza obiectul referit
-- in vederea modificarii
UTL_REF.LOCK_OBJECT (v_rec.ref_adr);
28 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
v_adresa.cod_postal := 7000;
-- se modifica obiectul referit prin v_rec.ref_adr
UTL_REF.UPDATE_OBJECT (v_rec.ref_adr, v_adresa);
END LOOP;
FOR v_rec2 IN c_adrese_izolate LOOP
-- este sters obiectul identificat de referinta
UTL_REF.DELETE_OBJECT (v_rec2.ref_adr);
END LOOP;
END;
/
Sistemul Oracle nu permite constrngeri asupra coloanelor sau atributelor de tip obiect,
colecie, referin sau LOB, cu dou excepii:
constrngerile NOT NULL sunt permise pentru toate tipurile definite de utilizator, vector
sau LOB (cu excepia tablourilor imbricate);
constrngerile NOT NULL, de cheie extern i de tip REF sunt permise pentru o coloan
de tip referin.
n general, la crearea unui subtabel sau a unei subvizualizri n cadrul unei ierarhii de
motenire nu se poate specifica o constrngere de tip UNIQUE sau PRIMARY KEY. Cheia unic poate
fi specificat doar n cadrul definiiei tabelului sau vizualizrii de pe nivelul rdcin.
Chiar dac coloanele i atributele de tip obiect, colecie, referin sau LOB nu pot avea
constrngeri de cheie unic, primar sau extern, cu unele restricii, aceste constrngeri sunt
disponibile pentru coloanele i atributele acestor tipuri.
Constrngerile din sintax pot fi specificate asupra atributelor scalare ale coloanelor de tip
obiect. Se pot impune constrngeri NOT NULL asupra coloanelor de tip obiect i constrngeri de tip
CHECK care s fac referin la coloane de tip obiect sau la atribute ale unor coloane de tip obiect.
Constrngerile NOT NULL sunt singurele constrngeri care se pot specifica la nivel de linie
pentru o coloan de tip XMLType sau vector. O astfel de constrngere nu se poate specifica pentru un
atribut al unui obiect. Pentru a implementa o astfel de restricie se poate folosi o constrngere de tip
CHECK asociat cu predicatul IS NOT NULL.
Exemplu:
S se creeze un tabel obiect ce conine artiti, specificnd c atributele nume i prenume sunt
obligatorii. S se defineas un tabel relaional care s conin dou coloane, artist de tip t_artist i
numar_opere de tip numeric. Tabelul va impune aceeai condiie asupra atributelor nume i prenume
ale tipului. Se observ c operaia de inserare ce urmeaz dup crearea tabelelor eueaz cu eroarea
ORA-02290: check constraint (STUDENT.SYS_C008911) violated.
CREATE TABLE tab_artisti OF t_artist
(CHECK (nume IS NOT NULL OR prenume IS NOT NULL));
CREATE TABLE statistica_artisti (
artist t_artist,
numar_opere NUMBER,
CHECK (artist.nume IS NOT NULL OR
artist.prenume IS NOT NULL));
INSERT INTO statistica_artisti
VALUES (t_artist (NULL, NULL, '1800', '1900',
NULL, NULL, NULL), 10);
Aa cum s-a exemplificat, la nivelul unui tabel obiect se pot defini aceleai categorii de
constrngeri ca i pentru tabelele relaionale obinuite. Aceste constrngeri se refer la atributele
scalare ale unei coloane obiect, cu excepia celor referin fr domeniu. Pot fi specificate
constrngeri de cheie primar (PRIMARY KEY), cheie extern (REFERENCING, FOREIGN KEY), de
unicitate (UNIQUE), NOT NULL, de verificare a unei condiii (CHECK).
Exemplu:
a) S se defineasc tabelul obiect tab_opere i s se plaseze o constrngere de cheie primar
asupra coloanei cod_opera. Se va presupune c tabelul tab_opere este bazat pe tipul t_opera_de_arta
definit anterior. De asemenea, cmpul titlu este obligatoriu, iar data crerii operei este anterioar datei
de achiziie.
Orientare pe obiecte n Oracle9i 33
specificat.
Constrngerile de tip CHECK sau PRIMARY KEY nu pot fi impuse unor coloane referin. n
schimb, sunt permise constrngeri de tip NOT NULL.
O coloan de tip REF refer un obiect dintr-un tabel sau o coloan obiect. O constrngere de
tip REF permite definirea relaiilor dintre coloanele de tip referin i obiectele referite. Pentru aceasta
sunt utilizate clauzele constr_linie_ref sau constr_tabel_ref. Diferena dintre aceste dou clauze este
nivelul de specificaie. n cazul constrngerii la nivel de tabel, trebuie specificate coloana sau atributul
la care se face referire.
Sintaxa constrngerii de tip referin la nivel de linie este urmtoarea:
{SCOPE IS [schema.]tabel_domeniu
| WITH ROWID
| [CONSTRAINT nume_constr] clauza_referire [stare_constr] }
Constrngerea de tip referin la nivel de tabel are sintaxa urmtoare:
{SCOPE FOR ( {col_ref | atr_ref} ) IS [schema.]tabel_domeniu
| REF ( {col_ref | atr_ref} ) WITH ROWID
| [CONSTRAINT nume_constr] FOREIGN KEY ( {col_ref | atr_ref} )
clauza_referire [stare_constr] }
Ambele variante permit definirea unei constrngeri referitoare la:
domeniul atributului sau coloanei referin respective;
stocarea valorilor referin mpreun cu identificatorul de linie;
integritatea referenial a unei coloane de tip REF.
n cadrul unei specificaii la nivel de tabel, col_ref reprezint un nume de coloan de tip
referin din tabelul obiect sau relaional creat, iar atr_ref specific un atribut de tip referin integrat
n cadrul unei coloane obiect a tabelului relaional. Coloana referin este considerat de tip utilizator
dac domeniul acesteia este un tabel obiect care are identificatorii obiect bazai pe cheie primar.
ntr-un tabel cu o coloan de tip referin, fiecare valoare stocat poate referi o linie dintr-un
tabel obiect oarecare (inclusiv tabelul obiect curent). Clauza SCOPE restricioneaz domeniul
referinelor la un singur tabel obiect specificat (tabel_domeniu). Valorile din coloana sau atributul de
tip REF sunt corelate cu obiecte din tabelul domeniu, tabel n care sunt stocate instane obiect de
acelai tip cu cel al coloanei respective. Tabelul specificat ca domeniu trebuie s fac parte din propria
schem sau trebuie deinut fie privilegiul obiect SELECT asupra tabelului, fie privilegiul sistem
SELECT ANY TABLE. Pentru o coloan de tip REF nu poate fi specificat dect un singur tabel
domeniu.
Restriciile asupra constrngerilor de tip SCOPE sunt:
nu se poate aduga o constrngere de domeniu unei coloane existente dect dac tabelul
creat este vid;
nu se poate specifica o constrngere de domeniu pentru elementele unei coloane de tip
vector;
este obligatorie specificarea unei clauze de domeniu atunci cnd comanda de creare a
tabelului conine o subcerere ce returneaz referine definite de utilizator;
nu este permis suprimarea ulterioar a unei constrngeri de domeniu.
Clauza WITH ROWID se folosete pentru a stoca n cadrul coloanei sau atributului respectiv,
pe lng valoarea referin propriu-zis, identificatorul de linie al obiectului referit. Acest lucru poate
Orientare pe obiecte n Oracle9i 35
mbunti performanele operaiei de derefereniere, dar utilizeaz mai mult spaiu de stocare.
Opiunea implicit este stocarea fr identificatori de linie.
Restriciile asupra constrngerii WITH ROWID sunt:
nu se poate defini pentru elementele de tip referin ale unui vector;
nu poate fi eliminat ulterior printr-o comand ALTER TABLE;
este ignorat dac exist deja o constrngere de domeniu asupra coloanei sau atributului
respectiv.
Clauza REFERENCES coninut n opiunea clauza_referire permite definirea cheilor externe
asupra coloanelor de tip REF. Pe lng meninerea integritii refereniale, aceast clauz
restricioneaz n mod implicit domeniul coloanei sau atributului referin la tabelul obiect specificat.
O constrngere de cheie extern asupra unei coloane relaionale refer o alt coloan relaional din
tabelul printe. Diferena dintre abordarea relaional i cea obiectual este c o constrngere de
cheie extern asupra unei coloane de tip REF face referire la coloana tabelului printe ce conine
identificatorul obiect corespunztor.
Similar tabelelor relaionale, constrngerea la nivel de coloan utilizeaz clauza
REFERENCES, iar cea la nivel de tabel necesit n plus cuvintele cheie FOREIGN KEY i una sau
mai multe coloane sau atribute asupra crora se fixeaz constrngerea respectiv.
Restriciile relative la constrngerile de integritate referenial asupra coloanelor de tip REF
sunt:
la definirea unei constrngeri de integritate referenial asupra unei coloane de tip REF se
adaug automat o constrngere de tip SCOPE fr domeniu (toate restriciile care se
aplic constrngerilor de domeniu se aplic i n acest caz);
nu se poate specifica o coloan dup numele obiectului din clauza REFERENCES.
Exemplu:
S se creeze un tabel care s fac legtura ntre tabelele tab_artisti i tab_adrese definite
anterior. Noul tabel, tab_adrese_artisti, va conine trei coloane:
tip, care specific dac adresa este permanent sau temporar;
artist, care refer un obiect de tip t_artist din tabelul tab_artisti i asupra creia este
impus o constrngere de cheie extern;
adresa, care refer un obiect de tip t_adresa din tabelul tab_adrese.
Asupra coloanei artist se impune o constrngere de integritate referenial, iar asupra coloanei
adresa o constrngere de domeniu. Pentru corectitudine, iniial se elimin coloana adresa din cadrul
tipului t_artist.
ALTER TYPE t_artist
DROP ATTRIBUTE adresa
CASCADE;
CREATE TABLE tab_adrese_artisti (
tip VARCHAR2(10) CHECK (tip IN ('TEMP', 'PERM')),
artist REF t_artist REFERENCES tab_artisti,
adresa REF t_adresa SCOPE IS tab_adrese);
Clauza stare_constr se refer la starea constrngerii la momentul crerii tabelului (activ,
inactiv, amnat, imediat etc.), stare ce poate fi modificat ulterior cu o comand ALTER TABLE.
Proprietile coloanelor de tip vector (proprieti_colecie) se pot specifica prin intermediul
urmtoarelor opiuni:
36 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
VARRAY elem_vector
{clauza_col_substituibil
| STORE AS LOB {numesegment_LOB (parametri_LOB)
| numesegment_LOB
| (parametri_LOB) } }
Aceste clauze permit specificarea unor caracteristici de stocare separate pentru obiectul de tip
LOB n care va fi stocat vectorul. Dac elem_vector este o colecie pe mai multe niveluri, atunci toate
componentele coleciei imbricate din elementul specificat sunt stocate n cadrul aceluiai obiect LOB.
Clauza VARRAY permite specificarea caracteristicilor de stocare asociate segmentelor de date
LOB ale vectorului, la mai multe niveluri:
global, la nivel de tabel, pentru tabele nepartiionate;
asociate tuturor partiiilor i subpartiiilor, pentru un tabel partiionat n care specificarea
caracteristicilor se face la nivel de tabel;
corespunztoare unei partiii i subpartiiilor acesteia, n cazul unor partiii individuale ale
unui tabel partiionat (setrile la nivel de partiie suprascriu setrile la nivel de tabel);
corespunztoare unei subpartiii, pentru subpartiii individuale ale tabelului partiionat
(setrile la nivel de subpartiie suprascriu att setrile la nivel de partiie ct i pe cele la
nivel de tabel).
Opiunea STORE AS LOB respect urmtoarele reguli:
dac dimensiunea maxim a vectorului este mai mic de 4 KB i nu a fost dezactivat
stocarea la nivel de linie, atunci sistemul stocheaz vectorii n cadrul nregistrrii (inline);
dac dimensiunea maxim a vectorului este mai mare de 4 KB sau a fost dezactivat
stocarea la nivel de linie, atunci sistemul stocheaz vectorii n afara nregistrrii (out-of-
line).
Dac nu se specific opiunea STORE AS LOB, atunci stocarea vectorilor se face n mod
diferit fa de alte obiecte LOB. Stocarea se bazeaz pe dimensiunea maxim posibil a vectorilor
(adic numrul de elemente nmulit cu dimensiunea acestora, plus o cantitate pentru informaia de
control), nu pe dimensiunea real a coloanei de tip vector. Pot aprea urmtoarele cazuri:
dimensiunea maxim a vectorului este mai mic dect 4 KB i atunci vectorul este stocat
inline sub forma unor date nestructurate;
dimensiunea maxim este mai mare de 4 KB i atunci vectorul este stocat ca LOB (dac
dimeniunea real este mai mic de 4 KB, atunci este stocat ca LOB n cadrul liniei, n caz
contrar, vectorul fiind stocat ca LOB n afara nregistrrii, ca i celelalte coloane de tip
LOB).
Pentru obiectul LOB setat nu se poate specifica parametrul TABLESPACE n cadrul clauzei
parametri_LOB. Spaiul tabel al obiectului LOB asociat unui vector este n mod implicit spaiul tabel
din care face parte tabelul ce l conine.
Proprietile coloanelor de tip tablou imbricat se pot seta cu ajutorul urmtoarelor opiuni:
NESTED TABLE {elem_imbr | COLUMN_VALUE}
[clauza_col_substituibil] STORE AS tabel_stocare
[ ( (propr_obiect) [propr_fizice] [propr_coloana] ) ]
[RETURN AS {LOCATOR | VALUE} ]
Orientare pe obiecte n Oracle9i 37
Aceste clauze permit specificarea unor caracteristici de stocare separate pentru un tablou
imbricat (de exemplu, definirea unui tablou imbricat ca tabel organizat pe baz de index).
Clauza NESTED TABLE este obligatorie atunci cnd se creeaz tabele ce conin coloane
(propriu-zise sau ascunse) de tip tablou imbricat. Clauzele clauza_col_substituibil, propr_obiect,
propr_fizice i propr_cooanal din cadrul opiunilor pentru tablouri imbricate funcioneaz n acelai
fel ca i pentru tabelul printe. Atributul element_imbr specific numele coloanei de tip tablou
imbricat sau al unui atribut tablou imbricat al tipului obiect asociat tabelului. Cuvntul cheie
COLUMN_VALUE este folosit n cazul coleciilor pe mai multe niveluri, atunci cnd tabloul imbricat
sau vectorul referit nu are nume.
Opiunea STORE AS tabel_stocare specific numele tabelului care va conine liniile coloanei
de tip tablou imbricat. Pentru un tabel nepartiionat, tabelul de stocare este creat n aceeai schem i
n acelai spaiu tabel ca i tabelul printe (utiliznd caracteristicile de stocare implicite). Dac
tabelul printe este partiionat, atunci tabelul de stocare este creat n spaiul tabel implicit al
schemei.
Asupra tabelului de stocare exist urmtoarele restricii:
nu se poate partiiona un tabel de stocare al unui tablou imbricat;
nu se pot executa comenzi de interogare sau prelucrare a datelor dintr-un tabel de stocare
n mod direct, dar se pot schimba caracteristicile de stocare ale acestuia, prin comanda
ALTER TABLE.
Clauza RETURN AS specific tipul rezultatului returnat de cererile asupra coloanei de tip
tablou imbricat. Exist dou opiuni:
VALUE, care permite returnarea unei copii a tabloului imbricat stocat n cadrul coloanei
referite de clauza NESTED TABLE;
LOCATOR, care permite obinerea unei adrese (locator) ctre valoarea propriu-zis a
tabloului imbricat7.
Dac nu se specific opiunea propr_fizice, ce indic atributele segmentelor de date, modul de
organizare a tabelului sau utilizarea unei grupri, atunci tabloul de stocare este creat utiliznd
caracteristicile de stocare implicite.
Asupra clauzei NESTED TABLE exist urmtoarele restricii:
nu se poate specifica pentru un tabel temporar (un tabel temporar nu poate conine
coloane de tip colecie);
nu se pot specifica n cadrul aceleiai comenzi clauzele NESTED TABLE i OBJECT
IDENTIFIER;
nu se poate specifica parametrul TABLESPACE pentru un tablou imbricat, el fiind acelai
cu cel al tabelului printe;
nu se poate specifica o constrngere referenial asupra atributelor tabloului imbricat la
momentul crerii, dar este posibil modificarea ulterioar asupra tabelului printe
pentru adugarea unei astfel de constrngeri.
Declanatorii asupra unui tabel obiect se definesc similar celor asociai tabelelor obinuite. Nu
exist restricii speciale asupra utilizrii tipurilor obiect n cadrul declanatorilor.
Nu se pot defini declanatori pentru un tabel de stocare corespunztor coloanelor sau
atributelor de tip tablou imbricat. De asemenea, nu este permis modificarea valorilor de tip LOB n
corpul declanatorilor.
7
Locatorul este propriu unei sesiuni i nu poate fi reutilizat de la o sesiune la alta. Spre deosebire de un locator al unui LOB,
locatorii coleciilor nu pot fi utilizai pentru modificarea instanei respective.
38 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Exemplu:
S se creeze un declanator asupra tabelului obiect opere_de_arta definit anterior. Acest
declanator insereaz o nou nregistrare n tabelul cumparari, pentru fiecare oper de art cumprat.
S se insereze o nregistrare i s se constate efectul declanatorului.
CREATE OR REPLACE TRIGGER t_ai_on_opere
AFTER INSERT ON opere_de_arta
FOR EACH ROW
BEGIN
INSERT INTO cumparari VALUES
(t_opera_de_arta(:NEW.cod_opera,:NEW.tip, :NEW.titlu,
NULL, :NEW.data_crearii, :NEW.data_achizitiei,
:NEW.valoare,:NEW.polite,:NEW.dimensiuni),
DEFAULT, :NEW.valoare, 'Vanzator implicit');
END;
/
INSERT INTO opere_de_arta (cod_opera, tip, titlu)
VALUES (1, 'tip_fictiv', 'titlu_fictiv');
SELECT *
FROM cumparari;
Dac regsirea unei coloane ntr-o operaie relaional este determinist i poate fi fcut de
ctre sistem, atunci SQL permite omiterea prefixrii acesteia cu numele tabelului.
Exemplu:
S se gseasc toate operele de art care au fost evaluate exact la valoarea la care au fost
achiziionate (coloana valoare face parte din tabelul opere_de_arta, iar pret din tabelul cumparari).
SELECT cod_opera, titlu, tip
FROM opere_de_arta
WHERE EXISTS (SELECT 'X'
FROM cumparari
WHERE valoare = pret);
Sistemul determin crui tabel i aparine fiecare coloan (cod_opera, titlu, tip, valoare
tabelului opere_de_arta, iar pret tabelului cumparari).
Utiliznd notaia cu punct, se pot prefixa numele de coloane cu nume de tabele sau de alias-
uri, ceea ce face codul mai explicit i mai uor de ntreinut.
SELECT cod_opera, titlu, tip
FROM opere_de_arta
WHERE EXISTS(SELECT 'X'
FROM cumparari
WHERE opere_de_arta.valoare = cumparari.pret);
SELECT cod_opera, titlu, tip
FROM opere_de_arta oda
WHERE EXISTS (SELECT 'X'
FROM cumparari c
WHERE oda.valoare = c.pret);
Pe lng faptul c, n unele cazuri, specificarea unui alias este obligatorie, utilizarea numelor
necalificate poate genera probleme. Dac, de exemplu, se adaug o nou coloan, valoare, n cadrul
tabelului cumparari i nu se schimb cererea de mai sus (cea n care nu se prefixeaz nici o coloan),
sistemul recompileaz automat interogarea astfel nct subcererea va folosi noua coloan valoare din
tabelul cumparari.
Orientare pe obiecte n Oracle9i 39
Pentru evitarea unor astfel de situaii i a problemelor similare de rezolvare a referinelor, este
recomandat utilizarea unui alias de tabel pentru a prefixa referinele ctre metodele sau atributele
obiectelor, prin notaia cu punct. Alias-ul de tabel este opional dac referirea atributelor terminale ale
unui tabel obiect se face n mod direct, fr notaia cu punct.
Exemplu:
Urmtoarele cereri indic modaliti corecte sau incorecte de referire ale atributului nume.
Tabelul tab_artisti este un tabel obiect de tip t_artist, iar tabelul opere_de_arta este un tabel relaional
ce conine o coloan obiect de tip t_artist.
SELECT nume FROM tab_artisti; --Corect
SELECT artist.nume FROM opere_de_arta; --Incorect
SELECT opere_de_arta.artist.nume
FROM opere_de_arta; --Incorect
SELECT oda.artist.nume FROM opere_de_arta oda; --Corect
n prima comand, nume este o coloan din tab_artisti. Ea refer atributul terminal
corespunztor n mod direct, fr s utilizeze notaia cu punct, astfel nct nu este necesar un alias de
tabel. n cea de-a doua comand, nume este un atribut al obiectului de tip t_artist stocat n coloana
artist. Aceast referin utilizeaz notaia cu punct i necesit un alias de tabel pentru a fi corect. Cea
de-a treia comand utilizeaz numele tabelului pentru a prefixa coloana. Acest lucru nu este permis,
trebuie specificat alias-ul tabelului aa cum este exemplificat n ultima cerere.
O referin ctre atributul sau metoda unui obiect trebuie prefixat cu un alias de tabel i nu
cu numele tabelului, chiar dac acesta este la rndul lui prefixat de numele schemei (utilizator.tabel).
Acelai lucru se aplic i la accesarea atributelor de tip referin.
De exemplu, expresia student.cumparari.opera.valoare se refer la schema student, tabelul
cumparari, coloana opera i atributul valoare al acestei coloane. Expresia este totui incorect din
cauz c este folosit direct numele tabelului cumparari i nu un alias al acestuia.
3.5. Metode
Metodele sunt funcii sau proceduri declarate n cadrul definiiei unui tip obiect pentru
implementarea comportamentului obiectelor de acel tip. O aplicaie interacioneaz cu un obiect prin
intermediul metodelor definite de tipul acestuia.
De exemplu, n cadrul tipului obiect t_sala se poate declara o metod suma_valoare() pentru
a calcula valoarea total a operelor dintr-o anumit sal a muzeului. Apelarea acestei metode relativ la
o instan a tipului, v_sala, se poate face prin intermediul expresiei v_sala.suma_valoare().
Metodele pot fi scrise n PL/SQL sau n alt limbaj de programare acceptat de baza de date
Oracle. Cele scrise n PL/SQL sau Java sunt stocate n baza de date, iar cele scrise n alte limbaje de
programare, cum ar fi C, sunt stocate extern.
n definiia unui tip pot fi declarate metode MEMBER i statice. Metodele MEMBER pot fi
metode obinuite sau funcii de ordonare. De asemenea, pentru fiecare tip obiect, sistemul definete
automat o metod constructor. Constructorul unui tip este utilizat pentru crearea obiectelor de tipul
respectiv.
Definirea metodelor
40 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Pentru implementarea metodelor unui tip obiect se utilizeaz comanda CREATE TYPE
BODY. Prin intermediul acestei comenzi trebuie specificat codul asociat tuturor metodelor declarate n
comanda CREATE TYPE8.
Pentru a crea sau nlocui corpul unui tip din propria schem sunt necesare privilegiile sistem
CREATE TYPE sau CREATE ANY TYPE. Pentru a crea corpul unui tip din schema altui utilizator
trebuie deinut privilegiul sistem CREATE ANY TYPE, iar pentru a nlocui corpul unui astfel de tip
trebuie avut i privilegiul sistem DROP ANY TYPE. Comanda are urmtoarea sintax:
CREATE [OR REPLACE] TYPE BODY [schema.]nume_tip {IS | AS}
{MEMBER | STATIC}{declar_proc | decl_funcie | decl_constr}
[ {MEMBER | STATIC}{declar_proc | decl_funcie | decl_constr}]
[ {MAP | ORDER} MEMBER decl_funcie]
END;
Pentru a schimba definiia corpului unui tip obiect fr a-l suprima i crea din nou, se
utilizeaz opiunea OR REPLACE. Un avantaj al acestei abordri este c utilizatorii crora li s-au
acordat anumite privilegii asupra corpului recreat pot utiliza n continuare tipul fr a fi necesar
reacordarea privilegiilor. De asemenea, clauza OR REPLACE este utilizat atunci cnd se
implementeaz definiia unei noi metode MEMBER adugat prin intermediul comenzii ALTER
TYPEREPLACE.
Dac se omite numele schemei, atunci sistemul creeaz corpul tipului n schema curent. Nu
este permis definirea corpului unui tip pentru care nu a fost creat specificaia.
n cadrul unui tip se poate defini fie o metod de tip MAP, fie una de tip ORDER. n acest fel
este posibil compararea instanelor tipului obiect respectiv, n cadrul comenzilor SQL. Dac nu este
declarat nici una dintre metodele de ordonare, atunci se poate verifica doar egalitatea a dou obiecte
de acel tip.
Opiunile MEMBER sau STATIC specific tipul metodei implementate, care poate fi
procedur, funcie sau constructor. Sintaxa corespunztoare celor trei tipuri de metode este:
PROCEDURE nume_proc ( [parametru tip_de_date] )
{IS | AS} {bloc_PLSQL | specificaie_apel}
FUNCTION nume_funcie ( [parametru tip_de_date] )
RETURN tip_de_date {IS | AS} {bloc_PLSQL | specificaie_apel}
[FINAL] [INSTANTIABLE]
CONSTRUCTOR FUNCTION tip_obiect
[ ( [SELF IN OUT tip_obiect,]
parametru tip_de_date [, parametru tip_de_date] ) ]
RETURN SELF AS RESULT {IS | AS}
{bloc_PLSQL | specificaie_apel}
Pentru fiecare metod trebuie specificate un nume, o list opional de parametri, iar n cazul
funciilor, un tip de date returnat. Antetul metodei trebuie s corespund celui din specificaia tipului
obiect definit.
8
Dac este creat un tip SQLJ pentru care metodele sunt definite n clasa Java asociat, atunci nu este necesar comanda
CREATE TYPE BODY. Acelai lucru este valabil i pentru metodele care sunt declarate ca proceduri sau funcii externe.
Orientare pe obiecte n Oracle9i 41
Dac pentru implementarea metodei nu este folosit un bloc PL/SQL, atunci trebuie definit o
specificaie de apel care face asocierea dintre o metod i o clas Java sau structur C.
Metode MEMBER
Metodele MEMBER reprezint modalitatea prin care o aplicaie acceseaz datele unei instane
obiect. n cadrul tipului obiect este posibil implementarea cte unei metode pentru fiecare operaie
care poate fi executat asupra obiectelor de tipul respectiv.
Exemplu:
S se defineasc o metod MEMBER, get_titlu(), care acceseaz informaiile despre o
anumit oper de art i returneaz titlul acesteia.
CREATE OR REPLACE TYPE BODY t_opera_de_arta AS
MEMBER FUNCTION get_titlu RETURN VARCHAR2 IS
BEGIN
RETURN SELF.titlu;
END get_titlu;
END;
/
SELECT o.get_titlu()
FROM opere o;
Orice metod are un parametru predefinit SELF care identific instana obiect asupra creia
este invocat metoda la un moment dat. Pentru simplitate, metodele MEMBER pot referi atributele i
metodele parametrului SELF fr calificativ (de exemplu, SELF.titlu sau titlu au aceeai valoare).
Nu este obligatoriu ca parametrul SELF s fie declarat n mod explicit, dar dac este declarat,
el trebuie s fie primul parametru transmis metodei. Dac parametrul SELF nu este declarat, n
funciile MEMBER el este considerat n mod implicit de tip IN, iar n procedurile MEMBER de tip IN
OUT.
O metod se invoc utiliznd notaia cu punct (obiect.metoda()). Prefixul notaiei specific
obiectul asupra cruia se invoc metoda. Parantezele sunt obligatorii chiar dac metoda nu are
parametri.
Exemplu:
S se defineasc tipul t_complex care modeleaz numerele complexe. Acesta conine
atributele real i imaginar de tip numeric i metode ce implementeaz calculul modulului unui numr
complex, al sumei i produsului a dou numere complexe.
PROMPT crearea tipului t_complex
CREATE TYPE t_complex AS OBJECT (
real NUMBER,
imaginar NUMBER,
MEMBER FUNCTION modul RETURN NUMBER,
MEMBER FUNCTION adunare(p_ob t_complex) RETURN t_complex,
MEMBER FUNCTION inmultit(p_ob t_complex) RETURN t_complex);
/
PROMPT crearea corpului tipului t_complex
CREATE OR REPLACE TYPE BODY t_complex AS
MEMBER FUNCTION modul RETURN NUMBER IS
v_rezultat NUMBER;
BEGIN
42 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
9
Dac tipul va fi referit n cereri ce implic sortri (printr-o clauz ORDER BY, GROUP BY, DISTINCT sau UNION) sau
join-uri i se dorete ca aceste cereri s fie paralelizate, atunci este obligatorie o funcie de tip MAP.
44 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
specific o funcie membru de tip ORDER care accept instana unui obiect ca argument explicit,
SELF ca argument implicit i returneaz un ntreg. Rezultatul reflect dac argumentul implicit SELF
este mai mic (rezultat negativ), egal (rezultat zero) sau mai mare (rezultat pozitiv) dect argumentul
explicit. Dac argumentul metodei ORDER este null, metoda ntoarce tot null i nu este invocat. n
cadrul unei ierarhii de tipuri, un subtip nu poate nici s declare i nici s suprascrie o metod de tip
ORDER.
Similar metodelor MAP, o metod ORDER este apelat automat ori de cte ori trebuie
comparate obiecte de tipul respectiv. De exemplu, dac o coloan de tip obiect apare ntr-o clauz
ORDER BY, atunci se invoc metoda ORDER.
Metodele de ordonare sunt necesare atunci cnd semnificaia comparrii obiectelor devine
prea complex pentru a putea utiliza metodele de mapare. De exemplu, pentru compararea unor
obiecte binare (imagini) se poate crea o metod de ordonare care s ia n consideraie luminozitatea i
numrul de pixeli.
Exemplu:
S se defineasc o metod de ordonare care compar artitii dup numele lor. n cazul
numelor identice, compararea se face dup prenumele acestora i apoi descresctor dup anul naterii.
S se verifice modul de funcionare a metodei.
ALTER TYPE t_artist
ADD ORDER MEMBER FUNCTION comparare(a t_artist)
RETURN INTEGER
CASCADE;
CREATE OR REPLACE TYPE BODY t_artist AS
ORDER MEMBER FUNCTION comparare(a t_artist)
RETURN INTEGER IS
v_nume_complet VARCHAR2(60);
v_return INTEGER;
BEGIN
v_nume_complet := nume || ' ' || prenume;
IF v_nume_complet < a.nume || ' ' || a.prenume THEN
v_return := -1; --sau alt numar negativ
ELSE
IF v_nume_complet > a.nume || ' ' || a.prenume THEN
v_return := 1;-- sau alt numar pozitiv
ELSE -- acelasi nume
IF TO_NUMBER (anul_nasterii) >
TO_NUMBER (a.anul_nasterii) THEN
v_return := -1;
ELSIF TO_NUMBER (anul_nasterii) <
TO_NUMBER (a.anul_nasterii) THEN
v_return := 1;
ELSE
v_return := 0;
END IF;
END IF;
END IF;
RETURN v_return;
END comparare;
END;
Orientare pe obiecte n Oracle9i 45
/
DECLARE
v_artist1 t_artist := t_artist ('Peter', 'Breugel', '1457',
NULL, NULL, NULL);
v_artist2 t_artist := t_artist ('Peter', 'Breugel', '1512',
NULL, NULL, NULL);
v_rezultat INTEGER;
BEGIN
SELECT v_artist1.comparare (v_artist2) INTO v_rezultat
FROM DUAL;
DBMS_OUTPUT.PUT_LINE (' Rezultat : ' || v_rezultat);
DBMS_OUTPUT.PUT_LINE (' Rezultat invers : ' ||
v_artist2.comparare(v_artist1));
END;
/
Dac se declar una dintre metodele de comparare, atunci obiectele pot fi comparate n cadrul
instruciunilor SQL sau n comenzi procedurale. Dac nu s-a definit nici una dintre metodele de
ordonare, nu se pot face comparaii dect n SQL, pentru a verifica egalitatea a dou instane (dou
obiecte de acelai tip sunt egale dac valorile atributelor lor sunt egale).
Atunci cnd se sorteaz sau se interclaseaz un numr mare de obiecte, este preferabil o
metod de mapare. De exemplu, se folosete o metod MAP pentru join-urile care folosesc funcii de
dispersie (hash join). n acest caz, nu se poate folosi o metod ORDER, deoarece mecanismul
dispersional folosete o valoare scalar asociat obiectului.
Metoda MAP se aplic o singur dat pentru a asocia obiectele cu nite valori scalare. Prin
urmare, o metod MAP este mai eficient dect una ORDER, care poate compara doar cte dou
obiecte la un moment dat. n schimb, o metod de ordonare poate implementa o semantic mai
complex a lumii reale.
Metode statice
O metod static implementeaz un comportament global la nivel de tip, invariabil relativ la
instanele tipului obiect respectiv. Ea nu necesit referine la datele unei instane particulare. Prin
urmare, metoda este invocat relativ la tipul obiect care o definete i nu relativ la instanele acestuia.
O metod static nu are parametrul SELF.
Invocarea se face prin utilizarea notaiei cu punct, prefixnd apelul metodei cu numele tipului
obiect asociat (nume_tip.metoda()).
Exemplu:
Comenzile ce urmeaz prezint crearea i referirea unei metode statice. Metoda static ins a
tipului tip_a insereaz o nou nregistrare n tabelul a. nregistrarea este format din dou coloane.
Prima reprezint identificatorul dat ca prim parametru, iar a doua are ca valoare o referin la obiectul
linie din tabelul b, identificat prin codul dat ca al doilea parametru. Operaia nu depinde de instanele
tipului i de aceea a fost declarat static. Care este rezultatul cererii?
CREATE OR REPLACE TYPE tip_b AS OBJECT (id NUMBER);
/
CREATE OR REPLACE TYPE tip_a AS OBJECT (
id NUMBER,
b REF tip_b,
46 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Metode constructor
n mod implicit, fiecare tip obiect are o metod constructor definit de sistem, adic o metod
prin care se poate crea o instan, setnd valorile atributelor acesteia. Metoda constructor este o
funcie ce are cte un parametru corespunztor fiecrui atribut al tipului obiect i care returneaz o
nou instan creat. Numele metodei constructor este acelai cu numele tipului obiect. Parametrii lui
au numele i tipurile de date ale atributelor tipului obiect. ncepnd cu Oracle9i a fost introdus
clauza CONSTRUCTOR care permite definirea constructorilor utilizator.
La definirea unui constructor este obligatorie clauza RETURN SELF AS RESULT. Acest lucru
indic faptul c cel mai specific tip al valorii returnate de constructor corespunde celui mai specific tip
al argumentului SELF. Funcia constructor trebuie s conin o comand RETURN simpl care nu
specific explicit valoarea returnat. n acest fel, n mod implicit, sistemul returneaz noua instan
SELF definit de constructorul respectiv.
Un constructor definit de utilizator nu poate fi utilizat n cadrul clauzei DEFAULT dintr-o
comand CREATE TABLE sau ALTER TABLE, dei metodele constructor implicite sunt permise. n
SQL, parantezele sunt necesare chiar i pentru constructorii care nu au argumente, n timp ce n
PL/SQL acestea sunt opionale. Pentru a fi n concordan cu limbajele orientate pe obiecte existente,
a fost introdus cuvntul cheie NEW. Acesta, ns, nu este obligatoriu.
Exemplu:
a) S se defineasc un tip t_organizator care s conin atributele cod, nume, telefon i
adresa. S se implementeze un constructor care permite specificarea doar a codului i numelui
organizatorului. S se creeze un bloc PL/SQL n care s se utilizeze ambii constructori (implicit i
definit de utilizator).
CREATE OR REPLACE TYPE t_organizator AS OBJECT (
cod NUMBER,
nume VARCHAR2(20),
telefon VARCHAR2(30),
Orientare pe obiecte n Oracle9i 47
adresa t_adresa,
CONSTRUCTOR FUNCTION t_organizator (
p_cod NUMBER, p_nume VARCHAR2)
RETURN SELF AS RESULT);
/
CREATE OR REPLACE TYPE BODY t_organizator AS
CONSTRUCTOR FUNCTION t_organizator (
p_cod NUMBER, p_nume VARCHAR2)
RETURN SELF AS RESULT IS
BEGIN
SELF.telefon := '1234567';
SELF.adresa := t_adresa (-1, 'nici o strada',
NULL, NULL, NULL, NULL);
RETURN;
END;
END;
/
DECLARE
v_org1 t_organizator;
v_org2 t_organizator;
BEGIN
-- constructor definit de utilizator
v_org1 := NEW t_organizator(1, 'Titan SA');
DBMS_OUTPUT.PUT_LINE (v_org1.adresa.strada);
-- constructorul implicit
v_org2 := t_organizator(1, 'Arta SA', '0724.513.331', NULL);
END;
/
b) S se defineasc tabelul obiect tab_organizatori i s se introduc date despre un
organizator avnd adresa precizat. Metoda constructor t_adresa creeaz un obiect de tipul t_adresa
avnd valorile atributelor specificate ca parametri.
CREATE TABLE tab_organizatori OF t_organizator;
INSERT INTO tab_organizatori
VALUES ( 1, 'Georgescu Elena', '630.98.04',
t_adresa(123, '23A N. Grigorescu', '74612', 'Bucuresti',
'Sector 3', 'Romania'));
conin elemente de un tip definit de utilizator care are atribute de tip LOB. Se poate crea un tip vector
de tip XMLType care s fie utilizat n PL/SQL sau n cererile vizualizrilor, dar nu se poate crea o
coloan de acest tip vector, deoarece sistemul stocheaz datele de tip XMLType sub form de CLOB.
Un tablou imbricat poate avea un numr nelimitat de elemente de acelai tip de date (nu este
specificat un numr maxim n definiia tabloului), iar ordinea elementelor nu este pstrat. El are o
singur coloan de tip predefinit sau definit de utilizator. n cazul n care coloana din tabloul imbricat
este de tip obiect, tabloul poate fi vizualizat ca un tabel multicoloan, avnd cte o coloan pentru
fiecare atribut al tipului obiect.
Asupra unui tablou imbricat se pot executa operaii LMD, similar celorlalte tabele ale
schemei. Elementele unui tablou imbricat sunt coninute ntr-un tabel de stocare separat, care conine
o coloan ce identific linia sau obiectul din tabelul printe din care face parte fiecare element.
Modalitatea este similar tabelelor printe - copil ale unei scheme relaionale.
Dac o coloan sau atribut dintr-un tabel relaional sau obiectual este de tip tablou imbricat,
atunci sistemul Oracle reine n acelai tabel de stocare toate valorile tabloului imbricat din tabelul
respectiv.
n atribuirile dintre colecii, sursa i inta trebuie s aib acelai tip de date. De asemenea,
obiectele ale cror tip de date sunt tipuri colecii nu pot fi comparate.
Dac este necesar s se stocheze doar un numr fix de elemente, s se parcurg elementele
ntr-o anumit ordine sau s se selecteze i s se prelucreze ntreaga colecie ca un ntreg, atunci se
recomand utilizarea unui vector.
Pentru eficien n accesarea coleciilor, prelucrarea unui numr arbitrar de elemente sau
executarea operaiilor de inserare, modificare i selectare n mas, este recomandat folosirea
tablourile imbricate. De asemenea, tablourile imbricate sunt utile atunci cnd nu exist o ordine
prestabilit a elementelor coleciei i este important interogarea eficient a elementelor individuale.
La crearea unui tip vector sau tablou imbricat nu se aloc spaiu de stocare, ci doar se reine
definiia tipului, care poate fi utilizat ulterior ca:
tip de date al unei coloane ntr-un tabel relaional;
atribut al unui tip obiect;
tip de date al unei variabile PL/SQL, parametru sau valoare returnat de o funcie.
Exemplu:
a) S se creeze un tip vector t_preturi care conine cel mult 10 preuri ce pot fi ataate unei
opere de art.
CREATE TYPE t_preturi AS VARRAY(10) OF NUMBER(12, 2);
/
b) S se creeze un tip tablou imbricat cu elemente de tip t_adresa. Tipul va fi utilizat pentru
stocarea coleciei de adrese a organizatorilor.
CREATE TYPE t_adrese_ti AS TABLE OF t_adresa;
/
c) S se nlocuiasc coloana adresa de tip t_adresa a tabelului obiect tab_organizatori, cu o
coloan adrese de tip t_adrese_ti care s conin mai multe adrese ale unui organizator. La crearea
tabelului tab_organizatori trebuie specificat tabelul de stocare (tstoc_adrese) asociat atributului
adrese. Acest tabel corespunde tuturor obiectelor de tip t_organizator stocate n cadrul tabelului
obiect.
ALTER TYPE t_organizator
DROP ATTRIBUTE adresa
Orientare pe obiecte n Oracle9i 49
CASCADE;
ALTER TYPE t_organizator
ADD ATTRIBUTE adrese t_adrese_ti
CASCADE;
DROP TABLE tab_organizatori;
CREATE TABLE tab_organizatori OF t_organizator
NESTED TABLE adrese STORE AS tstoc_adrese;
O modalitate convenabil de accesare a elementelor unui tablou imbricat n mod individual
este furnizat de un cursor imbricat (expresie CURSOR). n acest fel, valoarea unei coloane de tip
colecie poate fi transmis ca argument de tip REF CURSOR unui subprogram PL/SQL.
Exemplu:
S se listeze numele fiecrui organizator i adresele acestuia folosind o expresie CURSOR.
SELECT o.nume, CURSOR (SELECT * FROM TABLE (o.adrese))
FROM tab_organizatori o;
Exemplu:
S se creeze un tabel (stele), care conine o coloan denumit planete ce stocheaz colecia de
planete asociate fiecrei stele (tipul tablou imbricat t_planete_ti). La nivel de tabel trebuie specificate
clauze de stocare separate att pentru tabloul imbricat exterior planete, ct i pentru cel interior
sateliti.
CREATE TABLE stele (
nume VARCHAR2(20),
varsta NUMBER,
planete t_planete_ti)
NESTED TABLE planete STORE AS tstoc_planete
(NESTED TABLE sateliti STORE AS tstoc_sateliti);
Exemplul precedent poate face referire la tabloul imbricat interior (sateliti) prin nume,
deoarece acesta este un atribut al obiectului planete. Dac tabloul imbricat interior nu este un atribut
al unui obiect i nu are nume, atunci pentru a referi numele acestui tablou se folosete cuvntul cheie
COLUMN_VALUE.
Exemplu:
CREATE TYPE t_numere_ti AS TABLE OF NUMBER;
/
CREATE TYPE t_siruri_ti AS TABLE OF t_numere_ti;
/
CREATE TABLE tab (
data DATE,
rezultat t_siruri_ti)
NESTED TABLE rezultat STORE AS tstoc_rezultat
(NESTED TABLE COLUMN_VALUE STORE AS tstoc_colval);
Exemplu:
S se specifice atributele fizice pentru tabelele de stocare asociate coloanelor de tip colecie
planete i sateliti, utiliznd clauza NESTED TABLE.
DROP TABLE stele;
CREATE TABLE stele (
nume VARCHAR2(20),
varsta NUMBER,
planete t_planete_ti)
NESTED TABLE planete STORE AS tstoc_planete
((PRIMARY KEY (NESTED_TABLE_ID, nume))
ORGANIZATION INDEX COMPRESS
NESTED TABLE sateliti STORE AS tstoc_sateliti);
Fiecare tabel de stocare al unui tablou imbricat conine o coloan, referit prin
NESTED_TABLE_ID, care returneaz cheia nregistrrii corespunztoare liniei asociate din tabelul
printe. Dac un tabel printe este la rndul lui tablou imbricat (de exemplu planete) atunci el
conine dou coloane de tip identificator generate de sistem: una, referit prin NESTED_TABLE_ID,
care face legtura dintre liniile sale i liniile din propriul tabel printe, i o coloan ascuns referit
de coloana NESTED_TABLE_ID din tabelul imbricat copil.
n exemplul precendent, tabloul imbricat planete este organizat pe baz de index prin
adaugarea clauzei ORGANIZATION INDEX. De asemenea, el are asociat o cheie primar n care
prima coloan este NESTED_TABLE_ID. Aceast coloan conine identificatorul liniei din tabelul
Orientare pe obiecte n Oracle9i 51
printe cu care este asociat o linie dat din tabelul de stocare. Specificarea unei chei primare ce
conine NESTED_TABLE_ID i organizarea pe baz de index a tabelului determin sistemul s
grupeze fizic toate liniile tabloului imbricat care aparin aceleiai linii printe, obinndu-se un
acces mai rapid la informaii.
n funcie de tipul elementelor, vectorii pe mai multe niveluri sunt stocai ntr-unul din
urmtoarele moduri:
n cazul vectorilor de vectori, ntregul vector este stocat inline dac nu depete limita
superioar de 4000 octei sau dac se specific explicit stocarea lui sub form de LOB;
n cazul vectorilor de tablouri imbricate, ntregul vector este stocat sub form de LOB,
linia reinnd doar locatorul pentru obiectul LOB respectiv (nu exist tabele de stocare
asociate elementelor de tip tablou imbricate din vector, ntreaga colecie de tablouri
imbricate fiind stocat n cadrul vectorului).
Exemplu:
S se specifice explicit clauza de stocare sub form de obiect LOB pentru elementele de tip
vector ale unui tablou imbricat. Cuvntul cheie COLUMN_VALUE poate fi utilizat relativ la orice
colecie interioar fr nume (vector sau tablou imbricat).
CREATE TYPE t_numere_v AS VARRAY(10) OF NUMBER;
/
CREATE TYPE t_siruri_tiv AS TABLE OF t_numere_v;
/
CREATE TABLE tab_numere (
cod NUMBER,
rezultat t_siruri_tiv)
NESTED TABLE rezultat STORE AS tstoc_rez
(VARRAY COLUMN_VALUE STORE AS LOB numere_lob);
De asemenea, cuvintele cheie STORE AS LOB permit specificarea n mod explicit a stocrii
sub form de LOB pentru un tip vector de vectori.
CREATE TYPE t_siruri AS OBJECT (
a NUMBER,
b t_numere_v);
/
CREATE TYPE t_vv AS VARRAY(2) OF t_siruri;
/
CREATE TABLE tab_vv (
cod NUMBER,
doua_siruri t_vv)
VARRAY doua_siruri STORE AS LOB tab_vv_lob;
O instan a unui tip colecie se construiete asemntor cu o instan a unui tip obiect, prin
apelarea metodei constructor asociate. Numele metodei constructor coincide cu cel al tipului, iar
elementele coleciei apar n lista de argumente, delimitate prin virgul. Apelul unei metode
constructor cu o list vid de argumente creeaz o colecie vid. O colecie vid nu are elemente i nu
coincide cu o colecie care are valoarea null.
Exemplu:
Urmtorul exemplu apeleaz constructorul pentru colecia pe mai multe niveluri t_planete_ti.
52 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Acest tip este un tablou imbricat de obiecte de tip t_planeta, fiecare coninnd un tablou imbricat de
obiecte avnd tipul t_satelit. Constructorul tabloului imbricat exterior apeleaz constructorul
t_planeta pentru fiecare planet ce trebuie creat. Fiecare constructor t_planeta apeleaz constructorul
tipului tablou imbricat t_sateliti_ti, care, la rndul su, pentru fiecare instan obiect de tip t_satelit,
apeleaz constructorul asociat.
INSERT INTO stele
VALUES('Soare',23,
t_planete_ti(t_planeta('Neptun',10,
t_sateliti_ti(t_satelit('Proteus',67),
t_satelit('Triton',82))),
t_planeta('Jupiter',189,
t_sateliti_ti(t_satelit('Callisto',97),
t_satelit('Ganymede', 22)))));
Interogarea coleciilor
Exist dou metode generale de interogare a unui tabel care conine o coloan sau un atribut
de tip colecie. Prima returneaz coleciile imbricate integrate n cadrul liniilor rezultat, iar cealalt
distribuie colecia n aa fel nct fiecare element al acesteia s apar pe cte o linie.
Exemplu:
S se ataeze tipului creat anterior, t_autor, atributul articole de tip t_articole_ti, tablou
imbricat de elemente de tip t_articol. Coloana de tip colecie articole poate aprea n lista SELECT ca
orice alt coloan scalar, interogarea ei grupnd, n acest caz, elementele coleciei n linia rezultat cu
care este asociat.
CREATE TYPE t_articol AS OBJECT (
cod NUMBER,
titlu VARCHAR2(40),
data DATE);
/
CREATE TYPE t_articole_ti AS TABLE OF t_articol;
/
ALTER TYPE t_autor
ADD ATTRIBUTE (articole t_articole_ti)
CASCADE;
UPDATE tab_autori
SET articole = t_articole_ti (
t_articol(10, 'Despre bucurie', SYSDATE - 7),
t_articol(20, 'Vigilenta resentimentara', SYSDATE))
WHERE cod = 0;
Urmtoarea cerere returneaz numele fiecrui autor i colecia de articole asociat, prezentat
n format imbricat.
SELECT a.nume, a.articole
FROM tab_autori a;
NUME ARTICOLE(COD, TITLU, DATA)
----------- -------------------------------------------------Plesu
T_ARTICOLE_TI(T_ARTICOL(10, 'Despre bucurie',
'10-AUG-03'), T_ARTICOL(20, 'Vigilenta
resentimentara', '17-AUG-03'))
Orientare pe obiecte n Oracle9i 53
Rezultatele unei interogri sunt imbricate dac o coloan de tip obiect din lista SELECT
conine un atribut colecie (chiar dac acea colecie nu apare n lista SELECT). De exemplu, cererea
urmtoare produce un rezultat imbricat.
SELECT * FROM tab_autori;
v_sateliti_mari.EXTEND;
j := j + 1;
v_sateliti_mari(j) := p_sateliti(i);
END IF;
END LOOP;
RETURN v_sateliti_mari;
END;
/
b) S se obin lista stelelor care au planete cu satelii mari, mpreun cu numele i
diametrele sateliilor corespunztori.
SELECT s.nume, sm.nume, sm.diametru
FROM stele s, TABLE (s.planete) p,
TABLE (CAST (sateliti_mari (p.sateliti)
AS t_sateliti_ti)) sm;
Similar coleciilor simple, coleciile pe mai multe niveluri ce conin vectori permit doar
operaii globale la nivel de colecie.
Exemplu:
S se modifice pe seciuni o colecie pe mai multe niveluri pentru a redenumi satelitul Triton
al planetei Neptun. Noul nume este Thalia.
UPDATE TABLE(SELECT p.sateliti
FROM stele s, TABLE(s.planete) p
WHERE p.nume = 'Neptun') sat
SET VALUE(sat) = t_satelit('Thalia', 80)
WHERE sat.nume = 'Triton';
Expresia TABLE selecteaz tabloul imbricat ce conine sateliii planetei Neptun. Tabloul
imbricat returnat primete alias-ul sat, care este utilizat n cadrul clauzei SET pentru a referi valoarea
instanei ce va fi nlocuit (utiliznd funcia VALUE) i nu identificatorul obiect
(NESTED_TABLE_ID).
Exemplu:
Presupunnd c v_planete este o variabil de tip tablou imbricat de planete t_planete_ti, s se
insereze o nou stea avnd numele Aurora Boreal, vrsta 19 i planetele asociate date de variabila
v_planete.
DECLARE
v_planete t_planete_ti := NULL;
BEGIN
INSERT INTO stele VALUES ('Aurora Boreala', 19, v_planete);
END;
/
Urmtoarea comand modific tabelul stele setnd colecia de planete a stelei Aurora Boreal
la o valoare introdus de la tastatur. Dac se introduce o expresie valid pentru variabila de
substituie utilizat, atunci modificarea se realizeaz cu succes (de exemplu,
t_planete_ti(t_planeta('Pluto', 11, null))).
UPDATE stele s
SET s.planete = &v_planete
WHERE s.nume = 'Aurora Boreala';
Exemplu:
a) S se introduc o nou planet asociat stelei Soare. Planeta are numele Saturn, masa 65
i un singur satelit denumit Rea, cu diametrul 92.
INSERT INTO TABLE(
SELECT planete
FROM stele
WHERE nume = 'Soare') VALUES
('Saturn', 65, t_sateliti_ti( t_satelit('Rea', 92)));
b) S se asocieze planetei Jupiter un nou satelit, Miranda, cu diametrul 40. Expresia TABLE
din acest exemplu conine o subcerere care selecteaz tabloul imbricat interior pentru a putea specifica
inta comenzii INSERT.
INSERT INTO TABLE(SELECT p.sateliti
FROM TABLE(SELECT s.planete
Orientare pe obiecte n Oracle9i 57
FROM stele s
WHERE s.nume = 'Soare') p
WHERE p.nume = 'Jupiter')
VALUES ('Miranda', 40);
Tipuri i subtipuri
Un subtip poate fi derivat dintr-un supertip n mod direct sau indirect, prin intermediul mai
multor niveluri de extindere. Dintr-un supertip se pot deriva mai multe subtipuri, dar un subtip poate
fi derivat n mod direct dintr-un singur supertip. Cu alte cuvinte, sistemul Oracle permite doar
implementarea motenirii simpl, nu i a celei multiple.
Derivarea unui subtip dintr-un supertip se realizeaz prin definirea unei variante specializate a
supertipului. De exemplu, dintr-un tip t_organizator se poate deriva un tip t_org_particular i unul
t_org_de_stat. Fiecare dintre aceste subtipuri definesc tot un tip t_organizator, dar unul specializat.
Ceea ce face un subtip special i l distinge de supertipul printe este o schimbare asupra structurii
motenite de la tipul printe (modificarea sau adugarea de atribute sau metode).
Atributele i metodele unui tip obiect sunt elementele eseniale din specificaia lui. Dac
obiectul t_organizator are patru atribute cod, nume, telefon, adresa i metoda get_cod(), atunci tipul
obiect derivat din el va avea obligatoriu aceleai patru atribute i aceeai metod.
58 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
De asemenea, metodele pot fi declarate ca fiind finale sau nu. Dac o metod este final,
subtipurile nu pot s-i schimbe implementarea. Spre deosebire de tipuri, metodele sunt n mod
implicit nefinale i trebuie declarate explicit finale.
Exemplu:
S se creeze un tip nefinal care conine o funcie MEMBER final (combinaia invers nu are
sens).
CREATE TYPE tip AS OBJECT (,
MEMBER PROCEDURE afisare(),
FINAL MEMBER FUNCTION met(x NUMBER) )
NOT FINAL;
/
Crearea subtipurilor
Un tip poate avea mai multe subtipuri, iar acestea pot avea la rndul lor subtipuri. Un subtip
motenete toate atributele i metodele tipului printe direct (declarate sau motenite). Pentru a
defini un subtip se utilizeaz comanda CREATE TYPE specificnd n clauza UNDER printele
direct al subtipului.
Exemplu:
S se defineasc tipul t_artist care specializeaz tipul t_persoana. Deoarece t_artist este un
subtip al tipului t_persoana creat anterior, el motenete atributele cod i nume.
CREATE TYPE t_artist UNDER t_persoana (
cod_artist NUMBER,
an_nastere VARCHAR2(4),
an_moarte VARCHAR2(4),
nationalitate VARCHAR2(40));
/
Comanda care definete t_artist specializeaz tipul t_persoana, adugnd patru atribute.
Noile atribute declarate ntr-un subtip trebuie s aib nume diferite de numele oricrui atribut sau
metod declarate n supertipurile directe sau indirecte ale tipului respectiv.
Exemplu:
a) S se defineasc un subtip nefinal, t_autor, al tipului t_persoana.
CREATE OR REPLACE TYPE t_autor UNDER t_persoana (
cod_autor NUMBER,
ocupatie VARCHAR2(30),
descriere VARCHAR2(200))
NOT FINAL;
b) S se creeze un subtip, t_jurnalist, al tipului t_autor definit anterior. Pe lng atributele
motenite de la tipul t_autor, acesta declar dou noi atribute, functie i loc_munca.
CREATE TYPE t_jurnalist UNDER t_autor (
functie VARCHAR2(20),
loc_munca VARCHAR2(30));
/
SQL> desc t_jurnalist
t_jurnalist extends STUDENT.T_AUTOR
Nume Nul? Tip
----------- ---- --------------
COD NUMBER
60 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
NUME VARCHAR2(50)
COD_AUTOR NUMBER
OCUPATIE VARCHAR2(30)
DESCRIERE VARCHAR2(200)
FUNCTIE VARCHAR2(20)
LOC_MUNCA VARCHAR2(30)
Un tip este declarat neinstaniabil utiliznd clauza NOT INSTANTIABLE. Un tip neinstaniabil
este un fel de container. Dac tipul nu este instaniabil, el nu are constructor (nici implicit, nici definit
de utilizator) i nu se pot crea instane ale tipului respectiv. n limbajul Java, noiunea corespondent
este cea de clas abstract. Aceast opiune este util atunci cnd dou entiti au atribute comune care
pot fi implementate n cadrul unui tip printe al unei ierarhii, dar aceste atribute nu sunt suficiente
pentru instanierea de obiecte.
Exemplu:
Utiliznd tipuri obiect, s se reprezinte dou categorii de piese (rotund i dreptunghiular)
caracterizate de un nucleu de atribute i metode comune.
CREATE TYPE t_piesa AS OBJECT (
cod NUMBER,
tip VARCHAR2(10),
NOT INSTANTIABLE MEMBER FUNCTION suprafata RETURN NUMBER)
NOT INSTANTIABLE
NOT FINAL;
/
CREATE TYPE t_piesa_rotunda UNDER t_piesa (
diametru NUMBER,
OVERRIDING MEMBER FUNCTION suprafata RETURN NUMBER);
/
CREATE TYPE t_piesa_dreptunghiulara UNDER t_piesa (
latime NUMBER,
lungime NUMBER,
OVERRIDING MEMBER FUNCTION suprafata RETURN NUMBER);
/
Nu este permis crearea obiectelor de tip t_piesa pentru care nu sunt specificate clar
dimensiunile (lime i lungime pentru cea dreptunghiular i diametru pentru cea rotund). De aceea,
tipul printe comun este neinstaniabil.
Metodele pot fi i ele neinstaniabile. Similar tipurilor neinstaniabile, opiunea
corespunztoare este util atunci cnd dou tipuri trebuie s implementeze n mod diferit o metod
comun i obligatorie.
Un tip care conine o metod neinstaniabil trebuie s fie neinstaniabil. n exemplul anterior,
funcia suprafata din tipul neinstaniabil t_piesa este i ea neinstaniabil. Deci, definiiile corpurilor
tipurilor instaniabile t_piesa_rotunda i t_piesa_dreptunghiulara trebuie s conin o implementare
pentru aceast metod.
Exemplu:
S se defineasc o ierarhie cu tipul rdcin forma_geometrica i subtipurile dreptunghi i
cerc. Tipul printe este nefinal i neinstaniabil, iar subtipurile sale, dreptunghi i cerc, sunt finale.
CREATE TYPE forma_geometrica AS OBJECT (
tip VARCHAR2(20),
NOT INSTANTIABLE MEMBER FUNCTION aria RETURN NUMBER,
NOT INSTANTIABLE MEMBER FUNCTION perimetru RETURN NUMBER)
Orientare pe obiecte n Oracle9i 61
NOT INSTANTIABLE
NOT FINAL;
/
CREATE TYPE dreptunghi UNDER forma_geometrica (
lung NUMBER,
lat NUMBER,
OVERRIDING MEMBER FUNCTION aria RETURN NUMBER,
OVERRIDING MEMBER FUNCTION perimetru RETURN NUMBER);
/
CREATE TYPE BODY dreptunghi AS
OVERRIDING MEMBER FUNCTION aria RETURN NUMBER IS
BEGIN
RETURN SELF.lung * SELF.lat;
END;
OVERRIDING MEMBER FUNCTION perimetru RETURN NUMBER IS
BEGIN
RETURN 2 * (SELF.lung + SELF.lat);
END;
END;
/
SELECT dreptunghi('PATRULATER',20, 10).aria()
FROM DUAL;
CREATE TYPE cerc UNDER forma_geometrica (
raza NUMBER,
OVERRIDING MEMBER FUNCTION aria RETURN NUMBER,
OVERRIDING MEMBER FUNCTION perimetru RETURN NUMBER);
/
CREATE OR REPLACE TYPE BODY cerc AS
OVERRIDING MEMBER FUNCTION aria RETURN NUMBER IS
pi NUMBER := 3.1415;
BEGIN
RETURN SELF.raza * SELF.raza * pi;
END;
OVERRIDING MEMBER FUNCTION perimetru RETURN NUMBER IS
pi NUMBER := 3.1415;
BEGIN
RETURN 2 * SELF.raza * pi;
END;
END;
/
SELECT cerc('CIRCULARA',10).perimetru()
FROM dual;
Dac un subtip nu asigur o rescriere instaniabil pentru fiecare metod neinstaniabil
motenit, subtipul trebuie n mod obligatoriu s fie neinstaniabil. Un subtip instaniabil poate fi
extins dintr-un supertip neinstaniabil, dar nu invers.
Comanda ALTER TYPE permite modificarea unui tip din instaniabil n neinstaniabil, i
reciproc. De exemplu, urmtoarea comand modific tipul t_exemplu s fie instaniabil:
ALTER TYPE t_exemplu INSTANTIABLE;
Un tip instaniabil poate fi modificat astfel nct s fie neinstaniabil doar dac nu exist nici o
coloan, vizualizare, tabel sau instan obiect care s l refere n mod direct sau indirect prin
intermediul unui tip sau subtip dependent (practic, dac nu s-a definit nici o instan a lui).
62 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Nerespectarea aceastei reguli determin apariia erorii ORA-22327: cannot change a type to NOT
INSTANTIABLE if it has dependent tables.
Nu este permis definirea de tipuri neinstaniabile finale, deoarece acestea nu pot fi folosite
ulterior (sistemul returneaz eroarea de compilare PLS-00614: creating a FINAL NOT
INSTANTIABLE type).
BEGIN
v.procedura (SYSDATE);
--v_procedura ('text'); --incorect, genereaza eroare
w.procedura (SYSDATE);
w.procedura ('text');
END;
/
Redefinirea unei metode motenite pentru a-i particulariza comportamentul ntr-un subtip se
numete suprascriere (overriding). Pentru a semnala c o metod este suprascris, se utilizeaz
cuvntul cheie OVERRIDING n cadrul definiiei tipului i a corpului acestuia.
Exemplu:
Tipul forma_geometrica poate conine o metod afiseaza(). Aceasta va fi suprancrcat n
cadrul subtipului dreptunghi astfel nct s primeasc i s afieze un parametru de tip ir de caractere,
p_notatie. Se va adauga noua metod n cadrul tipului forma_geometrica, i se va da o implementare
fr parametri i apoi va fi suprancrcat n subtipul dreptunghi. n final, se prezint o modalitate de
testare.
ALTER TYPE forma_geometrica
ADD MEMBER PROCEDURE afiseaza
CASCADE;
CREATE TYPE BODY forma_geometrica AS
MEMBER PROCEDURE afiseaza IS
BEGIN
DBMS_OUTPUT.PUT_LINE (' Forma geometrica de tip: '
|| SELF.tip);
END;
END;
/
ALTER TYPE dreptunghi
ADD MEMBER PROCEDURE afiseaza(p_notatie VARCHAR2);
CREATE OR REPLACE TYPE BODY dreptunghi AS
OVERRIDING MEMBER FUNCTION aria RETURN NUMBER IS
BEGIN
RETURN SELF.lung * SELF.lat;
END;
OVERRIDING MEMBER FUNCTION perimetru RETURN NUMBER IS
BEGIN
RETURN 2 * (SELF.lung + SELF.lat);
END;
-- pana aici nimic schimbat
MEMBER PROCEDURE afiseaza(p_notatie VARCHAR2) IS
BEGIN
SELF.afiseaza();
DBMS_OUTPUT.PUT_LINE('Notatia:' || p_notatie);
DBMS_OUTPUT.PUT_LINE('*********');
DBMS_OUTPUT.PUT_LINE('* *');
DBMS_OUTPUT.PUT_LINE('*********');
END;
END;
/
DECLARE
64 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
invoc o metod MEMBER a unei instane obiect sau o metod static a unui tip, atunci este utilizat
implementarea definit sau motenit de acel tip.
De exemplu, dac inst este o instan obiect a unui tip (tip) extins din alt tip (tip_super) i care
are un subtip (tip_sub), atunci apelul inst.met() caut mai nti o implementare a metodei met()
definit n tipul tip. Dac aceasta nu exist, caut pe nivelul superior, deci n supertip. Faptul c
tip_sub definete i el o implementare nu este relevant deoarece ierarhia tipurilor este parcurs de jos
n sus, ctre nivelurile superioare. Subtipurile tipului curent nu prezint interes n acest caz. n mod
similar, un apel ctre o metod static tip.met_stat() declaneaz cutarea mai nti n tip i apoi, dac
mai este necesar, n supertipurile lui tip. Subtipul tip_sub nu este parcurs.
/
O instan a tipului t_sursa conine titlul i autorul, care este de tip t_persoana sau de orice alt
subtip al tipului t_persoana. Urmtorul exemplu specific un autor de tip t_artist:
SELECT t_sursa('Noa Noa',
t_artist(12345, 'Gaugain', 123, '1839', '1906', 'franceza'))
FROM dual;
Coloanele i liniile obiect sunt n mod implicit substituibile. Cu alte cuvinte, o coloan sau
linie de tip obiect t poate conine instane ale tipului t sau ale oricruia dintre subtipurile sale.
Exemplu:
Se consider ierarhia t_persoana cu subtipurile t_autor i t_artist. Tipul t_autor are la rndul
lui un subtip t_jurnalist. Un tabel obiect de tip t_persoana poate conine linii de tip t_persoana sau de
unul dintre subtipurile acestuia. Pentru a introduce un autor de un tip dat se utilizeaz, n clauza
VALUES a comenzii INSERT, constructorul specific tipului respectiv.
CREATE TABLE tab_persoane OF t_persoana;
INSERT INTO tab_persoane
VALUES (t_persoana (15, 'Georgescu'));
INSERT INTO tab_persoane
VALUES (t_autor (25, 'Irving Stone', 125, 'scriitor', NULL));
INSERT INTO tab_persoane
VALUES (t_jurnalist (35, 'Simona Popescu', 135, 'jurnalist',
NULL, 'redactor', 'Dilema'));
n mod similar se lucreaz ntr-un tabel sau vizualizare relaional pentru o coloan
subtituibil de tip t_persoana. Urmtorul exemplu insereaz n tabelul relaional tab_surse informaii
despre o persoan, un autor i un jurnalist.
CREATE TABLE tab_surse OF t_sursa;
INSERT INTO tab_surse
VALUES('Cronica de azi', t_persoana(15, 'Georgescu'));
INSERT INTO tab_surse
VALUES('Agonie si extaz', t_autor (25, 'Irving Stone', 125,
'scriitor', NULL));
INSERT INTO tab_surse
VALUES('Expozitii', t_jurnalist (35, 'Simona Popescu', 135,
'jurnalist', NULL, 'redactor', 'Dilema'));
n general, atributele pot fi accesate utiliznd notaia cu punct. n cazul atributelor unui subtip
al tipului declarat, se utilizeaz funcia TREAT.
Exemplu:
ntr-o vizualizare obiect viz_surse de tip t_sursa (n care coloana autor conine instane ale
oricrui tip din ierarhia cu rdcina t_persoana), se poate utiliza funcia TREAT mpreun cu
predicatul IS OF TYPE (ONLY) pentru a afia titlurile tuturor crilor i informaiile legate numai de
autorii de tip t_artist.
INSERT INTO tab_surse
VALUES ('Noa Noa', t_artist(12345, 'Gaugain', 123, '1839',
'1906', 'franceza'));
CREATE VIEW viz_surse OF t_sursa
AS SELECT * FROM tab_surse;
Orientare pe obiecte n Oracle9i 67
Exemplu:
Pentru a ilustra atribuirea prin lrgire, se consider urmtorul tabel.
CREATE TABLE tabel(
perscol t_persoana,
artcol t_artist,
autcol t_autor);
INSERT INTO tabel (perscol, artcol, autcol)
VALUES (t_persoana (15, 'Georgescu'),
t_artist (20, 'Peter Breugel', 11, '1457', NULL, NULL),
t_autor (25, 'Irving Stone', 125, 'scriitor', NULL));
Urmtorul exemplu folosete atribuirea prin lrgire. Instruciunile sunt valide doar dac
perscol este substituibil.
n SQL:
UPDATE tabel
SET perscol = artcol;
n PL/SQL:
DECLARE
var1 t_persoana;
var2 t_artist;
BEGIN
var1 := var2;
END;
/
Dac este necesar o substituire n sensul invers celui obinuit (o valoare de un anumit tip s
fie considerat de un supertip al tipului declarat), atunci se poate utiliza procesul reciproc, de lrgire
(narrowing). Acesta implic tratarea unui obiect de un tip mai general (de exemplu, t_persoana), ca
fiind de un tip specializat (de exemplu, t_artist). Nu toate persoanele sunt artiti, astfel nct o
atribuire n care tipul variabilei int este t_artist i tipul obiectului surs este t_persoana funcioneaz
doar dac obiectul respectiv este de tip t_artist.
Pentru a face o atribuire prin limitare, trebuie utilizat funcia TREAT care convertete n mod
explicit valorea surs la tipul specializat al variabilei sau coloanei int. Funcia TREAT verific dac
schimbarea poate fi fcut, la momentul execuiei, dup care fie realizeaz conversia i returneaz o
expresie de tipul specificat n opiunea AS, fie returneaz valoarea null dac valoarea surs nu este de
tipul int sau de un subtip al acestuia.
Exemplu:
S se atribuie coloanei perscol de tip t_persoana valorile coloanei artcol de tip t_artist.
Pentru fiecare valoare din coloana perscol, atribuirea se face cu succes doar dac persoana respectiv
este artist. n caz contrar, funcia TREAT returneaz valoarea null.
UPDATE tabel
SET artcol = TREAT (perscol AS t_artist);
Urmtoarea comand ncearc s fac o atribuire prin limitare fr a schimba n mod explicit
tipul valorii surs, ceea ce nu este permis. Comanda va determina apariia erorii ORA-00932:
inconsistent datatypes: expected STUDENT.T_ARTIST got STUDENT.T_PERSOANA.
UPDATE tabel
SET artcol = perscol;
n atribuirile expresiilor de tip colecie, tipul elementelor corespunztoare tipului surs i inta
70 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
trebuie s fie acelai. La nivel de colecie, nu sunt permise nici atribuiri prin lrgire i nici prin
limitare. Evident ns, c atribuirile de la nivelul elementelor unei colecii respect regulile de
substituibilitate prezentate anterior.
Exemplu:
S se creeze dou tipuri tablou imbricat cu elemente de tip t_persoana, respectiv t_autor.
Atribuirea dintre dou expresii colecie de tipuri diferite nu este permis, dar se poate realiza
substituirea la nivel de element (elem2 este utilizat n constructorul tipului colecie t_lista_persoane,
realizndu-se n acest fel la nivel de element, un proces de lrgire).
CREATE TYPE t_lista_persoane AS
TABLE OF t_persoana;
/
CREATE TYPE t_lista_autori AS
TABLE OF t_autor;
/
DECLARE
var1 t_lista_persoane;
var2 t_lista_autori;
elem1 t_persoana;
elem2 t_autor;
BEGIN
--var1 := var2; /*NEPERMIS - colectiile nu au acelasi tip */
var1 := t_lista_persoane (elem1, elem2);
/*PERMIS - elem2 este de un subtip al tipului declarat */
END;
/
END;
/
SELECT titlu, s.autor.cod, s.autor.nume
FROM tab_surse s
ORDER BY autor.map_cod();
72 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Exemplu:
a) S se listeze numele, tipul i tipul dependenei pentru obiectele schemei care depind de
tipul t_artist.
SELECT NAME, TYPE, REFERENCED_NAME, DEPENDENCY_TYPE
FROM USER_DEPENDENCIES
WHERE UPPER(REFERENCED_NAME) = 'T_ARTIST';
b) S se afieze pentru fiecare tip definit de utilizator numele acestuia i numrul de versiuni
definite pn la momentul curent.
SELECT TYPE_NAME, COUNT(DISTINCT VERSION#)
FROM USER_TYPE_VERSIONS
GROUP BY TYPE_NAME;
relativ la o coloan, respectiv atribut de tip obiect, sunt recompilate pe baza ultimei versiuni a tipului.
Dac revalidarea eueaz, atunci i compilarea blocului PL/SQL eueaz.
Clauza DEBUG se folosete pentru a impune compilatorului PL/SQL s genereze i s
stocheze codul n vederea utilizrii lui de ctre depanatorul PL/SQL.
Clauza REPLACE AS OBJECT permite adugarea de noi specificaii pentru atribute i
metode. Se poate redefini ntreg tipul obiect n mod similar unei comenzi CREATE TYPE. Aceast
clauz este valid doar pentru tipurile obiect, nu i pentru tipurile colecii.
n aceeai comand ALTER TYPE se pot aduga, terge sau modifica mai multe atribute sau
metode, dar fiecare atribut sau metod poate aprea o singur dat. n cazul adugrii sau tergerii
unei metode, sistemul dezafecteaz orice index bazat pe funcii care depinde de acel tip. Adugarea de
metode sau atribute nu trebuie s intre n conflict cu cele deja existente n ierarhia de tipuri.
O metod motenit nu poate fi tears dintr-un subtip, ea trebuie eliminat direct din
supertipul care o definete sau o suprascrie. Dac metoda eliminat nu este suprascris n subtipuri,
eliminarea ei se realizeaz utiliznd opiunea CASCADE i determin tergerea metodei att din tipul
int ct i din toate subtipurile acestuia.
Dac o metod este suprascris n cadrul subtipurilor, atunci operaia de tergere a acesteia
eueaz, iar comanda de modificare este anulat. Pentru ca operaia de eliminare cu propagare a
schimbrilor s se execute cu succes, este necesar ca mai nti s fie eliminate toate suprascrierile
metodei din subtipuri i abia apoi, s fie eliminat metoda din tipul care o definete.
Clauza ADD ATTRIBUTE permite adugarea unui nou atribut. Numele atributului trebuie s
nu intre n conflict cu atributele sau metodele ierarhiei din care face parte tipul modificat. Sistemul
adaug noul atribut la sfritul listei de atribute definite local. Dac se adaug un atribut unui supertip,
atunci acesta este motenit de toate subtipurile sale. n subtipuri, atributele motenite preced
ntotdeauna atributele declarate. Deci, n urma unei operaii de adugare a unor atribute asupra unui
tip care deine subtipuri, este posibil s fie necesar actualizarea unor operaii asociate subtipurilor (de
exemplu, se pot modifica apelurile constructorilor asociai acestora).
Dac se elimin un atribut prin intermediul clauzei DROP ATTRIBUTE, atunci sistemul
Oracle suprim coloana corespunztoare atributului, toi indecii, statisticile i constrngerile
(inclusiv cele de integritate referenial) care fac referire la atributul respectiv.
Restriciile cu privire la eliminarea atributelor presupun c:
nu se poate elimina un atribut motenit de la un supertip (el trebuie ters din supertip i n
acest fel, n urm propagrii schimbrilor, va fi eliminat i din subtip);
nu se poate elimina un atribut care face parte dintr-o cheie de partiionare, subpartiionare
sau din cheia unei grupri;
nu este permis eliminarea unui atribut care face parte dintr-un identificator obiect bazat
pe cheia primar a unui tabel obiect sau dintr-o cheie primar a unui tabel organizat pe
baz de index;
nu se pot terge toate atributele unui tip rdcin, ci trebuie ters tipul n ntregime (se pot
terge ns, toate atributele definite local ale unui subtip pentru c acesta tip motenete
toate atributele de la supertipul su i deci numrul de atribute nu se reduce la zero).
Modificarea tipului de date al unui atribut scalar existent se face folosind clauza MODIFY
ATTRIBUTE. De exemplu, se poate mri lungimea unui atribut de tip VARCHAR2 sau precizia i
domeniul unui atribut numeric. Nu se poate mri dimensiunea unui atribut referit ntr-un index bazat
pe funcie, index de domeniu sau cheie a unei grupri.
Exemplu:
Orientare pe obiecte n Oracle9i 75
Tipul t_persoana conine atributele cod de tip NUMBER i nume de tip VARCHAR2(50). S
se adauge un atribut corespunztor codului numeric personal (cnp) i altul referitor la nlime
(inaltime). S se elimine atributul cod i s se mreasc dimensiunea numelui pn la 60 de caractere.
ALTER TYPE t_persoana
ADD ATTRIBUTE (cnp VARCHAR2(13)),
DROP ATTRIBUTE cod,
ADD ATTRIBUTE inaltime NUMBER(3,2),
MODIFY ATTRIBUTE nume VARCHAR2(60)
CASCADE;
Urmtoarea comand ALTER TYPE, care face mai multe modificri aceluiai atribut, este
incorect i returneaz eroarea PLS-00716: Attribute/method 'CULOARE_OCHI' can occur only
once in an ALTER TYPE statement.
ALTER TYPE t_persoana
ADD ATTRIBUTE (greutate INTEGER, culoare_ochi VARCHAR2(15)),
DROP ATTRIBUTE culoare_ochi
CASCADE;
Dac se schimb proprietatea FINAL a unui tip, atunci este obligatorie clauza de dependen
CASCADE pentru a determina convertirea datelor din toate coloanele i tabelele dependente. n acest
caz, nu este permis amnarea conversiei datelor cu opiunea NOT INCLUDING TABLE DATA.
Evident c un tip care are deja subtipuri definite nu poate fi schimbat din NOT FINAL n FINAL.
Dac se face modificarea proprietii FINAL n NOT FINAL, acest lucru necesit conversia
obiectelor schemei care sunt dependente de tipul respectiv. n acest caz i n eventualitatea crerii de
subtipuri instaniabile, coloanele i tabelele obiect necesit o nou coloan care s stocheze
identificatorul de tip.
La iniierea unei astfel de comenzi pot aprea dou situaii.
Dac trebuie s fie create noi tabele i coloane substituibile de tipul respectiv, dar datele
dependente deja existente nu trebuie s fie substituibile, atunci se specific clauza
CASCADE INCLUDING TABLE DATA. Sistemul marcheaz toate coloanele i tabelele
dependente NOT SUBSTITUTABLE AT ALL LEVELS, astfel nct nu se vor putea insera
instane ale viitoarelor subtipuri asociate tipului modificat, n coloanele sau tabelele
existente la momentul schimbrii.
Dac schimbarea trebuie s fie reflectat de toate coloanele i tabelele dependente (att
cele existente la momentul modificrii ct i cele viitoare), atunci se utilizeaz clauza
CASCADE CONVERT TO SUBSTITUTABLE. Sistemul marcheaz toate coloanele i
tabelele existente cu SUBSTITUTABLE AT ALL LEVELS, cu excepia celor care sunt
marcate explicit nesubstituibile.
Proprietatea unui tip de a fi instaniabil indic dac pot fi construite instane ale tipului
respectiv. Evident c nu se poate schimba un tip obiect din INSTANTIABLE n NOT INSTANTIABLE
dac exist deja instane de acel tip.
Comportamentul implicit al unei comenzi ALTER TYPE fr clauze pentru dependen
(CASCADE, INVALIDATE) este de a verifica dac exist vreun obiect dependent. Dac exist astfel
de obiecte comanda este abandonat cu eroarea ORA-22312: must specify either CASCADE or
INVALIDATE option.
76 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
10
Clauza este obligatorie dac datele coloan sunt n formatul imagine Oracle8 sau schimbarea ce se face asupra tipului este
de la FINAL la NOT FINAL.
Orientare pe obiecte n Oracle9i 77
constructorului trebuie modificat astfel nct s specifice o valoare pentru acel atribut. Dac se adaug
o nou metod, atunci corpul tipului trebuie nlocuit i adugat o implementare pentru acea metod
(utiliznd comanda CREATE OR REPLACE TYPE BODY). Nu este disponibil o comand ALTER
TYPE BODY pentru modificarea corpului unui tip.
anul_nasterii VARCHAR2(4),
anul_mortii VARCHAR2(4),
nationalitate VARCHAR2(40),
observatii VARCHAR2(2000),
opere t_opere_ti);
/
Metoda 2:
CREATE TYPE t_artist AS OBJECT (
nume VARCHAR2(30),
prenume VARCHAR2(30),
anul_nasterii VARCHAR2(4),
anul_mortii VARCHAR2(4),
nationalitate VARCHAR2(40),
observatii VARCHAR2(2000),
opere t_opere_ti);
/
CREATE TYPE t_opera_de_arta AS OBJECT (
cod_opera NUMBER,
tip VARCHAR2(10),
titlu VARCHAR2(200),
artist REF t_artist,
data_crearii DATE,
data_achizitiei DATE,
valoare NUMBER);
/
CREATE TYPE t_opere_ti AS TABLE OF t_opera_de_arta;
/
ALTER TYPE t_artist COMPILE;
Aceaste secvene de comenzi creeaz un set de tipuri mutual dependente.
Utiliznd prima metod, se observ c tipul t_artist este definit de dou ori. Prima comand
este o declaraie incomplet, necesar pentru definirea atributului de tip referin artist al tipului
t_opera_de_arta. Declaraia este incomplet pentru c se omite specificarea structurii i a
comportamentului. Acestea sunt specificate ulterior, n declaraia complet, tipul t_artist devenind
funcional. Declaraia incomplet asigur compilarea cu succes a tipului t_opera_de_arta.
Fr declararea tipului t_artist ca fiind tip incomplet, comanda de creare a tipului
t_opera_de_arta ar fi returnat erori de compilare. n metoda a doua, dei sistemul realizeaz operaia
de creare, din cauza erorilor de compilare tipul t_artist este marcat automat ca fiind tip obiect
incomplet. Existena acestui tip determin compilarea fr erori a tipurilor t_opere_ti i t_artist. Dup
crearea tipurilor complete ce l utilizeaz (t_opere_ti i, indirect, t_opera_de_arta), tipul t_artist este
recompilat fr erori i devine un tip complet.
Un tip incomplet poate fi definit n urmtoarele dou situaii:
n mod explicit de ctre utilizator, atunci cnd comanda de creare a tipului stabilete doar
un nume pentru tip, omind definirea structurii i comportamentului acestuia;
n mod implicit de ctre sistem, atunci cnd la crearea unui tip apar erori de compilare i
tipul este creat fr a i se asocia o structur i un comportament valid.
Pentru a completa un tip incomplet, se execut comanda CREATE TYPE n care se specific
Orientare pe obiecte n Oracle9i 83
atributele i metodele tipului. Completarea unui tip incomplet se face dup ce au fost create toate
tipurile care fac referire la el. Aceast operaie determin recompilarea lui i permite sistemului s
elibereze eventualele blocri. Dac la crearea unui tip, acesta refer tipuri care nu exist (nici mcar
declarate incomplet), atunci tipul este creat, dar cu erori de compilare (este afiat mesajul Warning:
Type created with compilation errors).
Tehnica tipurilor incomplete permite crearea de tipuri care conin atribute referin ctre un
subtip planificat, dar care nu a fost creat nc. Pentru aceasta, mai nti se creeaz subtipul ca tip
incomplet, urmnd s fie completat ulterior.
Odat ce un tip obiect este declarat incomplet, el trebuie s fie completat ulterior ca tip obiect.
Nu se poate, de exemplu, s fie declarat ulterior ca tip colecie. Singura alternativ, n eventualitatea
acestei necesiti, este eliminarea tipului i recrearea lui.
Dac un tip a fost creat cu erori de compilare i se ncearc executarea unei operaii asupra
lui, cum ar fi crearea de tabelele obiect sau instanierea unor obiecte de tipul respectiv, este posibil s
apar eroarea Recompile type <nume_tip> before attempting this operation. n acest caz tipul
trebuie s fie recompilat manual, prin intermediul unei comenzi ALTER TYPECOMPILE.
Un tabel sau o coloan substituibil de tip obiect este dependent nu numai de tipul su, ci i
de subtipurile acestuia. Pentru fiecare atribut adugat ntr-un subtip al unui tip care este utilizat ntr-un
tabel, se introduce cte o coloan ascuns. Aceste coloane ascunse sunt adugate chiar i atunci cnd
tabelul sau coloana substituibil nu conine date pentru acel subtip.
De exemplu, un tabel obiect substituibil de tip t_persoana este dependent nu numai de acest
tip, dar i de subtipurile asociate, t_autor, t_jurnalist sau t_artist.
Exemplu:
Se consider tipul t_autor i subtipul acestuia t_jurnalist. S se creeze tabelul obiect
substituibil tab_autori, care s nu conin obiecte de tip t_jurnalist. S se insereze o nregistrare de tip
t_autor i apoi s se elimine tipul t_jurnalist.
CREATE TABLE tab_autori OF t_autor;
INSERT INTO tab_autori
VALUES (t_autor(1,'Dan Mihailescu',10,'critic','literar'));
COMMIT;
--DROP TYPE t_jurnalist
--returneaza eroarea ORA-02303
DROP TYPE t_jurnalist VALIDATE;
Dac se ncearc tergerea unui subtip avnd obiecte dependente, atunci comanda DROP
TYPE returneaz eroarea ORA-02303: cannot drop or replace a type with type or table dependents
i nu se execut. De exemplu, ncercarea de a terge tipul t_autor va genera o eroare, deoarece acest
tip este dependent de tabelul tab_persoane i de tipul t_jurnalist.
Dac exist tabele sau coloane dependente, dar care nu conin date de tipul eliminat, se poate
folosi cuvntul cheie VALIDATE, care face ca sistemul s verifice instanele existente ale tipului
respectiv i s tearg tipul doar dac nu a gsit date dependente. n acest caz, coloanele ascunse
asociate cu atributele unice ale tipului ters sunt, la rndul lor, eliminate. Utilizarea opiunii
VALIDATE este recomandat mereu, att la modificarea, ct i la tergerea subtipurilor.
84 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Exemplu:
Se consider c utilizatorul student deine obiectele create pe parcursul acestui capitol. S se
creeze doi utilizatori (student1, student2) care dein role-urile CONNECT i RESOURCE.
CREATE USER student1 IDENTIFIED BY parola1;
GRANT RESOURCE TO student1;
GRANT CONNECT TO student1;
--.. ceilalalt utilizator se creeaza asemanator
CONNECT student/oracle@instantaBD;
Utilizatorul student acord urmtoarele privilegii obiect utilizatorului student1 asupra tipurilor
t_adresa i t_autor, definite anterior.
GRANT EXECUTE ON t_adresa TO student1;
GRANT EXECUTE ON t_autor TO student1 WITH GRANT OPTION;
Utilizatorul student1 execut urmtoarele comenzi LDD.
CONNECT student1/parola1@instantaBD;
CREATE TABLE tab_adrese OF student.t_adresa;
CREATE TYPE t_adrese_ti AS TABLE OF student.t_adresa;
/
CREATE TYPE t_lansare_de_carte AS OBJECT (
data DATE,
titlu VARCHAR2(20),
autor student.t_autor);
/
CREATE TABLE tab_autori OF student.t_autor;
De asemenea, student1 are posibilitatea de a acorda mai departe altor utilizatori privilegii
asupra obiectelor care folosesc tipul t_autor, deoarece are privilegiul EXECUTE asupra acestuia, cu
opiunea WITH GRANT OPTION. n schimb, asupra tipului t_adresa nu a fost acordat privilegiul cu
aceeai opiune. De aceea, asupra obiectelor care l utilizeaz nu se pot acorda privilegii altor
utilizatori n acest caz, sistemul returneaz eroarea ORA-01720: grant option does not exist for
'<nume_utilizator>.<nume_tip>'.
GRANT SELECT ON tab_autori TO student2;
GRANT EXECUTE ON t_lansare_de_carte TO student2;
-- Returneaza eroarea ORA-01720
GRANT EXECUTE ON t_adrese_ti TO student2;
GRANT SELECT ON tab_adrese TO student2;
Utilizatorul student2 poate executa cu succes comenzi care acceseaz i folosesc tipurile i
tabelele din schema student1.
CREATE TYPE t_carte AS OBJECT(
nume VARCHAR2(20),
domeniu VARCHAR2(10),
lansare student1.t_lansare_de_carte);
/
CREATE TABLE tab_carti OF t_carte;
Pentru accesul la tipuri obiect se utilizeaz doar privilegiile EXECUTE i UNDER, dar
tabelele obiect folosesc toate privilegiile de acces disponibile pentru tabelele relaionale.
Privilegiile referitoare la un tabel obiect sunt:
86 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
SELECT, care permite accesul la valorile atributelor pentru obiectele stocate n liniile
tabelului;
UPDATE, care permite modificarea atributelor obiectelor utilizate n cadrul tabelului;
INSERT, care permite adugarea de noi obiecte n tabel;
DELETE, care permite eliminarea de obiecte din tabel.
Privilegiile care coordoneaz accesul la coloanele obiect ale unui tabel sunt similare celor la
nivel de tabel. Operaia de selectare a anumitor coloane ale unui tabel obiect nu necesit privilegii
asupra tipurilor obiect utilizate n cadrul tabelului. n schimb, pentru selectarea unei ntregi linii obiect
trebuie privilegii de acces la structura tipului obiect referit (EXECUTE). Nu este permis definirea de
privilegii la nivel de coloan (respectiv, atribut) asupra tabelelor obiect.
Exemplu:
Se consider tipul t_artist definit anterior, care conine un atribut de tip tablou imbricat
(t_opere_ti), i tabelul obiect tab_artisti asociat. Interogrile care urmeaz se execut folosind un set
diferit de privilegii:
CREATE TABLE tab_artisti OF t_artist
NESTED TABLE opere STORE AS ts_opere;
INSERT INTO tab_artisti VALUES
('Rodin', 'Auguste', '1840', '1917', 'franceza', NULL, NULL);
SELECT VALUE(a)
FROM tab_artisti a;
SELECT nume||' '||prenume||
'('||anul_nasterii||'-'||anul_mortii||')'
FROM tab_artisti;
Pentru ambele cereri, sistemul verific existena privilegiului SELECT asupra tabelului
tab_artisti. n cadrul primei cereri, pentru a interpreta datele, utilizatorul trebuie s obin informaii
despre structura tipului. De aceea, atunci cnd cererea acceseaz tipul, sistemul verific i privilegiul
EXECUTE. Execuia celei de-a doua cereri, nu implic tipuri n mod explicit, aa c privilegiile
asupra tipului t_artist nu sunt verificate.
Exemplu:
Utiliznd schema din seciunea precedent, student2 poate executa urmtoarele cereri.
SELECT aut.cod_autor
FROM student1.tab_autori aut;
SELECT c.lansare.autor.nume
FROM tab_carti c;
n ambele interogri utilizatorul folosete tipuri asupra crora nu are privilegii explicite, dar
comenzile se execut cu succes pentru c proprietarii tipului (student) i tabelului (student1) dein
privilegiile necesare, iar acestea au fost acordate cu opiunea WITH GRANT OPTION.
Sistemul Oracle face verificri suplimentare i returneaz o eroare dac utilizatorul care
execut cererea nu deine privilegiile necesare, la executarea urmtoarelor operaii:
ncrcarea unui obiect n memoria virtual obiect ca urmare a accesrii unei valori de tip
referin (se verific privilegiul SELECT asupra tabelului obiect ce conine obiectul referit
i privilegiul EXECUTE asupra tipului obiect respectiv);
modificarea sau instanierea unui obiect ncrcat n memoria virtual (se verific
Orientare pe obiecte n Oracle9i 87
privilegiul UPDATE, iar, n cazul instanierii, privilegiul INSERT asupra tabelului obiect
destinaie);
tergerea unui obiect (se verific privilegiul DELETE asupra tabelului obiect sau
relaional destinaie);
invocarea unei metode (se verific privilegiul EXECUTE asupra tipurilor obiect ce conin
metoda).
4.5. Utilitare
Versiunea Oracle9i permite utilizarea mecanismelor obiectuale n cadrul utilitarelor de
import/export i pentru ncrcarea rapid a datelor prin SQL*Loader.
Utilitarele de import/export permit introducerea i extragerea datelor n, respectiv din bazele
de date Oracle. De asemenea, acestea sunt utile pentru crearea copiilor de siguran (backup) i
migrarea ntre diferitele versiuni ale server-ului de baze de date Oracle.
Au fost aduse mbuntiri astfel nct s fie acceptate datele de tip obiect. Componenta de
export scrie definiiile tipurilor obiect i toate datele asociate ntr-un fiier depozit cu extensia .dmp,
iar componenta de import poate crea modelul de date i informaiile exportate, utiliznd acest fiier.
n cazul tipurilor, se export i comenzile de definire ale subtipurilor, iar la import, un subtip
poate fi creat naintea importului definiiei supertipului su. n acest caz, subtipul va fi creat cu erori
de compilare. Acestea trebuie ignorate, tipul fiind revalidat dup crearea supertipului su. De
asemenea, definiiile vizualizrilor obiect ce aparin unei ierarhii de vizualizri pot fi i ele exportate.
Utilitarul SQL*Loader extrage date din fiiere externe pentru a le insera n tabelele unei baze
de date Oracle. Fiierele pot conine att date de tip scalar (CHAR, INTEGER, DATE, NUMBER), ct
i date complexe de tipuri definite de utilizator. Se pot ncrca linii sau coloane obiect (inclusiv
obiecte care au atribute de tip obiect, colecie sau referin), colecii i obiecte de tip LOB. n
versiunea Oracle9i, prin SQL*Loader pot fi ncrcate doar coleciile pe un singur nivel, nu i cele pe
mai multe niveluri.
SQL*Loader folosete fiiere de control (*.ctl), care conin comenzi speciale de definire a
datelor, pentru a descrie formatul i locaia fiierelor de date, tabelul n care se introduc datele
ncrcate i ali parametri ai procesului.
Exist dou abordri pentru ncrcarea datelor:
ncrcarea convenional, care utilizeaz comenzi INSERT i un vector tampon de
legtur pentru a transporta date n tabelele bazei de date;
ncrcarea direct, care utilizeaz Direct Path Load API pentru a scrie blocurile de date
direct n baza de date, pentru client-ul SQL*Loader.
ncrcarea direct nu folosete o interfa SQL i evit cuantumul de procesare suplimentar,
asociat comenzilor SQL. De aceea, ncrcarea direct tinde s asigure performane mai bune dect cea
convenional. Oricare dintre cele dou abordri se poate utiliza pentru a ncrca date de tip obiect sau
colecie.
tipuri obiect sau colecie. Aceste tipuri speciale pot fi utilizate pentru implementarea de tipuri
anonime. Tipurile generice aparin schemei SYS.
Cele trei tipuri generice SQL sunt implementate ca tipuri opace, adic structura lor intern nu
este cunoscut bazei de date. Datele de aceste tipuri pot fi interogate doar dac se implementeaz
funcii speciale (de obicei rutine LG3). n acest scop, sistemul Oracle furnizeaz funcii OCI i
PL/SQL.
Tipurile generice sunt urmtoarele:
ANYTYPE, care conine o descriere a unui tip SQL;
ANYDATA, care este un tip autodescriptiv pentru instanele tipurilor de date, coninnd
att date, ct i o descriere a fiecrui tip utilizat;
ANYDATASET, care este un tip autodescriptiv pentru seturi de instane i care include o
descriere a tipului mpreun cu un set de instane ale tipului respectiv.
Tipurile ANYDATA i ANYDATASET pot fi stocate persistent n cadrul bazei de date.
ANYTYPE, dei se refer la un tip stocat persistent n baza de date, este tranzitoriu, valoarea lui
nefiind stocat automat n baza de date.
Fiecare dintre aceste trei tipuri poate fi utilizat att cu tipurile predefinite, native ale bazei de
date, ct i cu tipurile obiect sau colecie (cu sau fr nume). Ele asigur un mod generic de a lucra
dinamic cu descrierile, instanele i seturile de instane ale diverselor tipuri. Utiliznd funciile API, se
poate crea o descriere ANYTYPE a oricrui tip. De asemenea, se poate converti (CAST) o valoare de
orice tip SQL ctre ANYDATA i reciproc. Similar se lucreaz cu tipul ANYDATASET.
Tipurile generice simplific lucrul cu procedurile stocate. Ele se pot utiliza pentru a ncapsula
descrieri i date de tipuri standard sau pentru a transmite informaia ncapsulat n parametri de tip
generic. n corpul procedurii se detaliaz modalitatea de abordare a datelor ncapsulate i a
descrierilor de tipuri.
De asemenea, ntr-o coloan de tip ANYDATA sau ANYDATASET se pot stoca date
ncapsulate, de o varietate de tipuri. De exemplu, se poate utiliza ANYDATA mpreun cu tehnologia
Oracle Advanced Queuing pentru a modela cozile de tipuri de date eterogene.
Pentru fiecare tip SQL generic exist un tip OCI corespunztor care l implementeaz i care
este prevzut cu un set de funcii pentru crearea i accesarea informaiilor de tipul respectiv. Tipurile
OCI sunt urmtoarele:
OCIType, corespunztor lui SYS.ANYTYPE;
OCIAnyData, corespunztor lui SYS.ANYDATA;
OCIAnyDataSet, corespunztor lui SYS.ANYDATASET.
Exist unele limbaje care utilizeaz tipuri de date ce pot fi modificate dinamic la momentul
rulrii programului sau permit programului s verifice tipul variabilei. De exemplu, limbajul C are
cuvntul cheie union i pointer-ul void *, Java are operatorul typeof i clase nfurtoare (wrapper)
pentru tipurile scalare. Versiunea Oracle9i permite crearea variabilelor i a coloanelor ce conin date
de orice tip. De asemenea, este posibil determinarea reprezentrii fizice a unor valori de tip generic.
Utiliznd aceste caracteristici, o coloan a unui tabel poate conine o valoare numeric ntr-o linie, un
ir de caractere sau un obiect n alta.
Pachetul predefinit DBMS_TYPES conine constante ce caracterizeaz tipurile predefinite i
cele definite de utilizator, necesare pentru lucrul cu ANYTYPE, ANYDATA i ANYDATASET. Aceste
constante au tipul PLS_INTEGER i sunt folosite pentru a indica tipul (predefinit sau definit de
utilizator) unei valori de tip ANYTYPE. Constantele sunt de forma TYPECODE_numetip, unde
Orientare pe obiecte n Oracle9i 89
numetip este tipul identificat i poate fi NUMBER, VARCHAR2, BLOB, REF, OBJECT, VARRAY,
TABLE etc.
Tipul ANYDATA permite reprezentarea valorilor de orice tip scalar sau obiect. Acest tip
generic este un tip obiect ce are ataate metode specifice care primesc o valoare scalar i o
convertesc la un scalar sau obiect. Similar, tipul predefinit ANYDATASET se poate utiliza pentru a
reprezenta valori de orice tip colecie. Pentru a prelucra i verifica informaii despre un tip, se poate
utiliza tipul predefinit ANYTYPE n combinaie cu pachetul DBMS_TYPES.
Principalele metode ale tipului generic ANYDATA sunt urmtoarele:
funciile metode statice de forma CONVERTnumetip, care au un parametru de intrare de
tip numetip i returneaz instana de tip SYS.ANYDATA asociat valorii parametrului;
metodele de tip GETnumetip, care au un parametru de ieire de tip numetip prin
intermediul cruia returneaz valoarea instanei de tip SYS.ANYDATA n formatul adecvat
(numetip poate fi un tip scalar sau definit de utilizator);
funcia metod GETTYPE, care are un parametru de ieire de tip SYS.ANYDATA prin
intermediul cruia se pot afla caracteristicile unui tip (precizia, scala unui numr,
lungimea unui ir de caractere etc.) i care returneaz o valoare ntreag corespunztoare
tipului instanei SYS.ANYDATA relativ la care se apeleaz (identificatorul returnat este
consistent constantelor din cadrul pachetului DBMS_TYPES);
metoda GETTYPENAME, care nu are parametri i care, aplicat unei instane ce
stocheaz o valoare obiectual, returneaz numele tipului obiect al valorii stocate.
Exemplu:
Se consider tipul t_persoana creat anterior, ce conine atributele cod i nume. Se definete un
tabel tab_generic cu dou coloane, cod de tip numeric i data de tip SYS.ANYDATA. S se
construiasc o procedur care parcurge tabelul i afieaz sugestiv datele stocate n coloana de tip
SYS.ANYDATA, interpretnd tipul de baz i procesnd valoarea corespunztor cu acest tip.
CREATE TABLE tab_generic (
cod NUMBER,
data SYS.ANYDATA);
INSERT INTO tab_generic VALUES
(1, SYS.ANYDATA.CONVERTnumber(10));
INSERT INTO tab_generic VALUES
(2, SYS.ANYDATA.CONVERTobject(t_persoana(99,'Dali')));
INSERT INTO tab_generic VALUES
(3, SYS.ANYDATA.CONVERTvarchar2('arta'));
COMMIT;
CREATE OR REPLACE PROCEDURE proc_generica IS
CURSOR c_generic IS
SELECT cod, data
FROM tab_generic;
v_cod tab_generic.cod%TYPE;
v_data tab_generic.data%TYPE;
v_tip SYS.ANYTYPE;
v_codtip PLS_INTEGER;
v_numetip VARCHAR2(60);
v_dummy PLS_INTEGER;
v_numar NUMBER;
v_varchar2 VARCHAR2(100);
90 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
v_persoana t_persoana;
anytype_nenul_pt_scalar EXCEPTION;
numetip_necunoscut EXCEPTION;
BEGIN
FOR v_rec IN c_generic LOOP
v_cod := v_rec.cod;
v_data := v_rec.data;
/* codul tipului este un numar care identifica
** tipul valorii lui v_data. */
v_codtip := v_data.GetType (v_tip);
/* v_codtip este comparat cu constantele din pachetul
** DBMS_TYPES pentru a determina tipul de date si
** a decide modalitatea de afisare */
CASE v_codtip
--daca este numeric..
WHEN DBMS_TYPES.TYPECODE_number THEN
IF v_tip IS NOT NULL THEN
-- tipul scalar trebuie sa returneze v_tip null
RAISE anytype_nenul_pt_scalar;
END IF;
v_dummy := v_data.GETnumber (v_numar);
DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_cod) ||
': NUMBER = ' || TO_CHAR(v_numar));
--daca este sir de caractere..
WHEN DBMS_TYPES.TYPECODE_varchar2 THEN
IF v_tip IS NOT NULL THEN
-- tipul scalar trebuie sa returneze v_tip null
RAISE anytype_nenul_pt_scalar;
END IF;
v_dummy := v_data.GETvarchar2 (v_varchar2);
DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_cod) ||
': VARCHAR2 = ' || v_varchar2);
--daca este de tip obiect..
WHEN DBMS_TYPES.TYPECODE_object THEN
v_numetip := v_data.GetTypeName();
--numele unui tip obiect este calificat cu numele
--schemei din care face parte
IF UPPER(v_numetip) != 'STUDENT.T_PERSOANA' THEN
--este alt tip?
RAISE numetip_necunoscut;
END IF;
v_dummy := v_data.GETobject (v_persoana);
DBMS_OUTPUT.PUT_LINE (TO_CHAR (v_cod) ||
': tip obiect = ' || v_numetip ||
' (' || v_persoana.cod || ', ' ||
v_persoana.nume || ')' );
END CASE;
END LOOP;
EXCEPTION
WHEN anytype_nenul_pt_scalar THEN
RAISE_Application_Error (-20001,
'Paradox: instanta de tip AnyType returnata de GetType '
||' trebuie sa fie NULL pentru toate tipurile scalare');
Orientare pe obiecte n Oracle9i 91
4.8. Indeci
Tipurile obiect pot interveni n mecanismul de indexare furnizat de sistemul Oracle. n
continuare sunt prezentate cteva modaliti de implementare.
Indexarea atributelor
Definirea indecilor asupra unui tabel obiect sau tabel de stocare (asociat unui atribut sau
coloan de tip tablou imbricat) este similar cu cea a indecilor corespunztori tabelelor obinuite. Se
pot defini indeci asupra:
Orientare pe obiecte n Oracle9i 95
Dac tipul int este un subtip care doar motenete atributul, expresia TREAT va returna valori
diferite de null doar pentru subtip (t_jurnalist), nu i pentru supertipurile acestuia (t_autor).
CREATE INDEX cod_autor_gresit_idx
ON tab_surse (TREAT(autor AS t_jurnalist).cod_autor);
VALUE
ntr-o comand SQL, funcia VALUE accept ca argument un alias al unui tabel sau
vizualizare obiect i returneaz instanele obiect stocate n acesta. Aceast funcie poate returna
instane de tipul liniei sau de oricare dintre subtipurile sale, dac este activat opiunea de
substituibilitate. Funcia VALUE este util n cadrul comenzilor LMD pentru a returna linii obiect n
vederea modificrii coleciilor.
Exemplele prezentate folosesc ierarhia de tipuri definit anterior, format din tipul t_persoana
cu subtipurile t_artist, t_autor i t_jurnalist. Se consider c tabelul obiect tab_persoane de tip
t_persoana este substituibil pentru toate nivelurile ierarhiei (SUBSTITUTABLE AT ALL LEVELS).
Exemplu:
a) S se selecteze n form obiectual, respectiv relaional, toate persoanele al cror nume
este Georgescu.
SELECT VALUE(p)
FROM tab_persoane p
WHERE p.nume = 'Georgescu';
SELECT *
FROM tab_persoane p
WHERE nume = 'Georgescu';
Se observ c abordarea obiectual permite extragerea mai multor informaii, i anume
valorile tuturor atributelor celui mai specific tip al instanei. Abordarea relaional extrage numai
valorile atributelor pentru tipul specificat al tabelului (cod i nume ale tipului rdcin t_persoana).
b) S se selecteze persoanele (cod i nume), inclusiv artitii i autorii, dintr-o vizualizare
obiect viz_persoane asupra tabelului obiect tab_persoane.
CREATE VIEW viz_persoane OF t_persoana
AS SELECT *
FROM tab_persoane;
SELECT VALUE(p)
FROM viz_persoane p;
REF
Funcia REF are ca argument un alias al unui tabel sau al unei vizualizri obiect i returneaz
o referin ctre instanele obiect din acesta. REF poate returna referine att ctre obiecte de tipul
98 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
DEREF
ntr-o comand SQL, funcia DEREF permite obinerea instanei obiect corespunztoare unei
referine (derefereniere). Instana obiect returnat poate fi de tipul declarat al referinei sau de unul
dintre subtipurile acestuia.
Exemplu:
S se selecteze liniile obiect coninute n tabelul obiect tab_persoane, innd cont de
substituibilitatea acestuia. Vor fi afiate nregistrrile stocate att relativ la persoane obinuite, ct i la
artiti sau autori.
SELECT DEREF(REF(p))
FROM tab_persoane p;
TREAT
Funcia TREAT modific tipul unei expresii la un alt tip specificat. n general, acesta este un
subtip al tipului expresiei. Cu alte cuvinte, funcia ncearc s trateze o instan a unui supertip ca o
instan a unui subtip al acestuia. Dac acest lucru nu este posibil, este returnat valoarea null. Funcia
TREAT este permis n SQL, dar nu i n PL/SQL.
Principalele utilizri ale lui TREAT sunt:
n limitarea atribuirilor, pentru a modifica tipul unei expresii, astfel nct s poat fi
atribuit unei variabile de un tip mai specializat n ierarhie (altfel spus, pentru a seta
valoarea unui supertip la un subtip);
pentru accesarea atributelor i metodelor unui subtip al tipului declarat liniei sau coloanei
obiect.
De exemplu, un obiect de tip t_persoana poate fi tratat ca fiind de tip t_autor, doar dac
obiectul respectiv este ntr-adevr de tip t_autor (sau un subtip al acestuia, t_jurnalist). Dac persoana
este autor, atunci obiectul este returnat cu tipul t_autor avnd toate atributele i metodele
corespuntoare acestui tip. Dac persoana nu este autor, funcia TREAT returneaz valoarea null.
Funcia TREAT poate fi utilizat att relativ la parametri de tip obiect, ct i relativ la
parametri de tip referin.
Exemplu:
a) Se consider tabelul definit anterior, tabel, avnd atributele perscol de tip t_persoana,
autcol de tip t_autor i artcol de tip t_artist. S se realizeze o atribuire prin limitare ntre coloanele
autcol i perscol. Pentru fiecare linie, TREAT returneaz o expresie de tip t_autor, dac n linia
respectiv este stocat o valoare de acest tip, sau valoarea null, n caz contrar.
UPDATE tabel
set autcol = TREAT(perscol AS t_autor);
Orientare pe obiecte n Oracle9i 99
b) S se selecteze toate instanele de tip t_autor ale tabelului obiect tab_persoane de tip
t_persoana. Comanda utilizeaz TREAT pentru a modifica tipul fiecrei linii obiect din t_persoana n
t_autor.
SELECT TREAT(VALUE(p) AS t_autor)
FROM tab_persoane p;
c) S se selecteze referine ctre toate instanele t_autor din tabelul obiect tab_persoane.
SELECT TREAT(REF(p) AS REF t_autor)
FROM tab_persoane p;
Una dintre cele mai frecvente utilizri a funciei TREAT este aceea de a accesa atributele i
metodele unui subtip al tipului unei linii sau coloane obiect.
Exemplu:
S se listeze numele i ocupaia persoanelor din tabelul tab_persoane. S va afia ocupaia,
pentru persoanele care sunt caracterizate prin acest atribut i, n rest, valoarea null. Atributul ocupatie
face parte din tipul t_autor
SELECT nume, TREAT(VALUE(p) AS t_autor).ocupatie ocupatie
FROM tab_persoane p;
NUME OCUPATIE
---- --------
Georgescu null
Irving Stone scriitor
Simona Popescu jurnalist
Urmtoarea cerere va declana o eroare (ORA-00904: invalid identifier) deoarece ocupatie
este un atribut al tipului t_autor i nu al tipului t_persoana.
SELECT nume, VALUE(p).ocupatie ocupatie
FROM tab_persoane p;
Un tabel sau o coloan obiect de tip T care sunt substituibile, au asociat cte o coloan
ascuns corespunztoare fiecrui atribut al subtipurilor lui T. Aceste coloane nu sunt listate de o
comand DESCRIBE, dar ele conin date referitoare la atributele subtipurilor. Funcia TREAT permite
accesul la aceste coloane.
Exemplu:
Se presupune c tipul t_autor conine o metod ocupatie ce returneaz valoarea acestui atribut
pentru o instan obiect dat. S se descrie structura tabelului tab_persoane i s se afieze numele i
ocupaia fiecrei persoane. Exemplul arat modul de utilizare al funciei TREAT pentru a accesa o
metod.
DESC tab_persoane
SELECT nume, TREAT(VALUE(p) AS t_autor).ocupatie() ocupatie
FROM tab_persoane1 p;
IS OF
Predicatul IS OF verific instanele obiect n raport cu nivelul de specializare al tipului lor. IS
OF este permis n SQL, dar nu i n PL/SQL.
100 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Exemplu:
S se selecteze doar instanele obiect de tip t_autor (inclusiv instanele corespunztoare
subtipurilor acestuia) stocate n tabelul tab_persoane.
SELECT VALUE(p)
FROM tab_persoane p
WHERE VALUE(p) IS OF (t_autor);
VALUE(P)(COD, NUME)
-------------------------------------------------------------
T_AUTOR(25, 'Irving Stone', 125, 'scriitor', NULL)
T_JURNALIST(35, 'Simona Popescu', 135, 'jurnalist', NULL, 'redactor',
'Dilema')
Pentru orice obiect care nu este de subtipul specificat sau de un subtip al acestuia, predicatul
IS OF returneaz FALSE. Dac trebuie excluse subtipurile tipului specificat, se poate utiliza cuvntul
cheie ONLY. Acesta permite selectarea exclusiv a obiectelor cu cel mai specific tip dat.
Pentru a condiiona tipul obiectului adresat de o referin, se utilizeaz predicatul IS OF n
combinaie cu funcia DEREF, ce regsete obiectul referit.
Exemplu:
a) S se selecteze sursele bibliografice ale cror autori sunt de tip t_autor. Sunt excluse
sursele ale cror autori sunt de un subtip al tipului t_autor (de exemplu, t_jurnalist).
SELECT s.titlu titlu, s.autor autor
FROM tab_surse s
WHERE s.autor IS OF (ONLY t_autor);
TITLU AUTOR
--------------- ------
Agonie si extaz T_AUTOR(25,'Irving Stone',
125, 'scriitor', NULL)
b) S se selecteze referine ctre obiectele de tip t_autor sau t_artist, stocate n tabelul
tab_persoane.
SELECT REF(p)
FROM tab_persoane p
WHERE VALUE(p) IS OF (t_autor, t_artist);
c) S se afieze numai autorii pentru care t_autor este cel mai specific tip. Exemplul
utilizeaz funcia TREAT pentru a converti obiectele de tip t_autor de la tipul tabelului obiect
tab_persoane (t_persoana) la t_autor. n acest fel, sunt listate toate atributele tipului corespunztor
instanei returnate.
SELECT TREAT(VALUE(p) AS t_autor) AUTOR
FROM tab_persoane p
WHERE VALUE(p) IS OF (ONLY t_autor);
AUTOR(COD, NUME, COD_AUTOR, OCUPATIE, DESCRIERE)
---------------------------------------------------
T_AUTOR (25, 'Irving Stone', 125, 'scriitor', NULL)
SELECT p.*
FROM tab_persoane p
WHERE VALUE(p) IS OF (ONLY t_autor);
COD NUME
Orientare pe obiecte n Oracle9i 101
--- -------------
25 Irving Stone
SYS_TYPEID
Funcia SYS_TYPEID poate fi utilizat n cadrul cererilor SQL pentru a obine identificatorul
celui mai specific tip al instanei obiect precizate ca argument. Funcia returneaz identificatorii de tip
din coloana discriminant asociat coloanelor substituibile dintr-un tabel.
Tuturor tipurilor ce aparin unei ierarhii de tipuri li se asociaz identificatori diferii de null,
unici n cadrul ierarhiei. Dac instana dat ca argument corespunde unui tip final, atunci funcia
returneaz valoarea null.
Exemplu:
a) Se consider tabelul obiect substituibil tab_persoane, avnd tipul t_persoana. Tipul
t_persoana este tipul rdcin al ierarhiei. Acesta are pe t_autor i t_artist ca subtipuri, iar pe
t_jurnalist ca subtip al tipului t_autor. S se afieze numele fiecrei persoane i identificatorul tipului
instanei respective.
SELECT nume, SYS_TYPEID(VALUE(p)) cod_tip
FROM tab_persoane p;
NUME COD_TIP
-------------- ------
Georgescu 01
Irving Stone 03
Simona Popescu 04
b) S se afieze titlul lucrrii, numele i identificatorii celor mai specifice tipuri, pentru
autorii de surse bibliografice nregistrai n tabelul tab_surse. Coloana autor de tip t_persoana este
substituibil.
SELECT s.titlu, s.autor.nume, SYS_TYPEID(autor) cod_tip
FROM tab_surse s;
TITLU AUTOR COD_TIP
-------------------------- ----------- ------
Cronica de azi Georgescu 01
Agonie si extaz Irving Stone 03
Expozitii Simona Popescu 04
102 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
5. Vizualizri obiect
valoarea acestora. Vizualizarea obiect conine obiecte de tip t_opera_de_arta, avnd atributele
cod_opera, tip, titlu, data_crearii, dimensiuni, data_achizitiei i polite. Pentru a obine valorile
coloanei cod a tabelului relaional tab_opere, se va utiliza atributul cod_opera al tipului asociat
vizualizrii obiect.
CREATE TABLE tab_opere (
cod NUMBER PRIMARY KEY,
tip VARCHAR2(10),
titlu VARCHAR2(200),
artist REF t_artist,
data_crearii DATE,
data_achizitiei DATE,
valoare NUMBER,
polite t_polite_ti,
dimensiuni t_dim_v)
NESTED TABLE polite STORE AS tstoc_pol;
CREATE TYPE t_opera_de_arta AS OBJECT (
cod_opera NUMBER,
tip VARCHAR2(10),
titlu VARCHAR2(200),
artist REF t_artist,
data_crearii DATE,
data_achizitiei DATE,
polite t_polite_ti,
dimensiuni t_dim_v);
/
CREATE VIEW viz_picturi OF t_opera_de_arta
WITH OBJECT IDENTIFIER (cod_opera)
AS SELECT o.cod, o.tip, o.titlu, o.artist,
o.data_crearii, o.data_achizitiei,
o.polite, o.dimensiuni
FROM tab_opere o
WHERE LOWER (tip) = 'pictura';
Clauza WITH OBJECT IDENTIFIER (cod_opera) din comanda CREATE VIEW stabilete ca
identificatorii obiect ai liniilor obiect din cadrul vizualizrii viz_picturi s fie bazai pe cheia primar
cod a tabelului relaional de baz, tab_opere. n cadrul vizualizrii, coloana cod devine atributul
cod_opera asociat tipului obiect. Cum acest atribut este unic n domeniul obiectelor vizualizrii i
diferit de null, el poate fi folosit ca identificator obiect.
eliminarea unui tip referit de o vizualizare obiect pe server, sistemul modific automat i vizualizrile
obiect asociate.
coloanele oras_gal, strada_gal, judet_gal i codpostal din tabelul relaional sunt null. n felul acesta,
spaiul este ocupat inutil cu instane care conin valoari null pentru fiecare atribut. Tabelul relaional
nu are coloane care s specifice dac adresa departamentului este completat sau nu. Dac se face
convenia ca o anumit coloan (de exemplu, strada_gal) s indice c o ntreag adres este null,
atunci se poate capta acest regul a aplicaiei folosind funcia DECODE.
CREATE VIEW viz_galerii OF t_galerie
WITH OBJECT IDENTIFIER (cod)
AS SELECT g.cod_gal, g.nume_gal, g.nume_cladire,
DECODE(g.strada_gal, NULL, NULL,
t_adresa(g.strada_gal, g.oras_gal, g.judet_gal,
g.codpostal)) AS adresa_gal
FROM tab_galerii g;
Dei n acest fel se implementeaz o regul a aplicaiei imposibil de inclus ntr-o structur
relaional, utilizarea ei n subcererea corespunztoare vizualizrii obiect are i un dezavantaj. Nu mai
este permis modificarea direct a adresei departamentului prin intermediul vizualizrii obiect. Acest
lucru nu este grav deoarece se poate defini un declanator de tip INSTEAD OF care s trateze
propagarea modificrilor fcute asupra vizualizrii obiect ctre tabelul de baz.
/
CREATE TYPE t_opere_ti AS TABLE OF t_opera;
/
c) S se adauge tipului t_galerie un nou atribut, de tip t_opere_ti, care s includ lista
operelor expuse in acea galerie.
ALTER TYPE t_galerie
ADD ATTRIBUTE(lista_opere t_opere_ti)
CASCADE;
d) Utiliznd obiectele definite anterior, s se construiasc vizualizarea obiect viz_galerii,
care conine coloane pentru codul, numele, numele cldirii, adresa galeriei i colecia de opere de art
asociat galeriei respective. Vizualizarea obiect viz_galerii este bazat pe tipul obiect t_galerie, iar
datele din aceast vizualizare sunt sintetizate din tabelele relaionale tab_opere i tab_galerii. Pentru
sintetizarea datelor se va folosi funcia CASTMULTISET.
CREATE OR REPLACE VIEW viz_galerii OF t_galerie
WITH OBJECT IDENTIFIER (cod)
AS SELECT g.cod_gal, g.nume_gal, g.nume_cladire,
t_adresa (g.strada_gal, g.oras_gal,
g.judet_gal,g.codpostal) AS adresa_gal,
CAST (MULTISET (SELECT o.cod, o.titlu, o.tip,
o.valoare, o.cod_artist
FROM tab_opere o
WHERE o.cod_gal = g.cod_gal)
AS t_opere_ti)
AS lista_opere
FROM tab_galerii g;
Subcererea din cadrul blocului CASTMULTISET selecteaz operele care aparin galeriei
curente. Cuvntul cheie MULTISET indic faptul c lista dintre paranteze trebuie tratat ca o valoare
unitar. Operatorul CAST transform o expresie conform formatului specificat n clauza AS. Pentru
exemplul considerat, CAST transform rezultatul ntr-un tablou imbricat de tip t_opere_ti. O cerere
asupra vizualizrii viz_galerii returneaz lista galeriilor, fiecare linie coninnd codul, numele, numele
cldirii, adresa i colecia de opere expuse n cadrul galeriei.
Coleciile pe mai multe niveluri pot fi i ele utilizate n vizualizrile obiect. Pentru aceasta
trebuie create niveluri adiionale n cadrul tipului obiect corespunztor vizualizrii.
Urmtorul exemplu creeaz o vizualizare obiect care conine o colecie pe mai multe niveluri.
Se va implementa, n cadrul vizualizrii viz_galerii, faptul c fiecare oper de art are asociat o
mulime de polie de asigurare. Vizualizarea este bazat pe tabele relaionale simple, n sensul c
acestea nu conin colecii.
n primul rnd, trebuie create tipurile obiect i colecie care vor fi utilizate n cadrul
vizualizrii. Se definete cte un tip obiect corespunztor ca structur fiecrui tabel relaional (fiecrei
coloane din tabel i se asociaz un atribut de acelai tip n cadrul tipului obiect).
Exemplu:
a) S se defineasc tabelul relaional tab_polite, care conine informaii despre poliele de
asigurare corespunztoare operelor de art din muzeu. S se creeze tipul asociat tabelului (t_polita) i
tipul tablou imbricat t_polite_ti, cu elemente de tip t_polita. Se va aduga tipului t_opera un nou
atribut, lista_polite, pentru stocarea listei de polie asociate unei opere de art.
CREATE TABLE tab_polite(
110 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
cod_polita NUMBER,
descriere VARCHAR2(100),
firma VARCHAR2(20),
valoare NUMBER,
cod_opera NUMBER REFERENCES tab_opere (cod));
CREATE TYPE t_polita AS OBJECT (
cod_polita NUMBER,
descriere VARCHAR2(100),
firma VARCHAR2(20),
valoare NUMBER);
/
CREATE TYPE t_polite_ti AS TABLE OF t_polita;
/
ALTER TYPE t_opera
ADD ATTRIBUTE(lista_polite t_polite_ti)
CASCADE;
b) S se defineasc vizualizarea obiect asociat tabelelor relaionale i tipurilor definite mai
sus11.
CREATE OR REPLACE VIEW viz_galerii OF t_galerie
WITH OBJECT IDENTIFIER (cod)
AS SELECT g.cod_gal, g.nume_gal, g.nume_cladire,
t_adresa (g.strada_gal, g.oras_gal,
g.judet_gal,g.codpostal) AS adresa_gal,
CAST (MULTISET(
SELECT o.cod, o.titlu, o.tip,
o.valoare, o.cod_artist,
CAST (MULTISET (
SELECT p.cod_polita, p.descriere,
p.firma, p.valoare
FROM tab_polite p
WHERE p.cod_opera = o.cod)
AS t_polite_ti)
FROM tab_opere o
WHERE o.cod_gal = g.cod_gal)
AS t_opere_ti)
FROM tab_galerii g;
Tipul care implementeaz entitatea opera are un atribut de tip tablou imbricat (lista_polite) i
tipul t_galerie conine un tablou imbricat de opere de art. Prin urmare, tabloul de opere este o
colecie pe mai multe niveluri. Pentru a crea instanele acestui tip colecie se utilizeaz tot operatorul
CASTMULTISET n cadrul comenzii CREATE VIEW.
O referin creat relativ la un obiect dintr-o vizualizare obiect respect tipul identificatorului
obiect specificat la nivel de vizualizare (bazat pe cheia primar sau generat de sistem). Ca i obiectele
sintetizate, pot fi selectate referine stocate persistent i reinute n coloanele unei vizualizri obiect.
Referinele create relativ la obiecte sintetizate prin intermediul vizualizrilor obiect nu pot fi, ns,
stocate persistent.
n exemplul expus anterior, fiecare obiect din vizualizarea obiect viz_galerii are un
identificator obiect unic, derivat din valoarea codului galeriei. n cazul relaional, legtura dintre
tab_opere i tab_galerii se face prin cheia extern cod_gal din tabelul tab_opere. Identificatorii
obiect din vizualizarea viz_galerii sunt bazai pe cheia primar. De aceea, este permis folosirea
valorii cheii externe n vizualizarea viz_opere, la crearea unei referine ctre un obiect din viz_galerii.
Exemplu:
a) S se modifice vizualizarea viz_opere, astfel nct s conin pentru fiecare oper de art
o referin la galeria din care face parte. Sunt necesare modificri asupra tipului t_opera creat anterior
i a vizualizrii viz_galerii, care va trebui s includ n definiia ei o valoare pentru noul atribut al
tipului t_opera.
ALTER TYPE t_opera
ADD ATTRIBUTE ref_gal REF t_galerie
CASCADE;
CREATE OR REPLACE VIEW viz_galerii OF t_galerie
WITH OBJECT IDENTIFIER (cod) AS
SELECT g.cod_gal, g.nume_gal, g.nume_cladire,
t_adresa (g.strada_gal, g.oras_gal,
g.judet_gal,g.codpostal) AS adresa_gal,
CAST (MULTISET(
SELECT o.cod, o.titlu, o.tip,
o.valoare, o.cod_artist,
CAST (MULTISET (
SELECT p.cod_polita, p.descriere,
p.firma, p.valoare
FROM tab_polite p
WHERE p.cod_opera = o.cod)
AS t_polite_ti), NULL
FROM tab_opere o
WHERE o.cod_gal = g.cod_gal)
AS t_opere_ti)
FROM tab_galerii g;
CREATE OR REPLACE VIEW viz_opere OF t_opera
WITH OBJECT IDENTIFIER(cod)
AS SELECT o.cod, o.titlu, o.tip,
o.valoare, o.cod_artist, NULL,
MAKE_REF(viz_galerii, o.cod_gal)
FROM tab_opere o;
b) tiind c ref_gal conine o referin ctre galerie, s se listeze toate operele din galeriile
cu locaia n Timioara.
SELECT o.cod, o.titlu, o.ref_gal.nume_gal
FROM viz_opere o
112 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Se consider cazul entitilor galerie i opera. n modelul relaional clasic, cheia extern se
afl n tabelul cu opere de art. Se poate, ns, proiecta relaia dintre galerii i opere utiliznd colecii
n cadrul vizualizrilor obiect. Aa cum s-a exemplificat mai sus, vizualizarea viz_galerii poate
conine o colecie de opere de art, iar vizualizarea viz_opere o referin ctre galerie sau chiar
coloane de tipul asociat entitii galerie. Astfel, relaia este implementat n ambele sensuri ntre cele
dou entiti, att de la opera la galerie, ct i invers. Pentru a conserva spaiu, exist posibilitatea ca
vizualizarea viz_galerii s conin o colecie de referine ctre obiecte de tip t_opera_de_arta i nu
obiectele materializate propriu-zise. Cum tipul obiect asociat entitaii opera conine o referin ctre
galeria din care face parte, apar referine circulare ntre vizualizrile viz_galerii i viz_opere.
Exemplu:
Se consider tabelele tab_opere i tab_galerii definite anterior. Tipul t_opera conine o
coloan de tip referin la t_galerie. Lista de referine la operele de art va fi implementat sub forma
unui tabel imbricat. Se modific tipul t_galerie, astfel nct s conin o coloan de tip
t_lista_ref_opere. S se defineasc vizualizrile folosind cele dou metode descrise mai sus.
DROP VIEW viz_galerii FORCE;
DROP VIEW viz_opere FORCE;
CREATE TYPE t_lista_ref_opere AS TABLE OF REF t_opera;
/
ALTER TYPE t_galerie
DROP ATTRIBUTE lista_opere
CASCADE;
ALTER TYPE t_galerie
ADD ATTRIBUTE lista_ref_opere t_lista_ref_opere
CASCADE;
ALTER TYPE t_opera
DROP ATTRIBUTE lista_polite
CASCADE;
Metoda 1:
CREATE VIEW viz_opere OF t_opera
WITH OBJECT IDENTIFIER(cod)
AS SELECT o.cod, o.titlu, o.tip, o.valoare,
o.cod_artist, NULL
FROM tab_opere o;
CREATE VIEW viz_galerii OF t_galerie
WITH OBJECT IDENTIFIER(cod)
AS SELECT g.cod_gal, g.nume_gal, g.nume_cladire,
t_adresa(g.strada_gal, g.oras_gal,
g.judet_gal, g.codpostal),
CAST (MULTISET (
SELECT MAKE_REF(viz_opere, o.cod)
FROM tab_opere o
WHERE o.cod_gal = g.cod_gal)
AS t_lista_ref_opere)
FROM tab_galerii g;
CREATE OR REPLACE VIEW viz_opere OF t_opera
WITH OBJECT IDENTIFIER(cod)
AS SELECT o.cod, o.titlu, o.tip, o.valoare,
o.cod_artist, MAKE_REF(viz_galerii, o.cod_gal)
FROM tab_opere o;
Orientare pe obiecte n Oracle9i 115
Metoda 2:
CREATE FORCE VIEW viz_opere OF t_opera
WITH OBJECT IDENTIFIER(cod)
AS SELECT o.cod, o.titlu, o.tip, o.valoare,
o.cod_artist, MAKE_REF(viz_galerii, o.cod_gal)
FROM tab_opere o;
CREATE VIEW viz_galerii OF t_galerie
WITH OBJECT IDENTIFIER(cod)
AS SELECT g.cod_gal, g.nume_gal, g.nume_cladire,
t_adresa(g.strada_gal, g.oras_gal,
g.judet_gal, g.codpostal),
CAST (MULTISET (
SELECT MAKE_REF(viz_opere, o.cod)
FROM tab_opere o
WHERE o.cod_gal = g.cod_gal)
AS t_lista_ref_opere)
FROM tab_galerii g;
Exemplu:
a) S se listeze informaii complete despre operele de art din galeria avnd codul 1. Ambele
metode de creare prezentate mai sus permit interogarea vizualizrilor viz_galerii, viz_opere i
dereferenierea elementelor tabloului imbricat lista_ref_opere, referite prin cuvntul cheie
COLUMN_VALUE.
SELECT DEREF(o.COLUMN_VALUE)
FROM TABLE(SELECT g.lista_ref_opere
FROM viz_galerii g
WHERE g.cod = 1) o;
b) S se selecteze codurile operelor de art al cror titlu conine irul de caractere flori i
aparin galeriei avnd codul 1.
SELECT o.COLUMN_VALUE.cod
FROM TABLE(SELECT g.lista_ref_opere
FROM viz_galerii g
WHERE g.cod = 1) o;
WHERE LOWER(o.COLUMN_VALUE.titlu) LIKE '%flori%';
c) S se selecteze numele galeriei, codul i titlul operei de art pentru acele opere care fac
parte din galeria avnd codul 1 i care conin n titlu secvena flori. Pentru ca rezultatul s fie
tabelar, se poate distribui lista de referine prin introducerea unui join ntre vizualizare i coloana de
tip tablou imbricat.
SELECT g.nume_gal, o.COLUMN_VALUE.cod, o.COLUMN_VALUE.titlu
FROM viz_galerii g, TABLE(g.lista_ref_opere) o
WHERE LOWER(o.COLUMN_VALUE.titlu) like '%flori%'
AND d.cod = 1;
d) S se rescrie interogarea de la punctul anterior, utiliznd referinele coninute n
vizualizarea viz_opere, n sens invers.
SELECT o.ref_gal.nume_gal, DEREF(o.COLUMN_VALUE)
116 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
vizualizare obiect construit pentru fiecare tip, atunci se poate interoga vizualizarea obiect care
corespunde nivelului de specializare necesar la un moment dat. De exemplu, se poate interoga
vizualizarea asociat tipului t_autor pentru a determina un set de rezultate referitor doar la autori,
inclusiv jurnaliti.
Vizualizarea rdcin poate fi asociat oricruia dintre tipurile din ierarhia de tipuri. Nu este
obligatoriu s se asocieze o vizualizare obiect tipului rdcin. De asemenea, nu este necesar
extinderea ierarhiei pn la tipurile frunze ale ierarhiei de tipuri i nici nu trebuie acoperite toate
ramurile acesteia. n schimb, nu se pot omite subtipuri intermediare pe vreo linie descendent a
ierarhiei. Orice subvizualizare trebuie bazat pe un subtip direct al tipului supervizualizrii ei.
O vizualizare obiect poate avea mai multe subvizualizri. Subvizualizrile bazate pe un tip dat
pot participa doar ntr-o singur ierarhie de vizualizri obiect. Diferite ierarhii nu pot conine
vizualizri asociate aceluiai tip.
O subvizualizare motenete identificatorul obiect de la supervizualizare. Acesta poate fi
definit n mod explicit doar n vizualizarea rdcin a ierarhiei. Nu se poate specifica explicit un
identificator obiect ntr-o subvizualizare. Dac acesta este identificatorul generat de sistem sau clauza
nu este specificat n vizualizarea rdcin, atunci pot fi create subvizualizri doar dac vizualizarea
rdcin este bazat pe un tabel sau o vizualizare care utilizeaz tot un identificator obiect generat de
sistem.
Pentru subvizualizri se aplic aceleai reguli ca i la vizualizri obinuite, cu privire la
situaiile n care pot fi modificate prin comenzi LMD. Dac o subvizualizare este inerent
nemodificabil i trebuie modificat, atunci se definesc declanatori de tip INSTEAD OF specifici.
Declanatorii de tip INSTEAD OF nu se motenesc. Toate vizualizrile dintr-o ierarhie trebuie s
aparin aceleiai scheme.
Versiunea Oracle9i permite crearea de vizualizri asociate tipurilor neinstaniabile. Un tip
neinstaniabil nu poate avea instane aa c, la prima vedere, nu ar fi util crearea unei vizualizri
obiect asociate. Un tip neinstaniabil poate avea ns, subtipuri instaniabile, iar posibilitatea definirii
vizualizrilor obiect pentru tipuri neinstaniabile permite construirea ierarhiilor de vizualizri obiect
asociate unor ierarhii de tipuri care conin tipuri neinstaniabile.
Modelul flat
n modelul flat, toate vizualizrile din ierarhie sunt bazate pe acelai tabel. n exemplul ce
118 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
urmeaz, unicul tabel relaional de baz (ToatePersoanele) conine coloane pentru toate atributele
tipurilor t_persoana, t_autor i t_artist.
CREATE TABLE ToatePersoanele (
cod_tip NUMBER(1), -- cod asociat tipului
cod NUMBER, -- persoana
nume VARCHAR2(50),
cod_autor NUMBER, -- autor
ocupatie VARCHAR2(30),
descriere VARCHAR2(200),
cod_artist NUMBER, -- artist
an_nastere VARCHAR2(4),
an_moarte VARCHAR2(4),
nationalitate VARCHAR2(40));
A fost introdus o coloan suplimentar (cod_tip) care desemneaz tipul nregistrrii. Ea
poate avea trei valori (1, 2 sau 3) n funcie de tipul care trebuie asociat liniei respective (t_persoana,
t_autor, respectiv t_artist). Vizualizrile din ierarhia de vizualizri obiect sunt definite dup cum
urmeaz. Fiecare instan obiect sintetizat n cadrul unei vizualizri corespunde unei linii din tabel.
CREATE VIEW viz_persoane OF t_persoana
WITH OBJECT IDENTIFIER(cod)
AS SELECT cod, nume
FROM ToatePersoanele
WHERE cod_tip = 1;
CREATE VIEW viz_autori OF t_autor UNDER viz_persoane
AS SELECT cod, nume, cod_autor, ocupatie, descriere
FROM ToatePersoanele
WHERE cod_tip = 2;
CREATE VIEW viz_artisti OF t_artist UNDER viz_persoane
AS SELECT cod, nume, cod_artist,
an_nastere, an_moarte, nationalitate
FROM ToatePersoanele
WHERE cod_tip = 3;
Modelul flat are avantajul simplitii i nu genereaz nici un obstacol n crearea indecilor i a
constrngerilor.
Unul dintre dezavantajele acestui model este c un singur tabel poate avea cel mult 1000 de
coloane. Astfel, modelul flat impune aceast limit asupra numrului total de coloane pe care le poate
conine ierarhia de vizualizri obiect. De asemenea, fiecare linie a tabelului are multe valori null
asociate atributelor care nu aparin celui mai specific tip al liniei curente. Aceste valori pot afecta
performanele operaiilor asupra vizualizrilor.
Modelul orizontal
n modelul orizontal, fiecrei vizualizri sau subvizualizri i corespunde un tabel distinct.
Tabelele de baz pot fi relaionale, respectiv tabele obiect pentru care substituibilitatea coloanelor este
dezactivat.
CREATE TABLE doar_persoane (
cod NUMBER,
nume VARCHAR2(50));
CREATE TABLE doar_autori (
Orientare pe obiecte n Oracle9i 119
cod NUMBER,
nume VARCHAR2(50),
cod_autor NUMBER,
ocupatie VARCHAR2(30),
descriere VARCHAR2(200));
CREATE TABLE doar_artisti (
cod NUMBER,
nume VARCHAR2(50),
cod_artist NUMBER,
an_nastere VARCHAR2(4),
an_moarte VARCHAR2(4),
nationalitate VARCHAR2(40));
n acest caz, la construirea vizualizrilor nu sunt necesare join-uri. Fiecrei vizualizri din
ierarhie i corespunde un tabel relaional. De asemenea, o instan obiect este sintetizat dintr-o
singur linie a unui tabel de baz al modelului.
CREATE VIEW viz_persoane OF t_persoana
WITH OBJECT IDENTIFIER(cod)
AS SELECT *
FROM doar_persoane ;
CREATE VIEW viz_autori OF t_autor UNDER viz_persoane
AS SELECT *
FROM doar_autori;
CREATE VIEW viz_artisti OF t_artist UNDER viz_persoane
AS SELECT *
FROM doar_artisti;
Modelul orizontal este util pentru executarea eficient a interogrilor care selecteaz
nregistrri corespunztoare unui anumit nivel de specializare.
Exemplu:
S se selecteze informaii complete despre toi artitii din vizualizarea viz_persoane. Trebuie
afiate informaii referitoare numai la instanele care au cel mai specific tip t_artist.
SELECT VALUE(p)
FROM viz_persoane p
WHERE VALUE(p) IS OF (ONLY t_artist);
Astfel de cereri acceseaz un singur tabel fizic pentru a returna obiectele de tipul specificat.
Dezavantajele modelului sunt acelea c interogrile de tipul SELECT * FROM vizualizare necesit
executarea unui operator UNION asupra tuturor tabelelor de baz i apoi proiectarea liniilor doar
asupra coloanelor din vizualizarea dat. De asemenea, modelul nu permite crearea de indeci sau
constrngeri de tip UNIQUE asupra atributelor tipurilor. Acestea ar trebui s acioneze asupra mai
multor tabele i acest lucru nu este posibil.
Modelul vertical
n modelul vertical nu exist o coresponden ntre un tabel fizic i o vizualizare din ierarhie.
Fiecare tabel fizic stocheaz doar acele atribute care sunt unice subtipului corespondent lui.
CREATE TABLE ToatePersoanele (
cod_tip NUMBER,
cod NUMBER,
120 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
nume VARCHAR2(50));
CREATE TABLE TotiAutorii (
cod NUMBER,
cod_autor NUMBER,
ocupatie VARCHAR2(30),
descriere VARCHAR2(200));
CREATE TABLE TotiArtistii (
cod NUMBER,
cod_artist NUMBER,
an_nastere VARCHAR2(4),
an_moarte VARCHAR2(4),
nationalitate VARCHAR2(40));
Similar modelului flat, este necesar definirea unei coloane suplimentare pentru identificarea
tipului (cod_tip). Aceast coloan este inclus numai n tabelul referitor la persoane
(ToatePersoanele). O instan obiect este sintetizat din unul sau mai multe tabele relaionale ale
modelului. Atributele specifice fiecrui tip obiect din ierarhia implementat sunt obinute prin
intermediul join-ului dintre tabelele asociate tuturor tipurilor ce apar pe drumul de la tipul rdcin
pn la tipul respectiv. Legtura dintre tabelele modelului, se face prin cheia primar cod, care este
utilizat i ca identificator obiect.
CREATE VIEW viz_persoane OF t_persoana
WITH OBJECT IDENTIFIER (cod)
AS SELECT cod, nume
FROM ToatePersoanele
WHERE cod_tip = 1;
CREATE VIEW viz_studenti OF t_autor UNDER viz_persoane
AS SELECT p.cod, p.nume,
au.cod_autor, au.ocupatie, au.descriere
FROM ToatePersoanele p, TotiAutorii au
WHERE p.cod_tip = 2
AND au.cod = p.cod;
CREATE VIEW viz_artisti OF t_artist UNDER viz_persoane
AS SELECT p.cod, p.nume, ar.cod_artist, ar.an_nastere,
ar.an_moarte, ar.nationalitate
FROM ToatePersoanele p, TotiArtistii ar
WHERE p.cod_tip = 3
AND ar.cod = ar.cod;
Folosind modelul vertical, se pot procesa eficient cererile de tip SELECT * FROM
viz_rdcina. De asemenea, este posibil s se indexeze i s se impun constrngeri de unicitate
asupra atributelor individuale. n schimb, pentru a recrea o instan a unui tip, altul dect tipul
rdcin, trebuie executat cel puin un join. Acest lucru poate reduce din performane.
conine toate persoanele, inclusiv autori i artiti. Similar interogrii tabelelor obiect, n lista SELECT
pot fi incluse funciile REF i VALUE, ce returneaz instane obiect, sau se pot specifica atributele
obiectelor de tipul declarat al vizualizrii (de exemplu, nume i cod pentru tipul t_persoana).
Att specificarea atributelor asociate tipului declarat al unei vizualizri, ct i utilizarea
funciilor care ntorc instane obiect asigur returnarea unui set polimorfic de date, adic instane de
tipul vizualizrii i de subtipurile acestuia.
Exemplu:
S se introduc nregistrri corespunztoare fiecrui tip de date din ierarhia avnd tipul
rdcin t_persoana (se consider modelul orizontal). S se afieze instanele persoanelor, artitilor,
autorilor i referinele la aceste instane.
INSERT INTO doar_persoane (cod, nume)
VALUES (1, 'George Ionescu');
INSERT INTO doar_artisti
(cod, nume, cod_artist, an_nastere, an_moarte, nationalitate)
VALUES (2, 'Constantin Brancusi', 1, 1876, 1957, 'romana');
INSERT INTO doar_autori
(cod, nume, cod_autor, ocupatie, descriere)
VALUES (3, 'Irving Stone', 1, 'scriitor', 'Michelangelo');
COMMIT;
SELECT VALUE (p) , REF (p)
FROM viz_persoane p;
n cazul specificrii n lista SELECT a atributelor individuale ale tipului asociat vizualizrii
sau a caracterului *, liniile sunt proiectate pe coloanele asociate atributelor tipului declarat al
vizualizrii i nu sunt afiate dect aceste coloane. Cu alte cuvinte, subtipurile sunt afiate respectnd
doar atributele pe care le motenesc de la tipul declarat al vizualizrii.
Pentru a exclude subvizualizrile din rezultat, se folosete cuvntul cheie ONLY. Acesta
rafineaz selecia, permind obinerea doar a obiectelor pentru care cel mai specific tip este identic cu
tipul vizualizrii interogate.
Exemplu:
S se afieze informaii complete despre toate persoanele (inclusiv artitii i autorii).
Rezultatul utilizeaz doar coloanele corespunztoare atributelor tipului t_persoana (nume i cod) i nu
listeaz atributele specifice subtipurilor. De asemenea, s se afieze codul i numele persoanelor,
excluzndu-le pe cele care sunt artiti sau autori.
SELECT * FROM viz_persoane;
SELECT VALUE(p) FROM ONLY (viz_persoane) p;
De obicei, o cerere asupra unei vizualizri care are subvizualizri necesit privilegiul SELECT
doar asupra vizualizrii referite i nici un privilegiu explicit asupra subvizualizrilor. De exemplu,
cererea SELECT * FROM viz_persoane impune existena privilegiului SELECT asupra vizualizrii
viz_persoane, dar nu i asupra subvizualizrilor acesteia, viz_artisti i viz_autori.
O interogare care selecteaz toate atributele din subtipuri, dar nu utilizeaz tipul rdcin
necesit privilegiul SELECT asupra tuturor subvizualizrilor. Acest lucru se ntmpl deoarece
atributele subtipurilor pot conine informaii importante care necesit privilegii adiionale de acces.
122 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
6. Large Objects
Preliminarii
Deoarece aplicaiile de baze de date trebuie s asigure o semantic din ce n ce mai complex,
apare necesitatea de a organiza informaia utiliznd diverse categorii de date, simplu i complex
structurate, semistructurate sau nestructurate.
Modelul relaional este potrivit pentru stocarea datelor simplu structurate. Sistemul Oracle a
adugat caracteristicile obiectuale, astfel nct aplicaiile s poat lucra cu date complex structurate
(colecii, referine, obiecte). Tehnologiile Oracle de gestiune a cozilor de mesaje, cum ar fi Advanced
Queueing, lucreaz cu date semistructurate (de exemplu, date n format XML).
Pentru a asigura gestiunea datelor nestructurate, au fost introduse tipurile de date LOB.
Principalele caracteristici ale datelor nestructurate sunt urmtoarele:
nu pot fi descompuse n componente standard (de exemplu, dac i se asociaz fiecrei
opere de art o imagine, atunci, din punct de vedere fizic, informaia este un ir de bii
care nu poate fi stocat folosind tipurile standard ale bazei de date);
au dimensiuni mari (o nregistrare de tip t_opera_de_arta poate avea cteva sute de
octei, dar chiar i cele mai restrnse date multimedia poate avea de o mie de ori mai
mult);
pot fi stocate n fiierele sistemului de operare gazd, dar trebuie s poat fi accesate n
mod eficient de ctre baza de date.
Odat cu rspndirea Internet-ului i a aplicaiilor bazate pe coninut, a devenit imperativ ca
baza de date:
s asigure tipuri de date pentru stocarea informaiilor nestructurate;
s fie optimizat pentru gestiunea cantitilor mari de date;
s asigure o modalitate uniform de acces la datele nestructurate, stocate n interiorulul
bazei de date sau n afara ei.
n Oracle7, aplicaiile care stocau cantiti mari de date nestructurate utilizau tipurile LONG
sau LONG RAW. Avantajele utilizrii tipurilor LOB din versiunile Oracle8i i Oracle9i fa de tipurile
LONG i LONG RAW, care au fost pstrate pentru compatibilitate, sunt urmtoarele:
capacitatea superioar a tipurilor LOB (obiectele de tip LOB au capacitatea de dou ori
mai mare);
posibilitatea definirii mai multor coloane LOB ntr-un tabel (un tabel n Oracle9i poate
avea mai multe coloane de tip LOB, fiecare de un tip diferit, n timp ce tipurile LONG sau
LONG RAW pot fi folosite cel mult o dat ntr-un tabel);
accesul aleator pe seciuni care nu este valabil n cazul tipului LONG.
Urmtoarele restricii referitoare la tipul LOB au fost eliminate n Oracle9i.
Se pot defini orice tip de declanatori asupra tabelelor ce conin coloane de tip LOB.
Suportul pentru atributele NEW asociate declanatorilor de tip BEFORE la nivel de linie a
fost extins pentru coloanele de tip LOB.
Se pot defini coloane de tip LOB n cadrul spaiilor tabel gestionate local (locally
managed tablespaces) i a celor cu gestiune automat a segmentelor (AUTO segment-
managed tablespaces).
Tipul NCLOB este permis pentru a defini atribute ale tipurilor obiect.
Se pot crea tabele partiionate organizate pe baz de index care s conin obiecte de tip
LOB.
Rutinele pachetului DBMS_LOB pot fi invocate n procedurile de pe maina client (client-
side).
Este permis inserarea i modificarea nregistrrilor ce conin obiecte de tip LOB, n cazul
unei vizualizri asupra creia s-a definit un declanator de tip INSTEAD OF.
n funcie de localizarea lor fa de baza de date, sistemul Oracle9i mparte tipurile de date
LOB n dou categorii:
tipuri interne (BLOB, CLOB i NCLOB), stocate n baza de date;
tipuri externe (BFILE), stocate n fiierele sistemului de operare.
Obiectele LOB interne pot fi persistente sau temporare. Datele de tip LOB interne sunt stocate
n cadrul spaiilor tabel ale bazei de date, astfel nct se optimizez utilizarea spaiului de stocare i se
asigur acces eficient la informaii.
Exist trei tipuri de date LOB interne:
tipul BLOB (Binary Large Object), ale crui valori sunt compuse din date binare
nestructurate;
tipul CLOB (Character Large Object), ale crui valori sunt compuse din iruri de
caractere, ce aparin setului de caractere specificat la nivelul bazei de date (DCS);
tipul NCLOB (National Character Large Object), ale crui valori conin iruri de
caractere, ce aparin mulimii de caractere naionale (NCS) definit la nivel de nivelul
bazei de date.
Obiectele LOB externe (BFILE - binary file) sunt structuri de dimensiuni mari ce conin date
binare, stocate n afara spaiilor tabel ale bazei de date.
Tipul de date BFILE asigur acces secvenial de tip read-only asupra datelor din fiierele
sistemului gazd ale server-ului de baze de date. Singura condiie este ca sistemul de operare al
server-ului s permit acces secvenial asupra acestor fiiere.
126 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
este diferit de un obiect null prin faptul c acesta din urm nu conine un locator). Acest lucru se poate
realiza n SQL sau PL/SQL utiliznd funciile predefinite EMPTY_BLOB() pentru BLOB i
EMPTY_CLOB() pentru CLOB sau NCLOB.
Exemplu:
S se defineasc tabelul obiect tab_opere, asociat tipului t_opera creat anterior. S se insereze
i s se modifice o nregistrare n acest tabel.
CREATE TABLE tab_opere OF t_opera
(CONSTRAINT cod_nn CHECK (cod IS NOT NULL),
descriere DEFAULT EMPTY_CLOB());
INSERT INTO tab_opere
(cod, titlu, tip, cod_artist, foto, reportaj)
VALUES (15, 'Spirit', 'sculptura', 1, EMPTY_BLOB(), NULL);
UPDATE tab_opere
SET descriere = 'Material%Lemn%An%1857%Stil%modern%'
WHERE cod = 15;
Similar definirii tabelelor externe, pentru a crea obiecte LOB externe trebuie creat un obiect
de tip DIRECTORY (director logic). Acesta este un obiect al schemei prin care se specific un alias
pentru un director fizic, ce va conine obiectele LOB externe care vor fi accesate. Pentru a fi procesate
de ctre server-ul Oracle, fiierele referite trebuie s existe i s aib permisiuni de citire.
Alias-ul trebuie creat nainte de a efectua operaii asupra obiectelor BFILE. Comanda de
creare a unui director are urmtoarea form:
CREATE DIRECTORY nume_dir AS 'cale';
Identificatorul cale este un ir de caractere care determin adresa directorului fizic respectiv.
Dac sistemul de operare utilizeaz identificatori case sensitive, atunci specificarea directorului fizic
trebuie s respecte acest lucru.
Suprimarea unui director din dicionarul datelor se face prin comanda:
DROP DIRECTORY nume_dir;
Similar obiectelor interne, obiectele LOB externe (BFILE) trebuie s fie iniializate astfel
nct s refere un fiier al sistemului de operare. Acest lucru se realizeaz prin intermediul funciei
BFILENAME(), care primete ca parametri un director logic creat anterior i numele fiierului asociat.
De remarcat c funcia BFILENAME() nu verific existena fizic a directorului.
Exemplu:
S se introduc o nregistrare n tabelul tab_opere. S se ataeze celor dou nregistrri
existente n tabel, fiierele externe ce conin reportajele asociate. Se presupune c aceste fiiere se afl
n directorul fizic E:\reportaje\.
CREATE OR REPLACE DIRECTORY dir_reportaje AS
'E:\reportaje\';
INSERT INTO tab_opere
(cod, titlu, tip, cod_artist, descriere, foto, reportaj)
VALUES (25, 'Soare', 'pictura', 1,
'Material%Panza%An%1858%Stil%cubist%', EMPTY_BLOB(),
BFILENAME ('dir_reportaje', 'soare.mpeg'));
UPDATE tab_opere
SET reportaj = BFILENAME('dir_reportaje','spirit.mpeg')
128 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Pachetul DBMS_LOB
Pachetul DBMS_LOB conine subprograme pentru prelucrarea datelor de tip BLOB, CLOB,
NCLOB, BFILE i pentru obiectele de tip LOB temporare.
Pachetul DBMS_LOB poate fi folosit pentru a efectua:
operaii de citire sau modificare, n ntregime ori pe seciuni, asupra obiectelor LOB
interne, att persistente, ct i temporare;
operaii de citire pentru obiectele de tip BFILE.
Rutinele DBMS_LOB utilizeaz locatorii LOB. Pentru succesul unei rutine DBMS_LOB
trebuie furnizat un locator valid, diferit de null, care garanteaz existena valorii LOB la invocarea
rutinei.
Locatorii LOB corespunztori obiectelor stocate pot fi selectai ntr-o variabil local PL/SQL.
Aceast variabil se poate utiliza ca parametru de intrare n subprogramele DBMS_LOB pentru
accesarea valorii LOB. Utilizarea unui locator care a fost setat null, pentru a accesa sau prelucra o
valoare LOB, va duce la apariia unei excepii (INVALID_ARGVAL).
Procedurile PL/SQL de pe maina client (de exemplu, cele utilizate de Oracle Forms) nu pot
accesa rutinele DBMS_LOB. n schimb, procedurile stocate pe server sau blocurile anonime
Pro*C/C++ pot apela aceste rutine.
Pachetul DBMS_LOB conine urmtoarele constante:
FILE_READONLY de tip BINARY_INTEGER (valoarea 0);
LOB_READONLY de tip BINARY_INTEGER (valoarea 0);
LOB_READWRITE de tip BINARY_INTEGER (valoarea 1);
LOBMAXSIZE de tip INTEGER (valoarea 4294967295);
CALL de tip PLS_INTEGER (valoarea 12);
SESSION de tip PLS_INTEGER (valoarea 10).
Ca regul general a rutinelor DBMS_LOB, parametrii de tip CLOB i NCLOB sunt
specificai n caractere, iar parametrii de tip BLOB i BFILE n octei. De asemenea, parametrii de tip
ntreg care determin poziia sau cantitatea corespunztoare unui obiect de tip LOB sunt exprimai n
numr de caractere pentru NCLOB i CLOB, iar pentru BFILE i BLOB, n octei. De obicei,
parametrii care determin poziia ntr-o valoare LOB au valoarea implicit 1.
Pentru citirea sau examinarea valorilor LOB interne sau externe, se pot utiliza rutinele
prezentate n cele ce urmeaz.
Funcia COMPARE (lob_1, lob_2, cantitate, poz_1, poz_2) compar dou valori de tip
LOB (interne sau externe). Aceast funcie returneaz 0 dac cele dou valori sunt egale i
o valoare diferit de zero, n caz contrar. Valoarea returnat este null dac poz_1, poz_2
sau cantitate nu sunt cuprinse ntre 1 i LOBMAXSIZE.
Funcia GETCHUNKSIZE (locator) returneaz dimensiunea unitii folosite la
citire/scriere (permis doar cu valori de tip LOB interne).
Funcia GETLENGTH (lob_locator) returneaz dimensiunea valorii de tip LOB (intern
sau extern).
Funcia INSTR (locator, text, poz, n) returneaz poziia celei de-a n-a apariii a unui text
ntr-o valoare de tip LOB (intern sau extern), cutarea ncepnd de la poziia specificat.
130 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Procedura READ (locator, cantitate, poz, buffer) citete o anumit cantitate de date dintr-
o valoare de tip LOB, ncepnd de la poziia specificat (dac se ajunge la sfritul
obiectului este declanat eroarea NO_DATA_FOUND).
Funcia SUBSTR (locator, cantitate, poz) returneaz o poriune din valoarea de tip LOB,
ncepnd de la poziia specificat.
Exemplu:
S se selecteze informaiile coninute n descrierea operei de art avnd codul 15. n cmpul
descriere sunt stocate materialul, anul crerii i stilul, n aceast ordine. Caracterul de separare este
%. De asemenea, se va lista lungimea descrierii i dimensiunea unitii de citire/scriere pentru
fotografia ataat operei.
DECLARE
v_descriere CLOB;
v_foto BLOB;
v_cod tab_opere.cod%TYPE := 15;
v_material VARCHAR2(20);
v_an NUMBER;
v_stil VARCHAR2(20);
v_final BOOLEAN;
TYPE t_tabel IS TABLE OF VARCHAR2(20)
INDEX BY PLS_INTEGER;
info t_tabel;
i PLS_INTEGER;
pos_in PLS_INTEGER;
pos_fin PLS_INTEGER;
v_ecod NUMBER;
v_errm VARCHAR2(150);
BEGIN
SELECT descriere, foto INTO v_descriere, v_foto
FROM tab_opere
WHERE cod = v_cod;
DBMS_OUTPUT.PUT_LINE('Dimensiune CLOB este: ' ||
DBMS_LOB.GETLENGTH(v_descriere));
DBMS_OUTPUT.PUT_LINE('Dimensiune unitate BLOB este: ' ||
DBMS_LOB.GETCHUNKSIZE (v_foto));
v_final := FALSE;
i := 1;
pos_in := 0;
pos_fin := INSTR (v_descriere, '%', 1, i);
LOOP
IF pos_fin != 0 THEN
info (i) := SUBSTR (v_descriere,
Pos_in + 1, pos_fin - pos_in - 1);
i := i + 1;
pos_in := pos_fin;
pos_fin := INSTR(v_descriere, '%', 1, i);
ELSE
v_final := TRUE;
END IF;
EXIT WHEN v_final;
END LOOP;
FOR i IN info.FIRST..info.LAST LOOP
DBMS_OUTPUT.PUT (info(i) ||'-');
Orientare pe obiecte n Oracle9i 131
IF i MOD 2 = 0 THEN
DBMS_OUTPUT.NEW_LINE;
END IF;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
v_ecod := SQLCODE;
v_errm := SUBSTR( SQLERRM, 1, 150);
RAISE_APPLICATION_ERROR (-20100, v_ecod || '-' || v_errm);
END;
/
Rezultatul execuiei blocului PL/SQL anterior este urmtorul:
Dimensiune LOB este: 34
Dimensiune unitate BLOB este: 8132
Material-Lemn-
An-1857-
Stil-modern-
Urmtoarele subprograme din pachetul DBMS_LOB sunt prevzute pentru prelucrarea
obiectelor LOB temporare.
Procedura CREATETEMPORARY (locator, cache, durata) creeaz un obiect de tip LOB
intern temporar. Valoarea boolean cache specific dac obiectul va fi adus n zona de
memorie cache, iar durata este un cod (10 sau 12) care precizeaz durata de via a
obiectului temporar. Durata poate fi sesiunea curent (DBMS_LOB.SESSION) sau apelul
curent (DBMS_LOB.CALL).
Funcia ISTEMPORARY (locator) verific dac un obiect LOB intern este obiect
temporar. n caz afirmativ, funcia returneaz valoarea 1.
Procedura FREETEMPORARY (locator) elibereaz o valoare de tip LOB temporar.
Locatorul dat ca parametru este marcat invalid.
Exemplu:
S se creeze i s se iniializeze dou obiecte de tip LOB temporare, pentru stocarea irurilor
de caractere. S se compare parial cele dou obiecte.
DECLARE
v_temp1 CLOB;
v_temp2 CLOB;
v_sir VARCHAR2(10) := '1234567890';
buffer1 VARCHAR2(1);
buffer2 VARCHAR2(2);
v_cant PLS_INTEGER := 1;
v_ecod NUMBER;
v_errm VARCHAR2(150);
BEGIN
DBMS_LOB.CREATETEMPORARY (v_temp1, TRUE, DBMS_LOB.SESSION);
DBMS_LOB.CREATETEMPORARY (v_temp2, TRUE, DBMS_LOB.SESSION);
DBMS_LOB.WRITE (v_temp1, LENGTH(v_sir), 1, v_sir);
-- v_temp1 contine 1234567890
DBMS_OUTPUT.PUT_LINE (DBMS_LOB.SUBSTR (v_temp1, 10));
DBMS_LOB.COPY (v_temp2, v_temp1, 5, 1, 5);
-- v_temp2 contine 56789
DBMS_OUTPUT.PUT_LINE (DBMS_LOB.SUBSTR (v_temp2, 5));
132 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
CLOSE c_opere_fara_poza;
DBMS_LOB.FILEOPEN (v_reportaj, DBMS_LOB.FILE_READONLY);
IF DBMS_LOB.GETLENGTH (v_reportaj) < v_cant THEN
-- se poate incarca tot fisierul o data
v_cant := DBMS_LOB.GETLENGTH (v_reportaj);
DBMS_LOB.READ (v_reportaj, v_cant, 1, v_buffer);
DBMS_LOB.WRITE (v_foto, v_cant, 1, v_buffer);
DBMS_LOB.FILECLOSE(v_reportaj);
ELSE -- trebuie creat un ciclu pentru incarcarea datelor
BEGIN
v_pos := 1;
LOOP
DBMS_LOB.READ (v_reportaj, v_cant, v_pos, v_buffer);
DBMS_LOB.WRITE (v_foto, v_cant, v_pos, v_buffer);
v_pos := v_pos + v_cant;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN -- s-a terminat fisierul
DBMS_LOB.FILECLOSE (v_reportaj);
END;
END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
v_ecod := SQLCODE;
v_errm := SUBSTR( SQLERRM, 1, 150);
RAISE_APPLICATION_ERROR (-20100, v_ecod || '-' || v_errm);
END;
c) S se creeze o procedur care compar dou obiecte de tip BFILE i returneaz o valoare
boolean ce reflect egalitatea acestora. Se presupune c directorul logic dat ca parametru exist n
sistemul de operare gazd, iar fiierele ce vor fi comparate sunt plasate corect n acest director.
CREATE OR REPLACE FUNCTION comparare (
p_director VARCHAR2,
p_fis1 VARCHAR2,
p_fis2 VARCHAR2) RETURN BOOLEAN AS
v_fis1 BFILE := BFILENAME (p_director, p_fis1);
v_fis2 BFILE := BFILENAME (p_director, p_fis2);
v_rezultat BOOLEAN := FALSE;
BEGIN
DBMS_LOB.FILEOPEN (v_fis1, DBMS_LOB.FILE_READONLY);
DBMS_LOB.FILEOPEN (v_fis2, DBMS_LOB.FILE_READONLY);
v_rezultat := (DBMS_LOB.COMPARE (v_fis1, v_fis2,
DBMS_LOB.GETLENGTH (v_fis1)) = 0);
RETURN v_rezultat;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE (' A aparut o eroare ');
RETURN v_rezultat;
END;
/
136 BAZE DE DATE RELAIONALE ORIENTATE PE OBIECTE
Dintre excepiile predefinite care pot aprea n lucrul cu subprogramele din din pachetul
DBMS_LOB, se enumer:
ACCESS_ERROR, care indic depirea dimensiunii maxime permise pentru un obiect
LOB (cod eroare 22925);
INVALID_ARGVAL, care sesizeaz dac un argument este null, invalid sau n afara
domeniului (cod eroare 21560);
INVALID_DIRECTORY, care semnaleaz dac directorul referit este invalid sau a fost
modificat (cod eroare 22287);
NO_DATA_FOUND, care se declaneaz n situaia n care, la citire, se ajunge la sfritul
fiierului (cod eroare 100);
NOEXISTS_DIRECTORY, care marcheaz inexistena directorului referit ntr-o comand
(cod eroare 22285);
NOPRIV_DIRECTORY, care semnaleaz c utilizatorul nu are privilegiile necesare
asupra directorului referit (cod eroare 22285);
OPEN_TOOMANY, care se declaneaz dac s-a atins numrul maxim de fiiere ce pot fi
deschise n acelai timp (cod eroare 22290);
OPERATION_FAILED, care indic eecul unei operaii asupra unui fiier al sistemului de
operare (cod eroare 22288);
UNOPENED_FILE, care sesizeaz situaia n care o anumit operaie nu poate fi
executat asupra unui fiier, din cauz c acesta nu este deschis (cod eroare 22289).
Orientare pe obiecte n Oracle9i 137
Bibliografie
[1] Alecu A., Cristea G., Popescu I., Velcescu L. - Programare avansat n Oracle9i, Editura Tehnic, mai
2004.
[2] Codd E. F. - Derivability, Redundancy and Consistency of Relations Stored in Large Data Banks, IBM
Research report RJ599, 19 aug.1969.
[3] Codd E. F. A Relational Model for Large Shared Data Banks, Communications of the ACM, Vol. 13,
No6, 1970.
[4] Codd E.F. Further Normalisation of the Data Base Relational Model, Database Systems, Courant
Computer Science Symposia Series 6, Prentice Hall, 1972.
[5] Codd E.F. - Recent Investigations into Relational Database Systems, Proceedings of the IFIP, Stockholm,
1974.
[6] Popescu I. - Modelarea bazelor de date, Editura Tehnic, 2001.
[7] Popovici,D.M.,Popovici,I.M.,Tanase,I. - C++ Tehnologie orientata pe obiecte. Aplicatii, Ed.Teora, 1996.
[8] Soutou C. - De UML SQL Conception de bases de donnes, Eyrolles, 2002.
[9] Soutou C. - Objet-relationnel sous Oracle8, Modelisation avecUML, Eyrolles, 1999.
[10] *** Oracle9i Application Developer's Guide Large Objects (LOBs) Release 2 (9.2), Oracle Corporation, 2002.
[11] *** Oracle9i Application Developer's Guide - Object-Relational Features Release 2 (9.2), Oracle Corporation, 2002.
*** Oracle9i Database Concepts Release 2 (9.2), Oracle Corporation, 2002.