Sunteți pe pagina 1din 16

1.1.

1 Aplicarea regulilor de normalizare


Aceste reguli se utilizeaz pentru a verifica dac tabelele sunt structurate corect. Procesul aplicrii regulilor la proiectarea bazei de date este denumit normalizarea bazei de date, sau doar normalizare. Regulile se aplic succesiv, asigurndu-v la fiecare pas c proiectul va ajunge la ceea ce se numete o "form normal." n principiu, sunt acceptate cinci forme normale ! de la prima form normal pn la a cincea.

1.1.1.1 Prima form normal


Prima form normal presupune c e"ist o singur valoare la fiecare intersec#ie dintre un rnd i o coloan din tabel, i niciodat o list de valori.

1.1.1.2 A doua form normal


A doua form normal necesit ca fiecare coloan care nu este c$eie s depind complet de c$eia primar, nu doar de o parte a c$eii. Aceast regul se aplic cnd se utilizeaz o c$eie primar care con#ine mai multe coloane.

1.1.1.3 A treia form normal


A treia form normal necesit ca fiecare coloan care nu este c$eie s depind de %ntreaga c$eie primar, dar i ca toate coloanele care nu sunt c$ei s fie reciproc independente.

1.2 Crearea tabelelor n baza de date


&ac lucrm %n programul '() *avigator crearea unui tabel este simpl+ clic, dreapta pe subdirectorul "-ables" din "./ 'c$ema" i comanda "0reate" din submeniul aprut. 'e creeaz tabela "ani1universitari" avnd urmtoarele coloane+ - p,1an1universitar de tip number 2%n coloana se vor introduce numai numere care s identifice %n mod unic anul colar34 - cod1an1universitar+ varc$ar52673 - descriere1an1universitar+ varc$ar52673 &up ce am completat cele dou coloane se d clic, pe butonul "Appl/ 0$anges to &8" 2 3.

0ine nu are o asemenea interfa# grafic, este nevoit s scrie comanda '() pentru crearea unei tabele+ create table ani_universitari ( pk_an_universitar number, cod_an_universitar varchar2(15), descriere_an_universitar varchar2(50) ); &ac am greit ceva, putem terge tabela 2 drop table ani_universitari;) i apoi crea din nou, %n forma corect. 'au, mai avem varianta de modificare a tabelei direct, prin comanda '() "alter table" : ALTER TABLE ani_universitari (50)); 9"ist comenzi pentru adugare de coloane, tergere, modificare tip, modificare nume coloane. 0omanda &9'0R:89 face o descriere a coloanelor unui tabel cu tipurile aferente. modificare coloan+ o o alter table studenti modif/ 2nume1stud not null34 alter table studenti modif/ 2nr1matricol number34 MODIFY ( DESCRIERE_AN_UNIVERSITAR VARCHAR2

Adugare coloan+ o alter table ani1universitari add 2observatii varc$ar52;77334

'tergere coloan+ o alter table studenti drop column nr1matricol4

Redenumire coloan+ o Alter table student rename column nr1matricol to numar1matricol

&escriere ar$itectur tabel "student"+ o &escribe studenti4

1.3 Tipuri de date de inite n baza de date


:ntr-o coloana poatet fi stocat doar un singur tip de date, nu pot fi amestecate tipuri diferite 2numere, te"te, date calendaristice3. Principalele tipuri de date ce pot fi stocate %n baza de date+ Siruri de caractere: Varchar22n3+ ir de caractere cu lungime variabil, numrul ma"im de caractere fiind dat de numrul n. Nvarchar22n3+ similar cu varc$ar5, dar %n acest caz se pot introduce caractere na#ionale specifice 2, #, ,...3

Char2n3+ tot iruri de caractere, dar de lungime fi", ma"im 5777 de octe#i. Long raw+ iruri de caractere de pn la 5 <8 Numere: Number2p,s3+ un numr cu p cifre din care s la partea zecimal

Date calendari tice: Date+ o dat calendaristic ce poate con#ine orice dat %n perioada =>;5 %.e.n ? @@@@. Aceste date se pstreaz %n baz sub forma unor numere cu virgul, o unitate reprezentnd o zi. !ime tamp2s3+ tot o dat calendaristic, dar memeoreaz i frac#iuni de secund. *umarul s reprezint cte zecimale se pstreaz dintr-o secund 2implicit se ptreaz 6 zecimale, ma"im sunt @ zecimale3. "biecte mari: 8lob 2b/nar/ large objects3+ pentru obiecte foarte mari de date 2cum ar fi imagini, obiecte binare3. :n acest cmp se pot stoca pn la = <8 de date binare, fr nici o formatare prealabil 2ele sunt tratate ca un ir de octe#i oarecare3.

2. Con tr#ngeri
1.4 Con!tr"n#eri de tip $ri%ar& 'e& ($')
0onstrngerile reprezint un set de reguli pe care noi le definim i apoi baza de date se asigur c sunt respectate. &efinim o constrngere de tip "primar/ ,e/" pe o coloan i baza are grij ca niciodat s nu se repete o valoare pe acea coloan. 8azele de tip Aracle con#in un obiect numit "'eBuence" care este un generator de numere cresctoare unice. Adat definit, obiectul ne furnizeaz la apel un numar mai mare dect cel furnizat anterior. *imeni nu poate da secven#a %napoi, deci nu este posibil s se repete un numr de mai multe ori. Prin urmare, completarea unei coloane de tip "primar/ ,e/" 2p,3 se face cu ajutorul secven#elor. 0omanda '() de adugare a unei constrngeri de tip "primar/ ,e/" este urmtoarea+ alter table studenti add !nstraint studenti_"# "ri$ar% #e% ("#_student);

0rearea unei secven#e se face prin comanda+ create seBuence seB1p,1stud increment b/ ; start Cit$ 5; minvalue ;7 ma"value @@@@@@@@@@ noc/cle noorder 4

Con!tr"n#eri de uni*itate (+')


'unt situa#ii cnd mai multe coloane din tabel trebuie s con#in valori unice, dar nu putem defini dect o coloan ca fiind de tip PD. Pentru celelalte coloane avem la dispozi#ie constrngerea de unicitate care odat definit, nu permite repetarea valorilor pe acea coloan. alter table &ru"e add !nstraint &ru"e_u# uni'ue( !d_&ru"a( des &ru"a); alter table &ru"e dr!" !nstraint &ru"e_u#;

&aca vreau s creez o constrngere de unicitate dar datele e"istente %n tabel nu respect condi#ia impus de constrngere, se folosete clauza *AEA):&A-9 2baza deja este pornit, avem date, dar s-a constatat la un moment dat c unele date nu sunt corecte. *u putem terge datele, dar din acest moment definim constrngerea care s nu mai permit introducerea de noi date greite3+ alter table studenti add !nstraint studenti_u# uni'ue("#_stud( nu$e_stud) enable n!validate; A8'9REA-:9+ novalidate merge numai daca s-a creat un inde" pe acele coloane+ reate inde) ind_studenti !n studenti("#_stud( nu$e_stud);

Alte comenzi utile+ 'tergerea inde"+ dr!" inde) ind_studenti; 'tergere constrngere+ alter table studenti dr!" !nstraint studenti_u#;

9nableFdisable constrngere+ o o alter table enable (n!validate) !nstraint studenti_u#; alter table disable !nstraint studenti_u#; (asta *a e aut!$at n!validate)

1.5 Con!tr"n#eri de tip ,-ot -ull, (--)


0and o coloana contine valori de tip null 2nu sunt adaugate date in acea coloana3 folosim comanda G*ot *ullH pentru a evita o asemenea eroare. alter table studenti $!di*% (nu$e_stud var +ar,(50) n!t null);

1.6 Con!tr"n#eri de tip ,Forei#n 'e&,


A alt surs de erori este dat de legtura %ntre tabele. 'olu#ia este dat de constrngerea de tip "Ioreign De/", adic stabilim regula ca toate valorile introduse %n coloana "p,1grupa" s fac parte din mul#imea valorilor din coloana "p," a tabelei "grupe". alter table studenti_&ru"e add re*eren es &ru"e("#_&ru"a); Abserva#ie+ coloana p,1grupa din tabela grupe trebuie s fie declarat %ntr-o constrngere de tip PD sau JD, altfel ob#inem eroarea+ -n! $at +in& uni'ue !r "ri$ar% #e% *!r !lu$n.list-4 !nstraint stud_&ru"e_*# *!rei&n #e% ("#_&ru"a)

1.7 Con!tr"n#eri de tip ,*.e*/,


.ai e"ist o posibilitate de limitare a surselor de eroare+ constrngerile generale de tip "c$ec,". &e e"emplu, nu putem introduce note %n afara intervalului K;-;7L+ Alter table n!te add !nstraint #_n!ta C/EC0 (n!ta bet1een 2 and 20);

1.8 Co%anda 0ELECT


0omanda '() '9)90- are rolul de a e"trage si vizualiza o informatie dintr-o baza de date. . intereseaz s vd studen#ii %nscrii in facultate+ !ele*t 3 ro% studenti;

&ar nu vreau s vd toate coloanele, nu m intereseaz p,-ul studentului, sau alt p,, vreau s tiu numele i prenumele studentului+ select nume_student, prenume_student from studenti; 'unt prea mul#i, nu vreau s vd to#i studen#ii care au trecut prin facultate, vreau s vd numai studen#ii care sunt la litera M8M+ select nume_student, prenume_student from studenti where nume_student like 'B%';

&in cele prezentate pn acum putem re#ine sinta"a de baz a instruc#iunii '9)90-+ !ele*t nu$e_ !l!ane ro% nu$e_tabel 1.ere !ndi4ii de sele 4ie5

&up cuvntul "select" se introduc numele coloanelor din tabela care vrem sa fie afiate. &ac sunt mai multe coloane, se despart prin virgul, dup ultima coloan nu se pune virgul. &orim toate coloanele din tabelN punem direct O 2select O3. Jrmeaz clauza "from" dup care punem numele tabelei din care e"tragem acele informa#ii. *u dorim toate liniile din tabelN atunci trebuie s adugm clauza "C$ere" unde introducem condi#iile pe care trebuie s le %ndeplineasc liniile din tabel ce se doresc afiate.

1.$.1 Selectarea datelor dintr%un databa e lin&


&ac sunt mai multe baze de date instalate %n sistem, e"ist posibilitatea s se creeze legturi %ntre acestea, astfel %nct, printr-o sesiune desc$is pe o baz, s pot accesa informa#ii din baza vecin. :n acest scop se creeaz o legtur 2database lin,3 %ntre baza curent i alt baz din sistem+ CREATE DATABA0E LI-' adina_lin# CO--ECT TO adina IDE-TIFIED BY adina +0I-2 -stud'electul dintr-un tabel apar#innd unei baze de date vecine se face prin intermediul legturii create+ !ele*t 3 ro% studenti6adina_lin#;

:n felul acesta pot trece date dintr-o baz %n alta, sau pot face un select care s afieze datele cumulate din cele dou baze 2folosim clauza Jnion3+ !ele*t studenti5nu$e_student 77 - -77 studenti5"renu$e_student 8Nu$e "renu$e student8( -ba9a db:- 8ba9a de !ri&ine8 ro% studenti union !ele*t studenti5nu$e_student 77 - -77 studenti5"renu$e_student 8Nu$e "renu$e student8( -ba9a db2- 8ba9a de !ri&ine8 ro% studenti6db2_lin# order b& 8ba9a de !ri&ine8 de!* ;

1.9 0ele*tarea in or%a3iilor din %ai %ulte tabele !i%ultan


&e cele mai multe ori informa#iile necesare nu sunt stocate %ntr-un singur tabel, ci sunt dispersate %n mai multe tabele. &e e"emplu, un caz tipic apare cnd vreau s vd studen#ii pe fiecare grup dintr-un anumit an universitar. :n acest caz datele se regsesc %n tabele diferite+ tabela studenti con#ine numele studen#ilor, iar tabela studenti1grupe con#ine legatura %ntre studenti si grupe, iar tabela ani1universitari pstreaz anii universitari+ select st.nume_student, st.prenume_student, g.cod_grupa, au.cod_an_universitar from studenti st, grupe g, studenti_grupe stg, ani_universitari au

where st.pk_student = stg.pk_student and stg.pk_grupa = g.pk_grupa and stg.pk_an_universitar = au.pk_an_universitar order by au.cod_an_universitar, g.cod_grupa; :nstruc#iunea select permite e"tragerea informa#iilor din mai multe tabele simultan. Pot vizualiza att numele studentului, ct i specializarea acestuia, c$iar dac cele dou informa#ii sunt %n tabele diferite. :mportant este s e"iste o legtur %ntre cele dou tabele astfel %nct unei linii dintr-o tabel s-i corespund una sau mai multe linii din cealalt tabel. 0nd fraza select lucreaz cu dou tabele 2sau mai multe3, %ntotdeauna trebuie s e"iste clauza C$ere %n care se specific legtura %ntre tabele. :n selectul de mai sus legtura dintre tabela student si tabela student1grupe se realizeaz prin coloana "p,1student" comun celor dou tabele , %n timp ce mai departe se merge pe legtura "p,1an1universitar" pentru a lega anul universitar de selectul nostru. 0e se %ntmpl dac uit pur i simplu s pun %n clauza "C$ere" legtura dintre tabeleN Atunci e grav, se umple ecranul cu zeci de rnduri fr nici o noim. Iraza select face produsul cartezian %ntre cele dou tabele i afieaz rezultatul Concluzie: s nu uitm niciodat s punem %n clauza "C$ere" condi#ia de legtur dintre tabele atunci cnd selectm coloane din mai multe tabele simultan. !ema+ s se construiasc un select care s afieze to#i studentii din facultate, %mpreun cu grupa, disciplinele i notele ob#inute la e"amene+ select st.nume_student, st.prenume_student, g.cod_grupa, d.cod_disciplina, n.nota, au.cod_an_universitar from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note n, discipline d where st.pk_student = stg.pk_student and stg.pk_grupa = g.pk_grupa and stg.pk_an_universitar = au.pk_an_universitar and stg.pk_student_grupa = n.pk_student_grupa and n.pk_disciplina = d.pk_disciplina order by nume_student,au.cod_an_universitar, g.cod_grupa

1.10 Clauza 1.ere4 Operatori lo#i*i


1.1'.1 "peratori de compara(ie

0lauza C$ere este cea care ne ajut s sortm aceste linii i s scoatem numai informa#ia de care avem nevoie. :n aceast clauz sunt scrise e"presii logice ce returneaz doar dou valori+ valoarea "adevrat" 2true3 sau valoarea "fals" 2false3. 9"presiile logice sunt construite cu ajutorul operatorilor de compara#ie+ Aperator Q R RQ S SQ SR TQ 9"plica#ie 9gal cu .ai mare dect .ai mare sau egal .ai mic dect .ai mic sau egal &iferit de

9"emple+ ;. ' se listeze to#i studen#ii care au note mai mari de P+ select st.nume_student, st.prenume_student, g.cod_grupa, d.cod_disciplina, n.nota, au.cod_an_universitar from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note n, discipline d where st.pk_student = stg.pk_student and stg.pk_grupa = g.pk_grupa and stg.pk_an_universitar = au.pk_an_universitar and stg.pk_student_grupa = n.pk_student_grupa and n.pk_disciplina = d.pk_disciplina and n.nota ! order by nume_student,au.cod_an_universitar, g.cod_grupa ;

1.1'.2

"peratori AND ) "*) N"!

0lauza "C$ere" poate con#ine mai multe fraze care %mpreun s construiasc valoarea de adevr final. Irazele sunt legate prin trei termeni c$eie+ "and" + returneaz "true" numai dac toate frazele din compozi#ie sunt "true" "or" + returneaza "true" dac cel pu#in o fraz este "true". "not" + inverseaz valoarea de adevr a frazei la care se aplic ;. Afieaz studen#ii care au ob#inut la disciplina .9 nota > i nota P+ select st.nume_student, st.prenume_student, g.cod_grupa, d.cod_disciplina, n.nota, au.cod_an_universitar from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note n, discipline d where st.pk_student = stg.pk_student and stg.pk_grupa = g.pk_grupa

+,emple+

and and and and and

stg.pk_an_universitar = au.pk_an_universitar stg.pk_student_grupa = n.pk_student_grupa n.pk_disciplina = d.pk_disciplina d.cod_disciplina = '"#' (n.nota=$ or n.nota=! ) S nu uitm s punem parantezele rotunde

order by nume_student ;

1.1'.-

"peratorul .between.

Acest operator stabilete un interval %n care se afl informa#ia selectat+ 9"emplu+ afieaz studen#ii cu notele cuprinse %n intervalul K6, PL+ and n.nota between 5 and !

1.1'./

"peratorul .in.

'tabilete o list de valori %n care se afl informa#ia selectat+ 9"+ afieaz studen#ii cu notele incluse %n mul#imea U V, =, W, PX + and n.nota in (%,&,!)

1.1'.0

"peratorul .li&e.

9ste operatorul care ne scoate din %ncurctur cnd nu tim ce cutm, ci doar bnuim. &ac nu tiu numele complet al unui student, ci doar cteva caractere, atunci folosesc clauza li,e pentru filtrarea liniilor. ;. 9"+ caut studen#ii de la litera A+ select ' from studenti where studenti.nume_student like '(%';

5. -oate fetele din facultate 2prenumele se termina cu litera MaM sau MAM3 select ' from studenti where (prenume_student like '%a' or prenume_student like '%(');

0a s nu cutm %n zadar, utilizm func#ia .upper. ce transform toate literele %n majuscule + select st.nume_student, st.prenume_student, upper(st.prenume_student) from studenti st where upper(prenume_student) like '%(';

V. . mai pot juca cu operatorul "li,e"4 vreau to#i studentii care au %n componen#a numelui irul de caractere "ut"+ select st.nume_student, st.prenume_student, upper(st.prenume_student) from studenti st where upper(prenume_student) like '%)*%';

1.1'.1
clauza "distinct"+

Clauza di tinct

&aca vreau s afiez doar liniile distincte, ce nu repet informa#ia afiat de alte linii, folosesc select distinct st.nume_student, st.prenume_student, g.cod_grupa from studenti st, grupe g, studenti_grupe stg where st.pk_student = stg.pk_student and stg.pk_grupa = g.pk_grupa order by nume_student, g.cod_grupa ; &irectiva "distinct" %nltur informa#ia care se repet %n rezultatul frazei select. :n acest fel, studen#ii vor fi afia#i o singur dat, indiferent de numrul de %nregistrri gsite %n tabela studenti.

1.1'.2

"peratorul .i null.

A valoare nul e o valoare care nu e disponibil, neatribuit, necunoscut i neaplicabil. Adic, oriunde folosim null %ntr-o e"presie, toat e"presia devine null 2false3. *u pot folosi e"presii de tipul Qnull, sau SRnull. &e e"emplu, m intereseaz studen#ii ce nu au numr matricol select ' from studenti where nr_matricol is null;

'i viceversa, vrem s vedem studen#ii care au numr matricol+ select ' from studenti where nr_matricol is not null;

1.11 Fun*3ia DECODE


&ecode este o func#ie ce permite implementarea unei structuri de programare %n codul '(). Prin func#ia decode putem simula structura if - else specific oricrui limbaj de programare %n sensul c putem selecta informa#ie diferit %n func#ie de anumite rezultate ob#inute %n procesul rulrii. Iormatul func#iei este+ decode 2e"presie, prima1varianta , rezultat;, a1doua1varianta, rezultat5, .............. , rezultat1default34 'e evalueaz e"presia i se compar valoarea acesteia cu variantele scrise %n partea a doua a func#iei. :n caz c valoarea e"presiei coincide cu o variant, se %ntoarce rezultatul corespunztor acelei variante, %n caz contrar se %ntoarce "rezultat1default". 9"emplu+ s zicem c profesorul de la disciplina :8 2:nstrumentatie de 8ord3 vrea s mreasc la to#i studen#ii nota cu ; punct, iar profesorul de .9 vrea s micoreze notele cu ; punct. &eci trebuie s facem un select din tabela note, dar acest select s se comporte diferit, %n func#ie de valoarea rndului "cod1disciplina". select stg.pk_student_grupa, st.nume_student, st.prenume_student, g.cod_grupa, d.cod_disciplina, n.nota,

decode(d.cod_disciplina, '+B', decode(n.nota, 10, 10, n.nota ,1), '"#',n.nota - 1, n.nota) .ota_"odi/icata, ast.cod_an_studiu, au.cod_an_universitar from studenti_grupe stg, studenti st, ani_universitari au, grupe g, speciali0ari s, discipline d, ani_studiu ast, note n where stg.pk_student = st.pk_student and stg.pk_an_universitar = au.pk_an_universitar and stg.pk_grupa = g.pk_grupa and g.pk_speciali0are = s.pk_speciali0are and s.pk_speciali0are = d.pk_speciali0are -and g.cod_grupa = '6303' and g.pk_an_studiu = d.pk_an_studiu and g.pk_an_studiu = ast.pk_an_studiu and n.pk_student_grupa = stg.pk_student_grupa and n.pk_disciplina = d.pk_disciplina order by d.cod_disciplina ;

1.12 Fun*3ii de #rup


1.12.1 3unctii matematice de grup

Aceste func#ii nu se aplic unei singure linii, ele calculeaz informa#ii caracteristice unui grup de rnduri+ ma", min, avg, count2O3, sum. select max(nota),round(avg(nota),1), min(nota), sum(nota), count('), round(sum(nota)2count('),1) from note;

:n e"emplul de mai sus am e"tras cteva informa#ii globale ale tabelei "note"+ ma"2nota1finala3 + calculeaz cea mai mare valoare din coloana "nota1finala". 0$iar dac sunt mai multe note de @, func#ia ma" returneaz o singur valoare min2nota1finala3 + returneaz cea mai mica valoare din coloana "nota1finala"4 avg 2nota1finala3+ calculeaz media aritmetic a notelor ob#inute de studen#i4 sum2nota1finala3 + calculeaz suma tuturor notelor4 count2O3 + returneaz numarul de linii din tabela sit1final.

Jn avantaj al acestor func#ii e c nu prea sunt %ncurcate de valoarea null gsit pe anumite linii. Acea linie care are valoarea null este ignorat pur i simplu %n calcularea valorilor cumulate.

Iunc#iile min, ma" pot fi folosite i pentru coloane care nu sunt %n mod necesar de tip numeric. Aceste func#ii au sens i pentru iruri de caractere sau date calendaristice+ elect min2nume1student3, ma,2nume1student3 4rom studenti 4

Afiseaza primul student %n ordinea alfabetic din grupul selectat. &ac vreau s vd cte caractere are cel mai mic nume 2fr prenume3 scriu urmtorul select+ elect min2length2 ub tr2nume1student,;,in tr2nume1student,M M3-;333 4rom studenti4

1.12.2

Clauza .group b5.

. intereseaz de e"emplu s tiu care a fost media pentru disciplina .9, media pentru A9, min, ma" pe aceste discipline s pot face compara#ii, s trag eventual semnale de alarm %n caz c apar nite situa#ii catastrofale. ' afim notele ob#inute pe discipline+ select d.cod_disciplina, n.nota from discipline d, note n where n.pk_disciplina = d.pk_disciplina order by d.cod_disciplina ; ' calculm media notelor la fiecare disciplin+ select d.cod_disciplina, round(avg(n.nota),1) from discipline d, note n where n.pk_disciplina = d.pk_disciplina group by d.cod_disciplina order by d.cod_disciplina ; *u pot folosi func#iile de grup %n clauza C$ere. Pentru a face filtrri cu ajutorul func#iilor de grup folosim clauza .having.: select d.cod_disciplina, round(avg(n.nota),1) from discipline d, note n where n.pk_disciplina = d.pk_disciplina group by d.cod_disciplina having round(avg(n.nota),1) 3 ! order by d.cod_disciplina ; Iunc#iile de grup sunt foarte utile cnd sunt necesare statistici i rapoarte finale. 0u ajutorul lor putem sintetiza informa#ia care s reflecte aspecte globale ale tabelelor.

6n truc(iuni D7L
1.13 Co%anda I-0ERT
:ntroducerea datelor %n baz se face cu ajutorul comenzii :*'9RAm vzut c formatul acestei comenzi este de forma+ INSERT INT; nu$e_tabel (nu$e_ !l!ana_2( nu$e_ !l!ana_,(5555(nu$e_ !l!ana_n) VA<UES (val_2( val_,( 55555( val_n); 0a s introducem un student %n tabela studenti, avem mai multe variante+ insert into studenti(nume_student, prenume_student, nr_matricol) values('+onescu','4avel', 11$5);

insert into studenti values(null,'+onescu','4avel', 11$5); :n al doilea caz nu am mai specificat numele coloanelor, ceea ce %nseamn c le completm pe toate 8inen#eles, nu pot pune *J)) peste tot unde nu tiu valoarea coloanei. insert into studenti values(null, null,'4avel', 11$5); deoarece se sesizeaz constrngerile definite pe tabela "studenti". Aceste constrngeri trebuie definite c$iar la %nceput, %nainte de introducerea datelor, tocmai ca s m protejeze %mpotriva datelor incoerente.

1.13.1.1

Folosirea funciilor pentru completarea valorilor de insert

Iunc#ia "s/sdate"+ sistemul propune automat ziua curent pentru coloana "data" din tabela "note". insert into note(pk_student_grupa, pk_disciplina, nota, data) values(1&,1,5,sysdate);

1.13.1.2
alt tabel.

Utilizarea subinterogrilor n comanda insert

Anumite valori introduse de insert pot fi aduse %n momentul e"ecu#iei prin comanda select dintr-un

1.14 Co%anda +$DATE


:onescu nu este mul#umit cu nota P, a venit a doua zi la mrire i a ob#inut ;7. &ar nu pot s mai pun o not %n catalog deoarece el primete doar o not pe sesiune, de aceea ar trebui s modific nota ob#inut %n ziua precedent+ update note set nota=10 where pk_nota = (select n.pk_nota from studenti st, studenti_grupe stg, note n, discipline d where st.pk_student = stg.pk_student and stg.pk_student_grupa = n.pk_student_grupa and n.pk_disciplina = d.pk_disciplina and d.cod_disciplina = '"#' and st.nume_student = '+onescu');.

1.15 Co%anda DELETE


'inta"a comenzii "&elete" respect acelai tipar ca la celelalte comenzi &.)+ delete ro% nu$e_tabel 1.ere !nditie5

A!+N!6++ comanda delete nu terge doar o valoare dintr-o coloan pe o anumit linie, aceast comand lucreaz pe linii, ea terge toat linia. Rmne valabil discu#ia pentru clauza "C$ere" de la comanda "update"+ dac clauza "C$ere" este uitat sau greit scris, atunci dezastrul este mai mare dect la comanda "update". :n acest caz se terg toate liniile din tabel, sau, %ntr-un caz mai fericit, mult mai multe dect am fi dorit. Ereau s terg toate liniile din tabel+ delete 4rom note4

0omanda delete terge liniile din tabel, dar nu i tabelul ca obiect al bazei de date. Abiectul se terge prin comanda &&) 2&ata &efinition )anguage3 "drop"+ drop table note4

0omanda &&) "drop" terge complet tabela i nu se mai poate recupera nimic. &ac de la delete se mai pot recupera datele 2%n anumite condi#ii 3, dup drop nu se mai poate face nimic.

1.10.1

Stergerea 8n ca cad9

Presupunem c vrem s tergem un student din baza de date+ Aceast constngere nu permite tergerea unei linii din tabela "student: dac e"ist linii aferente %n tabela "studenti1grupe" 2nu pot terge studentul dac el este %nscris %n diverse grupe, are note, etc. -oate aceste informa#ii ar rmne suspendate %n aer dac s-ar terge studentul3. 0um se poate rezolva problemaN .ergem mai %nti %n tabelele copil 2note, studenti1grupe3 i tergem toate liniile ataate de studentul ce trebuie ters i la urm tergem studentul+ delete from note where pk_student_grupa in (select pk_student_grupa from studenti_grupe stg , studenti st where stg.pk_student = st.pk_student and st.nume_student = '+aco6' ); delete from studenti_grupe where pk_student in (select pk_student from studenti where nume_student = '+aco6'); delete from studenti where nume_student = '+aco6';

:ar acum putem terge foarte simplu studentul+ delete from studenti where nume_student = '78iriac';

2 !ranzac(ii 8n baza de date


2.1 Co%anda Rollba*/
Revenim la problema cnd am pus din greeal la toat lumea nota ;7+ update note set nota = 10 ; select ' from note; 0onstat o eroare de propor#ii, toat lumea are nota ;7, la toate obiectele i %n toate sesiunile. &in fericire %nc mai pot corecta eroarea prin utilizarea comenzii RA))8A0D+ rollback; Pur i simplu rulm rollbac, i totul s-a rezolvat, am revenit la situa#ia ini#ial. Problema e, ct de ini#ial este situa#iaN Pn la ce punct m-am %ntors cu baza de dateN

2.2

Co%anda Co%%it

0omanda RA))8A0D anuleaz ultima tranzac#ie, dar cnd a %nceput aceast tranzac#ieN Arice tranzac#ie %ncepe dup comanda commit i se termin la comanda commit. -ranzac#ia reprezint un ir de comenzi de tipul select, update, insert, etc, care este privit de Aracle ca un tot unitar+ ori toate comenzile se termin cu succes, ori sunt anulate toate. 0omanda commit %nc$eie tranzac#ia curent astfel %nct, toate modificrile realizate pn %n acel moment trec %n stare definitiv. Prima comand '() dup commit %ncepe o nou tranzac#ie care se termin la urmtorul commit. ' re#inem deci c prin RA))8A0D putem reface doar modificrile din tranzac#ia curent, nimic nu ne mai salveaz dup e"ecu#ia comenzii 0A..:-.

2.2.1 Commit implicit


'e %ntampl ca uneori comanda Rollbac, s nu mai restaureze situa#ia dat de ultimul commit. Aceasta pentru c, uneori baza de date realizeaz un commit implicit, adic e"ecut comanda commit fara ca noi s comandm e"plicit acest lucru. 0ommit-ul implicit se e"ecut atunci cnd utilizatorul ruleaz o comand special de tip &&) sau &0)+ comand &&) 2&ata &efinition )anguage3+ de e"emplu comanzile "create table..", "alter table...",etc. comand &0) 2&ata 0ontrol )anguage3+ "create user...", "grant user...",etc.

2.2.2 Comanda Savepoint


9ste util cteodat s %mpr#im o tranzac#ie %n mai multe subtranzac#ii i s anulm prin rollbac, numai o anumit subtranzac#ie

0e se %ntmpl dac nu merge contarea N 2nu tiu e"act care sunt conturile pe care trebuie s contez3. :n acest caz salvm cteva puncte intermediare %n tranzac#ia noastr. &up scoaterea produsului din magazie definim un punct intermediar de succes + succes+ *"LL<AC= to factura4 SAV+:"6N! iesire1magazie1succes;

.ergem mai departe i scoatem i factura+ SAV+:"6N! factura;

Apoi contm factura. &ac totul e AD dm un 0A..:-, altfel m intorc la ultima situa#ie de

:n acest fel am reuit s s scoatem factura clientului, rmnnd pentru mai trziu s rezolvm problema contrii.

S-ar putea să vă placă și