Documente Academic
Documente Profesional
Documente Cultură
1
Florin Radulescu - Baze de date (note de curs)
1. Modelul ierarhic
2. Modelul retea
3. Modelul relaţional
Sursa: www.wikipedia.org
2
Florin Radulescu - Baze de date (note de curs)
RELAŢIE CONSTRÂNGERI DE
Relaţie: termen provenit din matematică INTEGRITATE
Reprezentarea intuitivă: o tabelă. De asemenea descrierea poate include
Schema unei baze de date relaţionale = informaţii despre elementele de identificare
descrierea structurii acesteia: ale înregistrarilor dintr-o tabela (cheie
Numele relaţiilor (numele tabelelor), primara), a coloanelor comune cu alte tabele
Numele atributelor fiecărei relaţii (coloanele (chei straine) şi a altor restricţii şi verificari de
tabelelor) corectitudine pentru datele stocate.
Tipul de date asociat acestor atribute (coloane). Aceste informaţii sunt cunoscute sub numele
generic de constrangeri de integritate.
EXEMPLU
MODELUL ENTITATE-ASOCIERE (EA)
Acesta este un model generic de descriere a
structurii datelor sub forma grafica - Sotie
A_Absolvit
3
Florin Radulescu - Baze de date (note de curs)
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
7
Florin Radulescu - Baze de date (note de curs)
8
Florin Radulescu - Baze de date (note de curs)
9
Florin Radulescu - Baze de date (note de curs)
10
Florin Radulescu - Baze de date (note de curs)
1
Florin Radulescu - Baze de date (note de curs)
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
Sfarşitul capitolului 1
7
Florin Radulescu - Baze de date (note de curs)
Cursul 3 Sumar
1. Obiectivele proiectarii sistematice.
Anomalii
Modelarea 2. Etapele proiectarii unei aplicatii
3. Modelul entitate-asociere
datelor 4. Caracteristicile modelului
1
Florin Radulescu - Baze de date (note de curs)
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
EXEMPLU
AVANTAJELE EA (2)
Sotie
A_Absolvit
Poate fi usor de inteles de nespecialisti si
faciliteaza punerea de acord cu beneficiarul
Casatorit
STUDENT FACULT asupra structurii bazei de date a aplicatiei,
An evitandu-se in acest fel o proiectare
Sot neconforma cu realitatea sau cu cerintele
IS Nume IF Nume Proiectarea se poate face pe portiuni,
Apartine_de
diagramele partiale rezultate putand fi apoi
integrate pe baza unor algoritmi şi metode
bine puse la punct.
F. Rădulescu. Curs: Baze de date I 23 F. Radulescu. Curs: Baze de date 24
4
Florin Radulescu - Baze de date (note de curs)
Casatorit
STUDENT FACULT 4. Normalizare → Schema
Sot
An
conceptuala a bazei de date
IS Nume
Apartine_de
IF Nume 5. Implementare specifică SGBD-ului
folosit → Schema bazei de date a
Student(IS, Nume, Sot_IS, Apartine_de_IF) aplicaţiei
Facult(IF, Nume)
A_Absolvit(IS, IF, An)
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
7
Florin Radulescu - Baze de date (note de curs)
STUDENT
Cas_cu Inscris_la
STUD FACULT Ore
Alocare
PROIECT CALCULATOR
8
Florin Radulescu - Baze de date (note de curs)
9
Florin Radulescu - Baze de date (note de curs)
10
Florin Radulescu - Baze de date (note de curs)
PROFESOR
11
Florin Radulescu - Baze de date (note de curs)
SALARIAT SECTIE
Alocare
SALARIAT SECTIE
SECTIE
PROIECT CALCULATOR
Sfârşitul
cursului 3
Continuarea - saptamana
viitoare!
12
Florin Radulescu - Baze de date (note de curs)
Cursul 4 Sumar
1. Obiectivele proiectarii sistematice.
Anomalii
Modelarea 2. Etapele proiectarii unei aplicatii
3. Modelul entitate-asociere
datelor 4. Caracteristicile modelului
1
Florin Radulescu - Baze de date (note de curs)
2
Florin Radulescu - Baze de date (note de curs)
PROIECT CALCULATOR
3
Florin Radulescu - Baze de date (note de curs)
Regula 1 Exemplu
Regula 1. Entitatile au informatii descriptive,
pe cand atributele nu poseda astfel de Despre un ORAS este necesara
informatii.
stocarea in baza de date unor informatii
Daca exista informatii descriptive despre o
ca JUDET, POPULATIE, etc. atunci
anumita clasa de obiecte, aceasta va fi
modelata ca o entitate. ORAS va fi o entitate.
In cazul in care pentru pentru acea clasa de Daca singura informatie necesara este
obiecte nu este nevoie decit de un numele sau atunci NUME_ORAS va fi un
identificator (codul, denumirea, etc), ea va fi atribut al altei entitati.
modelata ca un atribut.
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20
Regula 2 Exemplu
Regula 2. Atributele multivalorice vor fi
reclasificate ca entitati. Localitate Bucuresti
4
Florin Radulescu - Baze de date (note de curs)
Regula 3 Exemplu
Regula 3. Atributele unei entitati care Daca avem entitatile BANCA avand ca atribut
au o asociere multi-unu cu o alta descriptiv monovaloric LOCALITATE şi JUDET,
entitate vor fi reclasificate ca entitati. daca se doreste modelarea apartenentei la
judete a localitatilor va exista o asociere
Asa cum am vazut asocierile pot lega multi-unu intre atributul LOCALITATE şi
doar entitati. Daca un descriptor al unei entitatea JUDET.
entitati este intr-o relatie multi-unu cu o Locali-
tate
alta entitate acel descriptor va fi trecut Apartine_de
in categoria entitatilor. BANCA JUDET
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
7
Florin Radulescu - Baze de date (note de curs)
8
Florin Radulescu - Baze de date (note de curs)
Modelul EA utilizat de
Atribute
instrumente CASE
Atributele unei entitati sunt inscrise in
Modelul clasic are o serie de caseta acesteia
dezavantaje, mai ales in ceea ce Atributele sunt marcate:
priveste lizibilitatea diagramelor # Identificare
complexe. * NOT NULL
Pantru uneltele CASE care utilizeaza o Poate fi NULL
EA s-a ales o varianta modificata
Asocieri Entitati
Nu exista decat asocieri de grad 1 sau Identificatorul unei entitati poate fi
2 cu conectivitate 1-1 sau 1-M format din atribute si/sau capete de
Toate asocierile de grad mai mare ca asocieri.
2 sau cele de grad 1 sau 2 cu Pot exista entitati (de exemplu entitati
conectivitate M-M sunt modelate ca intersectie) care au identificatorul
“entitati intersectie”. format numai din capete de asociere.
Etichetarea nu este per asociere ci per Marcajul este bararea capatului
capat de asociere (deci 2 etichete respectiv de asociere.
pentru fiecare asociere)
F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52
Ierarhiile Exemplificare
Ierarhiile se numesc aici Subtipuri-
Supertipuri.
Entitatile fiu sunt figurate ca incluse in
caseta entitatii tata.
Exista in anumite variante doar
ierarhiile de generalizare (fara cele de
incluziune).
9
Florin Radulescu - Baze de date (note de curs)
Sfârşitul
cursului 4
10
Florin Radulescu - Baze de date (note de curs)
Sumar
Cursul 5
1. Modele de date. Modelul relational
2. Elementele modelului
Modelul 3.
4.
Transformarea EA-Relational
Algebra relationala
relational 5. Multiseturi
6. Operatori extinsi
- Partea 1 - 7. Calcul relational pe tupluri si domenii
1
Florin Radulescu - Baze de date (note de curs)
MODELUL RELATIONAL
Modelul relational al datelor, folosit in
acest moment de majoritatea
covarsitoare a sistemelor de gestiune
aflate pe piata a fost introdus in anul
1970 prin articolul lui Edgar Frank Codd
”A relational model for large
shared databanks”.
(http://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf)
2
Florin Radulescu - Baze de date (note de curs)
REPREZENTAREA RELATIEI
RELATIE (2)
Produse
Elementele unei relatii sunt denumite in
literatura de specialitate tupluri (engl. tuple).
Relatia de mai sus contine doar 3 dintre 101 Imprimantă 30 20 XY SRL Str. X,
elementele produsului cartezian din care laser Bucureşti
provine (3 tupluri).
O reprezentare intuitiva pentru o relatie este o 105 Calculator PC 20 23 Z SRL Bd. Z,
tabela, fiecare coloana avand asociat un Bucureşti
anumit tip de date, dat de domeniul din care
provine.
124 Copiator 10 20 XY SRL Str. X,
Fiecare element al relatiei devine o linie a unei
tabele si fiecare coloana corespunde unui Bucureşti
domeniu din produsul cartezian de baza.
F. Rădulescu. Curs: Baze de date I 17 F. Rădulescu. Curs: Baze de date I 18
3
Florin Radulescu - Baze de date (note de curs)
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
7
Florin Radulescu - Baze de date (note de curs)
8
Florin Radulescu - Baze de date (note de curs)
CONSTRANGERI UNIQUE
9
Florin Radulescu - Baze de date (note de curs)
10
Florin Radulescu - Baze de date (note de curs)
ENTITATI EXEMPLU
Transformarea entitatilor
Marca Nume Prenume Varsta
Fiecare entitate a diagramei se
transforma intr-o schema de relatie
avand:
Numele relatiei = Numele entitatii
ANGAJATI
Atributele relatiei = Atributele entitatii
Cheia relatiei = Identificatorul Rezulta:
entitatii
Angajati(Marca, Nume, Prenume, Varsta)
11
Florin Radulescu - Baze de date (note de curs)
12
Florin Radulescu - Baze de date (note de curs)
13
Florin Radulescu - Baze de date (note de curs)
Sumar
Cursul 6
1. Modele de date. Modelul relational
2. Elementele modelului
Modelul 3.
4.
Transformarea EA-Relational
Algebra relationala
relational 5. Multiseturi
6. Operatori extinsi
- Partea 2 - 7. Calcul relational pe tupluri si domenii
ALGEBRA RELATIONALA
Inca din primul sau articol in care introduce
modelul relational, E.F. Codd propune si un
set de operatori pentru lucrul cu relatii.
O relatie este o multime de tupluri => o
parte dintre acesti operatori provin direct din
teoria multimilor.
Ceilalti operatori, introdusi in aceasta algebra
pentru relatii (numita in literature de
specialitate algebra relationala) sunt
specifici acesteia si au la baza operatii uzuale
cu tabele – acestea fiind reprezentarea
intuitiva pentru relatii.
F. Rădulescu. Curs: Baze de date I 3 F. Rădulescu. Curs: Baze de date I 4
1
Florin Radulescu - Baze de date (note de curs)
DIFERENTA EXEMPLU
Diferenta: Fiind date doua relatii R si S, SELECT NUME, CODS, LOC, PUNCTAJ
diferenta lor, notata R - S este o relatie care FROM STUD
WHERE CODS = 11 AND PUNCTAJ > 2000
contine tuplurile care sunt in R si nu sunt in
UNION
S. SELECT NUME, CODS, LOC, PUNCTAJ
Si in cazul diferentei cele doua relatii care se FROM STUD
reunesc trebuie sa aiba scheme compatibile. WHERE CODS = 21 AND LOC = 'BUCURESTI'
MINUS
Echivalent SQL: operatorul MINUS prin care SELECT NUME, CODS, LOC, PUNCTAJ
se poate face diferenta intre rezultatele a FROM STUD
doua cereri SQL de tip SELECT. WHERE PUNCTAJ >1500
ORDER BY LOC DESC, 4;
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
STUD⋈STUD.CodSpec>SPEC.CodSSPEC
JOIN NATURAL
Join natural: Joinul natural pentru
doua relatii R si S (notat R⋈S )se
Matr Nume CodSpec Media CodS NumeS obtine:
102 Popescu Maria 11 9 10 Calculatoare si facand joinul celor doua relatii dupa
Tehnologia Informatiei
conditia: “coloanele cu aceeasi
semnificatie au valori egale” +
eliminand prin proiectie coloanele
duplicat (cele dupa care s-a facut
joinul).
F. Rădulescu. Curs: Baze de date I 41 F. Rădulescu. Curs: Baze de date I 42
7
Florin Radulescu - Baze de date (note de curs)
8
Florin Radulescu - Baze de date (note de curs)
Matr Nume CodSpec Media CodS NumeS Matr Nume CodSpec Media CodS NumeS
102 Popescu Maria 11 9 10 Calculatoare si 102 Popescu Maria 11 9 10 Calculatoare si
Tehnologia Informatiei Tehnologia Informatiei
NULL NULL NULL NULL 11 Automatica si
101 Ionescu Ion 10 8 NULL NULL Informatica Industriala
302 Georgescu Vasile 10 9,50 NULL NULL
SEMIJOIN Sumar
Semijoin: Fie doua relatii R si S. Atunci
semijoinul lui R in raport cu S ( notat R S)
1. Modele de date. Modelul relational
este o relatie care contine multimea tuplurilor 2. Elementele modelului
lui R care participa la joinul natural cu S. 3. Transformarea EA-Relational
Semijoinul este un operator derivat. Putem 4. Algebra relationala
scrie ca: 5. Multiseturi
R S = πR (R⋈S)
6. Operatori extinsi
Semijoinurile pot fi folosite in optimizarea
7. Calcul relational pe tupluri si domenii
cererilor de regasire in baze de date
distribuite.
F. Rădulescu. Curs: Baze de date I 53 F. Rădulescu. Curs: Baze de date I 54
9
Florin Radulescu - Baze de date (note de curs)
10
Florin Radulescu - Baze de date (note de curs)
11
Florin Radulescu - Baze de date (note de curs)
12
Florin Radulescu - Baze de date (note de curs)
13
Florin Radulescu - Baze de date (note de curs)
CALCUL RELATIONAL PE
ATOMI
TUPLURI - CRT
Formula este compusa din elemente (numite
In calcului relational pe tupluri o cerere si atomi) care pot fi de trei tipuri:
se exprima printr-o expresie de forma: Elemente de tip R(s) unde R este un nume de
relatie iar s o variabila tuplu. Semnificatia
{ t | ψ(t) } este “s este un tuplu din R”
t este o variabila tuplu iar ψ o Elemente de tip s[i] θ v[j] unde s si v sunt
variabile tuplu iar θ un operator prin care se
formula. poate compara componenta i a variabilei
Semnificatia expresiei este “multimea tuplu s cu componenta j a variabilei tuplu v
s[i] θ a sau a θ s[i] prin care componenta i a
tuturor tuplurilor t care verifica formula variabilei tuplu s se compara cu constanta a.
ψ”.
F. Rădulescu. Curs: Baze de date I 79 F. Rădulescu. Curs: Baze de date I 80
14
Florin Radulescu - Baze de date (note de curs)
15
Florin Radulescu - Baze de date (note de curs)
CALCUL RELATIONAL PE
ECHIVALENTA CRT CU AR
DOMENII - CRD
Se poate demonstra ca expresiile sigure
din CRT sunt echivalente cu expresii din In calculul relational pe domenii nu
algebra relationala si reciproc. avem variabile tuplu ci variabile de
domeniu, ele constituind elementele
care formeaza tuplurile.
In acest caz trebuiesc rescrise regulile
de formare pentru o formula in CRD
dupa cum urmeaza:
16
Florin Radulescu - Baze de date (note de curs)
Exercitii
ECHIVALENTA CRD CU AR Exercitiul 1. Fie diagrama entitate asociere de mai jos.
a. Sa se corecteze erorile de sintaxa
In literatura de specialitate se arata ca b. Sa se transforme in model relational
expresiile sigure din CRD sunt A_stat_in: M-M, Cas_cu: 1-1, Acum_locuieste: M-1
echivalente cu expresii din algebra IS: IdStudent, IC: IdCamin, ambele identificatori
An
Cas_Cu
NumeS IS IC NumeC
Acum_locuieste
Exercitii
Exercitiul 2. Fie R=ABC, S=CDE, ambele cu cate 3
tupluri cu:
R[i, j] = i + j, S[i, j]=i+2*j+1 (i=indice de
linie, j=indice de coloana)
1. Sa se scrie explicit relatiile R si S.
2. Sa se calculeze joinul natural intre relatiile R
Sfârşitul
si S.
3. Sa se calculeze joinul extern complet intre
relatiile R si S dupa conditia R.C=S.C.
cursului 6
4. Considerand operatorii extinsi scrieti
rezultatul expresiei
γA → Crt, COUNT(*) → Cati(R × S)
F. Rădulescu. Curs: Baze de date I 101 F. Rădulescu. Curs: Baze de date I 102
17
Florin Radulescu - Baze de date (note de curs)
Cursul 7 Sumar
1. Problematica. Anomalii.
2. Dependente functionale
Proiectarea bazelor 3.
4.
Forme normale: FN1, FN2, FN3, FNBC
Descompunerea schemelor de relatii
de date 5. Dependente multivalorice. Forma
normala 5.
- Partea 1 -
F. Radulescu. Curs: Baze de date 1 F. Rădulescu. Curs: Baze de date I 2
1
Florin Radulescu - Baze de date (note de curs)
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
4
Florin Radulescu - Baze de date (note de curs)
A2 - AUGMENTARE A3 - TRANZITIVITATE
A2. Augmentare: Fie R o schema de A3. Tranzitivitate: Fie R o schema de
relatie si X, Y, Z ⊆ R. Atunci: relatie si X, Y, Z ⊆ R.
Daca X → Y atunci si XZ → YZ Daca X → Y si Y → Z atunci si X → Z
Aceasta axioma arata ca se poate reuni
o aceeasi multime Z in stanga si in
dreapta unei dependente functionale
valide obtinand de asemenea o
dependenta functionala valida.
REGULI R1 - DESCOMPUNERE
Pe baza acestor axiome se pot R1. Descompunere: Fie R o schema
demonstra o serie de reguli de inferenta de relatie si X, Y, Z ⊆ R.
pentru dependente functionale dintre Daca X → Y si Z ⊆ Y atunci si X → Z
care cele mai importante sunt Regula descompunerii ne permite sa
urmatoarele: rescriem un set de dependente
functionale astfel incat sa obtinem doar
dependente care au in partea dreapta
doar un singur atribut.
5
Florin Radulescu - Baze de date (note de curs)
R3 - PSEUDOTRANZITIVITATEA DEMONSTRATII
R3. Pseudotranzitivitate: Fie R o Exercitiu: Demonstrati cele trei reguli
schema de relatie si X, Y, Z, W ⊆ R. folosind axiomele lui Armstrong.
Exemplu de demonstratie R3:
Daca X → Y si YZ → W atunci si XZ → W Augmentam prima dependenta cu Z.
Obtinem XZ → YZ.
Din aceasta dependenta si din YZ → W
obtinem prin tranzitivitate XZ → W,
qed.
F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32
OBSERVATIE NU SE CALCULEAZA!
Multimea F+contine foarte multe Inchiderea unei multimi de dependente
dependente, inclusiv dependente triviale ca: functionale nu se calculeaza, algoritmii
ABC → A, care au nevoie de ea ocolind intr-un fel
ABC → B, sau altul calculul acesteia.
ABC → C, Introducerea acestei notiuni s-a facut
ABC → AB,
pentru:
in cazul descompunerii unei scheme de
ABC → AC, relatie, aflarea dependentelor mostenite de
ABC → BC sau la relatia initiala
ABC → ABC pentru a putea defini formal alte notiuni
F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36
6
Florin Radulescu - Baze de date (note de curs)
ACOPERIREA ECHIVALENTA
Echivalenta a doua multimi de
Acoperirea unei multimi de DF: Fie dependente:
R o schema de relatie si F, G doua Fie R o schema de relatie si F, G doua
multimi de dependente pentru R. Se multimi de dependente pentru R.
spune ca F acopera pe G daca si Se spune ca F e echivalenta cu G
numai daca G ⊆ F+. daca si numai daca F acopera pe G si G
acopera pe F (deci G ⊆ F+ si F ⊆ G+ ,
deci F+ = G+)
EXEMPLUL 1 EXEMPLUL 2
Fie R = ABCDE o schema de relatie si F Pentru relatia
multimea de dependente functionale asociata,
cu F = { AB → CDE, C → DE }: Produse(IdP, NumeP, Qty, IdF, NumeF,
Aplicam regula de descompunere. Obtinem: AdresaF, IdF)
F = { AB → C, AB → D, AB → E, C → D, C →
E} din paragraful 4.1. avand multimea de
Noua F nu e minimala deoarece AB → D si AB dependente functionale:
→ E se pot deduce prin tranzitivitate din AB
→ C impreuna cu C → D, C → E. F = { IdP → NumeP, Qty, IdF, NumeF,
Rezulta ca forma canonica a lui F este: AdresaF;
F = { AB → C, C → D, C → E } IdF → NumeF, AdresaF}
F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42
7
Florin Radulescu - Baze de date (note de curs)
SUPERCHEIE EXEMPLU
In cazul in care doar prima conditie este Fie R = ABCDE si F = { AB → C, C → D, C →
indeplinita multimea X se numeste E }. Atunci AB este cheie pentru R:
Din AB → C, C → D si C → E obtinem prin
supercheie. tranzitivitate AB → D si AB → E
Observatie: Faptul ca o supercheie nu este Din AB → C, AB → D si AB → E obtinem prin
reuniune AB → CDE
constransa de minimalitate nu inseamna insa Din AB → CDE obtinem (augmentare cu AB) AB →
ca ea nu poate fi minimala. ABCDE, deci AB → R
Rezulta ca orice cheie este in acelasi timp si Rezulta ca AB este supercheie pentru R. In
supercheie, reciproca nefiind insa adevarata. paragraful urmator vom vedea cum se poate
demonstra si faptul ca AB este minimala, deci
este nu numai supercheie ci chiar cheie
pentru R.
F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48
8
Florin Radulescu - Baze de date (note de curs)
EXEMPLU OBSERVATIE
Observatie: Atunci cand descompunem o schema se
Pentru exemplul de mai sus proiectiile poate intampla ca unele dintre dependentele schemei
sunt urmatoarele: initiale sa se piarda.
Exemplu: Fie R = ABCD si F = { A→B, B→C, C→D,
FPRODUSE = πPRODUSE (F) = D→A }. In cazul in care descompunem R in R1 = AB
si R2 = CD atunci:
{ IdP→NumeP, IdP→Qty, IdP→ IdF} FR1 = πR1(F) ={ A→B, B→A }
FFURNIZORI = πFURNIZORI (F) = FR2 = πR2(F) = { C→D, D→C }
A doua dependenta din fiecare multime nu este in F
{ IdF→NumeF, IdF→AdresaF } dar este in F+ (obtinuta prin tranzitivitate).
Observam insa ca dependentele B→C si D→A nu mai
pot fi obtinute nici din FR1 nici din FR2 nici din
reuniunea lor.
9
Florin Radulescu - Baze de date (note de curs)
10
Florin Radulescu - Baze de date (note de curs)
11
Florin Radulescu - Baze de date (note de curs)
EXEMPLUL 1 EXEMPLUL 2
R = ABCDE si R = ABCDE si
F = { A → B, A → C, D → E }. F = { A → B, B → A , A → C, D → E }.
Multimea atributelor care nu apar in partea Multimea atributelor care nu apar in partea
dreapta a nici unei dependente este X = dreapta a nici unei dependente este X = D.
AD. Calculam (D)+. Obtinem (D)+ = DE ≠ R.
Calculam (AD)+. Obtinem (AD)+ = ABCDE Rezulta ca D nu este cheie unica pentru R
= R.
Procesul se opreste. Rezulta ca AD este
cheie unica pentru R
F. Radulescu. Curs: Baze de date 69 F. Radulescu. Curs: Baze de date 70
12
Florin Radulescu - Baze de date (note de curs)
EXEMPLUL 2 EXEMPLUL 3
Relatia Produse = IdP, NumeP, Qty, IdF Relatia Produse = IdP, NumeP, Qty, IdF,
avand asociata multimea de dependente NumeF, AdresaF avand dependentele:
functionale
F = { IdP→NumeP, IdP→Qty, IdP→ IdF,
FPRODUSE = πPRODUSE(F) = IdF→NumeF, IdF→AdresaF }
{ IdP→NumeP, IdP→Qty, IdP→ IdF}
Nu este in forma normala Boyce-Codd: cheia
Este in forma normala Boyce-Codd: cheia unica este IdP dar exista dependente care nu
unica a relatiei este IdP si toate dependentele
au in partea stanga o supercheie (asa cum s- au in partea stanga o dupercheie:
a mentionat orice cheie este in acelasi timp si IdF→NumeF, IdF→AdresaF
supercheie)
13
Florin Radulescu - Baze de date (note de curs)
EXEMPLUL 1 EXEMPLUL 2
Relatia R = ABCD avand Relatia R = ABCDE avand
F = { AB → C, AB → D, D → A } are cheia
unica AB. F = { A → B, B → A , A → C, D → E }
Relatia este in FN3 deoarece primele doua are cheile AD si BD.
dependente au in partea stanga o supercheie
(AB) iar a treia dependenta are in partea R nu este in FN3 deoarece
dreapta atributul prim A. dependentele 3 si 4 nu au nici
Relatia nu este in FNBC deoarece a treia supercheie in partea stanga nici atribut
dependenta violeaza definitia pentru aceasta
forma normala (nu are in partea stanga o prim in partea dreapta
supercheie. R nu e in FNBC deoarece nu e in FN3
F. Radulescu. Curs: Baze de date 83 F. Radulescu. Curs: Baze de date 84
14
Florin Radulescu - Baze de date (note de curs)
15
Florin Radulescu - Baze de date (note de curs)
Exercitiu
ATENTIE!
Asa cum s-a specificat anterior FN2 nu este o P1. Fie R = ABCDE si F = {AB→ →C,
forma normala ‘buna’, ea trebuie evitata. C→→D, D→ →B, D→ →E}.
Relatia din exemplul anterior prezinta toate 1. Sa se calculeze (A)+
anomaliile enumerate la inceputul acestui 2. Dependenta D→ →A se poate deduce
capitol. din F?
3. Gasiti toate cheile lui R.
Sfarsitul cursului 7
Proiectarea bazelor de date
relationale - partea 1
16
Florin Radulescu - Baze de date (note de curs)
Cursul 8 Sumar
1. Problematica. Anomalii.
2. Dependente functionale
Proiectarea bazelor 3.
4.
Forme normale: FN1, FN2, FN3, FNBC
Descompunerea schemelor de relatii
de date 5. Dependente multivalorice. Forma
normala 5.
- Partea 2 -
F. Radulescu. Curs: Baze de date 1 F. Rădulescu. Curs: Baze de date I 2
DESCOMPUNEREA SCHEMELOR
DEFINITIE
DE RELATIE
Asa cum s-a mentionat anterior, in cazul in Procesul prin care se ‘sparge’ o relatie in mai
care o relatie din baza de date nu este intr-o multe relatii se numeste descompunerea
forma normala buna (FNBC, FN3) pot sa unei scheme de relatie.
apara diverse anomalii. Formal putem defini acest concept astfel:
Solutia este inlocuirea relatiei respective cu Definitie: Fie R o schema de relatie, R = A1
doua sau mai multe relatii care sa contina A2 … Am .
aceleasi informatii dar care, fiecare in parte, Se spune ca ρ = (R1, R2, …, Rn) este o
este in forma normala dorita de proiectant. descompunere a lui R daca si numai daca
R = R1 ∪ R2 ∪ …∪ Rn
OBSERVATII EXEMPLUL 1
Schemele R1, R2, …, Rn contin deci atribute Fie relatia R = ABCDE avand
din R, fiecare atribut Ai al schemei initiale
trebuind sa se regaseasca in cel putin una F = { A → B, B → A , A → C, D → E }.
dintre ele.
Nu este necesar ca schemele sa fie disjuncte Putem avea descompuneri ca:
(in practica ele au aproape intotdeauna ρ1 = (ABC, DE),
atribute comune).
In exemplele de mai jos sunt prezentate ρ2 = (ABCD, DE),
cateva descompuneri valide ale unor scheme ρ3 = (AB, CD, DE)
de relatii (unele insa incorecte din punct de
vedere al pastrarii datelor si/sau
dependentelor initiale)
F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6
1
Florin Radulescu - Baze de date (note de curs)
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
ABCD a1 a2 a3 a4 b15 a5
DE b21 b22 b23 a4 a5
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
ALGORITM DE TESTARE A
DEFINITIE – cont.
PASTRARII DEPENDENTELOR
Rezulta ca o descompunere pastreaza
dependentele daca si numai daca: Intrare: o schema de relatie R, multimea de
F ⊆ ( ∪i=1..n (Fi ) )+ dependente functionale asociata F si o
Din pacate atat proiectia unei multimi de descompunere ρ = (R1, R2, …, Rn)
dependente cat si incluziunea de mai sus Iesire: verdictul daca ρ pastreaza sau nu
implica un calcul de inchidere a unei multimi dependentele
de dependente (F si respectiv reuniunea
multimilor Fi). Metoda: Pentru fiecare dependenta
Exista si in acest caz un algoritm pentru a X → Y din F
testa daca o dependenta este sau nu pastrata
dupa descompunere fara a fi necesar efectiv se procedeaza astfel:
calculul multimilor Fi
F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40
7
Florin Radulescu - Baze de date (note de curs)
8
Florin Radulescu - Baze de date (note de curs)
Exercitii 49 Exercitii 50
Model EA Model EA
a. Sa se corecteze erorile de sintaxa a. Sa se corecteze erorile de sintaxa
b. Sa se transforme in model relational b. Sa se transforme in model relational
A_absolvit
Doctorat_la
Tutor Matr,Nume CodF, Denumire
Tutor Inscris_la IdS,Matricola, Nume CodF, Denumire
FACULT Cas_cu Inscris_la
STUD
STUD FACULT
Discipol
Sotie
Alocare
Alocare
Ore
CAMINIST NECAMINIST
CAMINIST ANGAJAT
Camin, Camera IdNecaminist, Adresa
Camin, Camera Firma, DinAnul
Exercitii 51 Exercitii 52
Exercitii 53 Exercitii 54
9
Florin Radulescu - Baze de date (note de curs)
Sfarsitul cursului 8:
Proiectarea bazelor de date
relationale - partea 2
10
Florin Radulescu - Baze de date (note de curs)
Cursul 9 Sumar
1. Problematica. Anomalii.
2. Dependente functionale
Proiectarea bazelor 3.
4.
Forme normale: FN1, FN2, FN3, FNBC
Descompunerea schemelor de relatii
de date 5. Dependente multivalorice. Forma
normala 5.
- Partea 3 -
F. Radulescu. Curs: Baze de date 1 F. Rădulescu. Curs: Baze de date I 2
OBSERVATII EXEMPLUL 1
Toate dependentele sunt pastrate: dependenta Xi → R = ABCDE,
Yi este in proiectia lui F pe XiYi
Pentru a minimiza numarul de elemente din F = { A → B, A → C, A → D, D → E }.
descompunere se aplica regula reuniunii: daca avem
mai multe dependente care au aceeasi parte stanga Rescriem prin reuniune multimea de
le reunim intr-una singura. dependente functionale:
Daca in descompunere exista doua elemente XiYi si
XjYj astfel incat XiYi ⊆ XjYj atunci XiYi se elimina. F = { A → BCD, D → E }.
In literatura de specialitate exista demonstratia Rezulta din algoritm descompunerea
faptului ca fiecare schema din descompunere este in
FN3. ρ = (ABCD, DE)
1
Florin Radulescu - Baze de date (note de curs)
EXEMPLUL 1 EXEMPLUL 2
Fie R = ABCDE,
Pentru relatiile din exemplele anterioare F = { A → B, B → A, A → C, D → E }.
descompunerea ramane aceeasi deoarece: Cheile relatiei sunt AD si BD.
In cazul relatiei R = ABCDE cheia este A, deja
Rescriem multimea de dependente:
inclusa in ABCD, deci descompunerea ramane
F = { A → BC, B → A, D → E }.
ρ = (ABCD, DE).
Rezulta descompunerea cu pastrarea dependentelor:
In cazul relatiei PRODUSE de asemenea cheia ρ = (ABC, AB, DE). Cum AB e inclus in ABC rezulta in
este IdP, inclusa deja intr-unul din elementele final ρ = (ABC, DE).
descompunerii. Cum elementele descompunerii nu contin vreo cheie
a lui R, o adaugam. Obtinem in final descompunerea
ρ = (AD, ABC, DE) (sau pt. cealalta cheie BD in loc
de AD)
F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
4
Florin Radulescu - Baze de date (note de curs)
VIZUALIZARE CONSECINTA
O consecinta interesanta a acestei
definitii este ca, daca inversam tuplurile
X Y R–X–Y
t1 si t2, rezulta ca exista si un tuplu t4
t1 AAA BBB CCC
t2 AAA DDD EEE pentru care
t3 AAA BBB EEE t4[X] = t1[X] = t2[X]
t4[Y] = t2[Y] si t4[R-X-Y] = t1[R-X-Y]
5
Florin Radulescu - Baze de date (note de curs)
CE REMARCAM? X→Y
Observam ca t3 = t2 si t4 = t1 ceea ce este corect
pentru ca in definitia dependentelor multivalorice nu
se cere ca t3 sa fie diferit de t1 si t2.
Consecinta importanta: orice dependenta X Y R–X–Y
functionala este in acelasi timp si o dependenta
multivalorica: t1 AAA BBB CCC
Fie relatia R si o dependenta functionala X → Y t2 AAA BBB DDD
pentru R. t3 este t2 AAA BBB DDD
Atunci daca doua tupluri t1 si t2 au aceleasi valori pe
atributele X vor avea aceleasi valori si pe atributele Y.
Rezulta ca t2 indeplineste conditiile pentru t3 din
definitia dependentelor multivalorice:
6
Florin Radulescu - Baze de date (note de curs)
A6 – TRANZITIVITATE DMV A7
A6. Tranzitivitate pentru DMV: Fie Ultimele doua axiome leaga dependentele
R o schema de relatie si X, Y, Z ⊆ R. multivalorice cu cele functionale:
Daca X →→ Y si Y →→ Z atunci
X →→ (Z – Y) A7. Fie R o schema de relatie si
X, Y ⊆ R.
Daca X → Y atunci si X →→ Y
A8 OBSERVATIE
A8. Fie R o schema de relatie si X, Y, Z, Orice dependenta functionala este in acelasi
W ⊆ R. cu W ∩Y = ∅ timp si o dependenta multivalorica insa
reciproca nu este adevarata: exista
Daca X →→ Y, Z ⊆ Y, W → Z atunci dependente multivalorice pentru care in
X→ Z schema relatiei nu avem o dependenta
functionala corespunzatoare.
Exemplu pentru acest fapt este dependenta
multivalorica existenta in tabela de angajati
din paragraful anterior:
7
Florin Radulescu - Baze de date (note de curs)
R2, R3 R4, R5
R2. Pseudotranzitivitate: R4. Diferenta:
Daca X →→ Y si WY →→ Z atunci Daca X →→ Y si X →→ Z atunci:
WX →→ Z – WY X →→ Y – Z
R3. Pseudotranzitivitate mixta: X →→ Z – Y
Daca X →→ Y si XY →→ Z atunci R5. Intersectie:
X →→ Z – Y Daca X →→ Y si X →→ Z atunci:
X →→ Y ∩ Z
R6, R7 SI R8 INCHIDERE
R6. Eliminare atribute comune: Aceste axiome si reguli se pot folosi pentru
Daca X →→ Y atunci: calculul inchiderii unei multimi de dependente
functionale si multivalorice.
X →→ Y – X Definitia inchiderii este aceeasi ca la
R7. Toate atributele (dependente dependentele functionale:
triviale): Definitie: Fie R o schema de relatie si G
Daca X ∪ Y = R atunci multimea de dependente functionale si
X →→ Y si Y →→ X multivalorice asociata. Atunci inchiderea
multimii de dependente G, notata G+, este
R8. Reflexivitate (dependente o multime de dependente (DF si DMV) care
triviale): sunt in G sau se pot deduce din G folosind
Daca Y ⊆ X atunci X →→ Y axiomele si regulile.
F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48
8
Florin Radulescu - Baze de date (note de curs)
9
Florin Radulescu - Baze de date (note de curs)
ALGORITM EXEMPLU
Fie R o schema de relatie si G multimea de Pentru relatia Angajati care nu era in FN4
dependente multivalorice asociata (consideram ca din
G au fost eliminate dependentele triviale). Putem Initial
calcula descompunerea in FN4 iterativ: ρ = ( (Nume,Strada,Localitate,Facultate,AnAbsolvire) )
Initial ρ = (R)
Alegem dependenta
La fiecare pas se alege o schema T care contine o
dependenta de forma X →→ Y care violeaza conditia Nume →→ Strada, Localitate
pentru FN4. Schema respectiva este inlocuita in ρ care violeaza conditia pentru FN4. Obtinem
prin T1 si T2 unde T1 = XY si T2 = T – Y
T1 = Nume, Strada, Localitate si
Procesul se opreste cand in ρ nu mai exista elemente
care nu sunt in FN4 T2 = Nume, Facultate, AnAbsolvire
10
Florin Radulescu - Baze de date (note de curs)
Sfarsitul cursului 9:
Proiectarea bazelor de date
relationale - partea 3
11
Cursul 10 PROBLEMATICA
Asa cum s-a exemplificat in primul capitol,
atunci cand mai multe programe opereaza
simultan pe aceleasi date pot sa apara situatii
in care continutul bazei de date devine
inconsistent
TRANZACŢII ŞI ACCES Daca pasii aceluiasi program de rezervare de
CONCURENT locuri rulat de la doua agentii de voiaj diferite
sunt ca in tabelul de mai jos, desi se rezerva
doua locuri numarul de locuri disponibile
scade cu doar o unitate
F. Radulescu. Curs: Baze de date 1 F. Radulescu. Curs: Baze de date 2
1
TRANZACTIE EXEMPLU
In exemplul anterior exista doua tranzactii,
T1 si T2 care erau doua executii ale aceluiasi Moment de timp Tranzactia 1 Tranzactia 2 lansata A în
program: lansata de Agentia de Agentia 2: BD
1: rezervare loc anulare rezervare
T1 executia programului de rezervare t1 READ A 10
lansata de Agentia 1 t2 READ A 10
T2 este cea de la Agentia 2. t3 A=A–1 10
t4 A = A +1 10
Nu inseamna insa ca un set de tranzactii care t5 WRITE A 9
opereaza simultan pe o baza de date trebuie t6 WRITE A 11
sa contina doar executii ale aceluiasi
program.
Putem avea de exemplu o tranzactie care
rezerva un loc si o alta care anuleaza o
rezervare de loc, ca in exemplul urmator:
F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8
EXEMPLU OBSERVATII
Se observa ca putem avea:
Timp T1 T2 T3 T4 tranzactii scriu date care anterior au fost citite
t1
t2
READ A
READ B
(ca T1 il scrie pe A, citit anterior),
t3
t4
READ A
READ B
tranzactii care scriu date care nu au fost
t5 WRITE B anterior citite, calculate eventual pe baza
t6
t7
WRITE B
READ B
altora citite din baza de date (T2 scrie pe C
t8 READ C pe care nu l-a citit, dar a citit A si B)
T9
t10
WRITE A
WRITE C
tranzactii care doar citesc date fara sa scrie
(T4)
tranzactii care doar scriu date fara sa citeasca
anterior ceva din baza de date (T3)
2
ARTICOL EXEMPLU
Definitie: Un articol este o portiune a bazei de date Sistemul Oracle blocheaza automat
care se poate citi, scrie, bloca sau debloca printr-o
singura operatie de READ, WRITE, LOCK respectiv orice linie modificata de o comanda de
UNLOCK. tip UPDATE pana cand tranzactia care a
In exemplul anterior am folosit articolele simbolice A,
B si C. In cazurile reale un articol poate fi: efectuat operatie fie comite
O intreaga tabela modificarile (le face permanente in baza
O linie (sau o multime de linii) dintr-o tabela
O celula dintr-o tabela (valoarea unei coloane de pe o linie a
de date) fie le revoca.
tabelei)
Orice alta portiune a bazei de date care indeplineste conditia
In acest caz articolele sunt deci linii ale
din definitie in concordanta cu facilitatile puse la dispozitie tabelei actualizate.
de SGBD-ul respectiv.
3
PLANIFICARE SERIALA BLOCARE
Definitie: O planificare in care pasii fiecarei tranzactii Cum s-a mentionat si in primul capitol, una
sunt succesivi, fara sa fie intercalati pasi ai altor
tranzactii se numeste planificare seriala. dintre metodele de a obtine planificari care sa
Exemplu de planificare seriala pentru doua tranzactii T1 si nu ridice probleme privind consistenta datelor
T2: dupa executia tranzactiilor este aceea a
R1(A); R1(B); R1(C); W1(B); R2(B); R2(C); W2(A); W2(C) blocarii articolelor.
Pasii lui T1 Pasii lui T2 Definitie: Blocarea unui articol de catre o
Planificarile seriale nu ridica probleme de consistenta tranzactie semnifica faptul ca acea tranzactie
(sunt planificari “bune” din punct de vedere al executiei
concurente). obtine din partea sistemului (SGBD) anumite
De aceea unul din obiectivele acestui capitol este acela drepturi speciale de acces care impiedica alte
de a gasi planificari care sa se comporte la fel cu o tranzactii sa efectueze anumite operatii
planificare seriala. asupra acelui articol.
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20
CATEGORII EXEMPLE
Exista doua categorii de blocari: Pentru a scrie un articol, o tranzactie trebuie sa
obtina anterior un Write Lock asupra acestuia: nici o
Blocari exclusive: celelalte tranzactii nu pot alta tranzactie nu poate citi sau scrie acel articol pana
sa execute operatii asupra articolului cand el nu este deblocat
blocat. Aceste blocari sunt denumite in Pentru a citi un articol o tranzactie trebuie sa obtina
literatura de specialitate si Exclusive Locks anterior un Read Lock asupra lui. Mai multe tranzactii
sau Write Locks. pot sa blocheze acelasi articol pentru citire insa nici
o alta tranzactie nu il poate scrie. O tranzactie poate
Blocari partajate: celelalte tranzactii pot sa sa obtina un Write Lock pe articolul respectiv abia
execute doar anumite tipuri de operatii dupa deblocarea acestuia de catre toate tranzactiile
asupra articolului blocat. Aceste blocari care l-au blocat pentru citire.
sunt denumite in literatura de specialitate
si Shared Locks sau Read Locks
F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22
4
GESTIUNE … - cont - ACID
Cum singurele operatii care sunt Pentru ca o tranzactie sa fie bine
importante din punct de vedere al definita ea trebuie sa indeplineasca
interactiunii dintre program si sistemul niste criterii de corectitudine care au
de gestiune sunt cele de citire/scriere si fost sintetizate prin abrevierea ACID.
Aceasta semnifica
cele conexe (blocare, deblocare,
comitere si revocare) putem defini o A – Atomicitate
tranzactie si ca o succesiune de operatii C – Consistenta
de acest tip. I – Izolare
D – Durabilitate.
F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26
CONSISTENTA IZOLARE
Definitie: O tranzactie care incepe sa lucreze pe o baza
de date consistenta trebuie sa o lase la final tot intr-o Definitie: O tranzactie trebuie sa se
stare consistenta. comporte ca si cand operatiile efectuate
In acest sens o tranzactie nu poate incalca restrictiile
existente la nivelul bazei de date. de ea sunt izolate, independente de
In cele mai multe cazuri aceste restrictii sunt operatiile efectuate de alta tranzactie.
modelate sub forma constrangerilor de integritate
(NOT NULL, PRIMARY KEY, etc). Nici o alta tranzactie nu trebuie sa
Daca o tranzactie contine o operatie care violeaza o citeasca date intermediare scrise de
constrangere de integritate atunci toate modificarile
efectuate de tranzactie vor fi revocate. tranzactia respectiva.
Mecanismele de pastrare a consistentei trebuie
asigurate de SGBD.
5
EXEMPLU IZOLARE – cont.
De exemplu daca o tranzactie contine Atunci nici o alta tranzactie nu poate citi pentru A si B
doua valori dintre care una este actualizata si cealalta
succesiunea de operatii: nu (adica 6 pentru A si 10 pentru B).
READ (A) -- citeste valoarea veche a lui A: 5 Inconsistentele prezentate in paragraful anterior erau
A = A + 1 datorate incalcarii acestui criteriu de corectitudine.
WRITE (A) -- scrie valoarea noua a lui A:6 Din punct de vedere al modului de asigurare a izolarii
READ (B) -- citeste valoarea veche a lui B:10 tranzactiilor tot sistemul de gestiune trebuie sa
B = B - 1 asigure mecanismele necesare.
WRITE (B) -- scrie valoarea noua a lui B:9
Izolarea este obiectul controlului accesului concurent,
prezentat in paragrafele urmatoare.
DURABILITATE SERIALIZABILITATE
Definitie: O data comise cu succes modificarile Asa cum s-a specificat planificarile seriale nu
efectuate de catre o tranzactie ele vor duc la inconsistente.
persista si nu mai pot fi revocate. In practica insa in cazul unor sisteme
Inclusiv in cazul unui incident hardware si incarcate planificarile contin pasi intercalati ai
diverselor tranzactii.
software efectele tranzactiilor comise sunt
regasite la recuperarea dupa incident. Rezultatul va fi totusi corect daca efectul
executiei planificarii respective este acelasi cu
Din acest punct de vedere fiecare sistem de al uneia dintre planificarile seriale posibile ale
gestiune trebuie sa contina mecanisme prin acelorasi tranzactii.
care efectele tuturor tranzactiilor comise sa O astfel de planificare se numeste planificare
fie inregistrate si in jurnalele sistemului serializabila.
pentru a fi restaurate in caz de incident.
F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34
6
ALT EXEMPLU - neserializabila SERIALE
Planificare neserializabila: Planificari seriale posibile (nici una
echivalenta):
T1 T2 A in baza de
T1 T2 A / BD T1 T2 A / BD
date
Read A 10 Read A 10
Read A 10
Read A 10 A=A+1 10 A=A+1 10
A=A+1 10 Write A 11 Write A 11
A=A+1 10 Read A 11 Read A 11
Write A 11 A=A+1 11 A=A+1 11
Write A 11 Write A 12 Write A 12
CONFLICT ECHIVALENTA
Exista si o alta abordare a serializabilitatii bazata pe
conflictele care pot sa apara intre pasii a doua Definitie: Doua planificari sunt conflict-
tranzactii dintr-o planificare. echivalente daca:
Definitie: Intre doua operatii apartinand unei
planificari exista un conflict daca: Contin aceleasi operatii ale acelorasi
Apartin unor tranzactii diferite tranzactii
Sunt pe acelasi obiect Fiecare pereche de operatii conflictuale
Una dintre operatii este o scriere apare in aceeasi ordine in cele doua
Cele doua operatii sunt succesive in sensul ca intre planificari.
ele nu exista o operatie cu care vreuna dintre ele
este in conflict. Aceasta definitie nu spune ca nu pot sa apara
Rezulta ca exista 3 tipuri de situatii conflictuale: Fiind anomalii in executia celor doua planificari ci
date doua tranzactii T1 si T2 pot exista conflicte de ca apar aceleasi anomalii in ambele.
tipurile R1-W2, W1-W2 si W1-R2.
CONFLICT-SERIALIZABILA CONFLICT-SERIALIZABILA
Prin trei interschimbari de operatii neconflictuale s-a
Definitie: O planificare este conflict- obtinut o planificare seriala.
7
TEST EXEMPLU
Test de conflict-serializabilitate:
Se construieste graful de dependenta astfel:
Nodurile sunt tranzactii T1 T2
Pentru orice pereche de operatii aflate in conflict
Read A
Oi si Oj, cu Oi in Ti si Oj in Tj, avem un arc de la
nodul Ti la Tj daca Oi apare in planificare inaintea Write A
lui Oj.
Write A
Daca acest graf nu contine cicluri planificarea
este conflict-serializabila altfel nu este
conflict-serializabila
F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44
EXEMPLU DE CE?
Acest fapt se datoreaza insa doar coincidentei
T1 T2 intre valoarea scrisa de T2 si cea citita de T1.
Write A Cum sistemul de gestiune nu face astfel de
judecati pentru el potential planificarea este
Read A periculoasa putand sa duca la inconsistente.
De aceea in judecarea planificarilor se
Write A
considera ca la o scriere o tranzactie poate
scrie orice valoare si nu doar o valoare
particulara.
8
V-SERIALIZABILA EXEMPLU
Exista de asemenea o a treia abordare (mai slaba) a
serializabilitatii (numita in eng. view serializability):
Exemplu: O planificare v-serializabila si planificarea seriala v-echivalenta:
Definitie: Doua planificari S1 si S2 sunt v-echivalente
daca pentru orice articol A: T1 T2 T3 T1 T2 T3
Daca Ti citeste valoarea initiala a lui A in S1 atunci ea face READ A READ A
acelasi lucru si in S2 WRITE A WRITE A
Daca Ti citeste o valoare a lui A scrisa de Tj in S1, atunci WRITE A WRITE A
face acelasi lucru si in S2.
WRITE A WRITE A
Daca Ti scrie valoarea finala a lui A in S1 atunci ea face
acelasi lucru si in S2
Definitie: O Planificare este v-serializabila daca este
v-echivalenta cu o planificare seriala.
9
SORTARE TOPOLOGICA EXEMPLU
Sortarea topologica se face astfel: T1 T2 T3
LOCK A
Se alege un nod care nu are arce care intra UNLOCK A
(neexistand cicluri exista cel putin un astfel LOCK A
UNLOCK A
de nod) LOCK B
UNLOCK B
Se listeaza tranzactia asociata nodului dupa LOCK B
care acesta este sters dion graf impreuna UNLOCK B
cu toate arcele care ies din el
Procesul se reia
EXEMPLU Probleme
Pentru o tranzactie care contine secventa: Protocolul de blocare in 2 faze implica insa uneori
UNLOCK A operatii de roll-back in cascada: T1 T2
LOCK B In momentul Rollback pentru T1 Lock A
Putem avea o planificare care contine: este necesar Rollback si pentru T2 Lock B
T1 T2 deoarece T2 a citit date scrise de T1, Read A
date care prin Rollback se pierd. Write A
UNLOCK A
O astfel de planificare se numeste Unlock A
LOCK A
planificare cu rollback in cascada Lock A
LOCK B Read A
UNLOCK A Exista in acest caz varianta Write A
UNLOCK B protocolului de blocare stricta in 2 faze Unlock A
LOCK B care implica eliberarea toturor Read B
articolelor blocate la sfarsitul Write B
Graful de precedenta contine un ciclu => executie
neserializabila tranzactiei. Rollback
F. Radulescu. Curs: Baze de date 59 F. Radulescu. Curs: Baze de date 60
10
Planificari - incluziuni MODELUL RLOCK/WLOCK
Incluziunea intre diverse tipuri de planificari este In cadrul acestui model exista o doua primitive de
urmatoarea: blocare:
RLOCK (blocare pentru citire). Oricate tranzactii pot
bloca acelasi articol pentru citire dar o tranzactie nu
Planificari
Serializabile
poate bloca pentru scriere un articol blocat cu
v-serializabile
RLOCK
Conflict-
WLOCK (blocare pentru citire). Duce la obtinerea
serializabile unui acces exclusiv la articol pentru tranzactia care
Fara rollback in cascada
Seriale
il blocheaza. Celelalte tranzactii nu mai pot sa
blocheze cu RLOCK sau WLOCK acel articol.
Deblocarea pentru ambele tipuri se face cu UNLOCK.
Vom presupune ca si anterior ca o tranzactie
nu blocheaza un articol deja blocat de ea
nu deblocheaza un articol pe care nu l-a blocat.
F. Radulescu. Curs: Baze de date 61 F. Radulescu. Curs: Baze de date 62
OBSERVATII Algoritm
Intrare: o planificare P a mulţimii de tranzacţii T1, T2, ...., Tk.
Si in acest caz se poate construi (altfel Ieşirea: raspunsul daca planificarea este serializabilă, si daca da
planificarea serială echivalentă.
decat in paragraful anterior) un graf de Metoda: construirea grafului de precedenta G, similar cu modelul
precedenta din care se poate deduce anterior: fiecarei tranzactii ii corespunde un nod al grafului iar
arcele se traseaza astfel:
daca planificarea e serializabila sau nu. 1. Fie Ti tranzactia care executa RLOCK A iar Tj urmatoarea
tranzactie (diferita de Ti) care face WLOCK A. Trasam atunci un arc
de la Ti la Tj.
Observatie importanta: Si in acest caz 2. Fie Ti tranzactia care face WLOCK A si Tj urmatoarea tranzactie
(daca exista) care face WLOCK A. Se traseaza un arc de la Ti la Tj.
protocolul de blocare in doua faze este De asemenea, in acest ultim caz fie Tm tranzactia care face RLOCK A
dupa ce Ti elibereaza pe A dar inainte de blocarea acestuia de catre
valabil: Daca toate blocarile (de orice fel, Tj. Se traseaza un arc de la Ti la Tm.
Observatie: Daca in cazul 2 Tj nu exista atunci Tm este urmatoarea
la citire sau la scriere) preced toate tranzactie care face RLOCK A dupa eliberarea lui A de catre Ti.
Exemplu Exemplu
Graful este urmatorul. Cum are cicluri, planificarea nu e
T1 T2 T3
WLOCK A
serializabila.
T1 T2
RLOCK B
1 UNLOCK A
5 UNLOCK B
WLOCK B T3
RLOCK A 6
UNLOCK B
UNLOCK A 4
Arcele s-au trasat pe baza regulilor de mai sus :
2 WLOCK A Prima regula a generat arcele de tip R-W: 4, 5.
WLOCK B Prima parte a celei de-a doua reguli a generat arcele
3 UNLOCK A de tip W-W: 2, 6.
UNLOCK B
RLOCK B A doua parte a celei de-a doua reguli a generat arcele
UNLOCK B de tip W-R: 1, 3. Arcul 3 e generat luand in
considerare nota de la a doua regula.
F. Radulescu. Curs: Baze de date 65 F. Radulescu. Curs: Baze de date 66
11
ARTICOLE STRUCTURATE
EXEMPLU
IERARHIC LOCK B
Exista cazuri in care articolele unei baze de LOCK C
date se pot reprezenta ca nodurile unui arbore. LOCK D
A
Sfarsitul cursului 11
12
Cursul 11 Ce este
Limbajul SQL este un limbaj de cereri de nivel
inalt, neprocedural.
Printr-o cerere se specifica ce doreste sa
obtina utilizatorul si nu si cum se ajunge la
rezultat.
OPTIMIZAREA Modalitatea de obtinere a acestuia ramane in
sarcina sistemului de gestiune care trebuie sa
CERERILOR aleaga cea mai putin costisitoare cale.
Costul este masurat de obicei prin timpul de
executie care, asa cum spune si definitia
bazei de date din capitolul introductiv, trebuie
sa fie rezonabil.
F. Radulescu. Curs: Baze de date 1 F. Radulescu. Curs: Baze de date 2
Ce este Ce este
Pentru reducerea timpului de raspuns
Supuse optimizarii sunt in primul rand cererile
sistemul efectueaza o serie de de regasire de date (de tip SELECT in SQL).
modificari ale cererii transformand-o Trebuie avut insa in vedere ca si celelalte
intr-o cerere echivalenta dar care se cereri de tip DML au nevoie de optimizari:
pentru a actualiza sau sterge anumite linii
poate executa mai rapid. dintr-o tabela ele trebuiesc intai localizate iar
Aceasta operatie poarta numele de in cazul inserarilor trebuie verificat daca
informatia nu exista deja in tabela.
optimizarea cererii. In plus o serie de cereri de tip DDL si DCL
includ operatii de regasire de date care
implicit sunt optimizate de SGBD.
F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4
1
Elemente de cost Elemente de cost
Atunci: Deci numarul de accese la disc este in
Numarul de blocuri citite pentru a parcurge total:
relatia R este: Numarul de blocuri din R + Numarul de parcurgeri ale
lui S * Numarul de blocuri din S:
Numarul de parcurgeri al relatiei S este
Strategii Strategii
In general, exista o serie de principii 3. Combinarea secventelor de
(strategii) care duc la micsorarea numarului operatii unare (selectii si proiectii)
de accese la disc. Ele sunt urmatoarele intr-una singura (o selectie sau/si o
(vezi si [Ul 82] - Ullman, J.D. Principles of proiectie)
Database Systems, Second Edition, Computer 4. Cautarea subexpresiilor comune,
Science Press, 1982): pentru a fi evaluate o singura data.
1. Realizarea selectiilor cit mai devreme
5. Folosirea indecsilor sau sortarea
posibil.
relatiilor, daca se obtine o crestere a
2. Combinarea anumitor selectii cu produse performantelor.
carteziene adiacente pentru a forma un join.
F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12
2
Strategii Echivalente
6. Evaluarea diverselor strategii Pentru rescrierea unei expresii in algebra
relationala in vederea optimizarii costurilor de
posibile inainte de a incepe procesul evaluare se pot folosi urmatoarele
de calcul efectiv (in cazul in care sunt echivalente:
posibile mai multe metode de calcul) 1. Comutativitatea joinului si a produsului
pentru a alege pe cea mai eficienta. cartezian:
Pe baza acestor principii, exista o E1 × E2 ≡ E2 × E1
E1 >< E2 ≡ E2 >< E1
serie de algoritmi de optimizare pentru
E1 ><F E2 ≡ E2 ><F E1
evaluarea expresiilor relationale.
Echivalente Echivalente
2. Asociativitatea produsului cartezian si 3. Cascada de proiectii:
a joinului: πA1...An (πB1...Bm(E)) ≡ πA1...An (E). Se
E1 × (E2 × E3) ≡ (E1 × E2) × E3 presupune bineinteles ca {Ai} ⊆ {Bj}
E1 >< (E2 >< E3) ≡ (E1 >< E2) >< E3 4. Cascada de selectii:
E1 ><F1 (E2 ><F2 E3) ≡ (E1 ><F1 E2) σF1(σF2(E)) ≡ σ F1 ∧ F2 (E)
><F2 E3
Echivalente Echivalente
5. Comutativitatea selectiilor cu 6. Comutativitatea selectiei cu produsul
proiectiile: cartezian:
Daca F contine doar atribute din Daca toate atributele din F fac parte din E1:
A1...An atunci: σ F (E1 × E2) ≡ σ F (E1) × E2
Daca F = F1 ∧ F2 cu F1 continand doar
πA1...An(σF (E) ) ≡ σF (πA1...An(E) ) atribute din E1 si F2 doar din E2:
Sau, in cazul general – F contine si alte σ F (E1 × E2) ≡ σ F1 (E1) × σ F2 (E2)
atribute, B1...Bm - atunci: Daca F = F1 ∧ F2 cu F1 continand doar
πA1...An(σF (E) ) ≡ πA1...An(σF ( πA1...An, B1 … Bm atribute din E1 dar F2 e o expresie generala:
(E) ) ) σ F (E1 × E2) ≡ σ F2 ( σ F1 (E1) × E2)
F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18
3
Echivalente Echivalente
7. Comutativitatea selectie – reuniune: 9. Comutativitatea proiectie – produs
σ F (E1 ∪ E2) ≡ σ F (E1) ∪ σ F (E2) cartezian:
Daca in lista A1...An atributele B1...Bm
sunt din E1 iar C1...Ck din E2 atunci:
8. Comutativitatea selectie – diferenta: πA1...An(E1 × E2) ≡ πB1...Bm(E1) × πC1...Ck(E2)
σ F (E1 − E2) ≡ σ F (E1) − σ F (E2) 10. Comutativitatea proiectie –
reuniune:
πA1...An(E1 ∪ E2) ≡ π A1...An (E1) ∪ πA1...An
(E2)
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20
4
Algoritm de optimizare Algoritm de optimizare
Pasul 5. Nodurile interioare ale arborelui Pasul 6. Se evalueaza fiecare grup astfel
rezultat sunt impartite in grupuri.
Fiecare nod intern care corespunde unei
incat niciunul nu este evaluat inaintea
operatiuni binare devine un grup impreuna cu descendentilor sai.
predecesorii sai imediati cu care sunt asociate
operatiuni unare. Rezulta astfel un program de evaluare
Din bloc fac parte de asemenea orice lant de a expresiei relationale initiale.
noduri succesoare asociate cu operatiuni
unare si terminate cu o frunza cu exceptia
cazului când operatia binara este un produs
cartezian neurmat de o selectie cu care sa
formeze un echijoin.
F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26
Exemplu Exemplu
Exemplu: Fie o baza de date care Fie de asemenea o expresie relationala
implementeaza o diagrama entitate asociere
formata din 2 entitati (Student, Disciplina) si
care afiseaza numele studentului si
o asociere binara multi-multi Nota continand notele sale pentru studentul cu numele
notele studentilor si data obtinerii lor ca „Ionescu” si note obtinute obtinute
atribute proprii. pana la 1 iulie 2009:
Structura simplificata a bazei de date este
urmatoarea: π NumeS, NumeD, Nota (σ Data < 1-Jul-2009 (σ
Stud (IdS, NumeS, ...) Disc.IdD = Nota.IdD ∧ Stud.IdS = Nota.IdS and NumeS =
Disc (IdD, NumeD, ...) ‘Ionescu’ ( (Stud x Nota) x Disc)))
Nota (IdS, IdD, Nota, Data)
5
Exemplu – arbore rezultat Planul rezultat
π NumeS, NumeD, Nota
σ Disc.IdD = Nota.IdD
Se observa formarea a doua grupuri
care se evalueaza in ordinea mentionata
×
in algoritm: intai grupul de jos si apoi
σ Stud.IdS = Nota.IdS π IdD, NumeD
grupul de sus care foloseste rezultatul
× Disc
primului grup.
πIdS, NumeS π IdS, IdD, Nota Pentru fiecare grup produsul cartezian
σ NumeS= ’Ionescu’ σ Data < 1-Jul-2009
si selectia se pot combina intr-un
Stud Nota
echijoin.
Exemplul 1 Exemplul 2
Un prim exemplu: o cerere pe o tabela, Un alt exemplu: cerere cu join continand
fara subcereri: o subcerere. Cererea returneaza numele
studentului si numele specializarii pentru
studentul avand cel mai mare punctaj:
6
Coloana id Coloana select_type
Coloanele rezultatului comenzii EXPLAIN select_type: Tipul cererii SELECT. In
sunt urmatoarele: MySQL 5.5 avem urmatoarele tipuri:
Id: Identificatorul cererii SELECT.
SIMPLE: SELECT fara UNION ori
In Exemplul 2 sunt 2 cereri SELECT, cea
principala si subcererea care returneaza
subcereri
maximul. PRIMARY: SELECT exterior (cererea
In rezultat sunt 3 linii deparece sunt 3 principala)
parcurgeri de tabela: doua in cererea UNION: Al doilea sau urmatoarele
principala (care e un join) si una in
subcerere.
SELECT dintr-un UNION
F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38
7
Coloana partitions Coloana partitions
partitions: Doar cand se foloseste clauza Pentru a vedea eventualele partitii
PARTITIONS: partitia din care vor fi luate pentru o tabela existenta se poate folosi
comanda SHOW CREATE TABLE:
liniile. Aceste partitii se speciifica la
crearea tabelei (daca e cazul).
8
Coloana type Coloana type
ref: sunt citite din tabela toate liniile cu Se foloseste un astfel de join pentru
aceeasi valoare de index pentru fiecare comparatii cu = si <=> (NULL safe equal) pe
combinatie de linii din tabelele precedente. coloane indexate.
De exemplu atunci cand se face un join care NULL safe equal - exemple:
foloseste doar partea stanga a unei chei
multiple (care identifica mai multe linii si nu mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
una) sau daca e vorba de un index ne-unic. Returneaza: 1, 1, 0 mysql>
SELECT 1 = 1, NULL = NULL, 1 = NULL;
9
Coloana type Coloana type
unique_subquery: este folosit in loc de ref range: doar liniile care au valori intr-o
pentru cereri cu IN. Subcererea e inlocuita cu anumita plaja sunt regasite, utilizand un
o cautare in index (cheia primara are automat index.
unul):
value IN (SELECT primary_key FROM In coloana key din rezultatul EXPLAIN
single_table WHERE some_expr) se spune care este acesta.
index_subquery: ca si unique_subquery, E folosit la joinuri cu operatii de
dar pentru indecsi non-unici: comparatie, IS NULL, BETWEEN sau IN.
value IN (SELECT key_column FROM
single_table WHERE some_expr)
Coloana ref din rezultatul EXPLAIN este
NULL in acest caz.
F. Radulescu. Curs: Baze de date 55 F. Radulescu. Curs: Baze de date 56
10
Coloana key_len Coloanele ref si rows
key_len: lungimea cheii alese. Poate ref: aici sunt listate coloanele sau
arata cate parti ale unui index multiplu constantele comparate cu indexul al
sunt folosite; NULL in cazul in care carui nume este pe coloana key.
coloana key e NULL rows: Numarul estimate de linii
examinate. Pentru stocarea de tip
InnoDB acest numar este o estimare si
poate sa nu fie intotdeauna exact.
11
Cursul 12 NoSQL?
Denumirea de sisteme de tip SQL este
data sistemelor traditionale de gestiune
a bazelor de date, bazate pe modelul
relational al datelor
Acestea sunt foarte bune pentru
Sisteme NoSQL sistemele operationale ale unei
organizatii, companii, etc. dar nu sunt
cea mai buna solutie pentru alte tipuri
de aplicatii, cum ar fi gestionarea unui
volum mare de date.
NoSQL? Diferente
Initial, NoSQL desemna folosirea unor Exista o serie de diferente intre un
alte solutii de stocare a datelor, diferite sistem SQL si unul NoSQL.
de cele clasice, si care nu utilizau Se poate face o comparatie intre cele
limbajul SQL. doua tipuri de sisteme prin prisma mai
A aparut apoi o nuantare a acestei multor caracteristici care pot fi (vezi si
acceptiuni: actualmente NoSQL [Widom, 1]):
desemneaza solutii de stocare care pot
sa imbine stocarea clasica, relationala,
cu alte metode de stocare.
Acum NoSQL = Not only SQL
F. Radulescu. Curs: Baze de date 1 3 F. Radulescu. Curs: Baze de date 1 4
Diferente 1. Adaptare …
Caracteristici: In cazul unui sistem clasic (SQL),
1. Adaptare la necesitatile aplicatiilor acesta are:
Un model simplu de stocare (date sub
2. Multi-user forma de tabele)
3. Acces securizat Un limbaj de cereri declarativ (cum este
4. Persistenta datelor SQL)
Mecanisme de garantare a tranzactiilor.
5. Siguranta in functionare
Nu intotdeauna insa toate aceste
6. Lucrul cu masive de date caracteristici sunt utile sau usor de
7. Eficienta folosit.
F. Radulescu. Curs: Baze de date 1 5 F. Radulescu. Curs: Baze de date 1 6
1
Model simplu Limbaj declarativ
In ceea ce priveste simplitatea Limbajul de cereri declarativ – SQL -
modelului: nu intotdeauna datele de este un plus in cazul aplicatiilor de tip
stocat au o forma tabelara in mod întreprindere dar are si dezavantaje.
natural.
Fiind un limbaj complet, care poate
In acest caz este necesara efectua intreaga gama de operatii,
preprocesarea lor pentru a le aduce la aduce cu sine un overhead de sistem
aceasta forma. care poate fi semnificativ
2
4. Persistenta datelor 5. Siguranta in functionare
Aceasta caracteristica este importanta Si aceasta caracteristica este
atat pentru sisteme SQL cat si pentru importanta atat pentru sisteme SQL cat
cele NoSQL. si pentru cele NoSQL.
In cazul celor din urma insa nu sunt Exista insa cazuri in care se lucreaza pe
intotdeauna necesare mecanisme date care pot fi restaurate in intregime
complicate de organizare a datelor pe (de exemplu cand se lucreaza pe un
disc, sistemele NoSQL putand utiliza depozit de date pentru a calcula
inclusiv doar fisiere simple. statistici sau pentru extragere de
cunostinte din date – data mining.
Cerintele in acest caz pot fi mai mici
pentru sistemele NoSQL.
F. Radulescu. Curs: Baze de date 1 13 F. Radulescu. Curs: Baze de date 1 14
Deci Dezavantaje
Sistemele NoSQL au deci cateva In unele cazuri nu exista un limbaj
caracteristici care le diferentiaza de cele declarativ de operare. Rezulta ca
traditionale: operarea se poate face doar scriind
1. O schema flexibila a datelor programe de acces.
2. Sunt usor si ieftin de instalat Relaxarea consistentei nu le face o
solutie buna pentru aplicatii care au
3. Scalabilitate – lucrul cu volume mari de nevoie de garantarea consistentei, a
date serializabilitatii si a tranzactiilor.
4. Consistenta datelor este relaxata
pentru a creste performantele si
disponibilitatea.
F. Radulescu. Curs: Baze de date 1 17 F. Radulescu. Curs: Baze de date 1 18
3
Tipuri de sisteme NoSQL MapReduce
In [Widom 2] sunt enumerate patru Introdus de cei de la Google.
categorii de sisteme NoSQL: In momentul de fata exista varianta
1. Framework-ul MapReduce open source Hadoop.
2. Stocare cheie-valoare In acest caz nu exista un model de
3. Stocare documente date, acestea fiind stocate in fisiere.
4. Baze de date de grafuri Exista doua sisteme de fisiere folosite,
Google File System (GFS) pentru
MapReduce (Google) si Hadoop
Distributed File System (HDFS) pentru
Hadoop.
F. Radulescu. Curs: Baze de date 1 19 F. Radulescu. Curs: Baze de date 1 20
Functii Functii
Framework-ul - care asigura o Printre functiile care trebuie furnizate
functionare distribuita - furnizeaza toate de utilizator exista doua care dau si
caracteristicile necesare pentru numele de mai sus, si anume functia
functionare, inclusiv toleranta la defecte map() si functia reduce() .
si scalabilitatea. Pe langa acestea sunt si alte functii
Pentru a il folosi utilizatorul trebuie sa care in mod normal trebuie sa existe:
scrie un set de functii necesare reader() este o functie care citeste datele
prelucrarii. din fisiere si le returneaza ca inregistrari
writer() ia inregistrarile produse si le scrie
in fisiere
Map Map
Functia map() imparte o problema in Aceste instante ale lui map() primesc
subprobleme. date de la mai multe instante ale lui
Ea primeste un articol de date - o reader() care si ele lucreaza in paralel.
inregistrare furnizata de functia reader() Datele sunt citite de reader() din
- si returneaza un numar (>=0) de fisierele de date care reprezinta
perechi (cheie, valoare). adevarata intrare in sistem.
Cum prelucrarea este paralela, exista
mai multe instante ale lui map() care
lucreaza in paralel.
4
Reduce Exemplu
Functia reduce() primeste o cheie si o Numarare aparitii cuvinte (Sursa: [Dean, Ghemawat])
lista de valori asociate si returneaza un map(String input_key, String input_value):
numar de inregistrari (>=0). // input_key: document name
// input_value: document contents
Iesirea lui reduce() este scrisa de for each word w in input_value: EmitIntermediate(w, "1");
MapReduce Executie
Figurile urmatoare se gasesc in articolul
[Dean, Ghemawat] publicat de Google:
http://research.google.com/archive/mapr
educe-osdi04-slides/index.html
5
Tipuri de sisteme NoSQL Stocarea cheie - valoare
1. Framework-ul MapReduce In acest caz se stocheaza perechi de
2. Stocare cheie-valoare forma <cheie, valoare>.
3. Stocare documente Este un model de date foarte simplu
dar care este util in multe cazuri.
4. Baze de date de grafuri
Operatiile principale sunt:
Insert(cheie, valoare) - inserarea unei noi perechi
Fetch(cheie) - incarcarea de valori dupa cheie
Update(cheie) - actualizare dupa cheie
Delete(cheie) - stergere dupa cheie
Implementare Implementare
Inregistrarile continand perechi sunt Fiecare operatie este o tranzactie.
distribuite in noduri pe baza valorii Consistenta intarziata: copiile replicate
cheii. ale unei aceleiasi inregistrari nu sunt
In acest fel cautarea unei anumite chei mereu identice ci doar la sfarsitul
se face doar in nodurile unde este procesarii datelor (dupa 'convergenta').
posibil sa se gaseasca acea valoare Eventual consistency este definita astfel
Replicare: aceeasi pereche se gaseste in articolul De-mystifying “eventual
in mai multe noduri (duplicate). Exista o consistency” in distributed systems
consistenta intarziata - vezi mai jos. publicat de Oracle - vezi si
http://www.oracle.com/technetwork/products/nosqldb/documentation/consistency-explained-1659908.pdf
6
Tipuri de sisteme NoSQL Stocare documente
1. Framework-ul MapReduce Sistemele de stocare documente
2. Stocare cheie-valoare (document stores, magazii de
documente) pot fi considerate tot
3. Stocare documente sisteme pentru perechi <cheie,
4. Baze de date de grafuri valoare>, valoarea fiind un document .
Tipurile de documente care pot fi
stocate difera in functie de sistem.
Putem avea diverse formate: JSON
(Java Script Object Notation), XML, alte
formate semistructurate
F. Radulescu. Curs: Baze de date 1 37 F. Radulescu. Curs: Baze de date 1 38
7
Baze de date de grafuri Exemplu
In acest caz obiectele sunt noduri si
arce.
Nodurile au proprietati (perechi <cheie,
valoare>, de exemplu <ID, 3451>)
Arcele pot avea etichete sau roluri.
Un exemplu este urmatorul:
http://en.wikipedia.org/wiki/File:GraphDatabase_PropertyGraph.png
Bibliografie
[Widom 1] Jennifer Widom – NoSQL System –
Motivation, 2011
http://www.youtube.com/watch?v=w0lPQZz7qjw
[Widom 2] Jennifer Widom – NoSQL System –
Overview, 2011 Sfarsitul ultimului capitolul
http://www.youtube.com/watch?v=x-6RsW_fQfE
[Dean, Ghemawat] Jeff Dean, Sanjay Ghemawat, Bafta la examen!
MapReduce: Simplified Data Processing on Large
Clusters,
http://research.google.com/archive/mapreduce-osdi04-
slides/index.html
8
Florin Radulescu - Baze de date (note de curs)
STUD
SQL - 1 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
CERERI SELECT PE O 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
TABELA 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24
SPEC si BURSA
CODS NUME DOMENIU
SINTAXA
----- ---------- ---------------
11 MATEMATICA STIINTE EXACTE SELECT [DISTINCT] lista_de_expresii
21 GEOGRAFIE UMANIST FROM nume_tabela
24 ISTORIE UMANIST WHERE conditie_linie
-- clauza optionala
TIP PMIN PMAX SUMA ORDER BY criterii_sortare_rezultat;
-------------------- ----- ----- -----
-- clauza optionala
FARA BURSA 0 399
BURSA SOCIALA 400 899 100
BURSA DE STUDIU 900 1799 150
BURSA DE MERIT 1800 2499 200
BURSA DE EXCEPTIE 2500 9999 300
EFECT EFECT
Se parcurg rând pe rând liniile tabelei Dacă există cuvântul cheie DISTINCT, din
specificate pe clauza FROM. rezultat se elimină liniile duplicat.
Din fiecare linie conţinând date pentru care Înainte de a trimite rezultatul, serverul îl
condiţia aflată pe clauza WHERE este sortează în funcţie de criteriile specificate de
adevărată va rezulta o linie în rezultatul clauza ORDER BY.
cererii. În cazul în care WHERE lipseşte, toate În cazul în care ORDER BY lipseşte, liniile din
liniile tabelei FROM vor avea o linie rezultat sunt într-o ordine independentă de
corespondentă în rezultatul cererii. conţinutul lor sau de ordinea în care ele au
Linia de rezultat este compusă pe baza listei fost adăugate în tabelă.
de expresii aflată pe clauza SELECT.
F. Radulescu. Curs: Baze de date - 5 F. Radulescu. Curs: Baze de date - 6
Limbajul SQL Limbajul SQL
1
Florin Radulescu - Baze de date (note de curs)
REZULTAT REZULTAT
Numărul coloanelor din rezultat este Evaluarea valorii de adevăr a condiţiei
egal cu numărul expresiilor din lista din WHERE se face doar pe baza
aflată pe clauza SELECT. Aceste expresii datelor aflate pe linia respectivă.
dau şi numele coloanelor din rezultat.
Deoarece parcurgerea liniilor specificată
În lipsa clauzei DISTINCT, numărul de
linii din rezultat este egal cu numărul de o cerere SELECT se face după un
liniilor din tabelă care îndeplinesc plan de execuţie generat de server,
condiţia WHERE sau, când clauza folosirea clauzei ORDER BY este
respectivă lipseşte, cu numărul total de obligatorie în cazul în care se doreşte
linii din tabelă. un rezultat sortat după anumite criterii.
F. Radulescu. Curs: Baze de date - 7 F. Radulescu. Curs: Baze de date - 8
Limbajul SQL Limbajul SQL
2
Florin Radulescu - Baze de date (note de curs)
CLAUZA WHERE
CLAUZA WHERE
Conditii compuse (AND, OR, NOT) si
Operatori de Operator Semnificaţie paranteze
= Egal
comparatie:
> Mai mare
AN=2 AND PUNCTAJ>500 OR
>= Mai mare sau egal CODS=11
< Mai mic AN=2 AND (PUNCTAJ>500 OR
<= Mai mic sau egal
<> Diferit
CODS=11)
!= Diferit
^= Diferit
3
Florin Radulescu - Baze de date (note de curs)
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
Sfarsitul capitolului
“Cereri SELECT pe o tabela”
7
Florin Radulescu - Baze de date (note de curs)
STUD
SQL - 2 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
CERERI SELECT PE MAI 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
MULTE TABELE 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24
JOIN SINTAXA
Operaţia care permite astfel de regăsiri se SELECT [DISTINCT] lista_de_expresii
numeşte join (termen preluat din limba FROM lista_de_tabele
WHERE conditie_de_join
engleză) şi este realizată prin intermediul unei
AND conditii_suplimentare
cereri SELECT având următoarele
. . .
caracteristici:
-- alte clauze: GROUP BY, HAVING, ORDER
În clauza FROM este specificată nu doar o BY
singură tabelă ci o listă de tabele.
În clauza WHERE există o condiţie care să
coreleze liniile tabelelor din lista FROM
(condiţie numită şi condiţie de join).
F. Radulescu. Curs: Baze de date - 5 F. Radulescu. Curs: Baze de date - 6
Limbajul SQL Limbajul SQL
1
Florin Radulescu - Baze de date (note de curs)
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
JOIN .. ON EXEMPLU
Prin această clauză se implementează Exemplu: cererea următoare efectuează
un join general. Condiţia de join (şi joinul dintre STUD şi SPEC după coloana
eventual şi condiţiile suplimentare) se CODS şi conţine şi o linie suplimentară care
opreşte doar liniile corespunzătoare
pun la ON. Sintaxa este: studenţilor născuţi în PLOIEŞTI.
Această condiţie suplimentară se putea pune
SELECT [DISTINCT] lista_de_expresii
şi pe clauza WHERE.
FROM tabela1 SELECT S.NUME, DATAN, F.NUME, DOMENIU
JOIN tabela2 ON (expresie_logica) FROM STUD S
JOIN SPEC F ON (S.CODS=F.CODS AND
LOC='PLOIESTI');
F. Radulescu. Curs: Baze de date - 41 F. Radulescu. Curs: Baze de date - 42
Limbajul SQL Limbajul SQL
7
Florin Radulescu - Baze de date (note de curs)
RIGHT … FULL …
În cazul RIGHT OUTER JOIN valorile nule provin În cazul RIGHT OUTER JOIN valorile nule provin
din tabela1. Cererea: din tabela1. Cererea:
SELECT S.NUME "NUME STUD", S.AN "AN STUD", SELECT S.NUME "NUME STUD", S.AN "AN STUD",
T.NUME "NUME TUTOR", T.AN "AN TUTOR" T.NUME "NUME TUTOR", T.AN "AN TUTOR"
FROM STUD S FROM STUD S
RIGHT OUTER JOIN STUD T RIGHT OUTER JOIN STUD T
ON (S.TUTOR=T.MATR); ON (S.TUTOR=T.MATR);
returnează 13 linii şi este echivalentă cu: returnează 13 linii şi este echivalentă cu:
SELECT S.NUME "NUME STUD", S.AN "AN STUD", SELECT S.NUME "NUME STUD", S.AN "AN STUD",
T.NUME "NUME TUTOR", T.AN "AN TUTOR" T.NUME "NUME TUTOR", T.AN "AN TUTOR"
FROM STUD S, STUD T FROM STUD S, STUD T
WHERE S.TUTOR(+)=T.MATR; WHERE S.TUTOR(+)=T.MATR;
8
Florin Radulescu - Baze de date (note de curs)
OBSERVATIE
In Oracle o condiţie de tipul:
9
Florin Radulescu - Baze de date (note de curs)
STUD
SQL - 3 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
FUNCTII STATISTICE SI 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
GRUPURI 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24
1
Florin Radulescu - Baze de date (note de curs)
EXEMPLU SUM
SELECT 'MATEMATICA' FACULTATE, Sintaxa funcţiei:
MIN(SUMA) MINIM, MAX(SUMA) MAXIM
SUM([ ALL | DISTINCT ] expresie)
FROM STUD, SPEC, BURSA
WHERE STUD.PUNCTAJ BETWEEN PMIN AND
Descriere:
PMAX AND SUM(expresie) întoarce suma valorilor
STUD.CODS = SPEC.CODS AND SPEC.NUME = nenule ale expresiei, fiecare valoare
'MATEMATICA' fiind calculată pe baza unei linii din
Rezultatul obţinut va avea o singură parcurgerea curentă.
linie având conţinutul: SUM(DISTINCT expresie) face acelaşi
MATEMATICA 150 300 lucru ignorând însă valorile duplicat.
F. Radulescu. Curs: Baze de date - 9 F. Radulescu. Curs: Baze de date - 10
Limbajul SQL Limbajul SQL
AVG EXEMPLU
Sintaxa funcţiei: Cererea care calculeaza sume si medii
AVG([ ALL | DISTINCT ] expresie) ale burselor studentilor de la ISTORIE:
Descriere: SELECT 'ISTORIE' FACULT,
SUM(SUMA) SUM1, SUM(DISTINCT SUMA) SUM2,
AVG(expresie) întoarce media AVG(SUMA) AVG1, AVG(DISTINCT SUMA) AVG2
aritmetică a valorilor nenule ale FROM STUD, SPEC, BURSA
expresiei. WHERE STUD.PUNCTAJ BETWEEN PMIN AND PMAX AND
STUD.CODS = SPEC.CODS AND SPEC.NUME='ISTORIE'
AVG(DISTINCT expresie) ignora valorile
duplicat.
F. Radulescu. Curs: Baze de date - 11 F. Radulescu. Curs: Baze de date - 12
Limbajul SQL Limbajul SQL
2
Florin Radulescu - Baze de date (note de curs)
REZULTAT COUNT
FACULT SUM1 SUM2 AVG1 AVG2 Sintaxa funcţiei:
------- ----- ----- ----- ----- COUNT(*)
ISTORIE 650 550 162.5 183.3 COUNT([ ALL | DISTINCT] expresie)
Descriere:
După cum se observă, suma şi media sunt
COUNT(*) întoarce numărul de linii pe baza cărora se
diferite pentru considerarea sau ignorarea calculează rezultatul => nu se poate adăuga
valorilor duplicat: DISTINCT sau nu se poate vorbi de valori nule
650 = 100 + 100 + 150 + 300 COUNT(expresie) întoarce numărul de valori nenule
ale expresiei.
550 = 100 + 150 + 300
COUNT(DISTINCT expresie) întoarce numărul de
162.5 = 650 / 4 valori nenule şi distincte ale expresiei.
183.3 = 550 / 3
F. Radulescu. Curs: Baze de date - 13 F. Radulescu. Curs: Baze de date - 14
Limbajul SQL Limbajul SQL
EXEMPLU REZULTAT
Tot pentru ISTORIE se doreste numărului FACULT NRSTUD BURSIERI BURSE
studentilor, numărul de bursieri şi numărul de ------- ------ -------- -----
valori diferite ale sumei primite ca bursă. ISTORIE 5 4 3
Cererea este:
SELECT 'ISTORIE' FACULT,COUNT(*) NRSTUD,
COUNT(SUMA) BURSIERI,
Într-adevăr, sunt 5 studenţi, doar 4 au
COUNT(DISTINCT SUMA) BURSE
FROM STUD, SPEC, BURSA bursa nenulă şi sunt trei valori distincte
WHERE STUD.PUNCTAJ BETWEEN PMIN AND PMAX pentru aceasta: 100, 150 şi 300.
AND STUD.CODS = SPEC.CODS – cond.join
AND SPEC.NUME='ISTORIE';
3
Florin Radulescu - Baze de date (note de curs)
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
Sfarsitul capitolului
FUNCTII STATISTICE SI
GRUPURI
7
Florin Radulescu - Baze de date (note de curs)
STUD
SQL - 4 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
SUBCERERI 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
2101 MARIUS 1 2412B 02-SEP-85 PITESTI 3514 310 24
4705 VOICU 2 2421B 19-APR-84 BRASOV 4311 1290 24
1
Florin Radulescu - Baze de date (note de curs)
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
EXEMPLU REZULTAT
Cererea din exemplul următor afişează lista Rezultatul va conţine datele pentru doi
tuturor studenţilor de la specializarea cu
codul 21 care sunt tutori ai altor studenţi.
studenţi:
NUME CODS
Pentru a fi tutor, matricola studentului trebuie ---------- -----
să aparţină mulţimii valorilor aflate pe STANCA 21
coloana TUTOR din tabela STUD calculată cu ALEX 21
ajutorul subcererii:
SELECT NUME, CODS Observaţie: NOT IN returnează
FROM STUD întotdeauna valoarea fals în cazul în
WHERE MATR IN (SELECT TUTOR FROM STUD) care mulţimea conţine valori nule.
AND CODS = 21;
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
EXEMPLU OBSERVATIE
Pentru a afla care sunt studenţii cu cel mai mare Observaţie: Din cauza faptului că două valori
punctaj de la fiecare specializare, cererea este
următoarea: nule nu sunt egale între ele un cuplu de tipul
SELECT NUME, PUNCTAJ, CODS (NULL, valoare) nu va fi considerat egal cu el
FROM STUD însuşi.
WHERE (CODS, PUNCTAJ) IN
(SELECT CODS, MAX(PUNCTAJ) Din acest motiv, cererea următoare nu va
FROM STUD returna date despre studenţii care nu au un
GROUP BY CODS); tutor asociat (au o valoare nulă pe această
Codiţia va fi adevărată dacă punctajul studentului coloană) deşi în aparenţă condiţia ar trebui să
este egal cu un punctaj maxim întors de subcerere şi
în acelaşi timp codul specializării este al celei pentru fie adevărată pentru orice student al
care s-a calculat maximul respectiv. specializării având codul 11:
F. Radulescu. Curs: Baze de date - 31 F. Radulescu. Curs: Baze de date - 32
Limbajul SQL Limbajul SQL
EXEMPLU REZULTATE
MATR NUME CODS TUTOR
----- ---------- ----- -----
SELECT MATR, NUME, CODS, TUTOR 1325 VASILE 11 1456
FROM STUD
WHERE (MATR, NUME, CODS, TUTOR) IN deşi rezultatul subcererii (executată separat)
(SELECT MATR, NUME, CODS, TUTOR este următorul:
FROM STUD MATR NUME CODS TUTOR
WHERE CODS = 11); ----- ---------- ----- -----
1456 GEORGE 11
1325 VASILE 11 1456
1645 MARIA 11
F. Radulescu. Curs: Baze de date - 33 F. Radulescu. Curs: Baze de date - 34
Limbajul SQL Limbajul SQL
6
Florin Radulescu - Baze de date (note de curs)
7
Florin Radulescu - Baze de date (note de curs)
Descrierea modului de evaluare în astfel de situaţii va Pentru fiecare linie a tabelei STUD valoarea de pe
fi făcută pe baza următorului exemplu care afişează coloana CODS - codul specializării - va fi transmisă
date despre studenţii care au un punctaj peste media subcererii (S.CODS).
celor din specializarea lor. Se execută subcererea care calculează punctajul
Deoarece şi cererea şi subcererea lucrează pe aceeaşi mediu pentru studenţii de la specializarea respectivă
tabelă, se foloseşte aliasul de tabelă S pentru a (AVG şi condiţia CODS = S.CODS).
specifica parcurgerea principală (cea din cerere). Rezultatul subcererii este folosit în cerere pentru a
SELECT NUME, CODS, PUNCTAJ filtra sau nu linia curentă (condiţia PUNCTAJ >
FROM STUD S rezultat subcerere).
WHERE PUNCTAJ > (SELECT AVG(PUNCTAJ) FROM Teoretic subcererea nu se mai execută o singură dată
STUD WHERE CODS = S.CODS); ci pentru fiecare linie din parcurgerea specificată de
cererea în care este inclusă.
EXEMPLU OBSERVATII
Numele, codul şi numărul total de studenţi pentru În cazul în care subcererea corelată se află pe clauza
specializările la care este înmatriculat cel puţin un WHERE ea poate primi valoarea de pe orice coloană
student de anul 1. : a tabelei/produsului cartezian din cererea
SELECT SP.NUME, ST.CODS, COUNT(*) înconjurătoare.
FROM STUD ST, SPEC SP În cazul în care subcererea corelată este pe clauza
WHERE ST.CODS = SP.CODS HAVING poate primi doar coloanele/expresiile după
care s-a facut gruparea.
GROUP BY SP.NUME, ST.CODS
Subcererile corelate pot returna o valoare, o coloană
HAVING 1 <= (SELECT COUNT(*) sau o tabelă, ca şi cele necorelate. În cazul în care
FROM STUD returnează o coloană sau o tabelă se poate folosi
WHERE CODS = ST.CODS AND operatorul IN. Sunt permişi de asemenea operatorii
AN = 1); SOME/ANY şi ALL.
8
Florin Radulescu - Baze de date (note de curs)
9
Florin Radulescu - Baze de date (note de curs)
EXEMPLU
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD
WHERE CODS = 11 AND PUNCTAJ > 2000
UNION
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD Sfarsitul capitolului
WHERE CODS = 21 AND LOC = 'BUCURESTI'
UNION
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD
SUBCERERI
WHERE CODS = 24 AND PUNCTAJ >1500
INTERSECT
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD
WHERE PUNCTAJ >= 700
ORDER BY LOC DESC, 4;
10
Florin Radulescu - Baze de date (note de curs)
STUD
SQL - 5 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
CREAREA TABELELOR 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
- Partea 1 - 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24
1
Florin Radulescu - Baze de date (note de curs)
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
OBSERVAM CA:
Crearea unei tabele în care se stochează date COD: un număr întreg de maxim 10 cifre,
MOMENT ÎNCEPUT: conţine momentul începutului
despre evenimente: momentul de început, unui eveniment în forma: data, ora, minutul, secunda
durata şi o descriere a acestora. şi miimile de secundă: TIMESTAMP(3) arată că
CREATE TABLE EVENIMENT( fracţiunile de secundă sunt memorate cu 3 zecimale.
Numele coloanei conţine un spaţiu şi a trebuit pus
COD NUMBER(10), între ghilimele.
"MOMENT INCEPUT" TIMESTAMP(3) WITH LOCAL DURATA: durata evenimentului în zile, ore, minute,
TIME ZONE, secunde şi fracţiuni de secundă. Numărul de zile
poate avea maxim 2 cifre iar numărul de secunde
DURATA INTERVAL DAY(2) TO SECOND(3), maxim 3 zecimale.
"DESCRIERE (PE LARG)" LONG); DESCRIERE (PE LARG): conţine un text de descriere
a evenimentului care poate avea până la 2 GB
caractere. Se folosesc ghilimelele pentru că numele
coloanei conţine spaţii şi paranteze.
F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
OBIECTIV CONSTRANGERI
Scopul acestui capitol este de a prezenta Constrângerile de integritate reprezintă reguli pe care
elementele limbajului pentru descrierea valorile conţinute într-o tabelă trebuie să le respecte.
datelor (DDL) referitoare la: Ele previn introducerea de date eronate în baza de
Tipurile de date permise pentru coloanele date şi definesc forma corectă a valorilor respective
tabelelor, dar nu iau în consideraţie semnificaţia acestora.
Crearea de noi tabele, Constrângerile de integritate sunt verificate automat
de sistemul de gestiune atunci când au loc operaţii de
Constrângeri de integritate, modificare a conţinutului tabelelor (adăugare,
Modificarea structurii unei tabele, ştergere şi modificare linii).
Modificarea şi activarea constrângerilor de În cazul în care noile valori nu sunt valide operaţia de
integritate, modificare este rejectată de sistem şi se generează o
Dicţionarul de date al sistemului. eroare.
6
Florin Radulescu - Baze de date (note de curs)
7
Florin Radulescu - Baze de date (note de curs)
EXEMPLUL 2 CE E UNIC?
În tabela BURSA nu pot exista două burse cu aceeaşi
În cazul în care o cheie definită cu UNIQUE conţine
sumă. Cererea de creare anterioară devine:
mai multe coloane, verificarea se face astfel:
CREATE TABLE BURSA(
nu există două linii care au aceleaşi valori nenule
PMIN NUMBER(4), pentru toate coloanele cheii.
PMAX NUMBER(4), nu există două linii care au aceleaşi valori nenule
TIP VARCHAR2(20), pentru unele coloane ale cheii şi valori nule în rest.
SUMA NUMBER(4) CONSTRAINT SUMA_UNICA Exemplu: În cazul unei tabele NUMERE creată cu
UNIQUE, cererea:
CONSTRAINT BURSA_PK PRIMARY KEY(PMIN, CREATE TABLE NUMERE(
PMAX)); NUMAR1 NUMBER(4),
NUMAR2 NUMBER(4),
În acest caz în tabelă nu pot exista două linii care conţin
aceeaşi valoare nenulă pe coloana SUMA dar pot exista UNIQUE(NUMAR1, NUMAR2));
oricâte linii cu valori nule pe această coloană.
F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48
8
Florin Radulescu - Baze de date (note de curs)
SINTAXA
La nivel de coloană: În cazul tabelei STUD avem două coloane
coloana [CONSTRAINT nume_constrangere] care pot avea asociată o astfel de
REFERENCES tabela(coloana) constrângere:
[ON DELETE CASCADE | Coloana CODS poate fi constrânsă să conţină doar
ON DELETE SET NULL] valori ale cheii primare a tabelei SPEC (formată
La nivel de tabelă: dintr-o coloană cu acelaşi nume - CODS).
[,CONSTRAINT nume_constrangere] FOREIGN Coloana TUTOR poate fi constrânsă să conţină
KEY(lista_coloane) doar valori nenule ale cheii primare a lui STUD -
MATR.
REFERENCES tabela(lista_coloane)
[ON DELETE CASCADE | În acest caz cererea anterioara de creare
ON DELETE SET NULL] pentru STUD devine:
9
Florin Radulescu - Baze de date (note de curs)
STUD: OBSERVATII
CREATE TABLE STUD( În cazul în care tabela SPEC nu există încă
MATR NUMBER(4) PRIMARY KEY, sistemul va semnala eroarea: ORA-00942: table
NUME VARCHAR2(10), or view does not exist
AN NUMBER(1) DEFAULT 1, În cazul în care tabela SPEC există dar nu are
GRUPA VARCHAR2(6), cheia CODS se semnalează eroarea: ORA-02270:
DATAN DATE, no matching unique or primary key for this
LOC VARCHAR2(10) DEFAULT 'BUCURESTI', column-list
TUTOR NUMBER(4) REFERENCES STUD(MATR),
După crearea lui STUD, dacă se încearcă
PUNCTAJ NUMBER(4) DEFAULT 0,
ştergerea tabelei SPEC se semnalează eroarea:
CODS NUMBER(2), ORA-02449: unique/primary keys în table
CONSTRAINT CODS_FK FOREIGN KEY(CODS) referenced by foreign keys
REFERENCES SPEC(CODS));
10
Florin Radulescu - Baze de date (note de curs)
CHECK SINTAXA
Prin acest tip de constrângeri valorile aflate pe o linie a
tabelei sunt forţate să verifice o condiţie (expresie logică). La nivel de coloană:
Aceasta poate conţine toate elementele prezentate
anterior pentru conditii, inclusiv apeluri de funcţii, cu coloana [CONSTRAINT nume_constrangere]
câteva excepţii: CHECK (expresie_logica)
apelurile unor funcţii ca SYSDATE, USER, UID
referinţa la pseudocoloanele NEXTVAL, CURRVAL La nivel de tabelă:
(specifice secvenţelor), LEVEL şi ROWNUM)
subcereri. [,CONSTRAINT nume_constrangere]
O aceeaşi coloană poate participa la mai multe CHECK (expresie_logica)
constrângeri de acest tip, având fiecare o altă condiţie
asociată.
Condiţia se evaluează doar la nivelul liniei respective, fără
a se putea lua în considerare valori aflate pe alte linii ale
tabelei.
11
Florin Radulescu - Baze de date (note de curs)
EXEMPLU – cont.
CREATE TABLE BURSA(
PMIN NUMBER(4), PMAX NUMBER(4),
TIP VARCHAR2(20),
SUMA NUMBER(4),
Sfarsitul partii 1 din capitolul
CONSTRAINT BURSA_CK CHECK (PMIN < PMAX
AND PMIN >= 0 AND PMAX >= 0 AND SUMA
BETWEEN 0 AND 500)); CREAREA TABELELOR
12
Florin Radulescu - Baze de date (note de curs)
STUD
SQL - 6 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
CREAREA TABELELOR 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
- Partea 2 - 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24
1
Florin Radulescu - Baze de date (note de curs)
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
7. ACTIVARE/DEZACTIVARE
EFECT
CONSTRANGERE DISABLE specifică dezactivarea constrângerii de
integritate respective.
Sintaxa: Dezactivare:
ALTER TABLE nume_tabela DISABLE PRIMARY KEY Opţiunea CASCADE duce la dezactivarea
[CASCADE] suplimentară a tuturor constrângerilor dependente.
ALTER TABLE nume_tabela
DISABLE UNIQUE(lista_coloane) [CASCADE] ENABLE CONSTRAINT specifică reactivarea
ALTER TABLE nume_tabela DISABLE CONSTRAINT constrângerii respective.
nume
[CASCADE] În momentul reactivării sistemul verifică dacă datele
la care se referă constrângerea sunt conforme cu
Reactivare: aceasta.
ALTER TABLE nume_tabela ENABLE PRIMARY KEY;
ALTER TABLE nume_tabela ENABLE
În cazul în care nu se constată respectarea
UNIQUE(lista_coloane); constrângerii, ea nu este activată şi se generează un
ALTER TABLE nume_tabela ENABLE CONSTRAINT mesaj de eroare. În caz de activare cu succes,
nume; constrângerile dependente nu sunt reactivate.
F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
EXEMPLE USER_CATALOG
Prezentarea tuturor acestor vederi nu face utilizator. Are doar două coloane, prima conţinând
obiectul lucrării de faţă. numele şi al doilea tipul obiectului. O parte a
conţinutului acestei tabele, obţinut cu cererea SQL:
În continuare sunt prezentate câteva dintre SELECT * FROM USER_CATALOG;
cele mai importante, legate mai ales de este următorul:
inventarul de tabele şi constrângeri de TABLE_NAME TABLE_TYPE
integritate existent la un moment dat în ---------------- -----------
sistem: BURSA TABLE
USER_CATALOG EVENIMENT TABLE
NUMERE TABLE
USER_OBJECTS SPEC TABLE
USER_CONSTRAINTS STUD TABLE
USER_CONS_COLUMNS
USER_OBJECTS USER_CONSTRAINTS
Conţine numele, tipul şi alte informaţii despre Conţine date despre constrângerile definite
obiectele deţinute de utilizator, inclusiv de utilizator. Dintre coloanele sale
indecşi. menţionăm:
Informaţii sumare despre conţinutul vederii CONSTRAINT_NAME : Numele constrângerii
se pot obţine cu cererea: CONSTRAINT_TYPE: Tipul acesteia, codificat pe
SELECT OBJECT_NAME, OBJECT_TYPE un caracter: P: cheie primară, U: cheie (UNIQUE),
R pentru integritatea referenţială şi C pentru
FROM USER_OBJECTS;
constrângerile CHECK (aici sunt incluse şi cele de
Rezultatul include rezultatul obţinut în urma tip NOT NULL)
cererii anterioare (USER_CATALOG). SEARCH_CONDITION: Condiţia asociată
constrângerii
F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36
6
Florin Radulescu - Baze de date (note de curs)
EXEMPLU USER_CONS_COLUMNS
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, Conţine informaţii despre coloanele care sunt implicate în
SEARCH_CONDITION constrângerile de integritate. Cererea următoare afişează
FROM USER_CONSTRAINTS; perechi (nume constrângere, nume coloană implicată) pentru
constrângerea BURSA_CK:
Rezultat: SELECT CONSTRAINT_NAME, COLUMN_NAME
CONSTRAINT_NAME C SEARCH_CONDITION FROM USER_CONS_COLUMNS
------------------------ - ---------------------- WHERE CONSTRAINT_NAME = 'BURSA_CK';
BURSA_CK C PMIN < PMAX AND PMIN >= 0
AND PMAX >= 0 AND SUMA
Rezultatul este:
BETWEEN 0 AND 500 CONSTRAINT_NAME COLUMN_NAME
DOM_NENUL U ------------------------ --------------------
DOM_5 C LENGTH(NUME)>5 BURSA_CK PMIN
NUME_NENUL C NUME IS NOT NULL BURSA_CK PMAX
BURSA_CK SUMA
7
Florin Radulescu - Baze de date (note de curs)
STUD
SQL - 6 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
ACTUALIZAREA 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
DATELOR 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24
1
Florin Radulescu - Baze de date (note de curs)
2
Florin Radulescu - Baze de date (note de curs)
EXPRESII SUBCERERI
In acest caz valoarea expresiei trebuie să fie Rezultatul unei subcereri necolelate care
compatibilă cu tipul coloanei. întoarce o singură valoare poate fi folosit
Expresiile pot conţine operatori şi funcţii. în lista de valori a cererii INSERT.
Exemplu: următoarea cerere de inserare este Exemplu: cererea:
validă: INSERT INTO SPEC(CODS)
INSERT INTO STUD (MATR, NUME, DATAN,
VALUES ((SELECT MAX(CODS) FROM SPEC)+1);
CODS) VALUES (1200+15, 'ION ' ||
'DOBRE', SYSDATE, 24); va insera o specializare având codul 25 (în
Valorile inserate vor fi: 1215 , 'ION DOBRE', cazul în care valoarea maximă pe
data curentă şi 24. coloana CODS este 24).
F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14
DELETE EXEMPLE
Sintaxa cererii care efectuează ştergerea unor Exemplul 1: dacă se doreşte ştergerea tuturor
linii dintr-o tabelă este următoarea: studenţilor specializării cu codul 11 cererea este:
DELETE FROM tabela DELETE FROM STUD WHERE CODS = 11;
[WHERE conditie] Exemplul 2: ştergerea liniilor corespunzătoare
studenţilor cu cel mai mic punctaj din fiecare
În clauza WHERE pot să apară aceleaşi specializare se face cu cererea:
elemente ca şi în cazul cererilor SELECT (deci DELETE FROM STUD
inclusiv subcereri). WHERE MATR IN
Efectul cererii este ştergerea tuturor liniilor (SELECT MATR FROM STUD
pentru care condiţia este verificată. WHERE (CODS, PUNCTAJ) IN
În cazul absenţei clauzei WHERE se şterg (SELECT CODS, MIN(PUNCTAJ)
toate liniile tabelei. FROM STUD GROUP BY CODS));
F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18
3
Florin Radulescu - Baze de date (note de curs)
UPDATE
OBSERVATIE Sintaxa cererii de actualizare (modificare) a valorilor dintr-o
tabelă este:
Stergerea nu se va efectua şi va UPDATE tabela
SET coloana1 = expresie1 [,
semnala o eroare dacă una dintre liniile coloana2=expresie2, ...]
[WHERE conditie];
care îndeplinesc condiţia conţine o cheie Efectul este următorul:
referită printr-o constrângere de tip În WHERE pot să apară aceleaşi elemente ca şi în cazul
cererilor SELECT,
FOREIGN KEY într-o tabelă din baza de Toate liniile care îndeplinesc condiţia din WHERE vor fi
actualizate conform cu specificaţiile din SET. În cazul
date. absenţei clauzei WHERE, toate liniile tabelei vor fi
actualizate,
Expresiile din clauza SET se evaluează pornind de la
valorile conţinute în linia care se modifică şi ele trebuie să
aibă un tip compatibil cu al coloanelor asociate,
O aceeaşi coloană nu poate apare de două ori în clauza
SET.
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
U1/t1: UPDATE NRSTUD SET NRSTUD = 0; U1/t1: UPDATE NRSTUD SET NRSTUD = 0;
U1/t2: SELECT * FROM NRSTUD; U1/t2: SELECT * FROM NRSTUD;
U2/t3: SELECT * FROM NRSTUD; U2/t3: SELECT * FROM NRSTUD;
U3/t4: UPDATE NRSTUD SET CODS = CODS + 1; U3/t4: UPDATE NRSTUD SET CODS = CODS + 1;
U1/t5: COMMIT; U1/t5: COMMIT;
U2/t6: SELECT * FROM NRSTUD; U2/t6: SELECT * FROM NRSTUD;
La momentul t1, U1 execută o actualizare a La momentul t3, U2 afişează de asemenea conţinutul
tabelei NRSTUD. Datele afişate vor conţine vechile
datelor, aducând la 0 valorile de pe coloana valori din coloana NRSTUD (diferite de 0), cele
NRSTUD. Noile valori nu sunt încă modificate fiind disponibile decat pentru U1.
permanente, fiind vizibile doar pentru U1. La momentul t4, U3 lansează o cerere de actualizare
pe tabela NRSTUD. Deoarece U1 nu a comis sau
În acelaşi timp sistemul blochează liniile revocat încă modificările, cererea lui U3 intră în
modificate, ele fiind accesibile pentru scriere aşteptare, liniile necesare fiind blocate de sistem.
doar pentru U1. La momentul t5 U1 comite modificările. Ele devin
permanente iar liniile blocate din NRSTUD sunt
La momentul t2, U1 afişează datele. deblocate. În consecinţă se execută şi cererea lui U3
Rezultatul conţine valorile modificate. care fusese plasată în aşteptare.
7
Florin Radulescu - Baze de date (note de curs)
8
Florin Radulescu - Baze de date (note de curs)
SAVEPOINT EXEMPLU
În sistemul Oracle există şi posibilitatea ca o tranzacţie să
fie revocată parţial.
Pentru asta însă trebuiesc setate puncte de revenire cu
Fie următoarea succesiune de cereri SQL,
cererea SAVEPOINT. Sintaxa aferentă acestor operaţii este executate imediat după intrarea într-o
următoarea: sesiune de lucru SQL*Plus.
SAVEPOINT nume; INSERT INTO SPEC ...
ROLLBACK TO [SAVEPOINT] nume; SAVEPOINT P1;
SAVEPOINT nume: specifică definirea unui punct de UPDATE STUD ...
revenire, având asociat un nume. Pe cuprinsul execuţiei unei
tranzacţii se pot fixa mai multe astfel de puncte. SAVEPOINT P2
ROLLBACK TO nume: specifică revocarea tuturor DELETE SPEC ...
modificărilor efectuate după fixarea punctului de revenire cu
numele respectiv. Modificările efectuate înainte de acest ROLLBACK TO P2
punct rămân şi nu sunt revocate. Ele pot fi comise sau INSERT INTO STUD ...
revocate ulterior, revocarea putând fi de asemenea parţială.
În acelaşi timp, toate punctele de revenire fixate ulterior ROLLBACK TO P1;
celui în cauză se pierd. CREATE TABLE ...
Tranzacţia începe cu o inserare în tabela Se execută o inserare în tabela STUD. Ulterior
SPEC. După efectuarea acesteia se fixează însă se revine în punctul P1. Sunt revocate astfel
punctul de revenire P1. efectele inserării şi actualizării tabelei STUD.
Se execută o actualizare a tabelei STUD şi Ultima cerere din exemplu este un CREATE.
fixarea punctului de revenire P2. Înainte de execuţia sa sunt comise modificările
executate de tranzacţie. Singura cerere DML care
Se execută o ştergere de linii din SPEC. încă nu a fost revocată este prima inserare în
Urmează însă o revenire la punctul P2 care SPEC şi va fi singura comisă.
anulează efectele acestei ştergeri. Se execută CREATE care fiind cerere DDL se
comite automat.
F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52
CONCLUZII
Mecanismele de tranzacţie şi blocările
implicite puse la dispoziţie de sistem
permit asigurarea consistenţei bazei de Sfarsitul capitolului
date în contextul operării concurente cu
aceleaşi date. ACTUALIZAREA
Pe lângă blocările implicite, Oracle pune DATELOR
la dispoziţia utilizatorilor şi mecanisme
de blocare explicită care nu fac obiectul
lucrării de faţă.
F. Radulescu. Curs: Baze de date 53 F. Radulescu. Curs: Baze de date 54
9
Florin Radulescu - Baze de date (note de curs)
STUD
SQL - 7 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
ALTE OBIECTE ALE 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
BAZEI DE DATE 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24
1
Florin Radulescu - Baze de date (note de curs)
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
4
Florin Radulescu - Baze de date (note de curs)
OBSERVATII OBIECTE
Operaţiile de modificare a conţinutului
tabelelor prin intermediul vederilor definite pe
baza lor trebuie să respecte toate vederi,
constrângerile de integritate ale acestora. secvenţe,
De exemplu:
nu se poate şterge o linie printr-o vedere dacă ea
indecşi
conţine o cheie referită prin FOREIGN KEY, sinonime.
nu se pot insera linii care duplică o valoare de
cheie primară sau
nu se poate actualiza o linie astfel încât o
constrângere de tip CHECK nu mai este verificată.
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
OBIECTE INDECSI
Un index este o structură de căutare rapidă care
poate fi folosită de sistem pentru creşterea vitezei de
vederi, evaluare a cererilor prin faptul că parcurgerea
tabelelor nu se mai face secvenţial, înregistrare cu
secvenţe, înregistrare, ci sunt accesate direct liniile necesare
cererii respective.
indecşi Sistemul Oracle crează automat indecşi de tip unic
sinonime. pentru cheile specificate la crearea tabelei prin
constrângerile PRIMARY KEY şi UNIQUE.
În plus faţă de aceştia se pot crea şi alţii, unici sau
neunici (în acest ultim caz valorile indexate se pot
repeta) prin cererea CREATE INDEX
7
Florin Radulescu - Baze de date (note de curs)
8
Florin Radulescu - Baze de date (note de curs)
SINONIME SINTAXA
Obiectelor din baza de date li se pot asocia nume Cererea de creare a unui sinonim are
alternative - sinonime.
Crearea sinonimelor are ca obiect simplificarea următoarea sintaxă:
operării cu obiectele respective, putând asigura: CREATE [PUBLIC] SYNONYM sinonim
Nume alternative mai sugestive pentru obiecte FOR obiect;
care la creare au primit o denumire criptică.
Nume alternative mai scurte pentru obiecte care Opţiunea PUBLIC specifică faptul că
la creare au primit o denumire lungă. sinonimul este accesibil şi celorlalţi
Nume alternative mai scurte pentru obiectele utilizatori ai sistemului.
create de alţi utilizatori (pentru a fi accesate
acestea trebuie prefixate cu numele utilizatorului
care le deţine).
F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52
9
Florin Radulescu - Baze de date (note de curs)
SINONIM - STERGERE
Ştergerea unui sinonim se face prin
cererea
DROP [PUBLIC] SYNONYM nume_sinonim; Sfarsitul capitolului
PUBLIC se foloseşte pentru ştergerea ALTE OBIECTE ALE BAZEI
sinonimelor create cu această opţiune.
Fiind o comandă DDL, ştergerea unui DE DATE
sinonim nu poate fi revocată cu
ROLLBACK.
10
Florin Radulescu - Baze de date (note de curs)
STUD
SQL - 8 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
TIPURI DE DATE 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
COMPUSE 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24
1
Florin Radulescu - Baze de date (note de curs)
Asemănări Diferenţe
c. Numărul de elemente dintr-o astfel de Diferenţele sunt următoarele:
colecţie poate varia (dar în cazul VARRAY nu a. Numărul maxim de elemente ale tipului TABLE
poate depăşi limita maximă declarată) nu este fixat la descrierea lui, spre deosebire de
d. Elementele unei astfel de colecţii sunt toate VARRAY unde se specifică această limită.
de acelaşi tip de date. b. Indicii elementelor unui VARRAY se păstrează
prin stocarea în baza de date şi regăsirea lui pe
e. Limitările privind tipul elementelor sunt
când în cazul TABLE acest lucru nu este
aceleaşi în cele două cazuri.
adevărat. Din acest motiv tipul TABLE seamănă
cu mulţimile din limbajele de programare Pascal
şi C spre deosebire de tipul VARRAY care este
asemănător cu tablourile.
F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8
Diferenţe Diferenţe
c. În cazul unui VARRAY indicii elementelor sunt e. În cazul TABLE stocarea valorilor se face
succesivi, pornind de la indicele 1, crescător cu într-o aşa numită 'tabelă de stocare' (store
o unitate. La TABLE deşi intiţial indicii table) asociată tabelei de bază.
elementelor sunt succesivi, prin ştergerea unor
elemente pot să apară 'goluri' (operaţia de
ştergere 'din mijloc' nu este posibilă la
VARRAY).
d. Ca stocare fizică în baza de date, datele de tip
VARRAY se memorează fie în interiorul tabelei
(pentru dimensiune mai mică de 4 KB) fie în
spaţiul asociat tabelei (tablespace).
F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10
2
Florin Radulescu - Baze de date (note de curs)
Rezultat Rezultat
MATR NUME CURSURI
Tabela arata acum astfel: ---------- ---------- -----------------------------------
1234 IONESCU LISTACURSURI('Analiza', NULL, NULL,
'Algebra', NULL, 'Fizica', 'Limba engleza')
1456 GEORGE
SELECT matr, nume, cursuri 1325 VASILE
1645 MARIA
3145 ION
FROM stud; 2146 STANCA
3251 ALEX
2215 ELENA
4311 ADRIAN
3514 FLOREA
1925 OANA
2101 MARIUS
4705 VOICU
13 înregistrări selectate.
1 înregistrare actualizată.
3
Florin Radulescu - Baze de date (note de curs)
4
Florin Radulescu - Baze de date (note de curs)
5
Florin Radulescu - Baze de date (note de curs)
VARRAY VARRAY
Adaugarea unei coloane de acest tip la tabela Sau, pentru a crea o tabela noua cu o astfel
STUD: de coloana:
ALTER TABLE stud ADD (cursuri CREATE TABLE Student (
ListaCursuri) id_student NUMBER(4),
nume VARCHAR2(25),
adresa VARCHAR2(35),
cursuri ListaCursuri); -- VARRAY
6
Florin Radulescu - Baze de date (note de curs)
Sfarsitul capitolului
TIPURI DE DATE
COMPUSE
7
Florin Radulescu - Baze de date (note de curs)
STUD
SQL - 9 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
ELEMENTE DE 2146
3251
2215
STANCA
ALEX
ELENA
4 2141A 15-MAY-82 BUCURESTI
5 2153B 07-NOV-81 BRASOV
2 2122A 29-AUG-84 BUCURESTI 2146
620
1570
890
21
21
21
4311 ADRIAN 3 2431A 31-JUL-83 BUCURESTI 450 24
PL/SQL 3514
1925
FLOREA
OANA
5 2452B 03-FEB-81 BRASOV
2 2421A 20-DEC-84 BUCURESTI 4311
3230
760
24
24
2101 MARIUS 1 2412B 02-SEP-85 PITESTI 3514 310 24
4705 VOICU 2 2421B 19-APR-84 BRASOV 4311 1290 24
1
Florin Radulescu - Baze de date (note de curs)
REGULI DE SCRIERE
EXEMPLU Fiecare cerere SQL şi instrucţiune PL/SQL se încheie cu
DECLARE
punct şi virgulă (;)
v_nume VARCHAR2(10); DECLARE, BEGIN şi EXCEPTION nu se termină cu punct şi
BEGIN
virgulă
SELECT NUME După END se pune punct şi virgulă
INTO v_nume Terminarea blocului se face cu punct (.)
FROM SPEC Rularea unui bloc (in SQL*Plus) se face cu / sau r (run) la
WHERE CODS=11; promptul SQL>
DBMS_OUTPUT.PUT_LINE('Specializarea: '|| Ultimul bloc executat poate fi editat (ed in SQL*Plus)
v_nume); În caz de rulare cu succes, după eventualele mesaje
EXCEPTION tipărite de bloc apare:
WHEN OTHERS THEN PL/SQL procedure successfully completed
DBMS_OUTPUT.PUT_LINE('A aparut o In caz de rulare cu eroare netratată, se va afişa codul şi
exceptie'); mesajul de eroare.
END;
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
DOMENIU DE VALABILITATE
ATRIBUTUL %TYPE
Putem defini tipul unei variabile în funcţie de tipul
PENTRU NUME
altei variabile sau a unei coloane de tabelă folosind Un identificator definit într-un bloc este
construcţia:
Variabila%TYPE local acelui bloc şi global în toate
sau subblocurile sale.
Tabela.Coloana%TYPE
Exemplu: În cazul în care un subbloc redefineşte
DECLARE
v_numar NUMBER(5,2); un identificator, în subbloc poate fi
v_altnumar
v_nume
v_numar%TYPE;
stud.nume%TYPE;
folosit doar acesta din urmă.
Notă: Dacă o variabilă este definită pe baza tipului
unei coloane de tip NOT NULL ea nu moşteneşte
acest atribut, putând conţine şi valoarea NULL.
EXEMPLU OPERATORI
DECLARE
a NUMBER; Operator Semnificaţie
b VARCHAR2(10); ** ridicare la putere
*, / înmulţire, împărţire
BEGIN +, -, || adunare, scădere, concatenare
DECLARE =, <, >, <=, >=, <>, !=, comparaţie
a VARCHAR2(20); ~=, ^=,IS NULL, LIKE,
BETWEEN, IN
c NUMBER; NOT negaţie logică
BEGIN AND ŞI logic
-- pot fi folositi a (VARCHAR2(20)), b si c OR SAU logic
END;
-- pot fi folositi a (NUMBER) si b
END;
4
Florin Radulescu - Baze de date (note de curs)
EXEMPLU
DECLARE
v_nr number(2);
CICLURI: LOOP
BEGIN
SELECT cods
INTO v_nr
LOOP
FROM spec
WHERE domeniu='STIINTE EXACTE'; Instructiuni;
dbms_output.put_line('Numarul specializarii este: ‘ ||v_nr);
IF (v_nr=21) then EXIT [WHEN conditie]; --
dbms_output.put_line('Este 21');
ELSIF v_nr < 21 then
dbms_output.put_line('Mai mic decat 21');
iesire din ciclu
ELSE
dbms_output.put_line('Mai mare decat 21'); Instructiuni;
END IF;
EXCEPTION END LOOP;
WHEN no_data_found THEN
dbms_output.put_line('Nu exista');
WHEN too_many_rows THEN
dbms_output.put_line('Sunt mai multe');
WHEN others THEN
dbms_output.put_line('Eroare nespecificata');
END;
5
Florin Radulescu - Baze de date (note de curs)
LOOP: EXEMPLU
DECLARE
v_contor number(2) :=6;
v_dom varchar2(20);
v_cods number; v_nume varchar2(10); CICLURI: FOR
BEGIN
LOOP
BEGIN
SELECT cods, nume, domeniu
INTO v_cods, v_nume, v_dom FOR contor IN [REVERSE] val_init..val_fin LOOP
FROM spec
WHERE cods=v_contor; Instructiuni PL/SQL si cereri SQL;
dbms_output.put_line('Cod '|| v_contor|| ' nume '||v_nume||
' domeniu '||v_dom); END LOOP;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('Nu exista codul '||
v_contor);
END; -- pentru subbloc
v_contor := v_contor + 5;
EXIT when v_contor > 40;
END LOOP;
EXCEPTION
WHEN others THEN
dbms_output.put_line('Exceptie');
END;
WHILE: EXEMPLU
DECLARE
v_contor number(2) :=6; v_cods number;
ALEGERE: CASE
v_nume varchar2(10); v_dom varchar2(20);
BEGIN
WHILE v_contor <=40 LOOP
CASE expresie
BEGIN
SELECT cods, nume, domeniu WHEN 'val1' THEN
INTO v_cods, v_nume, v_dom
FROM spec Instructiuni1;
WHERE cods=v_contor;
dbms_output.put_line('Cod '|| v_contor||
' nume '||v_nume||' domeniu '||v_dom);
WHEN 'val2' THEN
EXCEPTION
WHEN no_data_found THEN Instructiuni2;
dbms_output.put_line('Nu exista codul '||
6
Florin Radulescu - Baze de date (note de curs)
7
Florin Radulescu - Baze de date (note de curs)
%ROWTYPE EXCEPTII
Sintaxa: În cazul sistemelor de gestiune a bazelor de date
nume_variabila nume_tabela%ROWTYPE; erorile (dar nu numai) sunt numite şi excepţii.
Exemplu: Un bloc PL/SQL poate conţine între EXCEPTION şi
DECLARE END instrucţiuni care să trateze :
v_student stud%ROWTYPE; erorile returnate de serverul Oracle sau uneltele
BEGIN Oracle
SELECT *
situaţii definite de utilizator (excepţii definite de
INTO v_student
utilizator).
FROM stud WHERE matr=1456;
v_student.nume := 'MARCEL'; Excepţiile pot avea asociat un nume (identificator).
v_student.punctaj := 1400; Unele dintre aceste nume sunt predefinite (pentru o
. . . parte dintre erorile returnate de server sau unelte).
END;
8
Florin Radulescu - Baze de date (note de curs)
SINTAXA
EXEMPLU – cont. DECLARE
. . . .
DECLARE BEGIN
v_nume varchar2(10); . . . .
EXCEPTION
BEGIN
WHEN exceptie_11 OR exceptie_12 . . .THEN
SELECT nume INTO v_nume FROM stud instructiuni_1
WHERE cods>20; [WHEN exceptie_21 OR exceptie_22 . . . THEN
EXCEPTION instructiuni_2]
WHEN NO_DATA_FOUND THEN . . . . . .
[WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Nu exista date'); Instructiuni_others]
WHEN TOO_MANY_ROWS THEN END;
DBMS_OUTPUT.PUT_LINE('Mai multe linii'); unde:
WHEN OTHERS THEN exceptie_xy: identificatorul unei excepţii
DBMS_OUTPUT.PUT_LINE('Alta exceptie'); instructiuni_x: instrucţiuni PL/SQL sau cereri SQL = TRATARE
EXCEPTIE
END;
instructiuni_others Tratare orice alta exceptie.
9
Florin Radulescu - Baze de date (note de curs)
NON-PREDEFINITE EXEMPLU
DECLARE
Reprezintă alte erori returnate de v_nume VARCHAR2(10);
Oracle, în afara celor predefinite. v_numar NUMBER;
eroare_grupare EXCEPTION;
Aceste erori se pot trata în două PRAGMA EXCEPTION_INIT(eroare_grupare, -979);
BEGIN
moduri: SELECT NUME, COUNT(*) INTO v_nume, v_numar
FROM STUD GROUP BY CODS;
Prin folosirea lui WHEN OTHERS EXCEPTION
Prin declararea excepţiei (i se dă un nume) WHEN eroare_grupare THEN
DBMS_OUTPUT.PUT_LINE('Eroare grupare');
şi asocierea unui cod de eroare Oracle în WHEN OTHERS THEN
zona DECLARE şi tratarea ei în zona DBMS_OUTPUT.PUT_LINE('Alta exceptie');
END;
EXCEPTION.
F. Radulescu. Curs: Baze de date 57 F. Radulescu. Curs: Baze de date 58
10
Florin Radulescu - Baze de date (note de curs)
EXCEPTII UTILIZATOR -
EXEMPLU
DECLARE
SINTEZA
prea_putini EXCEPTION; v_nrstud NUMBER;
BEGIN Se declară în zona DECLARE (ca nume)
SELECT count(*)
INTO v_nrstud Se ridică explicit cu RAISE
FROM stud WHERE cods=21;
IF (v_nrstud < 5) THEN Se tratează în zona EXCEPTION
RAISE prea_putini;
END IF;
EXCEPTION
WHEN prea_putini THEN
DBMS_OUTPUT.PUT_LINE(‘< 5 studenti');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Alta exceptie');
END;
11
Florin Radulescu - Baze de date (note de curs)
RAISE_APPLICATION_ERROR EXEMPLU
Excepţiile de acest tip sunt similare erorilor DECLARE
Oracle non-predefinite dar trebuiesc ridicate v_suma NUMBER; suma_nula EXCEPTION;
PRAGMA EXCEPTION_INIT(suma_nula, -20021);
explicit în zona executabilă sau în zona de BEGIN
excepţii folosind: SELECT suma INTO v_suma
RAISE_APPLICATION_ERROR(cod_eroare, FROM bursa WHERE pmin < 100;
text_eroare) IF v_suma IS NULL THEN
unde: RAISE_APPLICATION_ERROR(-20021,
'Suma este nula');
cod_eroare este un număr ales de utilizator între -
20000 şi -20999 END IF;
EXCEPTION
text_eroare este un text ales de utilizator WHEN suma_nula THEN
Şi la aceste excepţii se poate folosi PRAGMA dbms_output.put_line(SQLERRM);
EXCEPTION_INIT pentru a le asigna un END;
nume.
F. Radulescu. Curs: Baze de date 67 F. Radulescu. Curs: Baze de date 68
EXEMPLU OBSERVATIE
DECLARE
exceptia1 EXCEPTION;
BEGIN
Exceptiile aparute:
DECLARE -- incepe un subbloc
BEGIN In zona de declaratii
...
IF ... THEN In zona de tratare a exceptiilor
RAISE exceptia1;
END IF;
EXCEPTION -- tratare exceptii subbloc Nu se pot trata in blocul in care au aparut
WHEN exceptia1 THEN
-- instructiuni tratare in subbloc
. . . .
ci in zona de exceptii a blocului
RAISE;
END; -- sfarsit subbloc
inconjurator
EXCEPTION
WHEN exceptia1 THEN -- retratare exceptia1 in bloc
...
END;
12
Florin Radulescu - Baze de date (note de curs)
13
Florin Radulescu - Baze de date (note de curs)
CURSORI CU PARAMETRI
EXEMPLU DECLARE
CURSOR studenti (v_cods number :=21,
-- fara OPEN, FETCH, declarare v_stud v_loc varchar2:='BUCURESTI') IS
DECLARE SELECT nume FROM stud
WHERE cods = v_cods and loc = v_loc;
CURSOR studenti IS i number;
BEGIN
SELECT * FROM STUD WHERE CODS = 21; FOR i IN 1..5 LOOP -- cod specializare = i*5+1
BEGIN dbms_output.put_line('Specializarea ' || (i*5+1));
FOR v_stud in studenti((i*5+1), 'PLOIESTI') LOOP
FOR v_stud IN studenti LOOP dbms_output.put_line(studenti%rowcount||
dbms_output.put_line(studenti%rowcount|| ' Student: '||v_stud.nume);
END LOOP; -- inchide automat cursorul
' Student: '||v_stud.nume); END LOOP; -- ciclul FOR i in 1..5
END LOOP; -- nu e necesar CLOSE dbms_output.put_line('Cu parametrii impliciti');
FOR v_stud IN studenti LOOP
END; dbms_output.put_line(studenti%rowcount||
' Student: '||v_stud.nume);
END LOOP; -- inchide automat cursorul
END;
WHERE CURRENT OF
DECLARE
CURSOR c_stud IS select nume, loc
from stud FOR UPDATE; -- blocheaza liniile
-- selectate
v_nume stud.nume%type; v_loc stud.loc%type;
v_nr number;
BEGIN
OPEN c_stud; v_nr := 0;
LOOP
FETCH c_stud INTO v_nume, v_loc;
EXIT WHEN c_stud%notfound;
dbms_output.put_line(v_nume||' '||v_loc); Starsit
UPDATE stud1
SET punctaj = punctaj * 1.1
WHERE CURRENT OF c_stud; -- linia din tabela din care
provine
-- linia curenta a cursorului
v_nr := v_nr + 1;
END LOOP;
COMMIT;
F. Radulescu. Curs: Baze de date 83 F. Radulescu. Curs: Baze de date 84
14
Florin Radulescu - Baze de date (note de curs)
STUD
SQL-10 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
PACHETE, 4311
3514
1925
ADRIAN
FLOREA
OANA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
2 2421A 20-DEC-84 BUCURESTI 4311
450
3230
760
24
24
24
DECLANSATORI 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24
1
Florin Radulescu - Baze de date (note de curs)
EXEMPLUL 1
PARAMETRI FORMALI CREATE OR REPLACE PROCEDURE SALUT IS
BEGIN
nume_parametru [IN | OUT [NOCOPY] | IN DBMS_OUTPUT.PUT_LINE(’SALUT’);
OUT [NOCOPY]] END SALUT;
numetip [{:= | DEFAULT} expresie]
Efect: se stocheaza procedura in baza de date, ca
IN, OUT şi IN OUT arată că este vorba de un obiect persistent.
parametru de intrare, de ieşire sau bidirecţional
(default: IN). Poate fi folosit apoi in alte blocuri (cu sau fara
nume).
În corpul unui subprogram nu se poate asigna o
valoare unui parametru transmis cu IN. Exemplu: folosirea intr-un bloc anonim (la promptul
SQL din SQL*Plus de exemplu):
NOCOPY: În mod implicit parametrii de tip IN sunt
transmişi prin referinţă iar cei OUT şi IN OUT prin BEGIN
valoare. Se poate specifica în acest caz (OUT, IN
SALUT();
OUT) transmiterea prin referinţă folosind NOCOPY.
END;
numetip este un nume de tip fără specificarea
dimensiunii (deci VARCHAR2 de exemplu şi nu
VARCHAR2(10).
F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12
2
Florin Radulescu - Baze de date (note de curs)
3
Florin Radulescu - Baze de date (note de curs)
EXEMPLUL 4
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXEMPLUL 4 - utilizare
mesaj := 'Nu exista studentul'; DECLARE
m varchar2(30);
WHEN fara_tutor THEN -- DEFINIRE PROCEDURA
mesaj := 'Nu are tutor'; PROCEDURE alt_tutor(. . .
WHEN este_el THEN . . .
mesaj := 'Nu isi poate fi tutor'; END alt_tutor;
BEGIN -- blocul principal
END alt_tutor; -- FOLOSIRE PROCEDURA
alt_tutor(1325, 1645, m);
In acest caz procedura nu se stocheaza in baza de dbms_output.put_line(m);
date. alt_tutor(1456, 1645, m);
dbms_output.put_line(m);
Este locala blocului si poate fi folosita doar in acest alt_tutor(1645, 1645, m);
context. dbms_output.put_line(m);
END;
Sintaxa Sintaxa
[CREATE [OR REPLACE ] ] –- FUNCTII STOCATE
FUNCTION nume_functie [ ( parametru [ ,
Elementele care apar şi la proceduri au
parametru ]... )] aceeaşi semnificaţie.
RETURN tip_date_returnate
[ AUTHID { DEFINER | CURRENT_USER } ]
În plus apare tipul valorii returnate care,
{IS | AS} ca şi parametrii formali, nu poate fi
[ PRAGMA AUTONOMOUS_TRANSACTION; ] constrâns prin specificarea unei dimensiuni
[declaratii locale]
BEGIN
maxime.
instructiuni executabile sau NULL; În zona executabilă trebuie să apară
[EXCEPTION
instrucţiunea RETURN expresie care
tratare erori]
END [nume_functie]; specifică valoarea returnată de funcţie.
4
Florin Radulescu - Baze de date (note de curs)
EXEMPLU
FUNCTION alt_tutor (cod_stud INTEGER, nou_tutor INTEGER)
RETURN VARCHAR2 IS
tutor_actual number;
FUNCTIE IN BLOC
fara_tutor EXCEPTION; este_el EXCEPTION; DECLARE
BEGIN
SELECT tutor INTO tutor_actual FROM stud -- DEFINIRE FUNCTIE
WHERE matr = cod_stud; FUNCTION alt_tutor (cod_stud INTEGER,
IF nou_tutor=cod_stud THEN
RAISE este_el; nou_tutor INTEGER) RETURN VARCHAR2 IS
ELSIF tutor_actual IS NULL THEN
RAISE fara_tutor;
. . . . .
ELSE END alt_tutor;
UPDATE stud1 SET tutor = nou_tutor
WHERE matr = cod_stud; BEGIN -- FOLOSIRE FUNCTIE
RETURN 'Actualizat '||cod_stud; dbms_output.put_line(alt_tutor(1325, 1645));
END IF;
EXCEPTION dbms_output.put_line(alt_tutor(1456, 1645));
WHEN NO_DATA_FOUND THEN dbms_output.put_line(alt_tutor(1645, 1645));
RETURN 'Nu exista studentul';
WHEN fara_tutor THEN END;
RETURN 'Nu are tutor';
WHEN este_el THEN
RETURN 'Nu isi poate fi tutor';
END alt_tutor;
5
Florin Radulescu - Baze de date (note de curs)
6
Florin Radulescu - Baze de date (note de curs)
7
Florin Radulescu - Baze de date (note de curs)
Declansatori Exemplu
Declanşatorii se pot asocia nu numai cererilor DML ci şi altor tipuri de
cereri: cereri DDL, erori server Oracle, pornire şi oprire server (startup, CREATE OR REPLACE TRIGGER nusterg_spec
shutdown), etc.
Exemplu de evenimente DDL care pot declansa un trigger: before drop or truncate
BEFORE / AFTER ALTER
BEFORE / AFTER CREATE
BEFORE / AFTER DROP
on schema
BEFORE / AFTER RENAME
BEFORE / AFTER ANALYZE WHEN (ora_dict_obj_name = 'SPEC' AND
BEFORE / AFTER ASSOCIATE STATISTICS
BEFORE / AFTER DISASSOCIATE STATISTICS ora_dict_obj_type = 'TABLE')
BEFORE / AFTER AUDIT
BEFORE / AFTER NOAUDIT BEGIN
BEFORE / AFTER COMMENT
BEFORE / AFTER DDL
BEFORE / AFTER GRANT RAISE_APPLICATION_ERROR(-20001,
BEFORE / AFTER REVOKE
BEFORE / AFTER TRUNCATE 'Protected : table SPEC');
AFTER SUSPEND
END;
F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44
PACHETE Pasul 1
Specificaţia unui pachet conţine declaraţiile publice
Mai multe proceduri şi/sau funcţii pot aferente acestuia, vizibile pentru aplicaţiile care îl folosesc.
forma un pachet (package). Sintaxa simplificată a declarării specificaţiei este
următoarea:
Declararea unui pachet se face în două CREATE [OR REPLACE] PACKAGE nume_pachet
[AUTHID {CURRENT_USER | DEFINER}]
etape: {IS | AS}
[definitii tipuri pentru colectii si
Declararea specificaţiei pachetului. inregistrari;
subtipuri]
Declararea corpului său conţinând [declarare colectii, constante, exceptii,
implementarea procedurilor şi funcţiilor obiecte,
inregistrari, variabile si cursori]
componente. [declaratii functii si proceduri]
END [nume_pachet];
8
Florin Radulescu - Baze de date (note de curs)
Exemplu Pasul 2
CREATE OR REPLACE PACKAGE STD AS Sintaxa simplificată a declarării implementării
(corpului) unui pachet este următoarea:
FUNCTION NUME (PMATR NUMBER) [CREATE [OR REPLACE] PACKAGE BODY nume_pachet
RETURN VARCHAR2; {IS | AS}
[definitii tipuri pentru colectii si
FUNCTION PUNCTE (PMATR NUMBER) inregistrari;
RETURN NUMBER; subtipuri]
[declarare colectii, constante, exceptii,
END STD; obiecte, inregistrari, variabile]
[definitie cursori]
Aici sunt 2 functii, dar pot fi un mix de [definitie functii si proceduri]
proceduri si functii [BEGIN
instructiuni
END [nume_pachet];]
F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50
Exemplu Utilizare
CREATE OR REPLACE PACKAGE BODY STD AS
FUNCTION NUME ( Folosirea subprogramelor care fac parte dintr-un
PMATR NUMBER) RETURN VARCHAR2 IS
V_NUME VARCHAR2(10);
pachet se face prin construcţia:
BEGIN nume_pachet.nume_subprogram([parametri_ac
SELECT NUME INTO V_NUME
FROM STUD tuali])
WHERE MATR=PMATR;
RETURN V_NUME; Exemplu: Cererea următoare returnează numele
END NUME;
FUNCTION PUNCTE (
studentului, numele tutorului său şi punctajul
PMATR NUMBER) RETURN NUMBER IS acestuia:
V_PUNCTE NUMBER(4);
BEGIN SELECT NUME, STD.NUME(TUTOR) TUTOR,
SELECT PUNCTAJ INTO V_PUNCTE
FROM STUD STD.PUNCTE(TUTOR) PUNCTE
WHERE MATR=PMATR;
RETURN V_PUNCTE; FROM STUD;
END PUNCTE;
END STD;
9
Florin Radulescu - Baze de date (note de curs)
Exemplu
Din aceeasi sursa (docs.oracle.com):
CREATE PACKAGE trans_data AS -- bodiless package
TYPE TimeRec IS RECORD (minutes SMALLINT, hours
SMALLINT);
TYPE TransRec IS RECORD ( category VARCHAR2,
account INT, amount REAL, time_of TimeRec); Starsit
minimum_balance CONSTANT REAL := 10.00;
number_processed INT;
insufficient_funds EXCEPTION;
END trans_data;
10