Sunteți pe pagina 1din 9

5/12/2008

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

F. Radulescu. Curs: Baze de date 1 F. Radulescu. Curs: Baze de date 2

SPEC si BURSA OBIECTIV


CODS NUME DOMENIU
----- ---------- --------------- Scopul acestui capitol este descrierea
11 MATEMATICA STIINTE EXACTE operaţiilor care fac parte din limbajul de
21 GEOGRAFIE UMANIST manipulare al datelor: adăugarea de linii într-
24 ISTORIE UMANIST o tabelă, modificarea valorilor unor linii şi
ştergerea acestora.
TIP PMIN PMAX SUMA
-------------------- ----- ----- ----- Este de asemenea prezentat mecanismul
FARA BURSA 0 399 tranzacţiilor şi consistenţa la citire care permit
BURSA SOCIALA 400 899 100 utilizatorilor şi aplicaţiilor care accesează o
BURSA DE STUDIU 900 1799 150 bază de date să utilizeze o versiune
BURSA DE MERIT 1800 2499 200
BURSA DE EXCEPTIE 2500 9999 300
consistentă a acesteia.
F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

CERERI PREZENTATE INSERT … VALUES (1)


 Principalele cereri SQL prin care sunt efectuate Inserarea unei linii prin specificarea valorilor acesteia
aceste operaţii sunt:  Sintaxa cererii este următoarea:
 INSERT efectuează adăugarea de noi linii, INSERT INTO tabela [(lista_de_coloane)]
VALUES (lista_de_valori)
 UPDATE permite actualizarea (modificarea)
În cazul în care lista de coloane nu este prezentă în cerere
valorilor dintr-o tabelă, efectul va fi următorul:
 DELETE şterge linii dintr-o tabelă,  Se inserează în tabelă o linie completă,
 MERGE efectuează o actualizare sau inserare,  Numărul valorilor din listă trebuie să fie acelaşi cu numărul de
după cum linia îndeplineşte sau nu o condiţie, coloane din tabelă,
 COMMIT, ROLLBACK şi SAVEPOINT permit  Ordinea valorilor din listă trebuie să fie aceeaşi cu ordinea
coloanelor din cererea de creare a tabelei,
controlul explicit al tranzacţiilor.  Tipul valorilor trebuie să fie compatibil cu tipul coloanelor în
 Este prezentată de asemenea clauza WITH CHECK care se stochează,
OPTION care controlează inserarea, ştergerea şi
actualizarea datelor în cazul în care aceste operaţii se
efectuează prin intermediul unei subcereri.
F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
5/12/2008

INSERT … VALUES (2) EXEMPLU


 În cazul în care pe o anumită coloană se doreşte inserarea : Inserarea specializărilor în tabela SPEC se
unei valori nule, în lista de valori se foloseşte cuvântul face cu cererile:
cheie NULL,
 Dacă la crearea tabelei unei coloane i-a fost asociată o INSERT INTO SPEC VALUES(11,
valoare implicită, pentru inserarea ei se foloseşte cuvântul 'MATEMATICA', 'STIINTE EXACTE');
cheie DEFAULT. În cazul în care se foloseşte DEFAULT dar INSERT INTO SPEC VALUES(21,
coloana nu are o valoare implicită definită, în coloană se 'GEOGRAFIE', 'UMANIST');
va insera o valoare nulă, INSERT INTO SPEC VALUES(24, 'ISTORIE',
 Valorile pentru coloanele de tip şir de caractere sau dată 'UMANIST');
calendaristică (doar cele în formatul standard) se pun
între apostrofi, Pentru inserarea unei noi specializări având
 În cazul în care o valoare de tip dată calendaristică nu codul 30, nume încă necunoscut şi un
este în format standard se foloseşte funcţia TO_DATE domeniu implicit se poate folosi cererea:
pentru conversia şirului respectiv în dată calendaristică,
INSERT INTO SPEC VALUES(30, NULL,
 Fiecare linie se inserează cu o cerere separată. DEFAULT);

F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

EFECT INSERT … VALUES (3)


Rezultatul celor patru inserări va fi următorul  În cazul în care cererea conţine şi o listă de
coloane, rezultatul acesteia este inserarea unei linii
(am considerat că la crearea tabelei SPEC, incomplete: pentru coloanele care lipsesc din listă se
pentru coloana DOMENIU s-a asociat vor insera automat valorile implicite - dacă există -
sau valori nule în caz contrar.
valoarea implicită 'UMANIST'):  Observaţii:
CODS NUME DOMENIU  Listele de coloane şi valori trebuie să conţină
----- ---------- --------------- acelaşi număr de elemente,
11 MATEMATICA STIINTE EXACTE  Cele două liste se corespund poziţional: prima
valoare va fi stocată în prima coloană din listă,
21 GEOGRAFIE UMANIST s.a.m.d.
24 ISTORIE UMANIST  Tipul valorilor trebuie să fie compatibil cu tipul
coloanelor în care se stochează.
30 UMANIST

F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

EXEMPLU CE PUTEM PUNE IN LISTA


Exemplu: inserarea specializării cu codul 30 În lista de valori se mai pot folosi:
se putea face şi astfel:  Expresii
INSERT INTO SPEC (CODS) VALUES(30);
 Subcereri
rezultatul obţinut fiind acelaşi ca mai sus.
În toate cazurile, inserarea va eşua dacă
noua linie nu respectă vreuna din
constrângerile de integritate care sunt active
în acel moment pentru tabela în care se face
adăugarea.

F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
5/12/2008

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

INSERT .. SELECT (1) EXEMPLU


 Sintaxa este în acest caz următoarea:  Fie o tabelă NRSTUD(CODS, NRSTUD) care conţine
INSERT INTO tabela [(lista_de_coloane)] pentru fiecare specializare numărul de studenţi al
acesteia.
cerere_select
 Umplerea ei se poate face prin cererea:
 Modul de execuţie al acestei cereri este următorul: INSERT INTO NRSTUD
 Se execută cererea SELECT, SELECT CODS, COUNT(*) FROM STUD GROUP
 Liniile rezultatului sunt inserate în tabelă, BY CODS;
 Numărul de coloane al tabelei/listei de coloane trebuie  Conţinutul tabelei NRSTUD va fi:
să fie egal cu cel al rezultatului cererii SELECT iar CODS NRSTUD
tipurile trebuie să fie compatibile,
----- ------
 În cazul în care o linie din rezultatul cererii SELECT nu
satisface constrângerile de integritate ale tabelei în 11 3
care se face inserarea, întreaga comandă eşuează (nici 21 4
celelalte linii nu sunt inserate). 24 5
F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

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
5/12/2008

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

EXEMPLE EXEMPLE – cont.


 Exemplul 1: Mărirea cu 10% a punctajului studenţilor Exemplul 3: În cazul în care pentru o coloană
de la specializarea cu codul 11 se face cu cererea:
UPDATE STUD se doreşte actualizarea valorilor prin aducerea
SET PUNCTAJ = PUNCTAJ * 1.1 lor la valoarea implicită asociată la crearea
WHERE CODS = 11 tabelei sau la o valoare nulă se folosesc de
 Exemplul 2: În cazul în care, pentru toţi studenţii, pe
lângă mărirea punctajului cu 10% se doreşte şi asemenea cuvintele cheie DEFAULT şi NULL.
incrementarea anului de studii pentru studenţii din În cazul folosirii lui DEFAULT, dacă nu există
anii 1-4 şi stocarea pe coloana AN a valorii 0 pentru
studenţii de anul 5, cererea este: o valoare implicită asociată, în coloana
UPDATE STUD respectivă se va stoca o valoare nulă.
SET PUNCTAJ = PUNCTAJ * 1.1, UPDATE SPEC SET DOMENIU = DEFAULT;
AN = DECODE (AN, 5, 0, AN+1);
UPDATE SPEC SET DOMENIU = NULL;

F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

SUBCERERI IN SET SUBCERERI IN SET – cont.


Expresiile din clauza SET pot conţine  Subcererile pot fi prezente atât pe clauza WHERE cât şi
subcereri pe tabela care se actualizează sau în locul numelui tabelei (acest caz mai tarziu).
pe o altă tabelă din baza de date.  De exemplu, dacă se doreşte actualizarea numărului de
studenţi doar pentru specializările având mai mult de
Exemplu: Pentru actualizarea numărului de trei studenţi cererea este:
studenţi din tabela NRSTUD descrisă anterior UPDATE NRSTUD
se poate folosi următoarea cerere corelată: SET NRSTUD =
UPDATE NRSTUD N (SELECT COUNT(*)
SET NRSTUD = FROM STUD WHERE CODS = NRSTUD.CODS)
(SELECT COUNT(*) WHERE CODS IN
FROM STUD (SELECT CODS FROM STUD GROUP BY CODS
WHERE CODS = N.CODS); HAVING COUNT(*) > 3);

F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
5/12/2008

EFECT CONSTRANGERI MERGE


 În cazul în care noile valori ale unei linii nu satisfac  O cerere MERGE efectuează fie actualizarea fie
constrângerile de integritate active pentru tabela inserarea unor linii într-o tabelă, după cum acestea
respectivă, cererea va eşua şi va returna un mesaj de îndeplinesc sau nu o condiţie de tip join.
eroare.  Sintaxa cererii este următoarea:
MERGE INTO nume_tabela_1 [alias_tabela_1]
 Este cazul actualizărilor în care: USING nume_tabela_2 | nume_vedere | subcerere
 Noua valoare este nulă şi coloana are o constrângere de ON (conditie_de_join)
integritate de tip NOT NULL, WHEN MATCHED THEN
 Noua valoare face ca linia să conţină o valoare de cheie care UPDATE SET
mai există în tabelă, într-o altă linie, coloana1 = expresie1
 Noua valoare nu verifică o constrângere de tip CHECK, [, coloana2=expresie2, ...]
 Vechea valoare a cheii este referită prin constrângeri de tip WHEN NOT MATCHED THEN
FOREIGN KEY în alte tabele, INSERT [(lista_coloane)] VALUES
 Noua valoare a unei chei străine nu se regăseşte în tabela (lista_valori);
referită prin FOREIGN KEY.

F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

MERGE – cont. EXEMPLU


 Tabela în care se fac actualizări/inserări este cea specificată în
clauza MERGE INTO. În continuare vom denumi această tabelă
În cazul în care conţinutul tabelei STUD se
tabela destinatie. modifică, aducerea tabelei NRSTUD în
 Valorile actualizate / inserate sunt determinate de tabela / vederea concordanţă cu acesta se poate face prin
/ subcererea din clauza USING. În continuare vom denumi această
tabelă tabela sursa. cererea:
 Decizia privind operaţia efectuată (actualizare sau inserare) este MERGE INTO NRSTUD
luată pe baza condiţiei de join dintre tabela sursă şi tabela USING (SELECT CODS C, COUNT(*) NR
destinaţie, specificată în clauza ON,
 În cazul în care linia curentă din tabela sursă are linii FROM STUD GROUP BY CODS)
corespondente prin condiţia ON în tabela destinaţie, se execută o ON (NRSTUD.CODS = C)
actualizare a acestor linii pe baza specificaţiilor din clauza UPDATE
SET, WHEN MATCHED THEN
 În cazul în care linia curentă din tabela sursă nu are nici o linie UPDATE SET NRSTUD.NRSTUD = NR
corespondentă prin condiţia ON în tabela destinaţie, se execută
inserarea unei noi linii pe baza specificaţiilor din INSERT, WHEN NOT MATCHED THEN
 Liniile din tabela destinaţie care nu au corespondent prin condiţia INSERT VALUES (C, NR);
ON nu sunt afectate de această cerere (nu sunt nici actualizate, nici
şterse).
F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

ACTUALIZARI PRIN SUBCERERI:


EXEMPLU – cont.
 Se evaluează subcererea din clauza USING.
CLAUZA WITH CHECK OPTION
Rezultatul conţine codurile specializărilor şi numărul
de studenţi corespunzător acestora calculate pe baza În cazul cererilor INSERT, DELETE şi UPDATE
datelor din tabela STUD. se poate folosi o subcerere în locul numelui
 În cazul în care un cod de specializare există atât în tabelei al cărei conţinut se modifică.
tabela NRSTUD cât şi în rezultatul subcererii, linia Aceste subcereri trebuie să satisfacă
corespunzătoare din NRSTUD este actualizată să restricţiile care vor fi prezentate în detaliu în
reflecte noul număr de studenţi, cel din rezultatul
subcererii. capitolul următor în paragraful privind
 În cazul în care au apărut studenţi la specializări noi actualizarea datelor prin intermediul vederilor.
(linia din rezultatul subcererii conţine un cod de Este vorba în principal despre subcereri care
specializare inexistent în tabela NRSTUD) se se referă la o singură tabelă şi nu conţin
inserează o nouă linie în NRSTUD conţinând datele funcţii de grup sau grupare şi nici nu au
referitoare la aceste specializări. coloane definite prin expresii.
F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
5/12/2008

WITH CHECK OPTION - cont EXEMPLE: INSERARE


Pentru un mai bun control al operaţiilor Inserarea unei noi specializări, cu şi fără WITH CHECK OPTION:
efectuate prin intermediul subcererilor,  Varianta 1: fără WITH CHECK OPTION. Deşi noua linie nu poate
fi regăsită prin subcerere (codul specializării nu îndeplineşte
acestea pot conţine clauza WITH CHECK condiţia CODS > 11), ea va fi totuşi inserată:
OPTION care specifică: INSERT INTO (SELECT * FROM SPEC WHERE CODS >
11)
 În cazul unui INSERT, noua linie îndeplineşte
VALUES (9, 'UNNUME', 'UNDOMENIU');
condiţiile pentru a fi regăsită prin subcererea prin
care se face inserarea,  Varianta 2: cu WITH CHECK OPTION. Deoarece noua linie nu
poate fi regăsită prin subcerere ea nu va fi inserată şi se va
 În cazul lui UPDATE, noile valori ale liniilor semnala mesajul de eroare ORA-01402: view WITH CHECK
actualizate îndeplinesc de asemenea condiţiile OPTION where-clause violation:
pentru regăsirea lor prin intermediul subcererii, INSERT INTO
 În cazul cererilor DELETE se pot şterge doar linii (SELECT * FROM SPEC
care au corespondent în rezultatul subcererii. WHERE CODS > 11
Folosirea lui WITH CHECK OPTION, deşi permisă, WITH CHECK OPTION)
nu are nici un efect. VALUES (9, 'UNNUME', 'UNDOMENIU');

F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

EXEMPLE: STERGERE EXEMPLE: ACTUALIZARE


 Stergerea unor specializări, cu şi fără WITH CHECK  Actualizarea unor specializări, cu şi fără WITH CHECK
OPTION: Următoarele două cereri au acelaşi efect: OPTION:
ştergerea specializării cu codul 21.  Varianta 1: fără WITH CHECK OPTION. Unele noi valori nu
pot fi regăsite prin subcerere (21 şi 24 devin > 50) dar
 Specializarea cu codul 24 nu este ştearsă, deşi cererea se va executa fără erori:
domeniul ei este 'UMANIST', pentru că ea nu este UPDATE (SELECT * FROM SPEC WHERE CODS <
regăsită de subcerere: 50)
DELETE (SELECT * FROM SPEC SET CODS = CODS + 30;
WHERE CODS < 24)  Varianta 2: cu WITH CHECK OPTION. În acest caz cererea
WHERE DOMENIU = 'UMANIST'; va semnala o eroare (codurile unora dintre specializări
depăşesc 50. Eşecul este la nivel de cerere şi nu sunt
Sau cu WITH CHECK OPTION: actualizate nici liniile care prin această operaţie pot fi încă
DELETE (SELECT * FROM SPEC regăsite de subcerere (cazul specializării cu codul 11):
WHERE CODS < 24 WITH CHECK OPTION) UPDATE (SELECT * FROM SPEC
WHERE DOMENIU = 'UMANIST'; WHERE CODS < 50 WITH CHECK OPTION)
SET CODS = CODS + 30;
F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

CONSISTENTA LA CITIRE CONSISTENTA.. (2)


Sistemul Oracle implementează În mod curent pe aceeaşi bază de date
operează simultan mai mulţi utilizatori care
mecanisme care îi permit fiecărui pot efectua două tipuri de operaţii:
utilizator (uman sau aplicaţie care  Operaţii de citire. În această categorie intră în
utilizează baza de date) să aibă în orice principal regăsirile de date prin cereri SELECT.
moment o viziune consistentă a datelor.  Operaţii de scriere. În această categorie sunt
operaţiile de INSERT, UPDATE, DELETE şi MERGE
În continuare sunt prezentate descrise anterior.
elementele de bază privind consistenţa În lipsa unei tratări necorespunzătoare,
execuţia simultană a unei operaţii de scriere
la citire, blocările implicite efectuate de cu o altă operaţie (de citire sau de scriere)
sistem şi mecanismele de implementare poate duce la inconsistenţe în utilizarea bazei
a tranzacţiilor. de date.
F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
5/12/2008

EXEMPLU CUM FACE ORACLE:


 Fie doi utilizatori care lucrează simultan pe tabela  Aceleaşi date pot fi citite simultan de oricâţi
STUD, primul incrementând anul de studii (o cerere utilizatori,
UPDATE) şi al doilea afişând conţinutul tabelei  Aceleaşi date nu pot fi modificate simultan de doi
(cerere SELECT). Fără mecanisme de păstrare a unei utilizatori. În momentul în care unul din ei modifică o
viziuni consistente asupra datelor este posibilă valoare, sistemul efectuează o blocare implicită a
următoarea situaţie: liniei care o conţine blocând accesul pentru scriere al
altor utilizatori.
 Unele dintre linile afişate pentru al doilea utilizator  Aceleaşi date pot fi modificate la un moment dat de
conţin anul de studii încă nemodificat (cererea un utilizator şi citite de oricâţi alţii,
UPDATE nu a ajuns încă la aceste linii),  Modificările făcute de un utilizator în conţinutul
 Celelalte linii afişate conţin anul modificat de cererea tabelelor nu sunt vizibile pentru ceilalţi utilizatori
UPDATE în curs. până în momentul în care se execută implicit sau
explicit înscrierea lor permanentă în baza de date
(operaţie numită în terminologia de specialitate
comitere).
F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

CUM FACE ORACLE – cont. EXEMPLU


 Până la comiterea modificărilor, operaţiile de citire  Exemplu: să considerăm trei posturi de lucru, U1, U2
efectuate de alţi utilizatori returnează conţinutul de şi U3 de la care se execută următoarele cereri, la
date anterior modificării lor, momentele de timp specificate (t1 < t2 < ... < t6).
 Până nu au fost comise, modificările pot fi revocate,  Iniţial presupunem că tabela NRSTUD conţine
anulându-se efectul cererilor care le-au efectuat,
informaţii corecte despre specializările şi numărul de
 În momentul comiterii sau revocării modificărilor se studenţi asociat lor:
ridică toate blocările aferente acestora,
U1/t1: UPDATE NRSTUD SET NRSTUD = 0;
U1/t2: SELECT * FROM NRSTUD;
În acest fel operaţiile de citire şi modificare a datelor U2/t3: SELECT * FROM NRSTUD;
se pot executa simultan fără să interfereze unele cu
U3/t4: UPDATE NRSTUD SET CODS = CODS + 1;
celelalte.
U1/t5: COMMIT;
De asemenea sunt prevenite inconsistenţele care pot
apare la modificarea simultană a aceloraşi date. U2/t6: SELECT * FROM NRSTUD;

F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

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.
F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
5/12/2008

U1/t1: UPDATE NRSTUD SET NRSTUD = 0;


U1/t2: SELECT * FROM NRSTUD;
U2/t3:
U3/t4:
SELECT * FROM
UPDATE NRSTUD
NRSTUD;
SET CODS = CODS + 1;
TRANZACTII
U1/t5: COMMIT;  În contextul acestui capitol, o tranzacţie poate fi
U2/t6: SELECT * FROM NRSTUD;
definită ca o succesiune de cereri DML (printre care
 Sistemul blochează pentru U3 liniile modificate din pot exista şi cereri de regăsire a informaţiilor)
NRSTUD. Ele nu mai pot fi scrise decât de acesta. executate într-o aceeaşi sesiune de lucru.
 La momentul t6 se execută din nou o cerere de  Modificarile facute in baza de date pe parcursul unei
regăsire a lui U1. Datele afişate vor conţine valorile tranzactii pot fi la final fie toate comise fie toate
modificate ale numărului de studenţi (0) şi cele încă revocate
nemodificate pentru codul specializării (U3 nu a  Tranzactia este din acest punct de vedere o operatie
comis încă modificările). atomica
 Pentru testarea acestui comportament se pot folosi  La încheierea unei tranzacţii, toate liniile blocate de
trei ferestre SQL*Plus deschise simultan pe acelaşi sistem pentru aceasta sunt eliberate.
calculator, cu acelaşi nume de utilizator Oracle.

F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

TRANZACTII – cont. CERERI DDL SI DCL


 Tranzacţia începe cu prima cerere DML şi se termină În ceea ce priveşte cererile DDL şi DCL,
în momentul în care:
 Se execută o cerere COMMIT care face permanente
acestea se constituie de asemenea în
modificările efectuate de tranzacţie. tranzacţii.
 Se execută o cerere ROLLBACK care revocă modificările
efectuate de tranzacţie. Execuţia unei astfel de cereri se face astfel:
 Se execută o cerere DDL (de exemplu CREATE) sau o cerere  Anterior execuţiei este finalizată prin comitere
DCL. Tranzacţia se încheie înainte de execuţia acesteia prin tranzacţia în curs.
comiterea modificărilor
 Se încheie sesiunea de lucru (ieşire din SQL*Plus). În acest  Se execută cererea DDL sau DCL.
caz modificările efectuate de tranzacţie sunt de asemenea  Efectul acesteia este de asemenea comis. Cererile
comise.
 Apare o cădere hardware sau software a sistemului.
de acest tip nu pot fi revocate prin ROLLBACK.
Modificările efectuate de tranzacţie sunt revocate.

F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

SQL*PLUS COMMIT SI ROLLBACK


În SQL*Plus există de asemenea posibilitatea Sintaxa cererilor COMMIT şi ROLLBACK
de a specifica faptul că fiecare cerere DML
trebuie comisă automat după execuţie. este următoarea:
Setarea poate fi efectuată astfel:  COMMIT; - Toate modificările efectuate de
 SET AUTOCOMMIT OFF - Comiterea şi revocarea
sunt la nivel de tranzacţie şi nu la nivel de cerere cererile DML ale tranzacţiei sunt comise.
DML. Este opţiunea implicită.  ROLLBACK; - Toate modificările efectuate
 SET AUTOCOMMIT ON - Fiecare cerere DML este
o tranzacţie. de cererile DML ale tranzacţiei sunt
Atentie: inchiderea ferestrei SQL*Plus (din revocate.
butonul x) este considerata incident software In ambele cazuri tranzactia curenta se
si tranzactia curenta este revocata!
incheie.
F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
5/12/2008

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 ...

F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50

INSERT INTO SPEC ... INSERT INTO SPEC ...


SAVEPOINT P1; SAVEPOINT P1;
UPDATE STUD ... UPDATE STUD ...
SAVEPOINT P2 SAVEPOINT P2
DELETE SPEC ... DELETE SPEC ...
ROLLBACK TO P2 ROLLBACK TO P2
INSERT INTO STUD ... INSERT INTO STUD ...
ROLLBACK TO P1; ROLLBACK TO P1;
CREATE TABLE ... 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
la dispoziţia utilizatorilor şi mecanisme
DATELOR
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

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