Gestionarea Bazelor de Date

Embed Size (px)

Citation preview

UNIVERSITATEA TEHNIC A MOLDOVEI

B. MIRONOV

GESTIONAREA BAZELOR DE DATE

ndrumar de laborator

Schema extern 1

Schema extern iSchema conceptual Schema intern

Schema extern n

Chiinu 2001

Prezentul ndrumar de laborator se adreseaz studenilor facultii Calculatoare, Informatic i Microelectronic, care studiaz cursul aprofundat de "Baze de date", grupelor de studii n cadrul magistraturii, care studiaz limbajul SQL i n special sistemul Oracle. El poate fi consultat i de studenii altor faculti n cadrul cursurilor de informatic. Ciclul conine 11 lucrri de laborator, consacrate crerii i gestionrii bazelor de date relaionale. Fiecare lucrare este prefaat de un material amplu teoretic necesar pentru nelegerea principiilor de operare cu bazele de date. Lucrrile de laborator sunt axate pe sistemul Oracle considerat cel mai utilizat sistem de gestiune a bazelor de date relaionale din ntreaga lume.

Autor: conf. univ. dr. Bettin Mironov

Redactor responsabil: prof. univ. dr. hab. Teodor iianu

Recenzent: conf. univ. dr. Leonid Carcea

U.T.M., 20011

CUPRINS LUCRAREA DE LABORATOR NR. 1 Introducere n bazele de date relaionale 3 LUCRAREA DE LABORATOR NR. 2 Structuri logice de stocare a bazelor de date 11 LUCRAREA DE LABORATOR NR. 3. Proiectarea unei baze de date 19 LUCRAREA DE LABORATOR NR. 4 Tipuri de date. Tabele 1 25 LUCRAREA DE LABORATOR NR. 5. Crearea tabelelor 36 LUCRAREA DE LABORATOR NR. 6. Integritatea datelor 42 LUCRAREA DE LABORATOR NR. 7. Selectarea si ntreinerea datelor 54 LUCRAREA DE LABORATOR NR. 8. SQL (limbaj structurat de interogare) 63 LUCRAREA DE LABORATOR NR. 9. Reuniunile i uniunile 77 LUCRAREA DE LABORATOR NR. 10. Vederi 88 LUCRAREA DE LABORATOR NR. 11. Sigurana bazei de date 94 ANEXE Lista cuvintelor rezervate Oracle SQL: 122 Cuvintele rezervate pentru SQL*Plus. 127 Simboluri 129 Bibliografie 123

2

LUCRAREA DE LABORATOR Nr. 1Introducere n bazele de date relaionaleBazele de date relaionale n prezent sunt cele mai utilizate pentru modelarea i gestionarea ntreprinderilor. Modelul relaional de date este modelul cu cea mai larg acceptare si utilizare. Modelul de date relaional utilizeaz cuvntul relaional deoarece n acest model se pot construi cu uurin relaii ntre tabele multiple. Un model relaional are trei caracteristici eseniale: - structuri - obiecte definite care conin date i sunt accesibile utilizatorilor; - operaii - aciuni definite care manipuleaz datele sau obiectele schemei; - reguli - legi care reglementeaz cum i de ctre cine pot fi manipulate datele. O baz de date relaional este definit pur i simplu ca un model de date care este vizualizat de utilizatorii lui exclusiv sub forma unor tabele. Un tabel este o matrice bidimensional format din linii i coloane. Ori de cte ori sunt modificate date ntr-o baz de date, se modific i tabelul sau datele acestuia. n sfrit, ntr-o baz de date relaional, orice date care sunt rezultatul unei interogri sunt prezentate utilizatorului n format coloan-linie. Modelul de date relaional prezint urmtoarele avantaje fa de modelele de date tradiionale: - un model de date uor de neles i de vizualizat; - legi de integritate uor de neles i de dezvoltat, destinate protejrii datelor i structurilor; - spaiu de stocare a datelor i redundan reduse; - independena structurii logice a bazelor de date de modul de stocare fizic a datelor. n sistemele de baze de date relaionale se utilizeaz limbajul de interogare SQL (Structured Query Language - limbaj structurat de interogare). n 1985 dr. Codd a definit modelul relaional ca pe o colecie de tabele, el a stabilit urmtoarele 13 reguli, care definesc ce este o baz de date. 1. Toate informaiile din baza de date sunt reprezentate n mod explicit sub form de valori ntr-un tabel. 3

2. Toate datele individuale dintr-un tabel sunt ntotdeauna accesibile prin furnizarea numelui tabelului, a coloanei i a liniei. 3. Valorile nule sunt tipuri de date valide n baza de date relaional. Ele reprezint inexistena informaiilor. 4. Baza de date relaional reprezint descrierea bazei de date ntr-un format logic simplificat de genul tabelelor. 5. Modelul relaional poate suporta mai multe limbaje, ns SQL este limbajul principal de nterfaare. 6. Toate vederile sunt actualizabile, dac vederea curent este un tabel. 7. Modelul relaional trateaz toate relaiile de baz i relaiile derivate ca un singur operand pentru operaiile update (actualizare), insert (inserare) i delete (eliminare) efectuate asupra datelor, precum i asupra datelor recuperate. 8. Aspectele logice ale bazei de date sunt complet separate de aspectele fizice ale bazei de date. 9. Datele sunt conservate atunci cnd bazei de date i se aduc modificri ilogice. 10. Restriciile de integritate pentru o baz de date relaional sunt create n sublimbajul de baze de date (SQL) i sunt stocate n catalogul bazei de date i nu n aplicaiile individuale. 11. Distribuia datelor ctre programele de aplicaie are loc continuu. Distribuia datelor este procesul de copiere a datelor ntr-o baz de date situat la distan. 12. Regulile i restriciile de integritate nu pot fi evitate de nici un limbaj de acces. 13. Un SGBDR trebuie s fie capabil s gestioneze bazele de date exclusiv pe baza caracteristicilor sale relaionale.

Noiuni despre sistemul de gestiune a bazelor de datePentru realizarea i funcionarea bazei de date este necesar un sistem de gestiune a bazelor de date relaionale (SGBDR). n prezent cel mai popular sistem de gestiune a bazelor de date relaionale este considerat Oracle. El reprezint nucleul liniei de produse oferite de Oracle Corporation, care include, printre altele, un set de instrumente de dezvoltare a aplicaiilor din a patra generaie, instrumente de raportare i utilitare. n afar de sistemul Oracle exist i alte sisteme, de exemplu Microsoft SQL Server, ndrumarul prezentat este axat n jurul sistemului Oracle, dar rezultatele pot fi uor extinse i asupra altor SGBDR. 4

nelegerea celor ce urmeaz, este legat de dou concepte: baza de date i instana. O baz de date este o colecie de date. Programul Oracle stocheaz aceste date folosind modelul relaional. Acest termen se refer att la datele fizice ct i la structurile logice de memorie i la procesele din fundal. Instana se refer la acea parte a memoriei pe care programul Oracle a alocat-o pentru baza de date, precum i la procesele din fundal necesare pentru susinerea bazei de date. Utilizarea programului Oracle prezint urmtoarele avantaje semnificative: - este un sistem deschis" i respect standardele industriale n vigoare referitoare la limbajele de accesare a datelor (SQL); - suport baze de date de orice dimensiuni, ncepnd de la civa octei pn la civa gigaoctei; - suport un mare numr de utilizatori simultan, minimizeaz conflictele de acces la date i garanteaz simultaneitatea datelor; - suport un mediu client/server real. El permite mprirea procesrii ntre baza de date server i programele de aplicaie ale clientului; - ofer caracteristici de siguran total pentru limitarea i monitorizarea accesului la date i a utilizrii acestora; - se comport identic pe toate platformele (Windows, UNIX, Macintosh i sisteme mainframe). Aceasta deoarece peste 80 la sut din codul su este identic pe toate platformele i sistemele de operare. Sistemul Oracle poate fi instalat pe o mare varietate de platforme hardware i de sisteme de operare, inclusiv pe calculatoarele personale. Capacitatea de procesare a sistemului Oracle este dat de structurile de memorie i de procesele acestuia. Toate structurile de memorie rezid n memoria principal a calculatorului. Procesele sunt sarcini i aciuni ale programului i ale utilizatorului care se desfoar n memoria acestor calculatoare. n funcionare, Oracle folosete dou structuri de memorie principale. Zona global a sistemului (SGA - System Global Area) este o structur de memorie care conine datele i controleaz informaiile pentru o instan Oracle. Structura SGA mpreun cu procesele din fundal ale serverului constituie o instan Oracle. Cea de-a doua structur principal de memorie este zona global a programului (PGA - Program Global Area). Aceast structur conine datele i controleaz informaiile 5

pentru un proces server. Structura PGA este creat la declanarea unui proces server. O baz de date Oracle nu este n mod necesar disponibil oricnd tuturor utilizatorilor. Atunci cnd baza de date este deschis, utilizatorii pot accesa informaiile acesteia. Atunci cnd baza de date este nchis, numai administratorul bazei de date are acces la ea. Administratorul bazei de date - sau utilizatorii posesori ai unui privilegiu DBA (Data Base Administrator) sunt singurii care pot s porneasc i s opreasc baza de date. Pornirea bazei de date i punerea ei la dispoziia utilizatorilor din ntregul sistem presupune parcurgerea urmtoarelor trei etape: - pornirea unei instane; - montarea bazei de date; - deschiderea bazei de date. Pornirea unei instane este sinonim cu pornirea bazei de date. Cnd survine acest lucru, programul Oracle aloc o poriune a memoriei partajate i a proceselor din fundal. Aceast poriune alocat a memoriei partajate este cunoscut sub numele de zon global a sistemului (SGA). Dac tocmai a fost pornit o instan, nici o baz de date nu este asociat cu aceast structur de memorie. n consecin, nici un utilizator nu poate accesa informaiile bazei de date. Montarea bazei de date este procesul de asociere a unei baze de date cu o instan pornit anterior. Dup montarea bazei de date, aceasta este nchis tuturor utilizatorilor pn n momentul n care administratorul bazei de date deschide baza de date. Deschiderea bazei de date este procesul prin care baza de date este pus la dispoziia utilizatorilor pentru operaii obinuite de baze de date. Orice utilizator autorizat se poate conecta la o baz de date Oracle deschis i poate accesa informaiile acesteia. Oprirea bazei de date Oracle presupune parcurgerea urmtoarelor trei etape: - nchiderea bazei de date; - demontarea bazei de date; - oprirea bazei de date. nchiderea bazei de date determin scrierea tuturor datelor bazei de date n fiierele de date. Demontarea bazei de date reprezint disocierea bazei 6

de date de instan. n sfrit, oprirea bazei de date duce la ncheierea tuturor proceselor server, iar SGA este eliminat din memorie.

Accesarea bazei de dateO instan Oracle care este pornit i posed o baz de date deschis poate fi accesat de utilizatori. Un utilizator este orice persoan care posed un cont utilizator nregistrat n serverul Oracle i creia i-au fost acordate privilegiile corespunztoare pentru accesul la date. Accesarea bazei de date se poate face prin intermediul urmtoarelor aplicaii: - aplicaia utilizatorului ntr-un mediu client/server prin intermediul SQL*NET; - prin intermediul SQL*PLUS, una dintre cele mai rspndite metode de acces; - instrumente Oracle, cum ar fi Developer 2000; - prin intermediul unui apel OCI sau al unui alt apel de funcie n care sunt ncorporate instruciuni SQL, ntr-un limbaj de programare de nivel sczut, cum ar fi C sau COBOL. Lista care urmeaz ilustreaz accesarea de ctre un utilizator a unui SGBDR Oracle, ntr-un mediu client/server. Sunt descrise numai operaiile cele mai elementare pe care le efectueaz Oracle. 1. Un server Oracle posed o instan pornit i o baz de date montat i deschis utilizatorilor. 2. Aplicaia utilizatorului ncearc s stabileasc o legtur cu serverul Oracle. 3. Serverul recunoate cererea de conectare a clientului i creeaz un proces n numele utilizatorului. 4. Aplicaia utilizatorului recepioneaz o confirmare privind succesul conectrii i transmite instruciuni SQL pentru a accesa i a actualiza baza de date. 5. Procesul serverului recepioneaz instruciuni SQL i verific privilegiile de acces ale utilizatorului. 6. Dac tranzacia SQL a decurs cu succes, procesul server transmite un mesaj aplicaiei client. Dac tranzacia nu s-a ncheiat cu succes, serverul transmite clientului mesajul de eroare corespunztor. 7. n timpul acestei tranzacii, serverul previne conflictele de acces la date cu alte tranzacii care solicita aceleai date. De asemenea, serverul 7

gestioneaz celelalte tranzacii i urmrete situaiile care necesit intervenie.

Dicionarul de date OracleNucleul bazei de date Oracle este dicionarul de date. Acest instrument read-only" furnizeaz tuturor utilizatorilor bazei de date informaii despre baza de date asociat. Dicionarul de date este creat automat atunci cnd este creat baza de date. Oracle actualizeaz dicionarul de date ca rspuns la orice comand DDL (Data Dictionary Language - limbaj al dicionarului de date) emis. Dicionarul de date furnizeaz urmtoarele informaii: - numele tuturor obiectelor bazei de date inclusiv tabele, vederi, instantanee, indeci, sinonime, proceduri, funcii i a. m. d.; - numele utilizatorilor bazei de date Oracle, privilegiile i rolurile acordate fiecrui utilizator, informaii referitoare la restriciile de integritate, valori prestabilite pentru coloane, gradul de utilizare i alocarea spaiului, informaii de auditare. Dicionarul de date al bazei de date relaionale Oracle este compus din dou componente fundamentale: - Tabele de baz. -Aceste tabele reprezint nucleul dicionarului care stocheaz informaiile despre baza de date. Aceste tabele sunt accesate direct de nsui mediul Oracle i sunt rareori accesate de utilizatorii Oracle. In aceste tabele, datele sunt stocate n formatul intern al mediului Oracle, pe care utilizatorul final nu-1 poate citi. - Vederi accesibile utilizatorilor. -Aceste vederi sintetizeaz i prezint informaiile stocate n tabelele de baz ale dicionarului de date. Aceste vederi decodific pentru utilizator informaiile stocate n tabelele de baz. Majoritatea utilizatorilor au acces la aceste vederi i nu la tabelele de baz. Dicionarul de date este proprietatea utilizatorului Sys al sistemului Oracle i, prin urmare, nici un utilizator nu are privilegiul de a modifica direct dicionarul de date. De obicei, pentru multe dintre vederile bazei de date sunt create sinonime publice astfel, nct acestea sunt uor accesibile utilizatorilor finali. Administratorul bazei de date are responsabilitatea de a crea aceste sinonime. Accesul la dicionarul de date este ntotdeauna permis atunci, cnd baza de date este deschis. Dac baza de date este nchis, toate vederile corespunztoare dicionarului de date devin inaccesibile. 8

Dicionarul de date reprezint o colecie logic de tabele i de vederi. Ele pot fi accesate prin interogri ale utilizatorilor n vederea obinerii de informaii despre baza de date. Dicionarul de date const dintr-un set de vederi, care sunt accesate prin intermediul limbajului SQL. Anumite vederi sunt accesibile tuturor utilizatorilor n timp ce altele sunt destinate numai administratorilor bazei de date. Urmeaz o scurt trecere n revist a ctorva dintre vederile disponibile tuturor utilizatorilor care posed privilegiul de sistem create session. all_col_coinments Comentarii n legtur cu coloanele tabelelor i vederilor accesibile. all_constraints Definiiile restriciilor asociate tabelelor accesibile. all_db_links Legturile bazei de date accesibile utilizatorului. all_errors Erori curente referitoare la toate obiectele accesibile utilizatorului. all_indexesDescrierea indecilor tabelelor accesibile utilizatorului. all_objectsObiectele accesibile utilizatorului. all_sequencesDescrierea secvenelor accesibile utilizatorului. all_snapshotsToate instantaneele accesibile utilizatorului. all_synonymsToate sinonimele accesibile utilizatorului. all_tablesDescrierea tabelelor accesibile utilizatorului, all_triggersInformaii referitoare la toi declanatorii accesibili utilizatorului. all_usersInformaii despre toi utilizatorii bazei de date. all_viewsTextul vederilor accesibile utilizatorului.

Mersul lucrrii:1. Activai comanda SQL*PLUS n dependen de sistemul de operare instalat pe calculator (Unele sisteme cer introducerea comenzii n registrul de jos). SQL*PLUS va afia Enter user-name: 2. Introducei numele SCOTT i apsai [Enter]. SQL*PLUS va afia "Enter password:". 9

3. Introducei parola TIGER i apsai [Enter] din nou. Parola nu se afieaz pe ecran. SQL*PLUS va arta versiunea ORACLE, i pachetele disponibile (ex., PL/SQL). Dup aceea, SQL*PLUS va afia: SQL> Ceea ce nseamn c SQL*PLUS este gata de a accepta comenzile. 4. Pentru a putea analiza ulterior activitatea n SQL, nainte de a ncepe lucrul se recomand crearea fiierului-spuller, de exemplu: spool c:/aa/trace1 aici: c:/aa/ - traseul spre fiierul-spuller; trace1 denumirea fiierului-spuller 5. Introducei comanda: describe all_tables; i apsai [Enter]. Care va fi rezultatul? 6. Repetai punctul 5 cu ali operatori din lista vederilor i nregistrai rezultatul. 7. Ieirea din SQL*PLUS, se face cu ajutorul comenzii exit. exit;

Rezumatn acest capitol, v-ai familiarizat cu sistemul de baze de date relaionale Oracle. Modelul de baze de date relaionale este definit ca o matrice bi-dimensional compus din linii i coloane. Accesul la o anumit dat se realizeaz prin cunoaterea numelui tabelului, coloanei i liniei n care se afl data. Sistemul de baze de date relaionale Oracle pune la dispoziie o baz de date care este uor de neles, de utilizat i suficient de flexibil pentru a satisface toate cerinele bazei de date. Aceast baz de date este un sistem deschis i respect standardele industriale referitoarele la limbajele de accesare a bazelor de date (SQL). n aceast lucrare, au fost prezentate etapele necesare pentru pornirea i oprirea bazei de date Oracle. De asemenea, ai aflat semnificaia termenului relaional, i anume: o colecie de tabele care sunt asociate ntre ele pe baza unei coloane comune.

10

LUCRAREA DE LABORATOR Nr. 2Structuri logice de stocare a bazelor de dateStructurile logice de stocare dicteaz modul n care este utilizat spaiul fizic al bazei de date, ele se pot manipula pentru a ajusta utilizarea spaiului de pe disc. O structur logic de stocare este o unitate alocat a spaiului de stocare. Scopul ei principal este de a defini modul n care va fi utilizat spaiul fizic de stocare a bazei de date. Este utilizat pentru a crea modelul de date relaional pornind de la structura fizic a bazei de date. Structurile logice de stocare includ spaii tabel, segmente, extinderi, blocuri si fiiere de date. Oracle aloc spaiul bazei de date pentru toate datele bazei de date. Unitile de stocare sunt blocurile de date, extinderile i segmentele. Aceste structuri pot fi manipulate prin operaii de baze de date. Structurile logice de stocare dicteaz modul n care va fi utilizat spaiul fizic al bazei de date. Obiectele schemei i relaiile dintre ele formeaz profilul relaional al bazei de date. Aceast configuraie logic a bazei de date are influen asupra performanelor bazei de date. O baz de date Oracle posed att o structur logic, ct i o structur fizic. Structura fizic conine fiierele de date, fiierele de control i fiierele jurnal curente. Prin separarea celor dou tipuri de structuri, fiecare poate fi gestionat independent de cealalt fr a afecta accesul reciproc. Atunci cnd sunt create structurile logice de stocare, spaiul este alocat n baza de date conform unor criterii predefinite. Administratorul bazei de date are dreptul s ignore sau s reconfigureze criteriile bazei de date pentru a optimiza utilizarea spaiului discului. Pentru a ti s alocai spaiu n mod eficient i performant, trebuie s nelegei cum este utilizat spaiul bazei de date. Structura logic a unei baze de date Oracle este definit prin urmtoarele caracteristici: spaii-tabel, segmente, extinderi, blocuri de date.

Spaii-tabelAtunci cnd o baz de date este creat de administratorul bazei de date, este mprit n uniti logice multiple numite spaii-tabel. Datele bazei de date sunt stocate logic n spaiul-tabel, iar fizic sunt stocate n fiierele de date care sunt asociate cu spaiul-tabel. 11

n afar de stocarea logic a datelor, administratorul bazei de date poate folosi spaii-tabel pentru a realiza urmtoarele: - controlul consumrii spaiului fizic de pe disc de ctre baza de date; - alocarea anumitor cote de disc utilizatorilor individuali; - stabilete repartiia stocrii datelor ntre dispozitive fizice multiple de stocare. Atunci cnd este creat un spaiu-tabel, sunt create automat spaiultabel System i fiierele de date. Spaiul-tabel System conine ntregul dicionar de date al bazei de date. Se recomand s fie creat cel puin un spaiu-tabel suplimentar pentru a pstra informaiile dicionarului de sistem separat fa de date. Utilizarea spaiilor-tabel multiple asigur flexibilitate n executarea operaiilor asupra bazei de date. Printre avantajele utilizrii spaiilortabel multiple se numr urmtoarele: - separarea datelor de sistem fa de datele utilizatorului; - permite separarea aplicaiilor ntre ele; - posibilitatea dezactivrii anumitor spatii-tabel individuale i meninerea celorlalte active; - posibilitatea de a stoca spaii-tabel diferite pe uniti de disc distincte n vederea mbuntirii performanelor i reducerii conflictelor de acces la date. Spaiul-tabel System conine, de asemenea, segmente de revenire si uniti de program PL/SQL cum ar fi funcii-procedur, declanatori i pachete. Dac pentru o anumit baz de date este creat o asemenea unitate PL/SQL, administratorul bazei de date trebuie s aib n vedere necesitile de spaiu aferente. Prin urmare, administratorul bazei de date va aloca mai mult spaiu pentru baza de date. Spaiul-tabel System trebuie s fie ntotdeauna pstrat activ, deoarece Oracle trebuie s aib oricnd acces la dicionarul de date. Un spaiu-tabel Oracle este pstrat de obicei activ (online) astfel, nct datele pe care le conine s fie accesibile tuturor utilizatorilor bazei de date. Administratorul bazei de date poate s dezactiveze spaiul-tabel (offline) pentru oricare dintre urmtoarele motive: - pentru a efectua operaiuni de ntreinere sau copii de siguran (backup) ale bazei de date; - pentru a interzice accesul la un grup de tabele n timpul actualizrii sau modificrii unei aplicaii; 12

- pentru a interzice accesul la o poriune a bazei de date n timp ce restul bazei de date rmne activ (online). Oracle mpiedic executarea instruciunilor SQL care fac referire la spatiile-tabel dezactivate. Orice tranzacie SQL activ care face referire la spatiile-tabel dezactivate va fi finalizat normal. Integritatea datelor se pstreaz n segmentele de revenire (rollback segments) pentru aceste segmente SQL active. Un spaiu-tabel nu poate fi dezactivat dac exist un segment de revenire activ care face referire la el. Segmentul de revenire trebuie rezolvat nainte ca spaiul-tabel s poat fi trecut n stare inactiv. Un spaiu-tabel dezactivat nu poate fi citit sau manipulat de nici o alt aplicaie sau utilitate alta dect Oracle. Spaii-tabel i fiiere de date Fiecare spaiu-tabel conine cel puin un fiier fizic de date. Fiierul de date asociat cu un spaiu-tabel conine datele pentru spaiul-tabel respectiv. Fiierele de date sunt asociate cu un singur spaiu-tabel i o singur baz de date. Fiierul de date iniial al fiecrei baze de date este destinat pstrrii spaiului-tabel System. Acest fiier este necesar pentru pstrarea dicionarului de date i a segmentului de revenire ce trebuie s aib o dimensiune iniial de cel puin 2KB. Pe msur ce dimensiunea bazei de date crete, putei aduga spaiului-tabel fiiere de date suplimentare. n general, ideal este s adugai mai degrab puine fiiere de date de dimensiuni mari dect mai multe fiiere de date de dimensiuni mai mici. Spaiul-tabel i fiierul de date asociat sunt goale n momentul n care sunt create. Cu toate acestea, ele posed spaiu alocat n vederea pstrrii datelor viitoarei baze de date. n vederea pstrrii acestor date, n spaiul-tabel sunt create segmente de date. Atunci cnd este creat un segment ntr-un spaiu-tabel sau cnd dimensiunea acestuia crete, programul Oracle utilizeaz spaiul liber din fiierul de date asociat pentru a aloca extinderi pentru segmentul respectiv. Remarcai faptul c un obiect logic de stocare nu corespunde unui anumit fiier de date. n schimb, un fiier de date este depozitarul datelor oricrui obiect dintr-un anumit spaiu-tabel.

13

Segmente Segmentele sunt omoloagele fizice ale obiectelor bazei de date care stocheaz datele. Un segment este format din extinderi. Spaiul alocat segmentelor nu este eliberat dect atunci cnd segmentul este abandonat sau trunchiat. Oracle definete patru tipuri de segmente: - segmentul tabel; - segmentul index; - segmentul de revenire; - segmentul temporar Segmentul tabel Segmentul tabel, cunoscut i sub numele de segment de date, stocheaz datele din tabele, clustere i instantanee. Acest tip de segment este creat indirect prin intermediul comenzilor create table/cluster/snapshot De obicei, segmentul tabel este foarte activ deoarece aici sunt pstrate datele. Aceste date sunt manipulate de un mare numr de tranzacii SQL. Pentru obinerea unor performane corespunztoare, este important ca administratorul bazei de date s aloce cantitatea adecvat de spaiu de stocare pentru fiecare segment. Dac segmentul acumuleaz continuu noi extinderi, datele devin fragmentate, iar performanele scad. Baza de date nu poate garanta alocarea contigu a extinderilor. Comanda pctfree poate fi folosit pentru a monitoriza cantitatea de spaiu liber pe care o posed un segment. Acest spaiu liber poate fi utilizat intern pentru spaiul-tabel sau poate fi eliberat i returnat bazei de date. Segmentul index Segmentul index este creat pentru a pstra datele unui index al bazei de date. Sintaxa: create index Aceast comand v permite s definii parametrii extinderilor segmentului index i spaiului-tabel n care va fi creat indexul. Segmentul de revenire Segmentul de revenire este o poriune a bazei de date care nregistreaz aciunile unei tranzacii SQL n vederea derulrii napoi a acestora dac se dorete acest lucru. Un segment de revenire restabilete 14

baza de date n starea n care se gsea la ultimul punct de salvare sau la ultima acceptare. Fiecare tranzacie are un segment de revenire asociat. De obicei, acest segment este atribuit automat de ctre baza de date. Avei totui posibilitatea s asociai o tranzacie cu un segment de revenire corespunztor. Segmentul de revenire conine mai multe informaii. Printre acestea se numr numele fiierului i identificatorul blocului pentru datele care au fost modificate i pentru datele existente naintea ultimei tranzacii. Aceste segmente de revenire pot fi citite i scrise exclusiv de ctre programul Oracle. Segmentul temporar Un segment temporar este un spaiu de lucru destinat prelucrrii unui tabel utilizat pentru pstrarea rezultatelor intermediare ale unei tranzacii SQL. De exemplu, pentru o operaie de sortare va fi creat un segment temporar reprezentnd zona de lucru pentru aceast operaie. Urmtoarele comenzi SQL pot necesita crearea unui segment temporar: Create index Select order by Select distinct Select minus Select intersect Extinderi O extindere este o structur logic de stocare compus dintr-un numr de blocuri contigue. Fiecare tip de segment este compus din una sau mai multe extinderi. Atunci cnd un segment epuizeaz spaiul de stocare care i-a fost alocat, programul Oracle i aloc o nou extindere. Atunci cnd este creat, fiecare segment posed cel puin o extindere. La alocarea unei noi extinderi pentru un segment, se parcurg urmtoarele etape: 1. Programul Oracle parcurge spaiul-tabel n cutarea primului set contiguu de blocuri de date libere care au mpreun dimensiunea incrementului stabilit pentru o extindere. 2. Programul Oracle gsete spaiul liber necesar i aloc extinderii respective o poriune a acestui spaiu liber egal cu incrementul unei extinderi. 3. Dicionarul de date este actualizat pentru a reflecta alocarea noii extinderi i faptul c spaiul alocat nu mai este liber. 15

Extinderile segmentelor pot fi returnate atunci cnd nu mai sunt necesare. n general, extinderile nu sunt returnate spaiului-tabel ca spaiu liber pn cnd segmentul nu este returnat ca un ntreg. Acest lucru survine, de exemplu, atunci cnd un tabel este abandonat, iar segmentele i extinderile sunt eliberate. Atunci cnd sunt eliberare segmente, dicionarul de date este actualizat pentru a reflecta extinderile recuperate ca reprezentnd spaiu disponibil. Datele din blocurile extinderilor eliberate nu mai sunt accesibile. Blocuri de date Blocul de date reprezint cea mai mic unitate de stocare utilizat de programul Oracle pentru stocarea datelor. Un bloc de date corespunde unui bloc fizic de octei de pe disc. n interiorul fiierelor de date spaiul de stocare este compus din blocuri de date. Formatul blocurilor de date Oracle este identic, indiferent dac blocul de date conine un tabel, un index sau clustere de date. Blocurile de date includ urmtoarele componente: - antetul - conine informaii referitoare la bloc cum ar fi adresa blocului i tipul segmentului; - catalogul de tabele - conine informaii despre tabele care posed linii n blocul respectiv; - catalogul de linii - conine informaii despre liniile din bloc; - spaiu liber - folosit pentru inserarea noilor linii i pentru actualizarea liniilor care necesit spaiu suplimentar. - linii de date - conine date aparinnd unor tabele sau unor indeci. Programul Oracle permite liniilor de date s se ntind pe spaiul mai multor blocuri. Spaiul alocat liniilor de date nu este eliberat de server atunci cnd sunt terse linii. Acest spaiu este reutilizat numai atunci, cnd sunt inserate noi linii n blocul respectiv. Pentru controlul utilizrii spaiului liber al blocului de date, proiectantul aplicaiei are la dispoziie doi parametri, pctfree i pctused. Ambii parametri pot fi specificai numai n momentul crerii sau modificrii tabelelor i clusterelor. Parametrul pctfree este folosit pentru a defini procentajul blocului de date care urmeaz s fie pstrat liber pentru eventualele actualizri ale liniilor care exist deja n blocul de date respectiv. Parametrul din exemplul urmtor, atunci cnd este folosit mpreun cu 16

comanda create table, va rezerva 35 de procente din blocul de date utilizat pentru tabelul respectiv ca spaiu liber pentru eventualele actualizri viitoare: pctfree 35 Parametrul pctused este folosit pentru a defini procentul din spaiul existent n blocul de date pe care programul Oracle va ncerca s-1 completeze nainte de a aloca o nou extindere. Parametrul din exemplul care urmeaz, atunci cnd este folosit mpreun cu comanda create table, specific programului Oracle s nu insereze alte linii n blocul de date dac nu sunt libere cel puin 40 de procente din acesta: pctused 40 Parametrii pctfree i pctused sunt folosii mpreun pentru a optimiza utilizarea spaiului din blocurile de date i extinderile unui segment de date.

Mersul lucrrii:1. Activai comanda SQL*PLUS 2. Introducei numele de sistem SYSTEM i apsai [Enter]. SQL*PLUS va afia "Enter password:". 3. Introducei parola MANAGER i apsai [Enter] din nou. 4. Introducei comanda pentru a avea fiierul spooller: spool c:\1\trace2 Crearea noilor spaii-tabel i a fiierelor de date Pentru a crea un nou spaiu-tabel trebuie s posedai privilegiul de sistem create tablespace. Instruciunea care urmeaz creeaz un spaiu-tabel numit dbt_user_01. create tablespace dbt_user_01 datafile 'c:\1/datafile_01' size 256k default storage ( initial 50k next 40k minextents 10 maxextents 50 pctincrease 0) ; Rezultatul: Tablespace created. 17

Urmtorul exemplu va aduga un nou fiier de date la un spaiu-tabel existent numit dbt_user_01: alter tablespace dbt_user_01 add datafile 'c:\1/new_file_name_2' size 512k; Rezultatul: Tablespace altered. Afiarea informaiilor spaiilor-tabel i ale fiierelor de date Oracle prevede mai multe vederi predefinite care v permit s obinei informaii despre spaiile-tabel i fiierele de date. Iat numele acestor vederi: Dba_tablespaces user_tablespaces dba_data_files user_extents user_segments dba_extents Urmtorul exemplu utilizeaz vederea dba_tablespace pentru a obine informaiile de stocare prestabilite pentru spaiul-tabel dbt_user_0l: select tablespace_name tablespace, initial_extent extent, next_extent next_ext, min_extents min_ext, max_extents max_ext, pct_increase pct_incr, status status from sys.dba_tablespaces; Rezultatul:tablespace extent next_ext min_ext max_ext pct_incr status -------------------- -------- ---------------- -------- -----SYSTEM 10240 10240 1 121 50 ONLINE USER_DATA 10240 10240 1 121 50 ONLINE ROLLBACK_DATA 10240 10240 1 121 50 ONLINE TEMPORARY_DATA 10240 10240 1 121 50 ONLINE DBT_USER_01 51200 40960 10 50 0 ONLINE

18

Privii aceste vederi, pentru a dobndi o impresie de ansamblu a spaiilor-tabel i fiierelor dumneavoastr de date curente.

RezumatStructurile logice de stocare creeaz modelul de date relaional n baza de date fizic. Aceste structuri definesc modul n care va fi utilizat baza de date fizic. Structurile logice de stocare sunt necesare pentru ca administratorul i proiectantul bazei de date s maximizeze eficiena bazei de date. De asemenea, aceste structuri sunt folosite pentru a optimiza utilizarea spaiului de pe disc prin reducerea redundanei datelor. Baza de date Oracle este mprit n uniti logice numite spaiitabel. Datele bazei de date sunt stocate n fiiere de date. Un spaiu-tabel posed cel puin un segment pentru stocarea datelor bazei de date. Fiecare segment este compus din extinderi. O extindere este format din uniti contigue de spaiu de stocare numite blocuri de date.

LUCRAREA DE LABORATOR Nr. 3Proiectarea unei baze de date.Proiectarea unei baze de date reprezint procesul pe care l parcurgei n vederea pregtirii crerii fizice a unei baze de date Oracle. Etapele acestui proces includ identificarea operaiunilor pe care le va gestiona baza de date, precum i crearea proiectului fizic al bazei de date. n lipsa proiectrii corecte a bazei de date, aceasta poate prezenta urmtoarele deficiene: - Integritatea datelor este compromis deoarece restriciile de integritate nu pot fi proiectate corect. - Datele devin redundante. - Performanele sunt afectate deoarece pentru finalizarea unei instruciuni select pot s fie necesare interogri suplimentare. Pentru a crea o baz de date Oracle este necesar parcurgerea urmtoarelor etape: 1. Crearea unui model al activitii companiei. 2. Crearea unui model al datelor. 3. Crearea unui proiect de baz de date. 4. Crearea definiiei tabelelor. 19

5. Crearea bazei de date relaionale. Crearea unui model activitii companiei Aceast etap presupune strngerea de informaii despre activitatea companiei pe care le va susine baza de date Oracle. Pentru a dobndi o bun cunoatere a activitii companiei, vei ntreprinde urmtoarele: Vei lua interviuri: a. Managerilor i supervizorilor activitilor companiei. b. Potenialilor utilizatori. c. Potenialilor beneficiari. Descoperii obiectivul declarat al activitii. Este util s cunoatei scopurile activitii unei companii astfel, nct baza de date s fie conceput n vederea deservirii acestora. Colaborai cu utilizatorii i supervizorii pentru a defini obiectivul aplicaiei. Este obligatoriu s definii preteniile companiei referitoare la ceea ce urmeaz s fac baza de date i aplicaia. Analizai specificaiile de sistem curente. Identificai viitoarele specificaii de sistem pentru baza de date. n acest moment, vei fi n posesia unor cantiti mari de date. Este necesar s nelegei toate aceste informaii i s le ordonai nainte de a trece la etapa urmtoare. Crearea unui model al datelor Dup ce ai strns informaiile precedente, trebuie s construii un model sau o reprezentare grafic a necesitilor i regulilor companiei. De exemplu, s presupunem c ai aflat urmtoarele informaii despre activitatea companiei n timpul interviurilor anterioare: Compania are nevoie s tie ce agent de vnzri deservete fiecare client. De asemenea, trebuie s cunoasc numele i telefonul clientului. Vor s aib posibilitatea de a gsi rapid informaii despre un anumit client. O tehnic de modelare verificat pentru reprezentarea grafic a activitilor companiilor este modelul ERD (Entity Relationship Diagram - diagrama relaiei dintre entiti). Acest model este format din trei componente: entitate - un element relevant n legtur cu care sunt necesare informaii; atribut - ceva care descrie sau explic o entitate; 20

relaie - o asociere ntre dou entiti. Numai elementele relevante pentru activitatea companiei devin entiti. Orice descrieri ale unei entiti devin atributele acesteia. Informaiile pe care le-ai obinut privitor la activitatea companiei trebuie s descrie relaiile ntre entiti. Ducnd acest exemplu mai departe, vom crea o diagram ERD simpl. Consultai fig. 3.1 pentru un exemplu de diagram a relaiilor dintre entiti. Informaii obinute n prima etap... Trebuie

s tim care sunt clienii arondai agenilor de vnzri...

Trebuie, de asemenea, s tim numele si numrul de telefon al fiecrui client

Un client va avea doar un singur reprezentant de vnzri arondat...

Client -Nume -Nr. telefon

Agent vnzri -Nume -ID

Fig. 3.1. O diagrama simpl a relaiilor dintre entiti. Dup ce ai creat diagram ERD iniial, analizai-o mpreun cu responsabilii de compartimente pentru a v asigura c ea este corect i a o mbunti dac este cazul. Printre avantajele utilizrii diagramei ERD se numr urmtoarele: diagrama ERD documenteaz cerinele informaionale ale companiei ntr-un format clar i precis; aceast abordare grafic a modelrii o face uor de neles; simplitatea modelului l face uor de utilizat.

Crearea unui proiect de baz de dateAcum cnd diagrama ERD este complet, acest model, mpreun cu informaiile referitoare la activitatea companiei culese n Etapa 1, poate fi utilizat pentru crearea unui proiect de baz de date. Figura 3.2 21

ilustreaz modul n care diagrama ERD poate fi convertit n schema unei instane a unei baze de date standard. Client Nume telefon

Vnzri Rep -Nume, -ID

Column Name Key Type Nulls? FK Datatype Max.lungime Exemple Data

ID PK NN nbr 7 1

Nume NN

telefon vnzri_rep_id

s emp.id char 30 char 12 23 nbr 7

Vasile 5551231

Fig. 3.2 Conversia diagramei ERD n schema instanei. Crearea definiiei unui tabel Schema instanei este compus din rnduri care definesc caracteristicile critice ale bazei de date. Entitile din diagrama ERD devin tabele; atributele devin coloane ale acestor tabele; iar relaiile devin chei externe. Dup finalizarea acestei scheme, analizai-o din nou cu responsabilii de compartimente pentru a v asigura c este complet i corect. n Oracle, pentru crearea tabelelor fizice, este folosit instruciunea SQL create table. Mulimea acestor tabele, mpreun cu consideraiile privind securitatea, reprezint fundamentul bazei de date relaionale. Figura 3.3 ilustreaz ct de uor poate fi modelat instruciunea create table pornind de la tabelul schemei de instan. 22

Column Name Key Type Nulls? FK

ID PK NN

nume NN

telefon

rep_vanzari_id

s_emp.id char 30 char 12 nbr 7 23

Datatype nbr Max.lungime 7 Exemple Data 1

Vasile 5551231

create table client_vanzari (id number(7), nume varchar2(30) constraint s_client_nume_nn not null, tel varchar2(12), rep_vanzari_id number(7) constraint s_client_pk_id pirimary key(id)); Fig. 3.3. Utilizarea schemei de instan ca baz pentru instruciunea create. Crearea unei baze de date relaionale Acum este momentul pentru a crea tabelul. Crearea unui tabel se realizeaz prin definirea numelui tabelului, precum i a numelor coloanelor tabelului i a descrierii acestora folosind o instruciune SQL. Urmtoarea instruciune creeaz tabelul prezentat n figurile anterioare: create table client_vanzari( id number(7,0), nume varchar2(30) constraint s_client_nume_nn not null, tel varchar2(12), rep_vanzari_nr_marca number(7), constraint s_client_pk_id primary key (id)); 23

Odat ce aceast instruciune a fost lansat prin intermediul programelor SQL*PLUS sau SQL*DBA, tabelul exist fizic n baza de date relaional Oracle.

Normalizarea datelorNormalizarea este procesul prin care eliminai problemele legate de redundana datelor n proiectul bazei de date i construii un model de date care susine diverse cerine funcionale i structuri alternative ale bazei de date. Normalizarea este un proces ordonat n care aplicai urmtoarele trei reguli referitoare la date: Toate atributele trebuie specificate o singur dat. Aceasta este forma 1 normal. Aceasta nseamn c atributele nu trebuie s se repete. Un atribut trebuie s depind n ntregime de identificatorul (ID) unic al entitii pe care o descrie. Aceasta este forma normal 2. Mutai atributele ntr-un tabel n care depind exclusiv de o cheie principal. Nu utilizai tabele n care atributele s nu depind exclusiv de o singur cheie. Pentru a fi n forma normal 3, o relaie trebuie s fie n forma normal 2, iar atributele ID nu trebuie s depind tranzitiv de cheia primar. Atunci cnd normalizarea este complet, fiecare tabel trebuie s posede o singur cheie primar, iar datele din tabel trebuie s depind exclusiv de cheia primar a tabelului. Repetai de sine stttor procedura de creare a unui tabel pornind de la un model propriu , explicai fiecare operator utilizat.

RezumatProiectarea bazei de date presupune parcurgerea mai multor etape pentru a colecta, a analiza i a modela informaiile referitoare la activitatea companiei. In acest capitol, au fost prezentate etapele necesare analizrii i modelrii datelor. Proiectarea judicioas a bazei de date este necesar deoarece n lipsa ei performanele ar avea de suferit, integritatea datelor ar fi n pericol, iar baza dumneavoastr de date ar deveni prea mare datorit acumulrii de date duplicate. nsuirea artei de a proiecta o baz de date presupune acumularea unei experiene ndelungate. Cu toate acestea, parcurgnd etapele 24

prezentate n acest capitol, putei construi o baz de date solid i bine conceput.

LUCRAREA DE LABORATOR Nr. 4Tipuri de date. Tabele 1Toate datele, care sunt stocate n baza de date Oracle sunt caracterizate prin tip i lungime. Aceast caracterizare este definit ca tipul de date al obiectului. Tabelele sunt dispozitive de stocare ntr-o baz de date relaional. Coloanele tabelului definesc caracteristicile datelor i n acelai timp atribuie un nume datelor din coloana respectiv. Coloanele, precum i variabilele, i constantele sunt caracterizate din tipul i lungimea datelor. Aceste proprieti fac ca serverul Oracle s trateze n mod difereniat tipurile de date diferite. Oracle recunoate tipuri de date interne i externe. Tipurile de date interne sunt cele care descriu coloanele tabelelor, clusterele i argumentele procedurilor. Precompilatorul Oracle recunoate i alte tipuri de date care se gsesc n programe SQL ncapsulate. Aceste tipuri de date sunt numite tipuri de date externe i sunt asociate variabilelor gazd. Tipurile interne de date ale programului Oracle sunt: Char; varchar2; varchar; number; date; raw; long raw; rowid; long; mlslabel Utilizarea tipurilor de date n baze de date ofer urmtoarele avantaje: Restrng domeniul valorilor pe care le pot lua diverse entiti. De exemplu, o entitate de tip date nu poate lua valoarea JIM. Permit conservarea spaiului de stocare prin adaptarea tipului la datele stocate. Permit conversia automat a datelor n anumite condiii. Urmtoarele paragrafe descriu fiecare dintre tipurile de date ale serverului Oracle care pot fi utilizate pentru definirea coloanelor, variabilelor i constantelor. Tipul char Tipul char este utilizat pentru a defini o coloan care conine iruri de caractere de lungime fix, cuprins n domeniul 1-255. Acest tip de date stocheaz date alfanumerice. Atunci cnd este utilizat tipul char, Oracle efectueaz urmtoarele operaii: 25

La definirea coloanei i atribuie lungimea fix specificat de dumneavoastr, iar la inserarea unei valori aceasta este ajustat pentru a o aduce la lungimea respectiv. Dac valoarea introdus este mai scurt dect lungimea de definiie a coloanei, valorii i sunt adugate spaii. Dac valoarea introdus este mai lung dect lungimea de definiie a coloanei, Oracle returneaz un cod de eroare. Dac valoarea care depete lungimea coloanei posed spaii la sfrit, acestea sunt eliminate pentru a aduce data la lungimea fixat, iat un exemplu de definire a unei coloane de tip char: Nr Articol char(15) Exemplu: "RX22723Y1 " Tipul varchar2 Tipul varchar2 este utilizat pentru a defini o coloan care conine iruri de caractere de lungime variabil, n domeniul 1-2000 octei. Pentru o coloan definit ca fiind de tip varchar2, fiecare dat este stocat ca dat de lungime variabil. Atunci cnd utiliznd tipul varchar2 pentru a defini o coloan, Oracle efectueaz urmtoarele operaii: La definirea coloanei i atribuie lungimea maxim specificat de dumneavoastr, iar la inserarea unei valori aceasta este de lungime variabil. Dac valoarea introdus este mai scurt dect lungimea de definiie a coloanei, nu sunt adugate spatii la sfritul valorii. Acesta este un tip de date n care valorile nu sunt completate cu spaii. Dac valoarea introdus este mai lung dect lungimea de definiie a coloanei, programul Oracle returneaz un cod de eroare. Dac valoarea care depete lungimea coloanei posed spaii la sfrit, acestea sunt eliminate pentru a aduce data la lungimea maxim fixat. n exemplul care urmeaz, coloana Nr_Articol este definit ca fiind de tip varchar2 i avnd o lungime maxim de 15 octei: Nr_Articol varchar2(15) Exemplu: "RX22723Y1" Tipul varchar n versiunea Oracle 7.1, tipul varchar este sinonim cu tipul varchar2. 26

Tipul number Datele de tip number stocheaz numere n virgul fix i n virgul mobil. Practic pot fi stocate numere orict de mari. Tipul number permite definirea preciziei i a scalei. Precizia este egal cu numrul total de cifre ale numrului; scala se refer la numrul de cifre din dreapta punctului zecimal. Aceste numere pot fi stocate cu o precizie de pn la 38 de cifre. Exemplul urmtor ilustreaz definirea unei date de tip number: Nr_Articol number Exemplu: '336100' sau Nr_Articol number(6,2) Exemplu: '3361.00' In acest exemplu, (6,2) reprezint urmtoarele: 6 este precizia. Precizia este sinonim cu numrul total de cifre permise. Acest numr include numrul total de cifre din ambele pri ale punctului zecimal. 2 este scala, sau numrul de cifre din dreapta punctului zecimal. Este recomandabil s specificai ntotdeauna precizia i scala datei. n acest fel se asigur verificarea integritii datei atunci, cnd aceasta este introdus. Tipul date Tipul date stocheaz data calendaristic si ora n coloanele unui tabel cu precizie de o secund. Acest tip de dat stocheaz cele patru cifre ale anului, luna, ziua, ora, minutele i secundele scurse de la miezul nopii. Pentru operaiile de intrare/ieire de date, formatul prestabilit este DD-MON-YY. Ora este stocat n format HH:MM:SS. Nu putei specifica data n litere. Dac nu specificai componenta pentru or ntr-o valoare de tip dat, ora prestabilit este 12:00:00 AM. n mod similar, dac omitei componenta corespunztoare datei calendaristice a unei valori de tip dat, data prestabilit este prima zi a lunii curente. Domeniul valid pentru date calendaristice este 1 Ianuarie 4712 .E.N - 1 Ianuarie 4712 E.N. Pentru alte informaii despre: Formate pentru date calendaristice; Modificatori de format, Sufixuri de formatare a datelor; Operaii 27

aritmetice cu date calendaristice, consultai literatura de specialitate, subiectul fiind prea amplu pentru a fi expus aici. Tipul long Coloanele, variabilele i constantele de tip long stocheaz date caracter cu lungime variabil coninnd pn la 2 gigaoctei de informaie. Dei tipul de date long este util n numeroase situaii, el prezint urmtoarele limitri: ntr-un tabel este permis cel mult o coloan de tip long Coloanele de tip long nu pot fi indexate Coloanele de tip long nu pot aprea n restricii de integritate Nu se pot face referiri la coloane de tip long n funcii SQL cum sunt substr, length i aa mai departe Coloanele de tip long nu pot fi utilizate n clauzele where, group by, order by i connect by n uniti de program PL/SQL nu pot aprea variabile sau argumente de tip long Tipurile raw i longraw Aceste tipuri de date sunt destinate datelor binare. Ele nu trebuie utilizate atunci cnd datele urmeaz s fie interpretate de Oracle. Aceste tipuri de date sunt ideale pentru stocarea datelor multimedia sau a altor fiiere binare. Tipul raw este similar cu tipul varchar2, iar long raw este similar cu tipul long. Singura deosebire este c datele de tip raw nu fac obiectul operaiunilor de conversie la atribuire. Datele de tip raw pot fi indexate, n timp ce datele de tip long raw nu pot fi indexate. Tipul rowid Tipul de date rowid corespunde adresei fizice a unei linii dintr-un tabel Oracle care nu aparine unui cluster. El este un identificator unic al fiecrei linii. Fiecare tabel al unei baze de date Oracle posed propria coloan rowid, pe care ns nu o vei vedea afiat atunci cnd executai o instruciune select * from sau describe. Adresa fiecrei linii poate fi citit prin intermediul unei interogri SQL n care este folosit cuvntul rezervat rowid drept nume de coloan. Exemplul urmtor 28

ilustreaz o instruciune SQL care utilizeaz tipul de date rowid, precum i valorile de ieire ale acesteia: SELECT rowid, nume_ang FROM ang; Rezultatul: rowid NUME_ANG -----------------------------000C0B7.0000.0001 'WHITE' Aceast adres rowid se traduce n felul urmtor: 000C0B7 Acesta este blocul de date care conine linia. Numerele blocurilor sunt relative la fiierul de date la care aparin i nu la spaiul-tabel. 0000 Acesta este numrul de secven al liniei n bloc. Numrul primei linii este ntotdeauna 0. 0001 Acesta este numrul fiierului de date care conine linia. Tipul mlslabel Tipul mlslabel este utilizat pentru stocarea formatului binar al unei etichete a sistemului de operare. Lungimea maxim pentru datele de acest tip este de 255 octei.

Conversii de tipn anumite situaii, programul Oracle convertete automat datele de la un tip la altul. Pe de alta parte, pentru a converti datele n mod explicit putei folosi urmtoarele funcii Oracle: to_char() to_date() to_number() to_label() chartorowid() rowidtochar() Pentru atribuiri, programul Oracle efectueaz n mod implicit urmtoarele conversii de tip: varchar2 sau char la number number la varchar2 varchar2 sau char la date date la varchar2 varchar2 sau char la rowid rowid la varchar2 Conversia la atribuire reuete dac Oracle poate converti tipul valorii care urmeaz s fie atribuit la tipul destinaiei atribuirii. Pentru 29

evaluarea expresiilor, Oracle efectueaz n mod implicit urmtoarele conversii de tip: varchar2 sau char la number varchar2 sau char la date Conversiile char la number reuesc numai dac rezultatul de tip ir de caractere reprezint un numr valid. Conversiile char la date reuesc numai dac rezultatul de tip ir de caractere are formatul de dat prestabilit DD-MON-YY. Tipul null null nu este un tip de dat Oracle, ns este un concept important legat de valoarea datelor. Valorile null pot aprea n coloanele tabelelor i n expresii SQL. null se definete ca o valoare care este necunoscut, fr sens sau irelevant. Valorile null pot aprea n orice coloan att timp ct aceasta nu este supus restriciilor de integritate not null sau primary key. Nu confundai valoarea zero cu null. Zero este un numr i are o semnificaie. Exemplul urmtor ilustreaz o instruciune select care va selecta orice nregistrare n care valoarea coloanei sold nu este null. SELECT nr_cont, nume_cont, sold FROM conturi WHERE sold IS NOT null;

Tabele 1Tabelele reprezint structurile fundamentale de stocare a bazelor de date relaionale Oracle. Tabelele sunt compuse din linii i coloane. O coloan conine date de un singur tip despre o anumit entitate. Un exemplu de coloan ar putea fi nume sau ora. O linie este o colecie de date pentru fiecare coloan a unui tabel. De exemplu, o linie a unui tabel care conine coloanele nume_oras i nume_stat ar putea fi Chisinau" i Moldova". Un tabel are un numr fixat de coloane predefinite i mai multe linii. Numrul de linii poate varia de la 0 la un numr practic nelimitat. Tabelul Oracle poate fi folosit pentru pstrarea informaiilor despre o singur entitate. Un asemenea tabel ar putea s conin o list a numelor salariailor sau o list a numerelor departamentelor din 30

companie. De asemenea, un tabel poate ilustra relaia dintre un angajat i numrul departamentului la care aparine. O baz de date relaional stocheaz datele n uniti logice de stocare numite tabele. Utilizarea tabelelor prezint urmtoarele avantaje: - baza de date devine mai uor de neles datorit structurii simple a tabelelor; - relaiile dintre datele situate n diverse tabele sunt uor de stabilit; - regulile de integritate se pot construi rapid; - tabelele reduc necesarul de spaiu de stocare i redundana datelor; - putei da nume sugestive pentru tabele i coloane, mbuntind claritatea bazei de date. Dup ce ai creat un tabel, putei s inserai linii de date n el folosind instruciuni SQL. n continuare, informaiile stocate n tabel sunt disponibile n vederea interogrii, actualizrii i eliminrii.

Utilizarea tabelelorPlanificarea tabelelorDe obicei, stabilirea parametrilor de stocare i definirea clusterelor pentru tabele cad n sarcina administratorului bazei de date. Acesta trebuie s utilizeze informaiile provenind de la creatorul aplicaiei, privind modul de utilizare a aplicaiei i tipurile de date necesare efecturii diverselor sarcini. n continuare sunt enumerate aspectele generale care trebuie avute n vedere atunci, cnd intenionai s creai un nou tabel. Tabelele trebuie s fie normalizate. Coloanele care permit valori nule vor fi definite ultimele pentru a conserva spaiul de stocare. Grupai tabelele n clustere ori de cte ori este posibil. Specificai valori adecvate pentru parametrii pctfree i pctused n momentul crerii tabelului. Specificai parametrii initrans i maxtrans n momentul crerii tabelului. Specificai spaiul-tabel n care vor fi pstrate tabelele. Estimai dimensiunea tabelului i specificai parametrii de stocare. Folosii, aceste estimri pentru a stabili resursele necesare de procesare i de spaiu de stocare pe disc. 31

n cazul n care constatai c vei avea tabele foarte mari, de genul celor cu milioane de linii, trebuie s luai anumite msuri de precauie. Dac tabelul urmeaz s creasc n timp ajungnd la dimensiuni foarte mari, asigurai-v c extinderile acestuia sunt suficient de mari astfel, nct segmentul s nu aib prea multe extinderi. n cazul tabelelor foarte mari trebuie avute n vedere nc dou aspecte: pe de o parte, specificai parametrii de stocare astfel, nct tabelul i indecii lui s se gseasc n spaii-tabel diferite; pe de alt parte, alocai suficient spaiu temporar pentru aciuni, cum ar fi sortarea.

Calcularea dimensiunii tabeluluiParcurgei urmtoarele ase etape pentru a calcula dimensiunea proiectat a unui tabel. Aceste etape fumizeaz o valoare estimativ rezonabil i nu un numr precis. 1. Determinai spaiul necesar pentru antetul blocului de date folosind urmtoarea formul: antet bloc = (antet fix + antet de tranzacie variabil) + (catalog de tabele + catalog de linii) antet fix = 57 octei antet de tranzacie variabil = 23*valoarea parametrului initrans catalog de tabele = 4 catalog de linii = 2*numrul de linii dintr-un bloc 2. Determinai spaiul disponibil pentru date per bloc de date, folosind urmtoarea formul: Spaiu disponibil pentru date = (dimensiune bloc - total antet bloc) -((dimensiune bloc - (antet fix + antet de tranzacie variabil)) * (pctfree/100)) Putei obine dimensiunea blocului curent prin lansarea comenzii show parameters db_block_size. 3. Calculai spaiul de date combinat pe baza valorilor unei linii tipice. Acest lucru se realizeaz prin evaluarea numrului de linii din tabel, a tipului coloanelor i a mediei dimensiunilor coloanelor de lungime variabil. Utilizai funcia avg pentru fiecare linie pentru a-i afla dimensiunea medie. 4. Calculai dimensiunea medie global a unei linii folosind urmtoarea formul: dimensiunea medie global a liniei = antet linie +A + B + C 32

A = totalul lungimii tuturor coloanelor care stocheaz 250 de octei sau mai puin. B = totalul lungimii tuturor coloanelor care stocheaz 250 de octei sau mai mult. C = spaiul de date combinat al tuturor coloanelor (calculat n etapa 3). 5. Determinai numrul mediu de linii per bloc cu urmtoarea formul: numr mediu de linii/bloc = spaiu disponibil/dimensiunea medie a liniei. Spaiul disponibil este cel calculat n etapa 2, iar dimensiunea medie a liniei este cea calculat n etapa 4. 6. Calculai numrul de blocuri cu urmtoarea formul: numr de blocuri = numr de linii/numrul mediu de linii per bloc. Numrul mediu de linii per bloc a fost determinat n etapa 5.

Proiectarea tabelelorPrima etap pentru crearea unui nou tabel Oracle o reprezint proiectarea tabelului. Iat cteva aspecte care trebuie avute n vedere la proiectarea unui tabel: - folosii nume sugestive pentru tabel i pentru coloane; - selectai tipul de date adecvat pentru fiecare coloan; - normalizai tabelele atunci cnd este posibil; - definii la sfrit coloanele care accept valori nule pentru a conserva spaiul de stocare; - nu uitai s documentai numele tabelului i scopul acestuia folosind comanda comment; - creai un tabel pentru relaii i un tabel distinct pentru date. nainte de a crea un tabel, trebuie s stabilii dac sunt necesare restricii de integritate. Putei defini restriciile de integritate pentru coloanele unui tabel pentru a impune automat anumite reguli de utilizare pentru baza de date. De exemplu, dac avei un tabel care conine informaii referitoare la angajai, putei folosi restricia de integritate not null pentru coloana nume_ang. Prezena acestei restricii va obliga utilizatorul s insereze o valoarea n aceast coloan pentru fiecare linie a tabelului. Not. n exemplul urmtor procedurile de Planificare a tabelelor i Calcularea dimensiunii tabelului nu sunt utilizate fiind utilizat spaiul predefinit al sistemului. 33

Crearea tabelelorPentru a crea un tabel, creai un script SQL folosind comanda create table. Sintaxa general a comenzii pentru a crea un tabel este urmtoarea: create table tablename (nume_coloana tip_data restrictie, (nume_coloana tip_data restrictie) Numele tabelelor i ale coloanelor pot fi formate din 1 pn la 30 de caractere. Primul caracter trebuie s fie o liter. Numele tabelului nu poate fi numele unui alt obiect deinut de acelai utilizator al serverului Oracle. O restricie este o regul care limiteaz valorile datelor pentru una sau mai multe coloane ale unui tabel.

Mersul lucrrii:1. Activai comanda SQL*PLUS 2. Introducei numele parola de SCOTT 3. Introducei parola TIGER i apsai [Enter]. 4. Introducei comanda pentru a avea fiierul spooller: c:\1\trace4 5. Introducei urmtorul script: /* crearea tablei Angajati */ drop table Angajati;

spool

create table Angajati( nas char(9), nume varchar2(9), prenume varchar2(9), sexe char(1) not null constraint c_constraint_sexe check(sexe in ('F', 'M')), ani number(2,0) null constraint c_constraint_ani check (ani >18 and ani < 65), angajat Date not null, nr_usinei char(3), nr_postului varchar2(6) not null );

34

Rezultatul: Table created. Descrierea tabelei describe Angajati; Rezultatul: Name Null? Type ----------------- -------- ---NAS CHAR(9) NUME VARCHAR2(9) PRENUME VARCHAR2(9) SEXE NOT NULL CHAR(1) ANI NUMBER(2) ANGAJAT NOT NULL DATE NR_USINEI CHAR(3) NR_POSTULUI NOT NULL VARCHAR2(6) Explicai fiecare rnd introdus i returnat.

Rezumatn aceast lucrare, ai fcut cunotin cu tipurile de date Oracle ca reprezentnd caracteristicile datelor i cu tabelele, care sunt structurile logice de stocare fundamentale ale bazei de date relaionale Oracle. Aceste caracteristici sunt un set predefinit de informaii care definesc felul i lungimea datei. Programul Oracle trateaz difereniat datele de tipuri diferite. Tipurile de date permit sistemului Oracle s economiseasc spaiu de stocare prin adaptarea tipului datelor la datele care urmeaz a fi stocate. n plus, utilizarea tipurilor de date v permite s restrngei domeniul de valori pe care le poate conine o dat, contribuind astfel la asigurarea integritii datelor. Ai nvat s utilizai tipurile de date la definirea coloanelor, variabilelor i constantelor. n primul rnd stabilii tipul datelor pe care le vor conine, dup care definii lungimea acestora. Oracle efectueaz conversii de tip fie implicit, fie explicit. Aceste conversii sunt permise numai pentru anumite tipuri de date.

35

LUCRAREA DE LABORATOR Nr. 5Crearea tabelelor 2 Mersul lucrrii:1. 2. 3. 4. Activai comanda SQL*PLUS Introducei numele parola de SCOTT. Introducei parola TIGER i apsai [Enter]. Introducei comanda pentru a avea fiierul spooller: spool c:\1\trace4 Exemplul care urmeaz prezint un script SQL care va crea un tabel de angajai Ang cu cinci coloane. Tabelul va conine numrul de marc al angajatului, numele i prenumele angajatului, numrul departamentului de care aparine angajatul i data angajrii.

Culegei: drop table Ang; create table ang( marca_ang number(15) primary key, prenume varchar2(20) not null, nume varchar2(40) not null, nr_dept varchar2(12), data_ang date not null); marca_ang este definit drept cheie primar a tabelului. Scopul definirii unei chei primare este identificarea univoc a liniilor tabelului (coloana pentru care s-a definit o cheie primar nu poate conine valori duplicate). Restriciile not null impuse unora dintre coloane indic faptul c aceste coloane trebuie s conin o valoare pentru fiecare linie. Descrierea tabelului ang: Describe ang; Rezultatul: Name Null? Type ---------------- -------- ---MARCA_ANG NOT NULL NUMBER(15) 36

PRENUME NUME NR_DEPT DATA_ANG

NOT NULL VARCHAR2(20) NOT NULL VARCHAR2(40) VARCHAR2(12) NOT NULL DATE

Distrugerea tabelelorPentru a elimina din baza de date un tabel mpreun cu toate datele acestuia, folosii comanda drop table. De exemplu, urmtoarea comand distruge tabelul ang: drop table ang; Pentru a distruge un tabel, acesta trebuie s se gseasc n schema dumneavoastr, n caz contrar, trebuie s posedai privilegiul de sistem drop any table. Distrugerea unui tabel are urmtoarele efecte: - definiia tabelului este eliminat din dicionarul de date, tabelul si datele devenind inaccesibile. Acest lucru este echivalent cu eliminarea efectiv a liniilor tabelului; - toi indecii i declanatorii asociai cu tabelul sunt distrui, indiferent dac sunt creai de dumneavoastr sau de alt utilizator; - vederile i sinonimele care fac referire la tabel nu sunt distruse ns devin invalide; - toate blocurile care au fost alocate tabelului sunt returnate spaiuluitabel ca spaiu liber i pot fi utilizate de orice alt obiect care necesit noi extinderi.

Trunchierea tabelelorO metod eficient de a elimina toate liniile dintr-un tabel este s utilizai comanda truncate table. Aceast comand elimin toate nregistrrile din tabel i elibereaz spaiul alocat care era folosit pentru pstrarea nregistrrilor eliminate. Comanda truncate table este mai eficient i mai rapid dect comanda delete from. De obicei, utilizatorii ntmpin dou probleme atunci cnd ncearc s elimine volume mari de nregistrri cu comanda delete from. n primul rnd, ei risc s primeasc un mesaj de eroare prin care sunt avertizai c segmentul lor de revenire este prea mic. Aceasta este o fals eroare deoarece de obicei segmentul lor de 37

revenire este corect dimensionat, ns tranzacia este prea mare. n al doilea rnd, obiectul tabel pstreaz ntregul spaiu alocat atunci, cnd comanda delete from este finalizat. Programul Oracle nu elibereaz acest spaiu dup executarea acestei comenzi, deci ctigul de spaiu este nul. Comanda truncate table rezolv ambele probleme. Ea nu folosete segmentul de revenire n timp ce este executat. Prin urmare, este mai rapid i nu este limitat de spaiul segmentului. Folosirea comenzii truncate table duce la eliberarea spaiuluitabel imediat dup execuia acesteia. Comanda truncate table nu poate fi derulat napoi; prin urmare, trebuie s o folosii cu precauie n aplicaiile dumneavoastr. Pentru a folosi comenzile truncate table sau truncate cluster, tabelul, respectiv grupul trebuie s se gseasc n schema dumneavoastr sau trebuie s posedai privilegiul de sistem delete any table. n exemplul urmtor, comanda truncate table este folosit pentru a elimina toate liniile din tabelul DEPT: truncate table ang;

ncrcarea unui tabelCulegei: /* crearea tablei Angajati */ drop table Angajati; create table Angajati( nas char(9), nume varchar2(9), prenume varchar2(9), sexe char(1) not null constraint c_constraint_sexe check(sexe in ('F', 'M')), ani number(2,0) null constraint c_constraint_ani check (ani >18 and ani < 65), angajat Date not null, nr_usinei char(3), nr_postului varchar2(6) not null 38

); Rezultatul: Table created.

Descrierea tabeleiCulegei: describe Angajati; Rezultatul: Name Null? Type --------------- -------- ---NAS CHAR(9) NUME VARCHAR2(9) PRENUME VARCHAR2(9) SEXE NOT NULL CHAR(1) ANI NUMBER(2) ANGAJAT NOT NULL DATE NR_USINEI CHAR(3) NR_POSTULUI NOT NULL VARCHAR2(6)

Inserarea datelor (tuplelor)Culegei: /* Inserarea datelor in tabelul Angajati */ insert into Angajati values ('199073432', 'Rusu', 'Maria', 'F', 35, to_date('20-oct-95', 'DD-MON-YY'),'u12', 'ps272'); insert into Angajati values ('198029823', 'Dionis','Pavel', 'M', 42, to_date('17-nov-98', 'DD-MON-YY'), 'u12', 'ps275'); insert into Angajati values ('199549525', 'Bucatru', 'Felix', 'M', 25, to_date( '8-jan-95', 'DD-MON-YY'), 'u14', 'ps71'); insert into Angajati values ('199579013', 'Gurau', 'christina','F',35, to_date('27-jan-94', 'DD-MON-YY'), 'u12', 'ps175'); insert into Angajati values ('199571002', 'Ionescu', 'Ilie', 'M', 35, to_date('19-sep-95', 'DD-MON-YY'), 'u14', 'ps75'); 39

insert into Angajati values ('199487815', 'Dusca', 'Lucia', 'F', 38, to_date('12-mar-95', 'DD-MON-YY'), 'u18', 'ps410'); insert into Angajati values ('199665972', 'Vasilescu', 'Ion', 'M', 32, to_date('10-jan-95', 'DD-MON-YY'), 'u10', 'ps235'); insert into Angajati values ('199623961', 'Scutaru', 'Maria', 'F', 35, to_date('26-jan-96', 'DD-MON-YY'), 'u16', 'ps410'); /* */ /*************Sfarsitul datelor***************/ Observaie. Se acord o deosebit atenie formatului datei, dat fiind c el este legat de versiunea lingvistic a sistemului de operare. Afiarea (returnarea) tabelei Angajati Culegei: select * from Angajati; Rezultatul:NAS --------199073432 198029823 199549525 199579013 199571002 199487815 199665972 199623961 NUME PRENUME S ANI ANGAJAT NR_ NR_POS --------- --------- - ---- --------- --- ----Rusu Dionis Bucatru Gurau Ionescu Dusca Vasilescu Scutaru Maria Pavel Felix christina Ilie Lucia Ion Maria F M M F M F M F 35 42 25 35 35 38 32 35 20-OCT-95 17-NOV-98 08-JAN-95 27-JAN-94 19-SEP-95 12-MAR-95 10-JAN-95 26-JAN-96 u12 u12 u14 u12 u14 u18 u10 u16 ps272 ps275 ps71 ps175 ps75 ps410 ps235 ps410

8 rows selected.

Modificarea tabelelorSistemul Oracle v permite s modificai orice tabel existent. Motivele pentru care ai putea dori s modificai un tabel sunt urmtoarele: - pentru a aduga una sau mai multe coloane unui tabel; - pentru a aduga sau a distruge restricii asociate unui tabel; - pentru a modifica parametrii pctused i pctfree; 40

- pentru a modifica definiia unei coloane existente (tipul de date i lungimea). Atunci cnd modificai definiiile coloanelor unui tabel, acesta trebuie s fie gol pentru a putea face urmtoarele operaii: - micorarea lungimii unei coloane; - modificarea tipului de date ale unei coloane. Mrirea lungimii unei coloane de tip char poate dura destul de mult. Aceasta deoarece tipul de date char face ca programul Oracle s completeze cu blancuri fiecare linie pentru coloana modificat. Pentru a modifica un tabel existent, folosii comanda alter table. Codul care urmeaz adaug o nou coloan tabelului dept: alter table dept add (profil_dept varchar2(35)); Urmtorul exemplu modific tabelul ANG, indicnd faptul c trebuie completat cmpul salariu: alter table emp modify (sal not null); Acest exemplu modific tabelul ANG prin adugarea unei restricii de tip cheie extern: alter table ang add constraint s_dept_man_id_fk foreign key (nr_dept) references dept; Acest exemplu elimin o restricie din tabelul DEPT: change dept to ang alter table dept drop constraint s_dept_man_id_fk; alter table emp Pentru a modifica un tabel, acesta trebuie s se gseasc n schema dumneavoastr; n caz contrar, trebuie s posedai fie privilegiul alter pentru tabelul respectiv, fie privilegiul de sistem alter any table.

Rezumatn acest capitol, ai fcut cunotin cu tabelele, care sunt structurile logice de stocare fundamentale ale bazei de date relaionale Oracle. Tabelele pot fi privite ca matrice bi-dimensionale care conin un numr predeterminat de coloane i linii multiple. 41

Folosirea tabelelor este componenta esenial a utilizrii bazei de date relaionale Oracle. Tabelele furnizeaz o structura logic simplificat uor de neles i suficient de flexibil pentru a satisface cerinele bazei dumneavoastr de date. Ai parcurs etapele necesare crerii i modificrii tabelelor. Cu comanda create table, putei s optimizai spaiul de stocare, precum i s stabilii diverse restricii.

LUCRAREA DE LABORATOR Nr. 6Integritatea datelorO problem critic n gestionarea bazelor de date este asigurarea respectrii unui set predefinit de reguli n concordan cu activitile, pe care le susine sistemul. Administratorul bazei de date, programatorul aplicaiei i reprezentantul de zon sunt responsabili pentru definirea si crearea acestor reguli. n esen, integritatea datelor presupune definirea regulilor care restrng valorile valide pentru o coloan a unui tabel. Restriciile de integritate sunt definite pentru tabele i prin urmare toate vederile i sinonimele tabelelor sunt supuse restriciilor de integritate. Dac o instruciune de manipulare a datelor ncearc s efectueze o aciune care violeaz o restricie de integritate, este generat o eroare i tranzacia este derulat napoi. Restriciile de integritate a datelor reprezint mijloacele utilizate de programul Oracle pentru a preveni introducerea datelor invalide n tabelele bazei de date. Programul Oracle nu permite nclcarea acestor reguli, asigurnd astfel integritatea datelor. Restriciile de integritate sunt definite asupra tabelelor bazei de date. Vederile i sinonimele tabelelor sunt supuse restriciilor de integritate definite asupra tabelelor de baz. n acest capitol sunt trecute n revist tipurile de restricii de integritate i modul de utilizare a lor. Este recomandabil s definii regulile de integritate a datelor n baza de date i nu n aplicaii. Este mai eficient s o facei la nivelul bazei de date dect s creai rutinele echivalente n aplicaie. Integritatea datelor la acest nivelul bazei de date asigur viteza maxim. Toate 42

aplicaiile pot beneficia de aceste restricii globale, deci nu este necesar s repetai structurile logice echivalente n fiecare aplicaie. Toate restriciile au un nume. Putei denumi o restricie n timp ce o creai. Dac nu o facei, programul Oracle i va atribui un nume. Numele furnizat de utilizator trebuie s fie diferit de toate celelalte restricii care v aparin.

Tipuri de restricii de integritaten baza de date relaional Oracle, exist urmtoarele tipuri de restricii de integritate a datelor: Null; Unique; Primary key; Referential; Check. Restricia de integritate pentru un tabel este stabilit atunci cnd tabelul este creat sau modificat. Pentru a stabili o restricie de integritate, putei include clauza constraint n comenzile create table sau alter table. Exemplul urmtor ilustreaz sintaxa general a clauzei constraint: CONSTRAINT nume_restricie tip_restricie Tipurile de restricii sunt tratate n paragrafele care urmeaz. Restricia de integritate null n mod prestabilit, toate coloanele unui tabel accept valori nule adic, este permis absena unei valori n coloan. Prin stabilirea restriciei not nuil, impunei coloanei specificate s posede o valoare pentru fiecare linie a tabelului. Pentru a afia restriciile null dintr-un tabel, folosii comanda describe dup care urmeaz numele tabelului. Restricia de integritate unique Restricie de integritate unique impune ca toate valorile dintr-o coloan s fie distincte, nu pot exista valori duplicate n coloana respectiv. Oracle v permite s plasai aceast restricie pe mai multe coloane, definind astfel o aa numit restricie de unicitate compus. O restricie de unicitate compus cere ca o combinaie a coloanei cu cheie unic s nu se repete. Instruciunea urmtoare creeaz o restricie de unicitate asupra coloanei marca_ang a tabelului ANG: create table ang (marca ang number(7) constraint s_ang_marca_ang_uk unique, 43

nume varchar2(20) constraint s_ang_nume_nn not null, prenume varchar2 (20), nr_dept varchar2(5)); n exemplul anterior a fost folosit comanda describe pentru a confirma restricia null. Pentru a afia alte restricii definite pentru un tabel, trebuie s folosii o alt abordare. Consultai paragraful Afiarea restriciilor de integritate" care urmeaz mai jos pentru a vedea care sunt metodele de confirmare a restriciilor unui tabel. Restricia de integritate unique este respectat de coloanele cu valori nule deoarece toate valorile nule sunt considerate unice i distincte din punctul de vedere al acestei restricii. In consecin, este recomandabil s plasai restricia not null pe coloanele cu valori unice. n acest fel forai introducerea unei valori pentru coloana respectiv si v asigurai c valorile sunt .cu adevrat distincte. In declaraia tabelului urmtor sunt adugate restriciile unique i not nuli pe coloana marca_ang: create table ang (marca_ang number(7) constraint s_ang_marca_ang_uk unique constraint s_ang_marca_ang_nn not null, nume varchar2(20) constraint s ang nume nn not null, prenume varchar2 (20) , nr_dept varchar2(5)); Restricia de integritate primary key Restricia de integritate primary key desemneaz o coloan sau o combinaie de coloane drept cheie principal a tabelului. Cheia principal identific n mod univoc fiecare linie a tabelului. De asemenea, aceast restricie creeaz n mod implicit restriciile not null i unique pe coloana respectiv. Dei Oracle nu impune existena unei chei principale pentru fiecare tabel, este bine s v obinuii s o creai. De asemenea, este recomandabil s desemnai drept cheie principal o coloana sau o combinaie de coloane ale cror valori nu se modific niciodat. 44

Instruciunea urmtoare creeaz o restricie primary key pentru cmpul marca_ang al tabelului ANG: create table ang (marca_ang number(7) constraint s_ang_marca_ang_pk primary key, nume varchar2(20) constraint s ang nume nn not null, prenume varchar2 (2'0'), nr_dept varchar2(5)); Pentru a crea restricii asupra tabelelor, putei folosi o a doua sintax, cunoscut sub numele de sintaxa restricie_tabel. Cu aceast sintax, restriciile sunt plasate la baza instruciunii create table. Exemplul urmtor creeaz acelai tabel ca n exemplul anterior, folosind sintaxa restricie_tabel: create table ang (marca_ang number(7), nume varchar2(20), prenume varchar2(20), nr_dept varchar2(5), constraint s_ang marca_ang_pk primary key (marca ang)); Sistemul Oracle impune existena a maxim o cheie principal pentru fiecare tabel. Cheia principal nu poate fi de tip long sau long raw. Nu putei desemna aceeai coloan sau combinaie de coloane att drept cheie principal ct i drept cheie unic sau att drept cheie principal ct i drept cheie de grup. Dac ncercai s facei acest lucru, programul Oracle genereaz o eroare. Exemplul urmtor adaug o cheie principal compus pe coloanele nume i prenume ale tabelului ANG: alter table ang add primary key (nume, prenume); alter table ang enable primary key; Restricia de integritate prin referin Restriciile de integritate prin referin sunt folosite pentru a impune regulile care dicteaz relaiile dintre coloanele diverselor tabele, 45

ntre tabele se creeaz o relaie printe-fiu. Tabelul printe conine cheia referit iar tabelul fiu conine cheia extern. De exemplu, s presupunem c avei un tabel printe care conine o list de 50 de state. Tabelul fiu poate fi un tabel de adrese care conine numele i adresa cunoscuilor dumneavoastr. Tabelul de adrese are o restricie prin referin care stabilete c singurele adrese valide sunt cele n care statul se regsete n tabelul printe de state. Dac ncercai s adugai o nou adres n care prescurtarea statului este ZZ, inserarea va eua, deoarece ZZ nu exist printre cele 50 de state ale tabelului printe. Exemplul urmtor creeaz aceast restricie de integritate prin referin asupra tabelului de adrese: alter table adrese add constraint fk abr stat foreign key (abr_stat) references abr_stat(abr_stat); Iat o list a principalilor termeni folosii la stabilirea unei restricii de integritate prin referin: Cheie extern - coloana sau setul de coloane incluse n definiia restriciei de integritate prin referin. Cheie referit - cheia unic sau cheia principal a aceluiai tabel sau a unui alt tabel la care face referire cheia extern. Tabel dependent - tabelul care conine cheia extern. Tabel referi - Tabelul care este referit de cheia extern. Sistemul Oracle impune cteva restricii n legtur cu manipularea cheilor prin referin. Nu putei s modificai sau s eliminai cheia referit dac cheia rezultant ar viola restriciile de integritate prin referin. De exemplu, nu putei elimina o valoare a cheii referite, deoarece acest lucru ar duce la violarea restriciilor prin referin. Totui, putei elimina valorile cheii referite dac nu exist nici o linie dependent. Eliminarea n cascad a cheilor externe Exist totui cazuri cnd este necesar s eliminai o valoare a cheii referite. Atunci cnd nu exist valori ale cheii externe care s fac referire la valoarea respectiv, putei elimina valoarea cheii referite. Dac ns, exista linii avnd asociat restricia foreign key ea va mpiedica s eliminai valoarea cheii referite. 46

Pentru a rezolva aceast problem, stabilii asupra cheii referite restricia on delete cascade. Restricia on delete cascade permite eliminarea din tabelul printe a oricror valori ale cheii referite care au linii dependente n tabelul fiu. Atunci cnd este eliminat o asemenea valoare n tabelul printe, programul Oracle elimin automat liniile corespunztoare din tabelul fiu. Restricia de integritate check Restricia de integritate check definete n mod explicit o condiie care trebuie s fie adevrat. Fiecare linie a tabelului trebuie s respecte condiia. Condiia poate fi evaluat i la valoarea Unknown pentru a permite prezena valorii null. Dac se ncearc executarea unei instruciuni care ar duce la nerespectarea condiiei, instruciunea este derulat napoi. Restricia check prezint urmtoarele limitri: Nu poate s conin subinterogri Nu poate s conin funciile sysdate, uid, user i userenv Nu poate utiliza pseudo-coloanele currval, nextval, level i rownum Exemplul urmtor creeaz o restricie check asupra coloanei ora din tabelul adresa_filiala: create table adresa_filiala (nr_filiala number(5), nume_filiala varchar2(50), oras varchar2(50) constraint verificare_oras check oras in ("chisinau","balti","tigina"), stat varchar2(50)); O singur coloan poate avea mai multe restricii check.

Afiarea restriciilor de integritateIn paragrafele anterioare, a fost utilizat comanda describe pentru afiarea restriciilor nuil impuse coloanelor. Tabelul USER_CONSTRAINTS conine informaii complete despre toate restriciile impuse unui tabel: owner - Utilizatorul care este proprietarul definiiei restriciei. constraint_name - Numele definiiei restriciei. 47

constraint_type - Tipul restriciei. Tipurile sunt C pentru check, P pentru cheie principal, U pentru cheie unic i R pentru cheie extern. table_name - Numele tabelului asociat cu definiia restriciei. search_condition - Textul condiiei de cutare pentru o condiie check. r_owner - Proprietarul tabelului la care se face referire ntr-o restricie prin referin. r_constraint_names - Numele restriciei de integritate primary key pentru coloana referit de o restricie prin referin. delete_rule - Modul de tratare a cheilor externe care fac referire la o cheie principal sau la o cheie unic eliminat. Cele dou opiuni sunt delete cascade i no action. Status - Valoare utilizat intern de serverul Oracle. Pentru a afia restriciile asociate unui anumit tabel, efectuai o operaiune select asupra tabelului USER_CONSTRAINTS pentru tabelul vizat. De exemplu, instruciunea urmtoare afieaz restriciile asociate tabelului LST_ARTICOLE: select constraint name "Nume" constraint_type "Tip" from user constraints where table name = 'lst_articole'; Date de ieire: Nume Tip S_COD_ARTICOLE_FK R S_NR_ARTICOLE_UK U S_ID_ARTICOLE_PK P Tabelul USER_CONS_COLUMN furnizeaz informaii suplimentare n legtur cu restriciile impuse unui tabel. n continuare sunt prezentate coloanele tabelului USER_CONS_COLUMN: Owner Utilizatorul care este proprietarul definiiei restriciei. constraint_name Numele definiiei restriciei. table_name Numele tabelului asociat cu definiia restriciei. column_name Numele coloanei specificate n definiia restriciei. Position Poziia iniial a coloanei n definiia restriciei. 48

Instruciunea urmtoare afieaz informaiile referitoare la restriciile impuse coloanelor tabelului client: select constraint_name "Restricie", colmnn_name "Coloana" from user_cons_coluinn where table_name = "client"; Date de ieire: Restrictie Coloana --------------S_CLIENT_ID_PK CLIENT_ID S_ZONA_VANZARI_CLIENT_FK ZONA_VANZARI

Afiarea excepiilor de la restriciile de integritatePentru a obine asisten la depanarea excepiilor de la restricii, includei opiunea exceptions n clauza enable a comenzilor create table sau alter table. Opiunea exceptions depune identificatorul liniei (rowid), proprietarul tabelului, numele tabelului i numele restriciei, pentru toate liniile care fac excepie de la restricii, ntr-un tabel predefinit, EXCEPTIONS. Sistemul Oracle dispune de un script, numit utlexcpt.sql, care creeaz tabelul EXCEPTIONS. Instruciunea urmtoare modific un tabel i adaug o nou restricie cu opiunea exceptions: alter table personal, enable primary key exceptions into exceptions; Odat creat tabelul EXCEPTIONS, putei efectua asupra lui o operaie de selectare pentru a obine liniile care violeaz o anumit restricie. Exemplul urmtor folosete o reuniune pentru a afia liniile de date care intr n conflict cu regulile tabelului. n acest exemplu, n tabelul dept exist o valoare duplicat a cheii unice. Select nr_dept, nume_dept, dir_dept from dept, exceptions where exceptions=constraint = "s_nume_dept_uk" and dept.rowid = exceptions.row_id; Date de ieire: NR_DEPT MUME_DEPT DIR_DEPT ----------------11 Ambalare Riley 49

11

Ambalare

Riley

Activarea i dezactivarea restriciilor de integritateO restricie de integritate definit asupra unui tabel se poate afla n dou stri: activ i inactiv. Dac se ncearc activarea unei restricii asupra unui tabel care nu respect regulile restriciei de integritate, programul Oracle genereaz o eroare de excepie iar instruciunea n cauz este derulat napoi. Dac exist o excepie, nu putei activa restricia pn cnd excepia nu este actualizat sau eliminata. Pentru activarea i dezactivarea restriciilor se folosesc comenzile create table si alter table. Exemplul urmtor dezactiveaz excepiile impuse tabelului LST.ARTICOLE: alter table lst_articole disable constraint s_cod_articole_fk; Exist momente cnd este cu adevrat necesar dezactivarea temporar a restriciilor. Acest lucru este necesar pe parcursul ncrcrii datelor prin intermediul SQL*Loader i pe parcursul proceselor de import i export. In ambele cazuri, dezactivarea temporar a restriciilor poate mbunti eficiena operaiei.

Vederi predefinite pentru afiarea restriciilor de integritateToate informaiile referitoare la restriciile de integritate sunt stocate n dicionarul de date. Sistemul Oracle v pune la dispoziie mai multe vederi pe care le putei folosi pentru a vedea definiiile curente ale restriciilor de integritate din dicionarul de date. Aceste vederi sunt urmtoarele: all_constraints - Definiiile restriciilor pentru toate tabelele accesibile all_cons_columns - Informaii n legtur cu coloanele accesibile care apar n definiiile restriciilor user_constraints - Definiiile restriciilor asociate tabelelor utilizatorului user_cons_columns - Informaii n legtur cu coloanele care apar n definiiile restriciilor aparinnd utilizatorului dba_constraints - Definiiile restriciilor pentru toate tabelele bazei de date 50

dba_cons_columns - Informaii n legtur cu toate coloanele care apar n definiiile restriciilor Distrugerea restriciilor de integritate Pentru a distruge o restricie de integritate, lansai comanda alter table cu clauza drop. n instruciunea urmtoare, este distrus restricia din tabelul lst articole: alter table lst_articole drop constraint s_cod_articole_fk;

Mersul lucrrii:1. Distrugei eventualele tabele cu aceleai nume: drop table studenti; drop table dates; 2. Creai tabelul "studenti": create table studenti ( nr number(2) not null, nume char(7), prenume char(7), sex char(1) not null, oras char(8), adresa char(10), ani number(2) not null, grupa char(6), constraint studenti_primary_key primary key(nr)); Explicai fiecare operator din procedura de mai sus. 3. Introducei datele n tabelul "studenti":insert into studenti values (00001,'Ricu','Slavic', 'M','chisinau','Studenti,21','AST961'); insert into studenti values (00002,'Odagiu','Silviu', 'M','chisinau','Studenti,22','AST951'); insert into studenti values (00004,'Mamulat','Rodica', 'F','Orhei','V_Lupu,23','C-962'); insert into studenti values (00005,'Bugaian','Vasile', 'M','Balti','Indepenta,23','TI-971'); insert into studenti values (00006,'Lupu','Maria', 'F','Ungheni','Florilor,20','AI-971');

51

4. Vizualizai tabelul "studenti": select * from studenti; Rezultatul:NR NUME PRENUME S ORAS ADRESA ANI GRUPA --- ------- ------- - -------- -------------- -----1 Ricu Slavic M chisinau Studenti 21 AST961 2 Odagiu Silviu M chisinau Studenti 22 AST951 4 Mamulat Rodica F Orhei V_Lupu 23 C-962 5 Bugaian Vasile M Balti Indepenta 23 TI-971 6 Lupu Maria F Ungheni Florilor 20 AI-971

5. Creai tabelul "dates": create table dates ( nr number(5) not null, nr_matr number(6) not null, an_inmatr number(4) not null, grupa char(6), nota_med number(4,2), bursa char(1), constraint studenti_foreign_key foreign key(nr) references studenti(nr)); 6. Introducei datele n tabelul "dates": insert into dates values (00001,961801,1996,'AST962',8.9,'y'); insert into dates values (00002,961352,1995,'AST951',9.0,'y'); insert into dates values (00004,971253,1971,'TI-972',8.0,'n'); insert into dates values (00005,971651,1971,'AI-972',8.9,'y'); 7. Vizualizai tabelul "dates": select * from dates; Rezultatul: NR NR_MATR AN_INMATR GRUPA NOTA_MED B --- --------- ------------ ------ ---------- 1 961801 1996 AST962 8.9 y 2 961352 1995 AST951 9 y 52

4 971253 1971 TI-972 5 971651 1971 AI-972 8. Introducei urmtorul rnd n tabelul "dates": insert into dates values (00006, 971651,1971,'AI-973',8.9,'y'); 9. Vizualizai din nou tabelul "dates": select * from dates;

8 n 8.9 y

Rezultatul: NR NR_MATR AN_INMATR GRUPA NOTA_MED --- --------- ------------ ------ ---------1 961801 1996 AST962 8.9 2 961352 1995 AST951 9 4 971253 1971 TI-972 8 5 971651 1971 AI-972 8.9 6 971651 1971 AI-973 8.9 10. Introducei nc un rnd n tabelul "dates": insert into dates values (00003,961352,1995,'AST952',9.0,'y');

B y y n y y

Rezultatul: ERROR at line 1: ORA-02291: integrity constraint (SCOTT.STUDENTI_FOREIGN_KEY) violated - parent key not found Explicai acest rezultat, comparai cu operaia din punctul 8. Introducei drop table studenti; drop table dates; Rezultatul: ERROR at line 1: ORA-02266: unique/primary keys in table referenced by enabled foreign keys drop table dates; Table dropped. Explicai acest rezultat Introducei din nou: 53

drop table studenti; Rezultatul: Table dropped.

RezumatIntegritatea datelor asigur respectarea de ctre baza de date a unui set predefinit de reguli stabilite de administratorul bazei de date i de programatorul aplicaiei. Att administratorul ct i programatorul preiau aceste reguli din zona de activitate a companiei pe care o susine baza de date. Practic, activitatea comercial este cu adevrat cea care impune i definete integritatea datelor. Integritatea datelor i restriciile de integritate sunt mecanismele folosite de serverul Oracle pentru a preveni introducerea datelor invalide n baza de date. Aceste restricii asupra datelor asigur respectarea cu strictee a regulilor companiei. n acest capitol, ai fcut cunotin cu diverse tipuri de restricii de integritate i ai nvat s le aplicai la nivel de tabel. De asemenea, au fost prezentate modurile de gestionare a restriciilor.

LUCRAREA DE LABORATOR Nr. 7Selectarea i ntreinerea datelorOracle stocheaz datele n tabele pe care unii utilizatori le pot citi; ali utilizatori au ns privilegiul de a actualiza, de a elimina i de a insera noi date n baza de date. Acest capitol trece n revist tehnicile utilizate pentru a efectua aceste aciuni. Selectarea datelor din baza de date Oracle este sinonim cu adresarea unei ntrebri bazei de date. Scopul dumneavoastr este s primii informaii din baza de date ca rspuns la ntrebrile pe care le punei sistemului Oracle. Putei pune tipuri diferite de ntrebri sistemului Oracle, care sunt tratate n acest capitol. ntreinerea datelor n baza de date este o sarcin predominant fa de alte sarcini n server. ntreinerea datelor din baza de date Oracle implic eliminarea datelor nedorite, modificarea datelor existente i inserarea 54

noilor date. Aceste aciuni sunt necesare pentru pstrarea intact a integritii i preciziei datelor. Baza de date ar fi inutil i nu i-ar justifica existena dac utilizatorii nu ar avea ncredere n datele acesteia. Selectarea datelor din baza de date reprezint aciunea de interogare a serverului i de obinere a unui rspuns la aceast interogare. Utilizatorii, proiectanii, administratorii bazei de date i alii au cu toii nevoie s selecteze date din baza de date. Utilizatorilor le este necesar accesul la date pentru efectuarea sarcinilor zilnice legate de activitile comerciale ale companiei. Proiectanii i administratorii bazei de date trebuie s poat accesa datele pentru a dezvolta noi aplicaii, pentru a valida aplicaii existente i pentru a acorda asisten utilizatorilor finali. Activitile curente ale unei companii necesit ntr