Documente Academic
Documente Profesional
Documente Cultură
Note de curs
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Cuprins
1
INTRODUCERE......................................................................................................................................................5
1.1
CE ESTE O BAZA DE DATE...................................................................................................................................5
1.2
CUM SE STOCHEAZA INFORMATIA IN BAZA DE DATE..........................................................................................7
1.3
INSTALAREA BAZEI DE DATE...............................................................................................................................8
1.3.1
Instalare Oracle 9i, 10g.............................................................................................................................9
1.3.2
Verificarea instalrii bazei de date..........................................................................................................10
1.3.3
Dezinstalarea bazei Oracle. Exportul informatiilor din baza..................................................................11
1.3.3.1
1.4
2
CONSTRNGERI.................................................................................................................................................42
4.1
4.2
4.3
4.4
4.5
4.6
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
FUNCII SQL........................................................................................................................................................60
7.1
FUNCII PENTRU PRELUCRAREA IRURILOR DE CARACTERE............................................................................60
7.2
FUNCII PENTRU VALORI NUMERICE................................................................................................................61
7.3
FUNCII PENTRU DATE CALENDARISTICE.........................................................................................................62
7.4
FUNCII PENTRU CONVERSIA TIPULUI DE DATE...............................................................................................63
7.4.1
Conversia datelor de tip "date" n iruri de caractere.............................................................................63
7.4.2
Conversia numerelor n iruri de caractere.............................................................................................64
7.4.3
Conversia datelor de tip text in format "date".........................................................................................65
7.4.4
Conversia textului in format numeric......................................................................................................66
7.5
FUNCIA DECODE...........................................................................................................................................66
7.6
FUNCII DE GRUP..............................................................................................................................................67
7.6.1
Functii matematice de grup.....................................................................................................................67
7.6.2
Clauza "group by"....................................................................................................................................69
SUBINTEROGRI................................................................................................................................................72
8.1
8.2
8.3
8.4
INSTRUCIUNI DML..........................................................................................................................................77
9.1
COMANDA INSERT..........................................................................................................................................77
9.1.1
Folosirea funciilor pentru completarea valorilor de insert....................................................................78
9.1.2
Utilizarea subinterogrilor n comanda insert........................................................................................78
9.2
COMANDA UPDATE.........................................................................................................................................79
9.3
COMANDA DELETE.........................................................................................................................................79
9.3.1
Stergerea n cascad................................................................................................................................80
10
Baze de date
Project no.
Document no.
11
BD 2011
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
PL/SQL................................................................................................................................................................85
11.1 STRUCTURA PROGRAMELOR PL/SQL...............................................................................................................85
11.2 FUNCIA DE CALCUL A MEDIEI PONDERATE......................................................................................................86
11.3 TRIGGERI...........................................................................................................................................................88
11.3.1
Completarea automat a coloanelor de tip PK.......................................................................................89
11.3.2
Verificarea notelor obinute de studeni...................................................................................................90
12
BIBLIOGRAFIE................................................................................................................................................92
13
ANEXE................................................................................................................................................................93
13.1 INSTRUCTIUNILE SQL PENTRU CREAREA OBIECTELOR N BAZA DE DATE........................................................93
13.1.1
Creare tabele............................................................................................................................................93
13.1.2
Introducerea date n baz.........................................................................................................................97
13.2 FRAZE SELECT N BAZA DE DATE....................................................................................................................101
13.2.1
Studenti-grupe-discipline-note...............................................................................................................101
13.3 CREARE USERI, IMPORT, EXPORT.....................................................................................................................102
Page 4 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
1 Introducere
Acest curs se vrea un ndrumar pentru cei care vor s se iniieze n domeniul bazelor de date, prezentnd
modul de stocare a datelor i principalele instruciuni de accesare a informaiilor stocate n baz. Este un
curs introductiv destinat n principal utilizatorilor bazelor de date, adic celor ce acceseaz baza pentru
obinerea de informaii utile, fr s cunoasc n mod obligatoriu cum a fost proiectat baza de date sau
alte tehnici de administrare a bazei. Se axeaz n principal pe instruciunile SQL (Structured Query
Language) cu care utilizatorul obinuit trebuie s lucreze pentru a introduce informaii n baz, s modifice
aceste informaii n timp i s scoat apoi rapoarte i analize complexe specifice domeniului de lucru.
Ca metod de lucru, pe parcursul cursului se va proiecta o baz de date minimal care s stocheze
informaiile specifice activitii dintr-o unitate de nvmnt superior: studenii nscrii n facultate, grupele
de care aparin, specializrile, disciplinele studiate i notele obinute. Fiecare cursant va trebui s treac
prin toate fazele necesare realizrii acestui sistem de stocare i administrare a datelor: crearea tabelelor,
introducerea datelor n tabele, modificarea datelor, selectarea i filtrarea datelor, realizarea de situaii
specifice activitii didactice.
Page 5 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Este mult mai simplu s utilizm un sistem de gestionare a informaiei care s primeasc toate datele
referitoare la activitatea didactic din facultate i apoi s ne dea informaia de care avem nevoie pentru un
student anume. Acest sistem este baza de date. Baza de date poate fi privit ca un container n care noi
introducem tot felul de piese electronice: rezistene, condensatori, circuite integrate de mrimi, culori i
valori diferite. Dupa ce-am introdus aceste piese, putem s cerem bazei de date s ne spun cte
rezistene de 100 de Ohm exist n container specificnd culoarea, tehnologia de fabricaie i productorul
pentru fiecare. Mai mult, piesele sunt descrcate simultan de mai muli lucrtori, n timp ce alii extrag
componente, alii fac inventarul pentru a determina ce piese sunt n cantitatea critic i trebuie fcute noi
comenzi de achiziie.
Alt exemplu ce justific necesitatea bazelor de date este dat de gestionarea activitii ntr-o ntreprindere.
Suntem ntr-o ntreprindere de cteva mii de angajai. Activitatea ntreprinderii este mprit pe diverse
servicii: aprovizionare, desfacere, ntreinere a echipamentelor, producie, serviciul financiar, contabilitate,
magazia, salarizare, personal , etc.
S lum magazia: aici trebuie inut evidena tuturor articolelor necesare n procesul de producie. Sunt
sute de mii de articole: de la articole mrunte de tip urub, pix, electrod sudur, la subansambluri,
semifabricate i produse finite destinate desfacerii. Fiecare articol poate proveni de la mai muli furnizori
avnd preuri i caliti diferite. Cnd se face o intrare n magazie a unui articol se completeaz un
document care merge la serviciul financiar ce ine evidena facturilor i a clienilor, documentul se conteaz
apoi la serviciul contabilitate ce ine evidena pe conturi de cheltuieli i aa mai departe. n orice moment
trebuie tiut situaia cantitativ i valoric a magaziei. Cei de la producie lanseaz n fabricaie un nou lot;
exist piesele necesare n magazie? La ce pre va rezulta noul produs innd cont c s-au utilizat uruburi
din loturi diferite i la preuri diferite? Care este valoarea articolelor din magazie? Care este situaia contului
de TVA? Cte produse sunt n magazie pentru desfacere? Aceste situaii trebuie date n condiiile n care
sunt mai multe magazii care suport tranzacii de intrare-ieire n mod permanent.
Soluia acestei probleme complexe este baza de date. O singur baz de date ce ruleaz pe server, toi
utilizatorii lucreaz simultan pe baz astfel nct s avem n orice moment situaia cumulat a tuturor
tranzaciilor. n orice moment persoanele din conducere pot vedea ce clieni au datorii mai mari de o limit
sau mai vechi de un anumit termen, situaia bncilor, situaia salariilor, cash-flow-ul, etc i pe baza acestor
informaii s ia decizii n cunostin de cauz.
Este clar ca astzi nu mai poate fi construit o aplicaie serioas care s nu aib n spate o baz de date.
De aceea, la orice interviu de angajare la o firma din domeniul informatic se cer cunotine minime de SQL
i baze de date.
Page 6 of 102
Baze de date
Project no.
Document no.
BD 2011
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Page 7 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Baza Oracle ocup o bun parte din memoria RAM a calculatorului. De aceea, dac nu avem treab cu
baza la un moment dat, e bine s-o oprim ca s eliberm din resursele hardware ale calculatorului.
Cum oprim baza? Mergem n Services , click dreapta pe serviciul "OracleServiceStud" i selectm "Stop".
Problema e ca baza pornete din nou la urmtoarea startare a calculatorului. Ca s scpm de acest lucru,
mergem la acelai serviciu , click dreapta, i selectm "Properties". Selectm la opiunea "Startup Type"
valoarea "Manual". Din acest moment baza nu va porni dect atunci cnd mergem noi n Services i dm
"Start" pe acel serviciu. Bineneles, dac baza nu-i pornit, nu o putem utiliza.
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
1.2.3.1
La instalarea serverului Oracle s-a instalat i un produs numit EXP n directorul " D:\oracle\ora92\bin" (dac
baza s-a instalat pe D). Programul EXP este utilizat pentru salvarea bazei Oracle ntr-un fiier. Se deschide
o fereastr Command Dos (Start/Run... cmd) i se introduce comanda:
exp
stud/stud@stud
file=c:\stud.dmp
log=c:\stud.log
grants=N
recordlength=8192
buffer=30000000
Deci se export toate obiectele care in de user-ul stud (se intra cu parola "stud" pe baza "stud"). Fiierul
rezultat "stud.dmp" va fi pe discul C i fiierul de mesaje "stud.log" va fi salvat pe acelai disc.
Dup instalarea unei noi baze de date i crearea user-ului "stud" se pot importa informaiile din
baza veche cu comanda:
Baze de date
Project no.
BD 2011
Document no.
Pentru
dezinstalarea
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
bazei
Oracle
CR no.:
se
merge
pe
programul
Start/Programs/Oracle
Installation
orice
modificare greit aici poate duce la blocarea anumitor programe sau chiar a calculatorului. Singura
scpare este reinstalarea sistemului de operare Windows cu o formatare prealabil a discului, ceea ce
consum timp, resurse i pierdere de informaii.
Dup tergerea serviciilor Oracle din Registry putei terge n sfrit directorul ORACLE de pe disc.
Dac v d eroare "acces denied" dai restart la calculator, s-i reciteasc regitrii i s nu mai porneasc
serviciile Oracle.
Dac dorim s vedem studenii din baza de date, atunci trebuie s execut o alt instruciune SQL:
Page 10 of 102
Baze de date
Project no.
Document no.
BD 2011
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
O baz de date proiectat corespunztor furnizeaz acces la informaii precise, actualizate. Deoarece o
proiectare corect este esenial pentru atingerea scopurilor utilizrii unei baze de date, investiia n timpul
necesar nvrii principiilor unei bune proiectri este esenial. n cele din urm, vei reui s creai o baz
de date care s v ndeplineasc necesitile i care s poat fi modificat cu uurin.
Acest capitol furnizeaz indicaii pentru planificarea unei baze de date. Vei nva cum s decidei de ce
informaii avei nevoie, cum s mprii aceste informaii n tabele i coloane corespunztoare i cum s
facei ca aceste tabele s interacioneze ntre ele.
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
un element singular de informaie - un tip de element care apare n orice nregistrare. De exemplu, n
tabelul produse, fiecare rnd sau nregistrare ar conine informaii despre un produs. Fiecare coloan sau
cmp conine un anumit tip de informaie despre acest produs, cum ar fi numele sau preul.
Furnizeaz programului Oracle informaiile necesare pentru a asocia informaiile din tabele dup
necesiti.
Procesul de proiectare
Procesul de proiectare const n urmtorii pai:
mprirea elementelor de informaii n entiti sau subiecte majore cum ar fi Produse sau
Comenzi. Apoi, fiecare subiect devine un tabel.
Page 12 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Decidei ce informaii s stocai n fiecare tabel. Fiecare element devine un cmp care este
afiat sub form de coloan n tabel. De exemplu, un tabel Angajai poate include cmpuri,
cum ar fi Nume de familie i Data angajrii.
Alegei cheia primar pentru fiecare tabel. Cheia primar este o coloan care se utilizeaz
pentru a identifica n mod unic fiecare rnd. Un exemplu poate fi ID produs sau ID
comand.
Privii fiecare tabel i decidei cum se asociaz datele dintr-un tabel cu datele din alte
tabele. Adugai cmpuri la tabele sau creai noi tabele pentru a clarifica relaiile, dup
necesiti.
Rafinarea proiectrii
o
Analizai proiectarea Pentru eliminarea erorilor. Creai tabele i adugai cteva nregistrri
de date eantion. Vedei dac reuii s obinei rezultatele dorite din tabele. Efectuai
ajustri ale proiectrii, dup necesitate
Aplicai regulile de normalizare a datelor pentru a vedea dac tabelele sunt corect
structurate. Efectuai ajustri pentru tabele, dup necessitate
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
exemplu, s presupunem c n prezent inei lista de clieni pe fie indexate. Examinnd aceste fie vei
descoperi c fiecare fi conine numele, adresa, oraul, statul, codul potal i numrul de telefon ale unui
client. Fiecare dintre aceste elemente poate reprezenta o coloan din tabel.
Pe msur ce pregtii lista, nu v facei griji dac nu este perfect din prima ncercare. n schimb, trecei n
list fiecare element la care v gndii. Dac va utiliza i altcineva baza de date, cerei-i prerea. Lista se
poate mbunti ulterior.
Apoi, luai n considerare tipurile de rapoarte sau de liste potale pe care dorii s le obinei din baza de
date. De exemplu, se poate crea un raport de vnzri pentru un produs, care afieaz vnzrile n funcie
de regiune sau un raport de rezumare a inventarului, care afieaz nivelurile de inventar ale produselor. De
asemenea, se pot genera scrisori formale, care li se vor trimite clienilor pentru a i anuna de evenimente
sau de oferte speciale. Proiectai mintal raportul i imaginai-v cum ar arta. Ce informaii ai dori s punei
n raport? Trecei fiecare element n list. Facei acelai lucru pentru scrisoarea formal i pentru orice alt
raport pe care considerai c l vei crea.
Proiectarea mental a rapoartelor i a listelor potale pe care dorii s le creai v ajut la identificarea
elementelor de care vei avea nevoie n baza de date. De exemplu, s presupunem c le oferii clienilor
oportunitatea de a se abona (sau a se dezabona) la actualizri periodice prin pot electronic i c dorii
s imprimai o list a celor care s-au abonat. Pentru a nregistra acele informaii, adugai o coloan
Abonat la mesaje de pot electronic la tabelul pentru clieni. Pentru fiecare client, se poate seta cmpul
la Da sau la Nu.
Page 14 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Necesitatea de a le trimite mesaje de pot electronic clienilor sugereaz alt element de nregistrat. Dup
ce tii c un client dorete s primeasc mesaje de pot electronic, va trebui s aflai adresa de pot
electronic la care s le trimitei. Aadar, trebuie nregistrat o adres de pot electronic pentru fiecare
client.
Este logic s se construiasc un prototip al fiecrui raport sau listare de ieire i s se ia n considerare
elementele necesare pentru a produce raportul. De exemplu, cnd examinai o scrisoare formal, se poate
s v vin n minte alte idei. Pentru a include o formul introductiv corespunztoare de exemplu, irul
"Dl.", "Dna." sau "Dra." cu care ncepe o formul de salut, va trebui creat un element pentru introducere. De
asemenea, este mai bine s se nceap scrisorile cu Drag Dl. Georgescu, dect cu Drag Dl. Florin
Georgescu. Aadar, de obicei este mai bine s se stocheze numele de familie separat de prenume.
Trebuie s se in cont de faptul c informaiile trebuie desprite n cele mai mici pri utile. n cazul unui
nume, pentru ca numele de familie s fie uor disponibil, se va despri numele n dou pri Nume i
Prenume. Pentru a sorta un raport dup numele de familie, de exemplu, este util s se stocheze separat
numele de familie ale clienilor. n general, pentru a sorta, cuta, celula sau raporta n funcie de un element
informaional, trebuie pus acel element ntr-un cmp propriu.
Gndii-v la ntrebrile la care dorii s rspund baza de date. De exemplu, cte vnzri s-au finalizat
pentru produsul principal? Unde locuiesc cei mai importani clieni? Cine este furnizorul produsului care se
vinde cel mai bine? Anticiparea acestor ntrebri c ajut s v dai seama de elementele suplimentare care
trebuie nregistrate.
Dup ce colectai aceste informaii, suntei gata pentru pasul urmtor.
Page 15 of 102
Baze de date
Project no.
Document no.
BD 2011
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Entitile principale afiate aici sunt produsele, furnizorii, clienii i comenzile. Aadar, este logic s pornii
cu aceste patru tabele: unul pentru date despre produse, unul pentru date despre furnizori i unul pentru
date despre comenzi. Dei lista este incomplet, este un punct de pornire bun. Lista se poate rafina pn
cnd se ajunge la un proiect care funcioneaz bine.
Cnd examinai prima dat lista preliminar de elemente, vei fi tentat() s le plasai pe toate ntr-un singur
tabel, n locul celor patru afiate n imaginea precedent. Vei nva acum de ce nu este o idee bun. Luai
n considerare tabelul afiat aici:
n acest caz, fiecare rnd conine informaii att despre produs, ct i despre furnizorul lui. Deoarece se
poate ca multe produse s aib acelai furnizor, numele i informaiile furnizorului se repet de multe ori.
Acest lucru irosete spaiul de pe disc. nregistrarea informaiilor despre furnizor o singur dat, ntr-un
tabel separat denumit Furnizori, iar apoi legarea acelui tabel cu tabelul Produse, este o soluie mult mai
bun.
A doua problem a acestui proiect apare atunci cnd trebuie modificate informaiile despre furnizor. De
exemplu, s presupunem c trebuie schimbat adresa unui furnizor. Deoarece apare n multe locuri, se
Page 16 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
poate, n mod accidental, s modificai adresa ntr-un loc i s uitai s o modificai n celelalte. nregistrarea
adresei furnizorului ntr-un singur loc rezolv problema.
Cnd proiectai baza de date, ncercai s nregistrai fiecare informaie o singur dat. Dac se repet
aceeai informaie, cum ar fi adresa unui anumit furnizor, n mai multe locuri amplasai informaia ntr-un
tabel separat.
n final, s presupunem c exist un singur produs furnizat de Coho Winery i c dorii s tergei produsul,
dar s pstrai numele i informaiile furnizorului. Cum se poate terge nregistrarea produsului fr a pierde
informaiile despre furnizor? Este imposibil. Deoarece fiecare nregistrare conine date despre un produs,
ct i despre un furnizor, este imposibil s se tearg separat. Pentru a menine datele separate, trebuie
mprit tabelul n dou tabele: unul pentru informaii despre produse i cellalt pentru informaii despre
furnizori. tergerea nregistrrii unui produs ar trebui s tearg doar datele despre produs, nu i datele
despre furnizor.
Dup ce alegei subiectul reprezentat de un tabel, coloanele din acel tabel trebuie s stocheze numai datele
despre acel subiect. De exemplu, tabelul pentru produse trebuie s stocheze numai date despre produse.
Deoarece adresa unui furnizor este o informaie despre furnizor, i nu una despre produs, aparine de
tabelul pentru furnizori.
Page 17 of 102
Baze de date
Project no.
Document no.
BD 2011
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
De asemenea, trebuie s se tie dac informaiile coninute n baza de date au doar caracter intern sau i
internaional. De exemplu, dac planificai s stocai adrese internaionale, este mai bine s avei o coloan
Regiune n locul coloanei Jude, deoarece o astfel de coloan poate conine judee naionale sau alte
ri/regiuni. Asemntor, codul potal este mai bun dect codul Zip dac stocai adrese internaionale.
Urmtoarea list afieaz cteva sfaturi pentru stabilirea coloanelor.
Page 18 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Dup mbuntirea coloanelor de date din fiecare tabel, se poate alege cheia primar a fiecrui tabel.
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
primar care nu se va modifica reduce ansele de a se desincroniza cheia primar cu tabelele care fac
referin la ea.
Deseori, e utilizeaz ca i cheie primar un numr unic arbitrar. De exemplu, i se poate atribui fiecrei
comenzi un numr unic de comand. Singurul scop al numrului de comand este identificarea unei
comenzi. O dat atribuit, nu se schimb niciodat.
Dac nu avei o coloan sau un set de coloane care se poate utiliza ca i cheie primar, luai n considerare
utilizarea unei coloane care are tipul de date AutoNumerotare. Cnd se utilizeaz tipul de date
AutoNumerotare, Oracle atribuie automat o valoare. Un astfel de identificator nu are date; nu conine
informaii care descriu rndul pe care l reprezint. Identificatorii fr date sunt ideali pentru rolul de cheie
primar, deoarece nu se modific. Este mai posibil ca o cheie primar care conine date despre un rnd
de exemplu, un numr de telefon sau numele unui client s se modifice, deoarece se poate modifica
informaia n sine.
O coloan setat la tipul de date AutoNumerotare este o cheie primar potrivit. Nu exist dou ID-uri
identice pentru produse.
n unele cazuri, este de preferat s se utilizeze dou sau mai multe cmpuri care mpreun asigur cheia
primar a unui tabel. De exemplu, un tabel Detalii Comenzi care stocheaz elemente de linie pentru
comenzi ar folosi dou coloane n cheia sa primar : ID Comand i ID Produs. Cnd o cheie primar
utilizeaz mai mult de o coloan, aceasta se mai numete i cheie compus.
n cazul bazei de date pentru vnzri de produse, se poate crea o coloan de tipul AutoNumerotare pentru
fiecare dintre tabele, pentru a ndeplini rolul de cheie primar: IDProdus pentru tabelul Produse,
IDComand pentru tabelul Comenzi, IDClient pentru tabelul Clieni i IDFurnizor pentru tabelul Furnizori.
Page 20 of 102
Baze de date
Project no.
Document no.
BD 2011
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Page 21 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
tabelul Angajai...
tabelul Comenzi...
tabelul Produse...
i tabelul Detalii Comand.
Oracle este un sistem de gestionare a bazelor de date relaionale. ntr-o baz de date relaional,
informaiile se mpart n tabele separate, bazate pe subiecte. Se pot utiliza relaiile dintre tabele pentru a
asocia informaiile n moduri utile.
Pentru a reprezenta o relaie de tipul unul-la-mai-muli n proiectul bazei de date, luai cheia primar din
partea "unu" a relaiei i adugai-o ca o coloan suplimentar la tabelul din partea "mai-muli" a relaiei. n
acest caz, de exemplu, se adaug coloana ID furnizor, din tabelul Furnizori, la tabelul Produse. Oracle
poate utiliza numrul de ID al furnizorului n tabelul Produse pentru a gsi furnizorul potrivit pentru fiecare
produs.
Page 22 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Coloana ID furnizor din tabelul Produse se numete cheie extern. O cheie extern este cheia primar a
unui alt tabel. Coloana ID furnizor din tabelul Produse este o cheie extern, deoarece este i cheia primar
a tabelului Furnizori.
Furnizai baza pentru a uni tabelele legate prin stabilirea perechilor de chei primare i chei externe. Dac nu
suntei sigur care tabele ar trebui s partajeze o coloan comun, identificarea unei relaii unu-la-mai-muli
va asigura necesitatea unei coloane partajate ntre cele dou tabele implicate.
Baze de date
Project no.
Document no.
BD 2011
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
creai o relaie ntre dou tabele adugnd cmpul ID produs la tabelul Comenzi. Pentru a avea mai mult de
un produs pentru fiecare comand, avei nevoie de mai mult de o nregistrare pentru fiecare comand n
tabelul Comenzi. S-ar repeta informaiile despre comand pentru fiecare rnd asociat cu o comand
rezultnd o proiectare ineficient care poate produce date exacte. Aceeai problem apare dac se adaug
cmpul ID comand la tabelul Produse rezult mai multe nregistrri n tabelul Produse pentru fiecare
produs. Cum se rezolv aceast problem?
Rspunsul este crearea celui de-al treilea tabel, numit adesea tabel de jonciune, care separ relaia maimuli-la-mai-muli n dou relaii unu-la-mai-muli. Inserai cheia primar a fiecruia dintre cele dou tabele
n al treilea tabel. Ca rezultat, al treilea tabel nregistreaz fiecare apariie sau instan a relaiei.
Fiecare nregistrare din tabelul Detalii comand reprezint un element linie ntr-o comand. Cheia primar a
tabelului Detalii comand const n dou cmpuri cheile externe ale tabelelor Comenzi i Produse.
Utilizarea cmpului ID comand singur nu funcioneaz ca o cheie primar pentru acest tabel, deoarece o
comand poate avea mai multe elemente linie. ID comand se repet pentru fiecare element linie dintr-o
comand, astfel nct cmpul nu conine valori unice. Nici utilizarea cmpului ID produs singur nu
funcioneaz, deoarece un produs poate aprea n mai multe comenzi diferite. Dar, mpreun, cele dou
cmpuri produc ntotdeauna o valoare unic pentru fiecare nregistrare.
n baza de date pentru vnzri de produse, tabelele Comenzi i Produse nu sunt asociate direct. n schimb,
ele sunt asociate indirect prin tabelul Detalii comand. Relaia mai-muli-la-mai-muli ntre comenzi i
produse se reprezint n baza de date utiliznd dou relaii unu-la-mai-muli:
Page 24 of 102
Baze de date
Project no.
Document no.
BD 2011
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
ntre tabelele Comenzi i Detalii comand exist o relaie unu-la-mai-muli. Fiecare comand are mai
mult de un element line, dar fiecare element linie este conectat cu o singur comand.
ntre tabelele Produse i Detalii comand exist o relaie unu-la-mai-muli. Fiecare produs poate avea
mai multe elemente linie asociate, dar fiecare element linie face referire la un singur produs.
Din tabelul Detalii comand, se pot determina toate produsele dintr-o anumit comand. De asemenea, se
pot determina toate comenzile pentru un anumit produs.
Dup incorporarea tabelului Detalii comand, lista tabelelor i cmpurilor poate arta cam aa:
Page 25 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Produs, exist o singur nregistrare care se potrivete n tabelul suplimentar. Cnd identificai o astfel de
relaie, ambele tabele trebuie s partajeze un cmp comun.
Cnd observai necesitatea unei relaii unu-la-unu n baza de date, gndii-v dac se pot pune informaiile
din cele dou tabele mpreun ntr-un singur tabel. Dac, dintr-un anumit motiv, nu dorii s facei acest
lucru, poate pentru c ar rezulta multe spaii libere, lista urmtoare v arat cum se reprezint relaia n
proiectare:
Dac cele dou tabele au acelai subiect, probabil se poate configura relaia utiliznd aceeai
cheie primar n ambele tabele.
Dac cele dou tabele au subiecte diferite, cu chei primare diferite, alegei unul din tabele (oricare)
i inserai cheia sa primar n cellalt tabel pe post de cheie extern.
Determinarea relaiilor dintre tabele v ajut s v asigurai c avei tabelele i coloanele corecte. Cnd
exist o relaie unu-la-unu sau unu-la-mai-muli, tabelele implicate trebuie s partajeze o coloan sau mai
multe coloane comune. Cnd exist o relaie mai-muli-la-mai-muli, este necesar un al treilea tabel pentru a
reprezenta relaia.
2.3.10
Rafinarea proiectrii
Din momentul n care avei tabelele, cmpurile i relaiile de care avei nevoie, trebuie s creai i s
populai tabelele cu date eantion i s ncercai s lucrai cu informaiile: crend interogri, adugnd
nregistrri noi i aa mai departe. Acest lucru ajut la evidenierea problemelor poteniale de exemplu,
este posibil s avei nevoie s adugai o coloan pe care ai uitat s o inserai n timpul fazei de proiectare,
sau este posibil s avei un tabel care s trebuiasc separat n dou tabele pentru a elimina duplicarea.
Vedei dac se poate utiliza baza de date pentru a obine rspunsurile dorite. Creai schie neprelucrate ale
formularelor i rapoartelor, i vedei dac v arat datele pe care le ateptai. Cutai dubluri inutile de date
i, dac le gsii, modificai proiectarea pentru a le elimina.
Pe msur ce testai baza de date iniial, probabil vei descoperi c se pot face mbuntiri. Cteva lucruri
care trebuie verificate:
Ai uitat vreo coloan? Dac da, apar informaiile n tabelele existente? Dac informaiile sunt
despre altceva, este posibil s fie nevoie s creai un alt tabel. Creai o coloan pentru fiecare
element informaional care trebuie urmrit. Dac informaiile nu se poate calcula de pe o alt
coloan, probabil avei nevoie de o coloan nou pentru asta.
Page 26 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Sunt inutile unele coloane, pentru c se pot calcula din cmpuri deja existente? Dac un element
informaional se poate calcula dintr-o alt coloana deja existent ca, de exemplu, preul redus
calculat din preul de vnzare este mai bine, n general, s se procedeze aa i s se evite
crearea unei coloane noi.
Introducei n mod repetat informaii dublate n unul din tabele? Dac da, probabil c trebuie
mprit tabelul n dou tabele ntre care s existe o relaie de tipul unu-la-mai-muli.
Avei tabele cu multe cmpuri, un numr limitat de nregistrri i multe cmpuri goale n
nregistrrile individuale? Dac da, gndii-v la reproiectarea tabelului astfel nct s aib mai
puine cmpuri i mai multe nregistrri.
A fost mprit fiecare element informaional n cele mai mici pri utile? Dac trebuie efectuate
operaii de raportare, sortare, cutare sau calculare pentru un element informaional, punei acel
element n propria sa coloan.
Conine fiecare coloan date despre subiectul tabelului? Dac o coloan nu conine informaii
despre subiectul tabelului, aceasta aparine unui alt tabel.
Sunt toate relaiile dintre tabele reprezentate prin cmpuri comune sau printr-un al treilea tabel?
Relaiile unu-la-unu i unu-la-mai-muli necesit coloane comune. Relaiile mai-muli-la-mai-muli
necesit un al treilea tabel.
Page 27 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Cnd revizualizai structurile tabelului, cutai grupuri repetitive. De exemplu, luai n considerare un tabel
care conine urmtoarele coloane:
ID produs
Nume
ID produs1
Nume1
ID produs2
Nume2
ID produs3
Nume3
n acest caz, fiecare produs este un grup repetitiv de coloane, care difer numai prin adugarea unui numr
la sfritul numelui coloanei. Cnd vedei coloanele numerotate astfel, ar trebui s reanalizai proiectarea.
Un astfel de proiect are mai multe defecte. Pentru nceput, v oblig s stabilii o limit superioar pentru
numrul produselor. Dup ce se depete aceast limit, trebuie adugat un grup de coloane nou la
structura tabelului, ceea ce reprezint o activitate administrativ major.
O alt problem este faptul c furnizorii care au mai puin dect numrul maxim de produse vor irosi spaiu,
din moment ce coloanele suplimentare vor fi goale. Cel mai serios defect al unui astfel de proiect este faptul
c efectuarea multor activiti, cum ar fi sortarea sau indexarea unui tabel dup ID-urile sau numele
produselor, devine dificil.
Oricnd vedei un grup repetitiv, reanalizai cu atenie proiectarea, n ideea de a mpri tabelul n dou. n
exemplul de mai sus, este mai bine s utilizai dou tabele, unul pentru furnizori i unul pentru produse,
legate prin ID furnizor.
2.3.12
Regulile de normalizare a datelor (denumite uneori reguli de normalizare) pot fi aplicate ca un pas din
cadrul proiectrii. 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.
Normalizarea este foarte util dac ai determinat toate elementele informaionale i ai creat un proiect
preliminar. Scopul este s v asigurai c ai mprit elementele informaionale n tabelele
Page 28 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
2.3.12.1
Prima form normal presupune c exist o singur valoare la fiecare intersecie dintre un rnd i o
coloan din tabel, i niciodat o list de valori. De exemplu, nu poate exista un cmp denumit Pre n care
s plasai mai multe preuri. Dac privii intersecia dintre un rnd i o coloan ca pe o celul, atunci fiecare
celul poate conine o singur valoare.
2.3.12.2
A doua form normal necesit ca fiecare coloan care nu este cheie s depind complet de cheia primar,
nu doar de o parte a cheii. Aceast regul se aplic cnd se utilizeaz o cheie primar care conine mai
multe coloane. De exemplu, s presupunem c avei un tabel care conine urmtoarele coloane, dintre care
ID comand i ID produs alctuiesc cheia primar:
Nume produs
Acest proiect ncalc a doua form normal, deoarece Nume produs depinde de ID produs, dar nu i de ID
comand, aadar nu depinde de ntreaga cheie primar. Nume produs trebuie eliminat din tabel. Aparine
de alt tabel (Produse).
2.3.12.3
A treia form normal necesit ca fiecare coloan care nu este cheie s depind de ntreaga cheie primar,
dar i ca toate coloanele care nu sunt chei s fie reciproc independente.
Un alt mod de a spune aste este c fiecare coloan care nu este cheie trebuie s depind de ntreaga
cheie primar i numai de cheia primar. De exemplu, s presupunem c avei un tabel care conine
urmtoarele coloane:
Page 29 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
Nume
PSV
Reducere
CR no.:
S presupunem c Reducere depinde de preul sugerat de vnzare (PSV). Acest tabel ncalc a treia form
normal, deoarece o coloan care nu este cheie, Reducere, depinde de alt coloan care nu este cheie,
PSV. Independena coloanelor nseamn c se poate modifica orice coloan care nu este cheie fr a
afecta alte coloane. Dac se modific o valoare din cmpul PSV, se modific n mod corespunztor
Reducere, aadar nclcndu-se regula. n acest caz, Reducere trebuie mutat n alt tabel pentru care PSV
este cheie.
In acest capitol am nvat despre modul de proiectare a unei baze de date: cum mprim informaiile n
tabele, definirea relaiilor ntre tabele, reguli de normalizare a bazei de date.
In continuare trecem efectiv la crearea unei baze de date aplicnd aceste reguli de proiectare. Baza de
date va conine informaiile primare despre studenii unei faculti, necesare n realizarea rapoartelor despre
situaia la nvtur a studentilor.
Page 30 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Atentie: tergerea unui user implic pierderea tuturor informaiilor care aparin acelui user: tabele, triggeri,
funcii, proceduri , biblioteci etc, de aceea trebuie realizat un export mai nti pe acel user, export ce
salveaz informaia ntr-un fiier pe disc (vezi comanda de export in capitolul "Dezinstalarea bazei Oracle").
Deci, intrm in SQL Plus cu user-ul system i dm comanda de creare a userului "stud". Orice
instruciune SQL se termin cu semnul ";". Odat creat, user-ul trebuie s primeasc i nite drepturi care
s-i permit s ntreprind anumite aciuni pe baza de date. Vom vorbi mai trziu despre drepturi, acum ne
vom mrgini s-i dm user-ului "stud" un rol de "data base administrator" (dba), rol suficient de puternic ca
s realizm ceea ce ne-am propus:
Dupa crearea user-ului "stud" se iese din SQL Plus si se reintr cu noul user sau, se poate reconecta direct
cu noua identitate:
connect stud/stud@stud;
Din acest moment vom lucra numai sub user-ul "stud", deci la nceputul fiecrei sesiuni se va da user-ul
stud i parola corespunztoare. Primul lucru ce-l avem de rezolvat este crearea tabelelor n care vom ine
informaia. Baza de date creat este minimal, acoperind doar cteva aspecte din activitatea colar a
studenilor.
Page 31 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Pentru a obine licena de absolvire, studentul trebuie sa treac printr-un ciclu de studii ce
presupune un numr de ani de studiu : anul 1, anul 2, anul 3 i anul 4.
Nu toi studenii parcurg acelai domeniu, facultatea avnd mai multe specializri de studiu,
(Maini Electrice, Metrologie, Informatic Aplicat, etc), fiecare specializare fiind format
din una sau mai multe grupe de studeni.
Structura tabelelor
Conform observaiilor de mai sus, ar rezulta urmtoarea structur de tabele necesar pentru stocarea
informaiilor specifice activitii didactice :
Tabela "ani_studiu": conine anii de studiu din facultate: anul 1, anul 2, 3,...;
Tabela "studenti_grupe" este tabela de legatura ntre studeni i grupe. Nu se poate trece
direct numrul grupei la fiecare student pentru ca acel student trece prin mai multe grupe
de studiu n decursul anilor, deci un student are ataate mai multe grupe, aa cum o grup
are ataai mai muli studeni. Este o legatur de tip "mai-multi-la-mai-multi" ce se rezolv
prin aceast tabel suplimentar.
Tabela "discipline": cnd se introduce o disciplin n tabel trebuie specificat anul de studiu
i specializarea la care se studiaz acea disciplin, precum si semestrul de studiu (1 sau
2).
Tabela "note" conine catalogul n care vor fi trecute notele la diverse testri i examene
finale ale studenilor. Fiecare not trecut n catalog trebuie s aparin unui student
(pk_student) i unei discipline (pk_disciplina).
Page 32 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
In figura de mai jos sunt date tabelele bazei de date, la fiecare tabel precizndu-se numele i tipurile
coloanelor incluse.
Lista disciplinelor ataate unui student ntr-un an universitar mpreun cu notele obinute de acesta
Studenii cu rezultate bune la nvtur, avnd media superioar grupei din care face parte
Etc
Page 33 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Coloana primary_key, avand prefixul "pk_", este coloana ce conine o valoare unic pentru fiecare
rnd din tabel. Orice tabel trebuie s aib o coloan care s identifice n mod unic o linie din
cadrul tabelei i care ne d sigurana c baza de date va reui s stocheze i s furnizeze
informaia n mod corect.
Coloana de cod, avnd prefixul "cod_", reprezint codul atribuit liniei respective. De cele mai multe
ori acest cod este unic dar nu n mod obligatoriu.
Coloana pentru descrierea informaiei din rnd, are prefixul "descriere_", i conine un text
descriptiv despre linia respectiv.
Aceste trei coloane se vor ntlni n toate tabelele create de noi n baza de date avnd semnificaiile
descrise mai sus.
In continuare prezentm arhitectura fiecrui tabel cu discuiile aferente:
1. Tabela "ani_universitari": este tabela ce stocheaz anii universitari parcuri din momentul crerii
bazei de date. Este o tabel independent de celelalte date din baz (tabela parinte), nu depinde
de nici o alta tabela, reprezint pur i simplu o iniruire de ani universitari. Include urmtoarele
coloane:
Pk_an_universitar: (ex: 1,2,3, ...)un numar unic ce identific fiecare an universitar n parte
2. Tabela "specializari": este tabela ce conine specializrile din facultate. De asemenea este o tabela
independent, structura specializrilor nu depinde de studeni sau grupe, ci este data de profilul
facultii.
Include urmtoarele coloane:
Pk_specializare: (ex: 1,2,3, ...) un numr unic ce identific fiecare specializare n parte
3. Tabela "ani_studiu": este tabela ce conine anii de studiu pe care i parcurge un student n
decursul facultii.
Include urmtoarele coloane:
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Descriere_an_studiu: (ex: "Anul I", "Anul II", ...), reprezint descrierea anului de studiu
4. Tabela "discipline": este tabela ce conine disciplinele studiate n facultate. Nu mai este o tabela
independent, ci una copil, aceasta tabela depinznd de anii de studiu i de specializrile din
facultate.
Include urmtoarele coloane:
Pk_disciplina: (ex: 1,2,3, ...) un numr unic ce identific fiecare disciplin n parte
5. Tabela "grupe": este tabela ce conine grupele de studeni care se formeaz n facultate. Grupele
depind de specializare i de anul de studiu: la specializarea "IA", anul 3 este o singur grup:
"6309".
Include urmtoarele coloane:
Pk_grupa: (ex: 1,2,3, ...) un numr unic ce identific fiecare grup n parte
6. Tabela "studenti": este tabela cu toti studenii din facultate, conine informaiile statice ale unui
student.
Include urmtoarele coloane:
Pk_student: (ex: 1,2,3, ...) un numr unic ce identific fiecare student n parte
Nume_student
Prenume_student
Nr_matricol
Adresa
7. Tabela "studenti_grupe": reprezint legatura ntre tabela studeni i tabela grupe. Un student
parcurge mai multe grupe n decursul facultii, aa cum o grup are mai multi studeni. Deci nu se
Page 35 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
poate face legatura direct ntre cele dou tabele, ci prin intermediul unei a treia tabele care s
specifice clar n fiecare an universitar componena grupelor.
Include urmtoarele coloane:
8. Tabela "Note": ine evidena notelor obinute de studeni n timpul examinrilor. Este legat de
tabela "studenti" orice not este asignat n mod unic unui student, i tabela "discipline" orice
not este pus la o anumit disciplin.
Include urmtoarele coloane:
Relaia studeni-grupe: este o relaie clasic de tipul "mai-multi-la-mai-multi". Dac analiza era
limitat doar la un singur an universitar, atunci se putea pune foarte simplu coloana "pk_grupa" n
tabela studenti. Intr-un an universitar un student nu poate fi dect ntr-o grup (mai sunt i cazuri
cnd se permite ca un student s efectueze doi ani ntr-un an). Dar dac lucrm cu mai muli ani
universitari, atunci eram nevoii s inserm acelai student n baza de date dar avand un alt
pk_grupa. Rezult astfel mai multe linii n tabela studenti pentru acelai student, fiecare avnd pkuri diferite, ceea ce nu este absolut deloc corect. Nu se mai poate deloc identifica n mod unic un
student n baza de date, deoarece numele studenilor nu este unic n mod absolut.
Soluia a venit prin crearea unui tabel de legtur ntre studeni i grupe.
Page 36 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
specializri care s includ i anul universitar curent. Este posibil ca o disciplin s se reformuleze
la un moment dat, nu se mai cheam "BD" ci "BDR" (baze de date relationale) i atunci trebuie
adaugat o nou disciplin. Nu poate fi modificat cea veche deoarece studenii care deja au
absolvit, au studiat disciplina veche i ea trebuie s rmn n baza de date pentru tiprirea foii
matricole n mod corect. Deci, la nceputul fiecrui an universitar ar trebui completat tabela de
legatur ntre discipline i specializri astfel nct, s se poat specifica clar ce discipline s-au
studiat n decursul anilor i n ce ani universitari.
Singura problema ar fi ca este necesar un volum de munc suplimentar pentru a ataa disciplinele la
specializri n fiecare an, munca destul de plictisitoare innd cont c aceste schimbri apar foarte rar n
timp.
Mai exist o soluie cnd se schimb programa unei specializri: se se creeze o nou specializare,
avnd acelai cod, aceeai descriere (dar pk diferit) i noile grupe formate s se ataeze la noua
specializare. Totui, dou specializri cu acelai cod i aceeai descriere pot crea confuzie, dac le
punem ntr-un combo-box (lista de selecie), apar dou linii identice din care utilizatorul nu tie pe care
s o aleag. Atunci se mai introduce o coloana numit "Inactiv" cu variantele "DA" sau "NU". Odat ce
o specializare se modific, atunci se creeaz una nou dup noua curicul i cea veche se trece n
starea inactiv. In felul acesta avem un criteriu de filtrare a specializrilor ce se afieaz la un moment
dat.
De ce nu pot folosi cod_grupa sau cod_specializare ca coloan de tip pk? Este mai util s vedem n
tabela grupe la coloana "pk_specializare" un text de tipul "IAD" decat un numr abstract. S-ar
vedea de la prima vedere la ce specializare este ataat aceast grup, far s mai merg prin
tabela specializri. Dar, aa cum am discutat la punctul anterior, pot adauga o nou specializare cu
acelai cod, deci s-ar nclca regula ce spune c fiecare linie trebuie identificat n mod unic prin
valoarea din coloana de tip pk.
Acceai regul se aplic i la cod_grupa, pot avea grupe cu acelasi cod, dar care s aparin de
specializri diferite n funcie de numrul de studeni din fiecare an universitar.
Page 37 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Dac lucrm n programul SQL Navigator crearea unui tabel este simpl: click dreapta pe subdirectorul
"Tables" din "My Schema" i comanda "Create" din submeniul aprut. Se creeaz tabela "ani_universitari"
avnd urmtoarele coloane:
- pk_an_universitar de tip number (n coloana se vor introduce numai numere care s identifice n
mod unic anul colar);
- cod_an_universitar: varchar2(50)
- descriere_an_universitar: varchar2(50)
Dup ce am completat cele dou coloane se d click pe butonul "Apply Changes to DB" (
).
Cine nu are o asemenea interfa grafic, este nevoit s scrie comanda SQL pentru crearea unei tabele:
create table ani_universitari
(
pk_an_universitar
number,
cod_an_universitar
varchar2(15),
descriere_an_universitar varchar2(50)
);
Dac am greit ceva, putem terge tabela (drop table ani_universitari;) i apoi crea din nou, n forma
corect. Sau, mai avem varianta de modificare a tabelei direct, prin comanda SQL "alter table" :
ALTER TABLE ani_universitari MODIFY ( DESCRIERE_AN_UNIVERSITAR VARCHAR2 (50));
Exist comenzi pentru adugare de coloane, tergere, modificare tip, modificare nume coloane. Comanda
DESCRIBE face o descriere a coloanelor unui tabel cu tipurile aferente.
modificare coloan:
o
Adugare coloan:
o
Stergere coloan:
o
Redenumire coloan:
o
Describe studenti;
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
In momentul cnd se definete o nou coloan n tabel trebuie specificat i tipul de date care vor fi stocate
n acea coloan. Intr-o coloana poatet fi stocat doar un singur tip de date, nu pot fi amestecate tipuri diferite
(numere, texte, date calendaristice).
In continuare se dau principalele tipuri de date ce pot fi stocate n baza de date:
Siruri de caractere:
Nvarchar2(n): similar cu varchar2, dar n acest caz se pot introduce caractere naionale
specifice (, , ,...)
Char(n): tot iruri de caractere, dar de lungime fix, maxim 2000 de octei.
Numere:
Date calendaristice:
Date: o dat calendaristic ce poate conine orice dat n perioada 4712 .e.n 9999. Aceste
date se pstreaz n baz sub forma unor numere cu virgul, o unitate reprezentnd o zi.
Pentru afiarea datelor calendaristice se folosesc diverse funcii ce formateaz acea data ntrun text corespunztor.
Obiecte mari:
Blob (bynary large objects): pentru obiecte foarte mari de date (cum ar fi imagini, obiecte
binare) Oracle pune la dispoziie tipul BLOB. In acest cmp se pot stoca pn la 4 GB de date
binare, fr nici o formatare prealabil (ele sunt tratate ca un ir de octei oarecare).
Page 39 of 102
Baze de date
Project no.
Document no.
BD 2011
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Page 40 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
4 Constrngeri
Constrngeri de tip Primary Key (PK)
Am vzut ca putem afla grupa din care face parte un student tiind numrul liniei din tabela "grupe"
care este asociat studentului. Dar, ce se ntmpl dac s-a ters o grup din baza de date? Toate liniile vor
fi decalate cu un pas, deci toti studenii vor fi trecui automat n grupa anterioar. Este mult mai bine dac
am defini o coloan n tabela "grupe" care s aib ca valoare un numr ntreg pentru fiecare linie care s fie
unic n tabel, indiferent de cte linii are tabela, cte linii s-au ters sau modificat. Putem defini o asemenea
coloan prin constrngerea "primary key".
Constrngerile reprezint un set de reguli pe care noi le definim i apoi baza de date se asigur c
sunt respectate. De exemplu, din experiena noastr de toate zilele, putem trage concluzia destul de util
c nu este bine s bagi mna n foc. De aceea definim o regula : " nu este voie s se bage mna n foc".
Cu toate c regula este clar, e greu s fie respectat. De multe ori omul uit c focul arde, sau din
greeal trece cu mna prin foc, sau introduce mna ntr-o incint n care nu tie c arde focul. Deci, ne
putem frige ori din neatenie, ori din netiin. N-ar fi mai bine dac cineva ar supraveghea tot timpul la
respectarea acestei reguli i, la fiecare ncalcare s ne blocheze s bgm mna n foc?
Exact asta face baz de date: noi definim o constrngere de tip "primary key" pe o coloan i baza
are grij ca niciodat s nu se repete o valoare pe acea coloan.
Dar cum tim s introducem valori n acea coloan? Cine st s verifice ce valori s-au introdus
pn acum i ce valori putem introduce n continuare? Din fericire, baza de date iari ne ajut. Bazele de
tip Oracle conin un obiect numit "Sequence" care este un generator de numere cresctoare unice. Odat
definit, obiectul ne furnizeaz la apel un numar mai mare dect cel furnizat anterior. Nimeni nu poate da
secvena napoi, deci nu este posibil s se repete un numr de mai multe ori. Prin urmare, completarea
unei coloane de tip "primary key" (pk) se face cu ajutorul secvenelor.
Comanda SQL de adugare a unei constrngeri de tip "primary key" este urmtoarea:
Page 41 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Sunt situaii cnd mai multe coloane din tabel trebuie s conin valori unice, dar nu putem defini
dect o coloan ca fiind de tip PK. Pentru celelalte coloane avem la dispoziie constrngerea de unicitate
care odat definit, nu permite repetarea valorilor pe acea coloan.
Daca vreau s creez o constrngere de unicitate dar datele existente n tabel nu respect condiia impus
de constrngere, se folosete clauza NOVALIDATE (baza deja este pornit, avem date, dar s-a constatat la
un moment dat c unele date nu sunt corecte. Nu putem terge datele, dar din acest moment definim
constrngerea care s nu mai permit introducerea de noi date greite):
alter table studenti add constraint studenti_uk unique(pk_stud, nume_stud) enable novalidate;
OBSERVATIE: novalidate merge numai daca s-a creat un index pe acele coloane:
Enable/disable constrngere:
o
Importm date n baz care nu respect ordinea: mai nti datele din tabelele printe i apoi cele
din tabelele copil. Prin dezactivarea constrngerilor, pot introduce datele n ordine aleatoare i apoi
constrngerile sunt validate la loc. Condiia este ca datele importate s respecte regulile impuse de
constrngeri.
Import date ntr-o tabel care se autorefer (am date parinte i copil in aceeai tabel).
Sterg date din tabel, dar datorit constrngerilor de tip foreign key, tergerea dureaz foarte mult
(baza trebuie sa verifice c nu tergem date de tip printe ce au date copii n alte tabele). Trebuie
s dezactivez toate constrngerile de tip foreign key care fac referire la tabela din care terg.
Aceste constrngeri se afl printr-un select din tabela user_constraints.
Page 42 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Ce se ntmpl dac introducem un student n baz, dar uitm s-i completm numele? Programul
salveaz linia i apoi vine profesorul s pun note n catalog. Cnd ajunge la studentul cu pricina gsete o
linie goal la care nu tie ce not s treac.
De aceea, trebuie s ne asigurm c, coloana "nume" nu are voie s conin valori de tip null.
Aceast problem se rezolv prin constrngerea "Not Null" pe care o aplicm coloanei "nume".
alter table studenti_grupe add constraint stud_grupe_fk foreign key (pk_grupa) references
grupe(pk_grupa);
Observaie: coloana pk_grupa din tabela grupe trebuie s fie declarat ntr-o constrngere de tip PK sau
UK, altfel obinem eroarea: 'no matching unique or primary key for column-list';
Alter table note add constraint ck_nota CHECK (nota between 1 and 10);
pk_an_universitar (pk_an_universitar)
Page 43 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
2. Ani_studiu:
-
pk_an_studiu (cod_an_studiu)
3. Specializari:
-
Pk_specializari (cod_specializare)
4. Discipline:
-
Pk_discipline (cod_disciplina)
5. Grupe:
-
Pk_grupa (cod_grupa)
6. Studenti:
-
Pk_student (pk_student)
7. Studenti_grupe:
-
Pk_studenti_grupe
8. Note:
-
Pk_nota(pk_nota)
Page 44 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Dup comanda "insert into" se pune numele tabelei n care se introduc datele, ntre paranteze se trec
denumirile coloanelor care se completeaz cu informaii, apoi dup cuvntul "values" se pun valorile noilor
date ale tabelei. Observm c valorile numerice se scriu ca atare pe cnd cmpurile de tip text se scriu cu
apostrof ( 'an scolar 2007-2008' ).
Aceeai comand poate fi dat i prin sintaxa:
cnd se renun la specificarea coloanelor completate. In acest caz paranteza "values" trebuie s conin
valori pentru toate coloanele tabelei. Prima variant este de preferat deoarece se vede foarte clar ce
coloane se completeaz (sunt tabele care au zeci de coloane i doar cteva primesc valori la o inserare) i
n al doilea rnd nu se tie niciodat dac nu cumva mai trebuie adugat o coloan la o tabel dup
conceperea bazei de date. O coloan n plus necesit modificarea tuturor insert-urilor scrise sub a doua
variant.
Not: trebuie verificat
Constrngerea fk_note_discipline verific c disciplina la care se pune nota exist n baza de date, dar nu
poate verifica dac studentul ce primete nota studiaz sau nu acea disciplin. Aceast verificare trebuie
fcuta printr-un trigger, concept ce se va studia n alt capitol.
Valoarea NULL
Ce se ntmpl cu acele coloane care nu sunt specificate n comanda insert?
In comanda precedent nu s-a completat prenumele studentului introdus n baz. Dac ne uitm la
informaiile din tabela studeni:
Page 45 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
vom vedea c la studentul cu pk-ul 20 coloana "prenume_student" nu are nimic. La omiterea unei coloane
n comanda insert baza de date introduce automat valoarea NULL n acea coloan. NULL nseamn "nimic"
i d multe bti de cap programatorilor. Deoarece un singur NULL pus ntr-o relaie sau ntr-o ecuaie d
peste cap toat ecuaia care va returna ntotdeauna NULL, indiferent de celelali membri ai ecuaiei (nimic
adunat, mpartit, testat etc cu ceva d ntotdeauna nimic).
Este foarte greu s inem evidena valorilor care sunt NULL n baza de date, de aceea, pentru a nu bloca
procesarea informaiei n cazul ntlnirii unei valori NULL se folosete funcia NVL care s furnizeze o
valoarea implicit pentru coloanele ce nu au valori:
Dac coloana "prenume_student" are valori diferite de NULL atunci funcia "nvl" returneaz acea valoare, n
caz contrar returneaz irul 'prenume student'.
Page 46 of 102
Baze de date
Project no.
Document no.
BD 2011
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Pentru o introducere mai rapid a datelor se pot utiliza frazele insert listate n anexa "Introducerea date n
baz".
Page 47 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Dar nu vreau s vd toate coloanele, nu m intereseaz pk-ul studentului, sau alt pk, vreau s tiu numele
i prenumele studentului:
Sunt prea muli, nu vreau s vd toi studenii care au trecut prin facultate, vreau s vd numai studenii
care sunt la litera 'B':
Din cele prezentate pn acum putem reine sintaxa de baz a instruciunii SELECT:
Dup cuvntul "select" se introduc numele coloanelor din tabela care vrem sa fie afiate. Dac sunt mai
multe coloane, se despart prin virgul, dup ultima coloan nu se pune virgul. Dorim toate coloanele din
tabel? punem direct * (select *). Urmeaz clauza "from" dup care punem numele tabelei din care
Page 48 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
extragem acele informaii. Nu dorim toate liniile din tabel? atunci trebuie s adugm clauza "where" unde
introducem condiiile pe care trebuie s le ndeplineasc liniile din tabel ce se doresc afiate.
CREATE DATABASE LINK adina_link CONNECT TO adina IDENTIFIED BY adina USING 'stud'
Selectul dintr-un tabel aparinnd unei baze de date vecine se face prin intermediul legturii create:
In felul acesta pot trece date dintr-o baz n alta, sau pot face un select care s afieze datele cumulate din
cele dou baze (folosim clauza Union):
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Instruciunea select permite extragerea informaiilor din mai multe tabele simultan. Pot vizualiza att numele
studentului, ct i specializarea acestuia, chiar dac cele dou informaii sunt n tabele diferite. Important
este s existe o legtur ntre cele dou tabele astfel nct unei linii dintr-o tabel s-i corespund una sau
mai multe linii din cealalt tabel. Cnd fraza select lucreaz cu dou tabele (sau mai multe), ntotdeauna
trebuie s existe clauza where n care se specific legtura ntre tabele. In selectul de mai sus legtura
dintre tabela student si tabela student_grupe se realizeaz prin coloana "pk_student" comun celor dou
tabele , n timp ce mai departe se merge pe legtura "pk_an_universitar" pentru a lega anul universitar de
selectul nostru.
Cum lucreaz selectul n acest caz? Se aduce numele studentului i pk-ul din tabela "studenti" i apoi se
caut toate liniile din tabela "student_grupe" ce corespund acelui pk. Pentru fiecare din aceste linii se
testeaz dac respect cealalt condiie dat de pk_grup (stg.pk_grupa = g.pk_grupa), cele care
nu respect condiia sunt eliminate din select. Se merge In continuare pe condiia "pk_an_universitar" pn
sunt eliminate toate liniile nedorite.
Ce se ntmpl dac uit pur i simplu s pun n clauza "where" legtura dintre tabele? Atunci e grav, se
umple ecranul cu zeci de rnduri fr nici o noim. Fraza select face produsul cartezian ntre cele dou
tabele i afieaz rezultatul (adic pentru fiecare linie din tabela "studenti" parcurge toate liniile din tabela
"studenti_grupe").
Concluzie: s nu uitm niciodat s punem n clauza "where" condiia de legtur dintre tabele atunci cnd
selectm coloane din mai multe tabele simultan.
Page 50 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Tema: s se construiasc un select care s afieze toi studentii din facultate, mpreun cu grupa,
disciplinele i notele obinute la examene:
Nu atasez nici o grup la acest student i facem un select care s-mi afieze studenii i grupele ataate:
Studentul Chirila nu apare n selectul precedent, chiar dac el exist n baza de date, deoarece linia
respectiv cade n clauza st.pk_student = stg.pk_student.
Totui, dac vreau s vad toi studenii, indiferent dac au grupe asociate sau nu, cei care au grupe
asociate s li se afieze grupa, cei care nu au, s apar fr grup, dar s apar.
In acest caz trebuie s utilizez operatorul (+):
Page 51 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Operatorul (+) pus n dreapta tabelului ce nu are corespondent pentru fiecare linie din primul tabel, are ca
efect afiarea tuturor liniilor selectate din primul tabel, indiferent dac au sau nu legtur cu cel de-al doilea.
Afiez i codul grupei din care face parte studentul. In acest caz trebuie sa folosesc de dou ori operatorul
"outer join" (+):
Explicaie
Egal cu
Mai mare dect
Mai mare sau egal
Mai mic dect
Mai mic sau egal
Diferit de
Page 52 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Exemple:
1. S se listeze toi studenii care au note mai mari de 8:
"and" : returneaz "true" numai dac toate frazele din compoziie sunt "true"
Page 53 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Exemple:
1. Afieaz studenii care au obinut la disciplina ME nota 7 i nota 8:
Page 54 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Dac uitm de paranteze, atunci obinem sute de mii de linii cu informaii eronate, deoarece pentru fiecare
nota de 8 din tabela note se repet selectul iniial.
Mai sunt disponibili i ali operatori de relaie care ne ajut la construirea clauzei "where":
Page 55 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Este operatorul care ne scoate din ncurctur cnd nu tim ce cutm, ci doar bnuim. Dac nu tiu
numele complet al unui student, ci doar cteva caractere, atunci folosesc clauza like pentru filtrarea liniilor.
1. Ex: caut studenii de la litera A:
Deci scriem n clauza where caracterele pe care le tim sigur ("A") i pentru restul caracterelor punem
simbolul "%". Fraza select anterioar se traduce: adu-mi toi studenii al cror nume ncepe cu litera "A".
2. Toate fetele din facultate (prenumele se termina cu litera 'a' sau 'A')
3. M mai pot juca cu operatorul "like"; vreau toi studentii care au n componena numelui irul de
caractere "ut":
Page 56 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
In rezultat Iacob Adelina apare de dou ori pentru ca a repetat anul colar, deci a fost de dou ori n
aceeai grup (chiar dac n ani universitari diferii).
Daca vreau s afiez doar liniile distincte, ce nu repet informaia afiat de alte linii, folosesc clauza
"distinct":
Directiva "distinct" nltur informaia care se repet n rezultatul frazei select. In acest fel, studenii vor fi
afiai o singur dat, indiferent de numrul de nregistrri gsite n tabela studenti.
Dar dac se afieaz i pk_an_universitar, atunci Iacob Adelina apare iari de dou ori, pentru c, n acest
caz, liniile nu mai sunt identice.
Evident, nu aduce nici o linie, am fcut o greeal evident, am pus null ntr-o expresie logic.
Corect ar fi n felul urmtor:
Page 57 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Clauza ORDER BY
Clauza "order by" se folosete pentru a ordona liniile aduse de fraza select. Intotdeauna aceast clauz se
pune ultima ntr-o fraz select. Liniile aduse de select nu sunt ordonate, de aceea e posibil ca acelai select
rulat de mai multe ori s aduc liniile n ordine diferite. Order by rezolv aceast problem, prin ordonare,
aceeai linie va fi tot timpul la locul ei.
S vedem studenii n ordinea alfabetic:
Implicit "order by" lucreaz ascendent, adic de la valoare mic spre valoare mare. Dar dac vreau s-i
afiez n ordine invers, folosesc clauza "desc":
Deci folosesc clauza "desc" (de la descendent) i schimb ordinea de listare. Pentru ordinea ascendent
folosesc cuvntul "asc" (dar acesta este implicit, nu trebuie scris neaprat).
Pot face ordonarea dup mai multe coloane, i pun n ordinea notelor, dar la aceeai not, s fie n ordinea
alfabetic:
Baze de date
Project no.
Document no.
BD 2011
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
La prima vedere pare ilogic s pun order by dup nume_stud, deoarece aceast coloan nu este de tip
number, ca s-o poi ordona. Dar s ne amintim c, toat informaia din calculator este sub form de
numere, deci are sens ordonarea. Literele din cadrul numelui studentului sunt memorate sub forma unor
numere ce corespund codurilor ASCII ale acelor litere. Nu ntmpltor, codurile ASCII ale literelor
corespund ordinii din alfabet (litera "a" are codul ASCII mai mic dect litera "b").
Exerciii:
1. S se afieze disciplinele studiate de grupele 6403 i 6404:
select g.cod_grupa,
d.cod_disciplina
from grupe g, specializari s,discipline d
where g.pk_specializare = s.pk_specializare
and s.pk_specializare = d.pk_specializare
and g.cod_grupa in ('6403','6404')
order by g.cod_grupa
;
Page 59 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
7 Funcii SQL
Adesea avem nevoie ca informaia adus de fraza select s fie prelucrat nainte de afiare. Vreau s m
asigur c toi studenii vor fi afiai cu litere mari. In acest caz folosesc funcia "upper" ce prelucreaz
informaia de pe fiecare rnd al rezultatului adus de fraza select:
Nu-mi place titlul coloanei adus de fraza select, a dori s se numeasc "nume student":
SQL permite definirea de alias-uri pentru nume de coloane astfel nct acestea s fie ct mai explicite.
Aceste alias-uri trebuie s urmeze imediat dup numele coloanei n fraza select i trebuie scrise folosind
ghilimele.
Funciile SQL se mpart n dou tipuri: funcii de un singur rnd , care ntorc cte un rezultat pentru fiecare
linie adus de fraza select, i funcii de grup ce prelucreaz informaia de pe mai multe linii i returneaz o
valoare pentru ntreg grupul de linii.
In continuare sunt listate cteva funcii de rnd care se ntlnesc n mod frecvent n practica SQL:
2. Rezultat
Face conversia caracterelor alfabetice n litere mici
Face conversia caracterelor alfabetice in litere mari
Face conversia pentru primul caracter din fiecare cuvnt n litera
CONCAT(exp1,exp2)
SUBSTR(expresie,
m/,n/)
LENGTH(expresie )
INSTR(expresie ,"sir")
Exemple:
Page 60 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
vrem sa facem un raport simplu in care fiecare student sa apar numai cu primele 3 litere
din nume (facem o prescurtare):
Am pus condiia rownum < 4 ca s aduc numai 3 linii din rezultatul selectului. Rownum este o coloan
implicit construit de motorul SQL n care se pstreaz numrul liniei curente.
funcia round (numar, n): rotunjete numrul la n zecimale. Dac n lipsete, se rotunjete
la partea ntreag. Rotunjirea se face prin adaos (dac numrul zecimal se apropie mai
mult de ntregul superior, sau prin lips).
funcia trunc (numar, n): similar cu round numai c se face trunchiere, adic rotunjire prin
lips ntotdeauna
Tabela "dual" este o tabel creat automat sub user-ul "sys" i este accesibil tuturor utilizatorilor. Are o
singur coloan "dummy" cu o singur linie "X":
Se utilizeaz cnd vrem s afim diverse informaii care nu sunt n tabele din baza de date. Vreau s
afiez rezultatul mpririi lui 3 la 2:
Page 61 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Nu exist alt posibilitate de a afia informaie dect prin fraza select, care are o sintax fixat: select ...
from nume_tabel, de aceea am nevoie de tabela "dual".
funcia sysdate: returneaz data curent (citit din memoria CMOS a calculatorului):
Un ntreg adunat (sau sczut) la o dat calendaristic crete acea dat cu 1 zi. Vreau s cresc cu 7 ore de
exemplu, adun la data respectiv 7/24:
funcia months_between(data1, data2): returneaz numrul de luni ntre cele dou date,
numr ce poate fi negativ dac data2 e mai mica dect data1.
next_day(data,'nume_zi'): gsete data cnd cade prima dat ziua 'nume_zi' ce urmeaz
dup data:
Page 62 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Exerciii:
1. S se gseasc prima zi din luna urmtoare lunii curente:
Vrem s afim data curent (sysdate), dar ntr-un format specific: zi-luna-an:
Sunt permise o mulime de formate pentru afiarea unei date calendaristice. Prezentm n continuare doar
cteva mai semnificative:
YYYY sau YY sau Y
MM
MONTH
MON
WW sau W
DDD sau DD sau D
DAY
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
DY
cu spaii pn la 9 caractere.
O abreviaie a denumirii unei zile format din trei
AM sau PM
A.M. sau P.M.
HH sau HH12 sau HH24
MI
SS
SSSSS
litere
indicator de meridian
indicator de meridian cu puncte
ora
minute (0-59)
secunde (0-59)
Numarul de secunde ncepnd cu miezul noptii
Exemplu:
select to_char(234567.1,'999,999,999.00')format_suficient ,
to_char(234567,'9,999.00') format_prea_mic,
to_char(234567,'$999,999,999.00')
cu_dolar,
to_char(23.48,'999,999.0')
rotunjire_zecimale,
to_char(23.67,'999,999') fara_zecimale
from dual;
Dac nu specificm un format funcia to_char afieaz numrul aa cum este, fr separatoare sau
rotunjiri. Prin cmpul de formatare scris ntre apostrofuri sunt definite numrul de cifre pentru afiare, poziia
virgulei de separare, numrul de zecimale, afiare cu moned, etc. Observm c dac numrul de cifre
Page 64 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
specificat n cmpul de formatare este prea mic, atunci to_char afieaz semnul (#) n locul valorii
numerice.
Funcia to_date (expresie, format) returneaz o valoare de tip dat calendaristic calculat pe baza
expresiei ce se interpreteaz conform irului din cmpul format.
to_date('01/02/05','mm/dd/yy') "luna/zi/an",
to_date('01-feb-05','dd-mon-yy') "zi-luna-an",
to_char(to_date('01-feb-05','dd-mon-yy'),'dd-mon-yy') "zi-luna-an cu to_char"
from dual;
Prin funcia to_date transformm un ir de caractere ntr-o dat. Intotdeauna avem probleme cu
interpretarea unui ir de caractere ce reprezint o dat calendaristic. S lum de exemplu textul
"01/02/05"; poate fi interpretat ca fiind 1 februarie 2005 dac lucrm dup modelul romnesc, sau foarte
bine, poate fi 2 ianuarie 2005 interpretat dup modelul american: mm/dd/yy (ei pun luna n faa zilei). De
aceea, cnd transformm un ir de caractere n dat trebuie s specificm formatul. Mai ru este pentru cel
care utilizeaz programul, vede data 01/02/2005 i nu tie cum s-o interpreteze. In acest caz, data se
afieaz prin funcia to_char n care putem specifica exact cum trebuie s apar data la utilizator. Indicat
este s se utilizeze formatul cu litere pentru afiarea lunii, astfel nct s dispar orice dubii n citirea datei
calendaristice.
In coloana 3 din exemplul precedent, chiar dac am utilizat formatul de citire a date sub forma 'dd-mon-yy',
ea a fost afiat tot cu cifre : 1/02/2005. Aceast afiare depinde de modul cum a fost setat programul SQL
Navigator, sau, dac se utilizeaz SQL Plus de setrile din regitrii Windows: run ->regedit
->hkey_local_machine -> software ->oracle -> nls_date_format. Ca s nu mai depind de aceste setri ce
pot diferi de la un calculator la altul, am folosit funcie to_char (coloana 4 din exemplul de mai sus).
Page 65 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Prin to_number se returneaz un numr pornind de la un ir de caractere. Acest ir este interpretat conform
formatului specificat i tradus ntr-un numr. Dac cele dou cmpuri nu corespund, funcia to_number d
eroare.
select
TO_NUMBER('100.00',
'9G999D99'),
TO_NUMBER('5,342',
'9G999D99'),
Funcia DECODE
Decode este o funcie foarte puternic ce permite implementarea unei structuri de programare n codul
SQL. Funcia nu este standard SQL, ea fiind specific motorului Oracle. Prin funcia decode putem simula
structura if - else specific oricrui limbaj de programare n sensul c putem selecta informaie diferit n
funcie de anumite rezultate obinute n procesul rulrii.
Formatul funciei este:
decode (expresie,
prima_varianta , rezultat1,
a_doua_varianta, rezultat2,
.............. ,
rezultat_default
);
Se evalueaz expresia i se compar valoarea acesteia cu variantele scrise n partea a doua a funciei. In
caz c valoarea expresiei coincide cu o variant, se ntoarce rezultatul corespunztor acelei variante, n caz
contrar se ntoarce "rezultat_default".
Exemplu: s zicem c profesorul de la disciplina IB (Instrumentatie de Bord) vrea s mreasc la
toi studenii nota cu 1 punct, iar profesorul de ME vrea s micoreze notele cu 1 punct. Deci trebuie s
facem un select din tabela note, dar acest select s se comporte diferit, n funcie de valoarea rndului
"cod_disciplina".
select stg.pk_student_grupa, st.nume_student, st.prenume_student, g.cod_grupa,
d.cod_disciplina, n.nota,
decode(d.cod_disciplina, 'IB', decode(n.nota, 10, 10, n.nota +1),
'ME',n.nota - 1,
n.nota) Nota_Modificata,
ast.cod_an_studiu, au.cod_an_universitar
from studenti_grupe stg, studenti st, ani_universitari au, grupe g,
specializari s,
discipline d, ani_studiu ast, note n
Page 66 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Funcii de grup
7.6.1 Functii matematice de grup
Aceste funcii nu se aplic unei singure linii, ele calculeaz informaii caracteristice unui grup de rnduri:
max, min, avg, count(*), sum.
select max(nota),round(avg(nota),2), min(nota), sum(nota),
count(*), round(sum(nota)/count(*),2) from note;
In exemplul de mai sus am extras cteva informaii globale ale tabelei "note":
max(nota_finala) : calculeaz cea mai mare valoare din coloana "nota_finala". Chiar dac
sunt mai multe note de 9, funcia max returneaz o singur valoare
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Un avantaj al acestor funcii 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. Putem verifica acest
lucru printr-un mic experiment. Hai s introducem o nou linie n tabela note dar fr not :
update note set nota = null where pk_nota = 68;
i acum ne uitm dac s-a introdus linia:
Evident, min(nume_stud) nu aduce studentul cu cel mai mic nume (adic format din cel mai mic numr de
caractere), ci primul student n ordinea alfabetic din grupul selectat.
Dac vreau s vd cte caractere are cel mai mic nume (fr prenume) scriu urmtorul select:
Page 68 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
S ncercm o alt situaie: care sunt disciplionele de la care s-au obinut medii sub 8?
Page 69 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Nu-i bun, nu pot folosi funciile de grup n clauza where. Pentru a face filtrri cu ajutorul funciilor de grup
folosim clauza "having":
Funciile de grup sunt foarte utile cnd sunt necesare statistici i rapoarte finale. Cu ajutorul lor putem
sintetiza informaia care s reflecte aspecte globale ale tabelelor.
Exerciii:
-
Studenii care repet anul colar (se regsesc de dou ori n acelai an de studiu pe ani
universitari diferii)
Page 70 of 102
Baze de date
Project no.
Document no.
BD 2011
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
8 Subinterogri
Constructia clauzei "where" prin subinterogare
De multe ori se ntmpl s nu putem scrie exact valorile care ne intereseaz n clauza where. De exemplu,
trebuie s dau un raport cu studenii care au obinut cea mai mare not la o sesiune de examene. Problema
e c eu nu tiu care este acea not, poate fi 10, sau 9, sau 8 sau..... Ar trebui s aflu mai nti care este cea
mai mare nota n sesiunea respectiv, iar aceast valoare se afl n mod dinamic printr-un select interior:
select st.nume_student, st.prenume_student, d.cod_disciplina, n.nota
from studenti st, studenti_grupe stg, note n, discipline d, ani_universitari
ani
where st.pk_student = stg.pk_student
and stg.pk_an_universitar = ani.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and d.cod_disciplina = 'PSM1'
and ani.cod_an_universitar = '2011-2012'
and n.nota = (
select max(n.nota)
from studenti_grupe stg, ani_universitari ani, note n, discipline d
where n.pk_disciplina = d.pk_disciplina
and n.pk_student_grupa = stg.pk_student_grupa
and stg.pk_an_universitar = ani.pk_an_universitar
and d.cod_disciplina = 'PSM1'
and ani.cod_an_universitar = '2011-2012'
)
;
Dac uneori se ntmpl ca subinterogarea s aduc mai mult de o linie, ceea ce duce la eroare Oracle,
este foarte posibil ca subinterogarea s nu aduc nici o linie, ceea ce propag null-ul i la interogarea
principal i nu se afieaz nimic.
De exemplu, dac n selectul inferior greim codul disciplinei, atunci tot selectul principal d gre:
select st.nume_student, st.prenume_student, d.cod_disciplina, n.nota
from studenti st, studenti_grupe stg, note n, discipline d, ani_universitari
ani
where st.pk_student = stg.pk_student
and stg.pk_an_universitar = ani.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and d.cod_disciplina = 'PSM1'
and ani.cod_an_universitar = '2011-2012'
and n.nota = (
select max(n.nota)
from studenti_grupe stg, ani_universitari ani, note n, discipline d
Page 71 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
S mai rezolvm o problem: toi studenii a cror medie pe un an universitar este mai mare dect
media notelor pe acel an universitar:
Page 72 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Tabele intermediare
Complicm puin lucrurile: care sunt studenii ce au media notelor peste media grupei din care face parte
fiecare (cei mai buni studeni din grupa lor).
Deja problema s-a complicat: trebuie s gsim media fiecrui student i s comparm acea medie cu
media grupei din care face parte studentul. Selectul ar fi mai simplu dac a avea n baz dou tabele:
-
Un tabel care s dea studentul, grupa din care face parte i media obinut de student
Dac a avea acele tabele, atunci selectul se construiete mult mai simplu. Oracle permite definirea unor
tabele temporare, bazate pe un select i care pot fi utilizate n acel select specific:
select st.nume_student, st.prenume_student, medie_studenti.medie_stud
, medie_grupe.cod_grupa, medie_grupe.medie_grupa
from studenti st, studenti_grupe stg,
(
select g.pk_grupa , g.cod_grupa, round(avg(nota),2) medie_grupa
from grupe g, studenti_grupe stg, note n
where g.pk_grupa = stg.pk_grupa
and stg.pk_student_grupa = n.pk_student_grupa
group by g.pk_grupa, g.cod_grupa
)medie_grupe,
(select st.pk_student, round(avg(nota),2) medie_stud
from studenti st, studenti_grupe stg, note n
where st.pk_student = stg.pk_student
and stg.pk_student_grupa = n.pk_student_grupa
group by st.pk_student
) medie_studenti
where st.pk_student = stg.pk_student
and stg.pk_grupa = medie_grupe.pk_grupa
and st.pk_student = medie_studenti.pk_student
and medie_stud > medie_grupa
order by cod_grupa
;
In clauza "from" am adugat cele dou selecturi, le-am dat denumire de tabele i am putut s le utilizm n
selectul superior.
Page 73 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Am vzut n acest capitol ct de puternic poate deveni instruciunea SELECT. In afara selectrii clasice a
informaiilor din tabelele bazei de date, selectul permite utilizarea subselecturilor n clauza where (care n
plus, pot face referire la tabelele din selectul superior) i, de asemenea, permite construirea de tabele
temporare n clauza from (select din select).
Vizualizri
Vizualizrile sunt tabele virtuale create printr-un select din alte tabele. Am vzut n subcapitolul anterior ce
util a fost s creez tabele intermediare cu mediile studenilor, sau mediile grupelor. Alt exemplu, mi-ar fi
foarte util s am un tabel n care s gsesc numele studentului, specializarea, codul grupei din care face
parte, notele obinute i disciplinele la care a obinut note. Cu un asemenea tabel a putea lucra mult mai
uor cnd fac selecturile.
De ce nu se creeaz asemenea tabele? Una din regulile proiectrii bazei de date spune c un tabel nu
trebuie s conin informaii amestecate, cu identiti i funcii diferite. Ce facem dac se modific o
denumire de specializare? Modificm toate liniile tabelului?
Oracle mi vine n ajutor i m las s-mi fac un tabel virtual care s conin aceste cmpuri. Dar nu este un
tabel propriu-zis, ci o imagine ce oglindete informaia din tabelele de baz. In felul acesta, orice modificare
ntr-un tabel de baz apare n mod automat i n imaginea sa din tabela virtual. Aceste tabele se numesc
vizualizri ( VIEW ) i se construiesc cu ajutorul instruciunii select:
Creez un view numit "medie_grupe" care s conin toate grupele i media notelor pe acea grup
n fiecare an universitar:
Page 74 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Numai c acesta nu este un tabel obinuit, este un tabel logic n care nu pot face modificri, inserri, etc.
Este o oglind unde am grupat n mod avantajos informaia din tabelele de baz astfel nct s am acces
mai uor asupra datelor de interes.
Recapitulare:
In acest capitol am vzut ct de performant poate fi o fraz select, ce faciliti extraordinare ne ofer
pentru cutarea i filtrarea datelor. Dac facem acum o comparaie cu modul de stocare a datelor n fiiere,
unde n afar de un suport de stocare aceste fiiere nu-mi ofer nimic, observm c stocarea datelor n
baza de date este de departe mult mai avantajoas.
Bineneles, informaia introdus i analizat n tabelele de lucru din acest curs este ultraminimal, ca s nu
ocupm spaiul inutil afind rezultatele selecturilor i s putem urmri firul rezultatelor. In practic ns, pe
acelai principiu se pot stoca informaii mult mai ample, cu zeci sau sute de mii de studeni. Un ntreg
centru universitar se introduce n aceeai baz de date ce ruleaz pe un singur calculator i fiecare
profesor, student, secretar de la diverse faculti sau universiti intr cu parola sa prin intermediul
internetului i introduce sau vizualizeaz datele la care are dreptul. Putem gndi mai departe s crem o
baz unic cu toi studenii din ar .a.m.d. S ne gndim ce baz de date uria reprezint Google n
momentul de fa i totui ce repede se deschide o pagin Google care n ultim instan, se bazeaz pe
un select dintr-o baz cu miliarde de linii.
Page 75 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
9 Instruciuni DML
Pn acum ne-am ocupat de modul de extragere a informaiilor din baza de date. Acum trebuie s acordm
un timp special pentru tehnicile de introducere, modificare i tergere a datelor. Aceste instruciuni, care
modific baza de date, se numesc instruciuni DML (Data Manipulation Language).
Comanda INSERT
Introducerea datelor n baz se face cu ajutorul comenzii INSERT prezentat n prima parte a cursului, fiind
necesar pentru completarea tabelelor iniiale. Acum, cnd tim mai multe despre baze de date, s facem
cteva precizri suplimentare.
Am vzut c formatul acestei comenzi este de forma:
In al doilea caz nu am mai specificat numele coloanelor, ceea ce nseamn c le completm pe toate. Dar
dac uitm o coloan?
Apare eroare: valori insuficiente. Nu tiu ce valoare va primi prin trigger coloana pk_student, dar ea trebuie
pus n cmpul values. In acest caz pot utiliza valoarea NULL.
Bineneles, nu pot pune NULL peste tot unde nu tiu valoarea coloanei.
insert into studenti values(null, null,'Pavel', 1275);
deoarece se sesizeaz constrngerile definite pe tabela "studenti".
Aceste constrngeri trebuie definite chiar la nceput, nainte de introducerea datelor, tocmai ca s m
protejeze mpotriva datelor incoerente. Dac am introdus cteva linii ce nu respect condiia de unicitate i
de "not null", i ncercm apoi s definim constrngerea, aceasta va eua. Deoarece, la definire,
Page 76 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
constrngerea verific dac sunt date n baz ce nu respect condiiile impuse de ea. In caz c gsete
date incorecte, d eroare i anuleaz definiia.
Putem avea surpriza ca insert-ul s dea eroare, chiar dac nu folosim NULL:
In acest caz a fost violat alt constrngere, cea de tip "foreign key" ntre tabela "studenti_grupe" i
"studenti". Aceast constrngere specific faptul c orice linie introdus n tabela "studenti_grupe" trebuie
s aib corespondent n mulimea valorilor "pk_student" din tabela "studenti".
Page 77 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Comanda UPDATE
Ionescu nu este mulumit cu nota 8, a venit a doua zi la mrire i a obinut 10. Dar nu pot s mai pun o not
n catalog deoarece el primete doar o not pe sesiune, de aceea ar trebui s modific nota obinut n ziua
precedent:
update nume_tabel
set nume_col_1 = val_1, nume_col_2=val_2, .... , nume_col_n=val_n
where conditie ;
Dup update si nume tabel urmeaz comanda set dup care se scriu numele coloanelor i valoarea
acestora. Dac sunt mai multe coloane, se despart prin virgul. Urmeaz clauza where care-i foarte
important n acest context.
De ce este important clauza where la update? Dac la select am uitat sau am greit aceast clauz, nu-i
nimic, eventual aduce prea multe date sau deloc. Ne uitm prin ele i ne dm seama imediat c ceva nu-i
n regul. Dar dac uitm s punem clauza "where" la "update"? Atunci e dezastru, modificm notele la toi
studenii din tabela "note". Lipsind clauza "where", comanda "update" nu se mai oprete la o singur linie
cum am fi dorit, ci parcurge toat tabela de date modificnd nota. Iar ca dezastrul s fie complet, Oracle nu
se sesizeaz ca noi am fcut o greeal imens, el nu are de unde s tie c de fapt noi am dorit s
modificm nota la un singur student.
noile valori pe care le setm n baz pot veni i dintr-un alt tabel, aduse prin comanda
"select". Aceste subinterogri trebuie s respecte aceleai condiii de la comanda "insert".
Comanda DELETE
Vreau s terg nota pus studentului Ionescu, el zice c prefer s aib absent n loc de o not mic.
Page 78 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
(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 = 'ME'
and st.nume_student = 'Ionescu');
Sintaxa comenzii "Delete" respect acelai tipar ca la celelalte comenzi DML:
ATENTIE: 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 discuia pentru clauza "where" de la comanda
"update": dac clauza "where" este uitat sau greit scris, atunci dezastrul este mai mare dect la
comanda "update". In acest caz se terg toate liniile din tabel, sau, ntr-un caz mai fericit, mult mai multe
dect am fi dorit.
Comanda delete terge liniile din tabel, dar nu i tabelul ca obiect al bazei de date. Obiectul se terge prin
comanda DDL (Data Definition Language) "drop":
Comanda DDL "drop" terge complet tabela i nu se mai poate recupera nimic. Dac de la delete se mai
pot recupera datele (n anumite condiii ), dup drop nu se mai poate face nimic.
Am definit o constrngere de tip "foreign key" ntre tabelele studenti i studenti_grupe bazat pe coloana
"pk_student":
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Aceast constngere nu permite tergerea unei linii din tabela "studentI dac exist linii aferente n tabela
"studenti_grupe" (nu pot terge studentul dac el este nscris n diverse grupe, are note, etc. Toate aceste
informaii ar rmne suspendate n aer dac s-ar terge studentul).
Cum se poate rezolva problema? Sunt dou soluii:
Mergem mai nti n tabelele copil (note, studenti_grupe) i tergem toate liniile ataate de
studentul ce trebuie ters i la urm tergem studentul:
Modificm definiia constrngerii de tip "foreign key" dintre tabele adugnd sufixul "on
delete cascade":
Foarte simpl a doua variant , dar nu indicat. Pentru exemplul nostru a fost simplu, am avut numai aceste
trei tabele, dar ce ne facem dac de tabela "studenti" se mai leag i alte tabele copil, care la rndul lor
sunt prini pentru alte tabele i aa mai departe? Punem peste tot "ON DELETE CASCADE" ? Nu-i bine,
putem scpa de sub control aceste tergeri i la un moment dat, nu mai tii de ce a disprut disciplina de
matematic din baz cnd tu nu ai fcut dect s tergi un student.
Page 80 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Constat o eroare de proporii, toat lumea are nota 10, la toate obiectele i n toate sesiunile.
Din fericire nc mai pot corecta eroarea prin utilizarea comenzii ROLLBACK:
rollback;
Pur i simplu rulm rollback i totul s-a rezolvat, am revenit la situaia iniial. Problema e, ct de iniial
este situaia? Pn la ce punct m-am ntors cu baza de date?
Comanda Commit
Comanda ROLLBACK anuleaz ultima tranzacie, dar cnd a nceput aceast tranzacie?
Orice tranzacie ncepe dup comanda commit i se termin la comanda commit. Tranzacia reprezint un
ir de comenzi de tipul select, update, insert, etc, care este privit de Oracle ca un tot unitar: ori toate
comenzile se termin cu succes, ori sunt anulate toate.
De exemplu, ne hotrm s tergem un student din baza de date. Pentru aceasta ncepem s-i tergem
notele, apoi prezena la curs, laborator, apoi din tabela de examene, apoi de la bibliotec, etc.Dup ce
tergem informaiile din toate tabelele copil, la sfrit tergem din tabela "studenti". Dar ce se ntmpl
dac, undeva pe parcurs, o instruciune d eroare? De exemplu, cnd tergem studentul din registrul
bibliotecii, constatm c acest tabel are o alt tabel copil cu crile mprumutate de la bibliotec. Iar acel
student nu a returnat toate crile luate mprumut de la bibliotec. Evident ca procesul de tergere se
oprete aici i nu poate continua pn cnd studentul nu returneaz mprumuturile.
Page 81 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Pe de alt parte, avem deja efectuate cteva tergeri din baza de date. Acestea trebuie refcute, pentru c
nu putem lsa unele tabele sterse i altele nu. Intreg procesul de tergere trebuie terminat cu succes, caz
n care ncheiem tranzacia prin comanda "Commit", altfel situaia n baz trebuie s rmn aceeai.
Refacerea situaiei se face prin comanda ROLLBACK , caz n care ne ntoarcem la situaia de la ultimul
commit executat.
Comanda commit ncheie tranzacia curent astfel nct, toate modificrile realizate pn n acel moment
trec n stare definitiv. Prima comand SQL dup commit ncepe o nou tranzacie care se termin la
urmtorul commit. S reinem deci c prin ROLLBACK putem reface doar modificrile din tranzacia
curent, nimic nu ne mai salveaz dup execuia comenzii COMMIT.
10.2.1
Commit implicit
Se ntampl ca uneori comanda Rollback s nu mai restaureze situaia dat de ultimul commit. Aceasta
pentru c, uneori baza de date realizeaz un commit implicit, adic execut comanda commit fara ca noi s
comandm explicit acest lucru.
Commit-ul implicit se execut atunci cnd utilizatorul ruleaz o comand special de tip DDL sau DCL:
comand DDL (Data Definition Language): de exemplu comanzile "create table..", "alter
table...",etc.
10.2.2
Comanda Savepoint
Este util cteodat s mprim o tranzacie n mai multe subtranzacii i s anulm prin rollback numai o
anumit subtranzacie. De exemplu, vindem un produs la un client, proces ce presupune mai multe etape:
- scoatem produsul din magazie (modificm stocul din magazia respectiv)
- facem factur pentru client (adugm un document n tabela de documente emise)
- contm acel document (pentru evidena contabil)
Ce se ntmpl dac nu merge contarea ? (nu tiu exact care sunt conturile pe care trebuie s contez). Nu
mai vnd produsul clientului? Dar el este la poart i ateapt s plece cu produsul.
In acest caz salvm cteva puncte intermediare n tranzacia noastr. Dup scoaterea produsului din
magazie definim un punct intermediar de succes :
SAVEPOINT iesire_magazie_succes;
SAVEPOINT factura;
Page 82 of 102
Baze de date
Project no.
BD 2011
Document no.
Product name:
Date:
July - 2011
Version no.:
3.0
Author:
Lucian Nita
CR no.:
Apoi contm factura. Dac totul e OK dm un COMMIT, altfel m intorc la ultima situaie de succes:
ROLLBACK to factura;
In acest fel am reuit s s scoatem factura clientului, rmnnd pentru mai trziu s rezolvm problema
contrii.
Page 83 of 102
Baze de date
Project no.
BD 2010
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
11 PL/SQL
SQL este OK n majoritatea taskurilor pe care le avem de ndeplinit cnd lucrm cu o baz de date. Dar de
multe ori, exist necesitatea de a putea rula cteva linii de cod direct pe baz, s putem extrage informaia
ntr-un mod mai flexibil.
De exemplu, m-ar interesa s afiez pentru fiecare student media sa general calculat prin media
aritmetic a tuturor notelor obinute de student. Dar doresc ca media general s nu fie influenat de
notele obinute la sport sau alte materii opionale. Mi-ar fi foarte uor s aflu aceste informaii dac a putea
scrie o funcie care s primeasc ca parametru pk_student (identificatorul unic al studentului) i s-mi
returneze acele valori de care am nevoie. E clar c ntr-o funcie pot folosi acele bucle FOR, LOOP, WHILE,
condiii IF de care avem atta nevoie cnd este necesar s alegem din mai multe variante, s facem tot
felul de sume, s extragem informaia n funcie de anumite condiii.
Orict de puternic ar fi SQL-ul, tot mai avem nevoie de linii de cod, de tehnicile specifice limbajelor de
programare. Un alt avantaj al acestor programe (pe care le denumim PL/SQL) este dat de faptul c ele
ruleaz pe server, deci nu ncrcm n mod excesiv reeaua de calculatoare cu un trafic imens ntre staia
noastr i server (de ct s cer de zeci de ori cu cte un select o poriune de informaie, scriu o funcie
PL/SQL n baz care returneaz o singur dat tot blocul de date cerut).
Ce nseamn PL/SQL? nseamn SQL introdus ntr-o structur de programare. Prin SQL obinem o
informaie care se afieaz i att. Dar dac vreau ca aceast informaie s o salvez ntr-o variabil i apoi
s o prelucrez conform unui algoritm? In SQL clasic nu putem, de aceea folosim PL/SQL.
Page 84 of 102
Baze de date
Project no.
BD 2010
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
exception
WHEN exception_name THEN
instructiuni tratare exceptii ;
END;
Prima parte din program este rezervat declaraiilor de variabile. Urmeaz blocul de instruciuni care se
termin cu instruciunea "end". Intre "begin" si "end" se poate include eventual clauza "exception" unde se
introduc instruciuni de tratare a erorilor aprute n blocul de instruciuni. Structura respect arhitectura
oricrui limbaj de programare: declaraie variabile, instruciuni, tratare erori (construcia begin .... exception
... end poate fi privit ca un bloc try ... catch din limbajele de programare moderne).
Lucrnd pe o baz de date care ne poate surprinde oricnd cu date invalide sau lips, este obligatorie
tratarea erorilor printr-o clauz de tip exception, altfel eroarea se transmite mai departe i apare la interfaa
utilizator cu tot felul de mesaje Oracle neinteligibile pentru utilizatorul final.
Medie _ ponderata
nr _ credite * nota
i 0
nr _ total _ discipline
nr _ credite
i 0
Se face produsul dintre numrul de credite de la fiecare disciplin studiat de student ntr-un an de studiu i
nota obinut de student. Suma produselor se mparte la numrul total de credite. In caz c studentul nu are
not, atunci se consider nota zero.
Este destul de clar c aceast problem nu prea poate fi rezolvat prin SQL, deci se va construi o funcie
ce primete ca parametru un numar dat de "pk_student_grupa" i va returna un numr ce reprezint media
ponderat.
create or replace function calcul_medie_ponderata( p_pk_student_grupa in
number) return number is
cursor c_discipline_studiate is
select d.pk_disciplina, d.cod_disciplina, d.credite
from studenti_grupe stg, grupe g, discipline d
Page 85 of 102
Baze de date
Project no.
BD 2010
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
number
number
number
number
:=
:=
:=
:=
0;
0;
0;
0;
begin
for rec in c_discipline_studiate loop
open c_note(rec.pk_disciplina);
fetch c_note into nota_curenta;
if c_note%notfound then
nota_curenta := 0;
end if;
close c_note;
sum_medie_credite := sum_medie_credite + nvl(rec.credite,0) *
nvl(nota_curenta,0);
sum_credite := sum_credite + nvl(rec.credite,0);
end loop;
if sum_credite != 0 then
v_medie_ponderata := sum_medie_credite/sum_credite;
else
v_medie_ponderata := 0;
end if;
return round(v_medie_ponderata,2) ;
exception when others then
return 0;
end;
Analiza funciei "calcul_medie_ponderata":
Ce este CURSORUL ? Un cursor este o zon de memorie n care Oracle i depune rezultatele dintr-un
select. Orice select cu care ne-am obinuit noi n SQL este de fapt un cursor pe care l declar implicit
Oracle. In PL/SQL noi avem posibilitatea s definim explicit un astfel de cursor i apoi s parcurgem zona
de memorie i s extragem diverse valori. Avantajul este c ne putem plimba prin cursor i pentru fiecare
valoare s executm anumite operaii n funcie de parametri.
Page 86 of 102
Baze de date
Project no.
BD 2010
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Am declarat dou cursoare, unul ce aduce toate disciplinele studiate de studentul dat, cellalt aduce nota
obinut de student la o disciplin dat.
Am
baleiat
ntreg
cursorul
"c_discipline_studiate"
(for
rec
in
Dac studentul nu are not, sau disciplina nu are credite, atunci se pune implicit zero
(nvl(nota_curenta,0).
Nu lipsete clauza EXCEPTION unde se intr n caz de o eroare n codul nostru ("when others"
adic oricare ar fi eroarea , ea va fi tratat n acest segment). Aici nu facem nimic altceva dect
returnm zero.
Nu explicm aici cum lucreaz instruciunea IF sau altele (FOR, WHILE, EXIT, ... ) ele au aceeai
funciune ca-n orice limbaj de programare. Trebuie doar s fim ateni la sintaxa lor care se
aseamn cu cea din DELPHI.
11.2.1Medie student
CREATE OR REPLACE
FUNCTION calcul_medie( p_pk_student_grupa in number) return
number is
cursor c_discipline_studiate is
select d.pk_disciplina, d.cod_disciplina
from studenti_grupe stg, grupe g, discipline d
Page 87 of 102
Baze de date
Project no.
BD 2010
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
number
number
number
number
:=
:=
:=
:=
0;
0;
0;
0;
begin
dbms_output.put_line('*** pk_stud_grupa=' || p_pk_student_grupa);
nr_note := 0;
suma_note := 0;
for rec in c_discipline_studiate loop
nota_curenta := -1;
open c_note(rec.pk_disciplina);
fetch c_note into nota_curenta;
if nota_curenta != -1 then
nr_note := nr_note + 1;
dbms_output.put_line('
nota_curenta =' || nota_curenta || ' nr_note=' ||
nr_note);
else
nota_curenta := 0;
end if;
close c_note;
suma_note := suma_note + nvl(nota_curenta,0);
end loop;
if nr_note > 0 then
dbms_output.put_line('
suma_note = '||suma_note||' nr_note= '||
nr_note);
v_medie := suma_note/nr_note;
else
v_medie := 0;
end if;
return round(v_medie,2) ;
exception when others then
return 0;
end;
/
Page 88 of 102
Baze de date
Project no.
BD 2010
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Triggeri
O baz de date performant trebuie s vin n ntmpinarea programatorilor cu diverse obiecte i
mecanisme care s le fac munca mai uoar. Unul din aceste obiecte este TRIGGER-ul.
TRIGER-ul este o seciune de cod ce se execut automat la un anumit eveniment. Odat definit acel
eveniment, baza de date are grij s lanseze n execuie trigger-ul corespunztor ori de cte ori are loc
evenimentul. Este foarte util atunci cnd trebuie executate anumite sarcini n mod automat cnd sunt
ntrunite anumite condiiile impuse.
INSERT ON studenti_grupe
Informaiile care sunt nlocuite sunt accesibile prin construcia "OLD", iar cele noi prin
constructia "NEW". Exemplu: ":new.pk_student_grupa" este valoarea care tocmai se
Page 89 of 102
Baze de date
Project no.
BD 2010
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Triggerul se va executa pentru fiecare linie afecat de operaia n desfaurare din tabel (FOR
EACH ROW).
Page 90 of 102
Baze de date
Project no.
BD 2010
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
end;
Dac ncercm acum s introducem o not la o disciplin greit, obinem eroare:
Recapitulare:
Acest ultim capitol din curs introduce cteva noiuni elementare despre programarea PL/SQL.
Nu toate bazele de date suport limbajul PL/SQL ci doar cele mai performante.
Executarea sarcinilor direct pe server, prin programare PL/SQL are multiple avantaje (trafic redus n
reea, vitez mare de execuie, eliminarea conflictelor de date ntre sesiuni, etc).
Se pot define funcii, proceduri, biblioteci de asemenea programe, triggeri ce se execut automat
pe evenimente prestabilite.
Page 91 of 102
Baze de date
Project no.
BD 2010
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
12 Bibliografie
http://office.microsoft.com/ro-ro/access-help/notiuni-de-baza-despre-proiectarea-bazelor-de-dateHA001224247.aspx
http://www.w3schools.com/sql/default.asp
http://st-curriculum.oracle.com/tutorial/SQLDeveloper/index.htm
http://www.java2s.com/Tutorial/Oracle/CatalogOracle.htm
Page 92 of 102
Baze de date
Project no.
BD 2010
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
13 Anexe
Instructiunile SQL pentru crearea obiectelor n baza de date
In continuare sunt date frazele SQL ce creeaz tabelele de lucru mpreun cu legturile ntre ele.
13.1.1
Creare tabele
--ani universitari
delete from ani_universitari;
drop table ani_universitari;
create table ani_universitari
(
pk_an_universitar
number,
cod_an_universitar
varchar2(15),
descriere_an_universitar varchar2(50)
);
alter table ani_universitari add constraint pk_ani_universitari primary
key(pk_an_universitar);
alter table ani_universitari add constraint uk_cod_an_univ unique
(cod_an_universitar);
alter table ani_universitari add constraint uk_desc_ani_univ unique
(descriere_an_universitar);
--ani studiu
drop table ani_studiu;
create table ani_studiu
(
pk_an_studiu
number,
cod_an_studiu
varchar2(2),
descriere_an_studiu
varchar2(50)
);
alter table ani_studiu add constraint pk_an_studiu primary key (pk_an_studiu);
alter table ani_studiu add constraint uk_cod_ani_studiu unique (cod_an_studiu);
-- specializari
drop table specializari;
create table specializari
(
pk_specializare
number,
cod_specializare varchar2(15),
descriere_specializare varchar2(50)
);
alter table specializari add constraint pk_specializare primary key
(pk_specializare);
alter table specializari add constraint uk_specializare unique
(cod_specializare);
-- grupe
drop table grupe;
Page 93 of 102
Baze de date
Project no.
Document no.
BD 2010
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
number,
varchar2(50),
varchar2(50),
number
number,
varchar2(50),
Page 94 of 102
Baze de date
Project no.
BD 2010
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
descriere_disciplina varchar2(100),
pk_specializare
number,
pk_an_studiu
number,
semestru
number,
credite
number
);
alter table discipline add constraint pk_disciplina primary key
(pk_disciplina);
alter table discipline add constraint fk_disciplina_spec foreign key
(pk_specializare) references specializari(pk_specializare);
alter table discipline add constraint fk_disciplina_an_studiu foreign key
(pk_an_studiu) references ani_studiu(pk_an_studiu);
alter table discipline add constraint ck_semestru check (semestru in
(1,2));
--note
drop table note;
create table note
(
pk_nota
number,
pk_student_grupa
number,
pk_disciplina
number,
nota
number,
data
date
);
alter table note add constraint pk_nota primary key (pk_nota);
alter table note add constraint fk_nota_student
foreign key (pk_student_grupa) references studenti_grupe(pk_student_grupa);
alter table note add constraint fk_not_disciplina foreign key
(pk_disciplina) references discipline(pk_disciplina);
ALTER TABLE note ADD CONSTRAINT ck_note CHECK (nota <= 10);
/* ------------------------------------------------------------------------Secvente
-------------------------------------------------------------------------*/
CREATE SEQUENCE pk_an_universitar
INCREMENT BY 1
START WITH 1
MINVALUE 1
MAXVALUE 9999999999999;
CREATE SEQUENCE pk_an_studiu;
CREATE SEQUENCE pk_specializare;
CREATE SEQUENCE pk_grupa;
CREATE SEQUENCE pk_student;
CREATE SEQUENCE pk_student_grupa;
CREATE SEQUENCE pk_disciplina;
CREATE SEQUENCE pk_nota;
/* --------------------------------------------------------------------------triggeri ---> completare automata a coloanei pk....
Page 95 of 102
Baze de date
Project no.
Document no.
BD 2010
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
---------------------------------------------------------------------*/
CREATE OR REPLACE TRIGGER bef_ani_universitari
BEFORE INSERT ON ani_universitari REFERENCING NEW AS NEW OLD AS OLD FOR EACH
ROW
begin
select pk_an_universitar.NEXTVAL into :new.pk_an_universitar from dual;
end;
/
CREATE OR REPLACE TRIGGER bef_ani_studiu
BEFORE INSERT ON ani_studiu REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_an_studiu.NEXTVAL into :new.pk_an_studiu from dual;
end;
/
CREATE OR REPLACE TRIGGER bef_specializari
BEFORE INSERT ON specializari REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_specializare.NEXTVAL into :new.pk_specializare from dual;
end;
/
CREATE OR REPLACE TRIGGER bef_grupe
BEFORE INSERT ON grupe REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_grupa.NEXTVAL into :new.pk_grupa from dual;
end;
/
CREATE OR REPLACE TRIGGER bef_studenti
BEFORE INSERT ON studenti REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_student.NEXTVAL into :new.pk_student from dual;
end;
/
CREATE OR REPLACE TRIGGER bef_studenti_grupe
BEFORE INSERT ON studenti_grupe REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_student_grupa.NEXTVAL into :new.pk_student_grupa from dual;
end;
/
CREATE OR REPLACE TRIGGER bef_discipline
BEFORE INSERT ON discipline REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_disciplina.NEXTVAL into :new.pk_disciplina from dual;
end;
/
Page 96 of 102
Baze de date
Project no.
Document no.
BD 2010
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
13.1.2
values(null,1,'an
values(null,2,'an
values(null,3,'an
values(null,4,'an
values(null,5,'an
values(null,6,'an
1');
2');
3');
4');
5');
6');
--3. specializari
insert into specializari(cod_specializare,descriere_specializare)
values('IAD', 'Instrumentatie si Achizitii de Date');
insert into specializari(cod_specializare,descriere_specializare)
values('IA', 'Informatica Aplicata');
insert into specializari(cod_specializare,descriere_specializare)
values('EM', 'Electromecanica');
insert into specializari(cod_specializare,descriere_specializare)
values('EPAE', 'Actionari');
--4. discipline
insert into discipline
insert into discipline
insert into discipline
insert into discipline
insert into discipline
insert into discipline
values(null,'PSM1','Progr.Sist. de Masurare1',1,4,1);
values(null,'IB','Instrumentatie de bord',1,4,1);
values(null,'ME','Masurari Electrice',1,3,1);
values(null,'BD','Baze Date',2,3,1);
values(null,'MEP','Masini Electrice de putere',3,4,1);
values(null,'AE','Actionari Electrice',4,3,2);
--5. grupe
insert into grupe values(null,'6403','Grupa 6403',1,4);
Page 97 of 102
Baze de date
Project no.
BD 2010
Document no.
insert
insert
insert
insert
insert
into
into
into
into
into
grupe
grupe
grupe
grupe
grupe
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
values(null,'6404','Grupa
values(null,'6303','Grupa
values(null,'6401','Grupa
values(null,'6409','Grupa
values(null,'6402','Grupa
6404',1,4);
6303',1,3);
6401',3,4);
6409',2,4);
6402',4,4);
into
into
into
into
into
studenti
studenti
studenti
studenti
studenti
values(null,'Antohe','Adina',null);
values(null,'Iacob','Adelina',null);
values(null,'Hogas','Ionel',null);
values(null,'Pavel','Ionel',null);
values(null,'Jora','Bogdan',null);
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
Page 98 of 102
Baze de date
Project no.
Document no.
BD 2010
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
-- 7. Note
--grupa 6404
delete from note;
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,26,2,5,sysdate-401);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,26,1,4,sysdate-402);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
Page 99 of 102
Baze de date
Project no.
Document no.
BD 2010
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
values(-1,7,2,10,sysdate-1);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,7,1,10,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,9,2,8,sysdate-1);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,9,1,9,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,8,2,9,sysdate-1);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,8,1,9,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,11,2,5,sysdate-1);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,11,1,4,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,10,2,9,sysdate-1);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,10,1,9,sysdate);
--grupa 6403
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,2,2,8,sysdate-1);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,2,1,6,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,4,3,4,sysdate);
--grupa 6401
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,15,5,7,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,16,5,9,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,17,5,4,sysdate);
--grupa 6303
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,25,3,5,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,21,3,9,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,24,3,8,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,22,3,6,sysdate);
commit;
Baze de date
Project no.
Document no.
BD 2010
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Studenti-grupe-discipline-note
Baze de date
Project no.
Document no.
BD 2010
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.: