Sunteți pe pagina 1din 25

Manipularea datelor

Obiective:

Dupa parcurgerea acestei lectii, ar trebui sa puteti face urmatoarele:


• Sa descrieti fiecare comanda DML
• Sa inserati înregistrari într-un tabel
• Sa reactualizati înregistrarile dintr-un tabel
• Sa stergeti înregistrari dintr-un tabel
• Sa controlati tranzactiile.

Scopul lectiei:
În aceasta lectie veti învata cum sa inserati înregistrari într-o tabela, sa
reactualizati (modificati) înregistrarile existente în tabela si sa stergeti înregistrari dintr-o
tabela. Veti mai învata si cum sa controlati tranzactii cu comenzile COMMIT,
SAVEPOINT si ROLLBACK.

Limbajul de manipulare a datelor (DML)

• O comanda DML este executata când:


- Adaugati noi înregistrari la tabela
- Modificati înregistrari existente într-o tabela
- Stergeti înregistrari existente dintr-o tabela
• O tranzactie consta dintr-o colectie de comenzi DML care formeaza o
unitate logica de lucru

Limbajul de manipulare a datelor

Limbajul de manipulare a datelor (DML) este partea de baza a SQL. Când doriti
sa adaugati, sa modificati sau sa stergeti date dintr-o baza de date, executati o comanda
DML.
O colectie de comenzi DML care formeaza o unitate logica de lucru se numeste
tranzactie.

1
Considerati o baza de date din domeniul bancar. Atunci când un client al bancii
doreste sa transfere bani dintr-un depozit într-un cont curent, tranzactia ar putea consta în
3 operatii separate: scade suma din depozit, creste suma din contul curent, înregistreaza
tranzactia în jurnalul de tranzactii. Serverul Oracle trebuie sa garanteze ca toate cele 3
comenzi SQL sunt executate în asa fel încât sa mentina echilibrul necesar între conturi.
Atunci când, din anumite cauze, una dintre comenzile tranzactiilor de mai sus nu se
executa, atunci celelalte comenzi ale tranzactiilor trebuie sa fie anulate.

Adaugarea unei noi înregistrari într-un tabel:

Adaugarea unei noi înregistrari într-un tabel


“...insereaza o noua
înregistrare în baza de
50 DEVELOPMENT DETROIT
date DEPT ...”
Noua înregistrare

DEPT DEPT
DEPTNO DNAME LOC DEPTNO DNAME LOC

10 ACCOUNTING NEW YORK 10 ACCOUNTING NEW YORK

20 RESEARCH DALLAS 20 RESEARCH DALLAS


30 SALES CHICAGO 30 SALES CHICAGO
40 OPERATIONS BOSTON 40 OPERATIONS BOSTON
50 DEVELOPMENT DETROIT

Graficul de mai sus ilustreaza adaugarea unui nou departament în tabelul DEPT.

COMANDA INSERT

• Puteti adauga noi înregistrari într-un tabel folosind comanda


INSERT.

INSERT INTO tabel [(coloana [,coloana...])]


VALUES (valoare [,valoare...]);

• Folosind aceasta sintaxa, se poate insera in tabel, doar o


înregistrare odata

2
Prin intermediul comenzii INSERT se pot introduce noi înregistrari într-un tabel.
În descrierea sintaxei:
tabel este numele tabelului (bazei de date).
coloana este numele coloanei din tabelul respectiv.
valoare este valoarea corespunzatoare coloanei.

Nota : Folosind clauza VALUES, aceasta comanda adauga numai câte un rând odata la
un tabel.

Inserarea unor noi înregistrari

• Inserarea unei noi înregistrari continând valori pentru fiecare coloana.


• Valorile se dau în ordinea prestabilita a coloanelor din tabel.
• Precizarea coloanelor este optionala.

SQL>INSERT INTO dept(deptno, dname, loc)


2 VALUES (50, ‘DEVELOPMENT’, ‘DETROIT’);

• Valorile de tip caracter sau data trebuie încadrate de ghilimele simple.

Deoarece se poate insera o noua înregistrare care contine valori pentru fiecare
coloana, lista coloanelor nu este necesara în sintaxa INSERT.
Totusi, daca aceasta nu este precizata, valorile trebuiesc enumerate conform
ordinii coloanelor din tabel.

SQL> DESCRIBE dept


Name Null? Type
_________________ ________ _________
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)

Pentru claritate, precizati lista coloanelor în sintaxa INSERT.


Încadrati doar sirurile de caractere si datele între ghilimele simple; nu încadrati si valorile
numerice.

3
Inserarea de înregistrari cu valori de NULL

• Metoda implicita: Omiterea coloanei din lista.


SQL>INSERT INTO dept(deptno, dname)
2 VALUES (60, ‘MIS’);
1 row created.
• Metoda explicita: Specificarea cuvântului cheie NULL.
SQL>INSERT INTO dept
2 VALUES (70, ‘FINANCE’, NULL);
1 row created.
Metode de inserare a valorilor NULL:

Metoda Descriere
Implicita Omiteti coloanei din lista.
Explicita Specificati cuvântul cheie NULL în lista de dupa VALUES.

Specificati sirul vid (‘’) în lista de dupa VALUES; numai pentru siruri de
caractere si pentru valori de tip data.

Asigurati-va ca pentru coloana vizata este permisa valoarea NULL.


Serverul Oracle aplica automat toate constrângerile de integritate, de domeniu si
tip pentru date. Orice coloana care nu este specificata explicit în lista, va primi o valoare
nula în noua înregistrare.

Inserarea unor valori speciale

Functia SYSDATE furnizeaza data si timpul curent

SQL>INSERT INTO emp(empno, ename, job, mgr,


2 hiredate, sal, comm, deptno)
3 VALUES (7196, ‘GREEN’, ‘SALESMAN’,
4 7782, SYSDATE, 2000, NULL, 10);

1 row created.
Inserarea de valori speciale folosind functii SQL:
Se pot folosi pseudocoloane pentru a introduce valori speciale în tabele.

Exemplul de mai sus înregistreaza informatia pentru angajatul Green în baza de


date EMP. Pentru a introduce data si ora curenta în câmpul HIREDATE este folosita
functia SYSDATE.
Se poate de asemeni folosi functia USER la introducerea de valori într-un tabel.
Functia USER furnizeaza numele utilizatorului curent.
Verificarea datelor adaugate in tabel:

4
SQL> SELECT empno, ename, job, hiredate, comm
2 FROM emp
3 WHERE empno = 7196;

EMPNO ENAME JOB HIREDATE COMM


_____ ______ ________ ________ ________
7196 GREEN SALESMAN 01-DEC-97

Inserarea unor valori specifice de tip data calendaristica

• Adaugarea unui nou angajat:

SQL>INSERT INTO emp


2 VALUES (2269, ‘AROMANO’, ‘SALESMAN’,7782,
3 TO_DATE(‘FEB-3 , 1997’, 'MON DD, YY'),
4 1300, NULL, 10);

1 row created.

• Verificarea adaugarii:

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


____ ______ ________ ___ _______ ___ _____ ______
2296 AROMANO SALESMAN 7782 01-DEC-97 1300 10

Inserarea de valori de tip data calendaristica:


Formatul DD-MON-YY este de obicei folosit pentru a insera o valoare de tip data
calendaristica. Cu acest format, secolul este implicit cel curent. Deoarece data contine de
asemenea informatii despre timp, ora implicita este 00:00:00.
Daca o data calendaristica necesita specificarea altui secol sau ora, trebuie folosita
functia TO_DATE.
Exemplul din figura înregistreaza informatia despre angajatul Aromano în baza de
date EMP. Câmpul HIREDATE primeste valoarea February 3, 1997.

5
Inserare de valori folosind variabile de substitutie
Inserarea
Crearea unui script de valori folosind
interactiv variabilevariabilelor
prin folosirea de substitutie:
de substitutie SQL*Plus
Se poate scrie o comanda INSERT care sa permita utilizatorului sa adauge valori
interactiv folosind variabilele
SQL>INSERT INTOde substitutie SQL*Plus.
dept(deptno, dname, loc)
2 Exemplul
VALUESde mai sus înregistreaza
(&department_id,pentru
informatia un departament în tabelul
‘&department_name’,
DEPT. Numarul departamentului, numele si locatia sunt cerute interactiv utilizatorului.
3 Pentru valori de tip data calendaristica
'&location');
sau sir de caractere, ampersandul si numele
variabilei sunt încadrate de ghilimele simple (apostroafe).

Enter value for department_id: 80


Enter value for department_name: EDUCATION
Enter value for location: ATLANTA

1 row created.

Crearea unui script cu interactiv

• ACCEPT memoreaza valoarea într-o variabila


• PROMPT afiseaza textul specificat.

ACCEPT department_id PROMPT 'Introduceti


numarul departamentului:'
ACCEPT department_name PROMPT 'Introduceti
numele departamentului:'
ACCEPT location PROMPT 'Introduceti orarul:'

INSERT INTO dept(deptno, dname, loc)


VALUES (&department_id,'&department_name',
'&location');

Crearea unui script pentru manipularea datelor:

Comanda împreuna cu variabilele de substitutie pot fi salvate într-un fisier si


acesta poate fi executat. De fiecare data când se executa fisierul, sunt cerute valori noi
pentru variabile. Prin intermediul comenzii SQL*Plus ACCEPT, mesajele afisate la
cererea introducerii valorilor pot fi modificate.

6
Exemplul din figura înregistreaza informatia pentru un departament, în tabelul
DEPT. Utilizatorului îi sunt cerute numarul departamentului, numele si locatia acestuia,
folosind mesajele de prompt stabilite în ACCEPT.

Introduceti numarul departamentului: 90


Introduceti numele departamentului: PAYROLL
Introduceti orasul: HOUSTON

1 row created.

Parametrul de substitutie SQL*Plus nu trebuie precedat de & când este referit


într-o comanda ACCEPT. Pentru a continua o comanda SQL*PLUS pe linia urmatoare se
foloseste o linie. (-)

Copierea înregistrarilor dintr-un alt tabel:

Comanda INSERT poate fi folosita pentru a adauga înregistrari într-un tabel,


valorile pentru câmpuri fiind extrase dintr-un tabel existent. Pentru aceasta se foloseste,
în locul clauzei VALUES, o subinterogare.

Copierea înregistrarilor dintr-un alt tabel

• Folositi comanda INSERT cu o subinterogare.

SQL> INSERT INTO managers(id, name, salary, hiredate)


2 SELECT empno, ename, sal, hiredate
3 FROM emp
4 WHERE job = 'MANAGER';
3 rows created.

• Nu se mai foloseste clauza VALUES.


• Numarul coloanelor din clauza INSERT trebuie sa corespunda celor
din subinterogare.

Sintaxa este urmatoarea:

INSERT INTO tabel [ coloana ( , coloana ) ]


Subinterogare;
unde: tabel este numele tabelului (bazei de date).
coloana este numele coloanei din tabelul în care se
face inserarea.
subinterogare este subinterogarea care returneaza
înregistrarile în tabel.
Numarul si tipul câmpurilor (coloanelor) din lista specificata în comanda INSERT trebuie
sa corespunda numarului si tipului valorilor din subinterogare.

7
Modificarea datelor dintr-un tabel

EMP
EMPNO ENAME JOB ... DEPTNO
7839 KING PRESIDENT 10
“...modifica o înregistrare
în tabelul EMP...”
7698 BLAKE MANAGER 30
7782 CLARK MANAGER 10
7566 JONES MANAGER 20
. Modificarea
.. datelor dintr-un tabel:

Figura de mai sus arata modificarea numarului departamentului pentru Clark din
10 în 20. EMP
Actualizarea înregistrarilor: EMPNO ENAME JOB ... DEPTNO
7839 KING
Înregistrarile existente pot fi modificate folosind comanda PRESIDENT
UPDATE. 10
7698 BLAKE MANAGER 30
7782 CLARK MANAGER 20
7566 JONES MANAGER 20
...

COMANDA UPDATE

• Actualizati înregistrarilor existente folosind comanda


UPDATE.

UPDATE tabel
SET coloana = valoare [,coloana=valoare]
[WHERE conditie];

• Daca este nevoie, se pot modifica mai multe înregistrari


simultan.

În sintaxa de mai sus:

tabel este numele tabelului (bazei de date).


coloana este numele coloanei din tabelul în care se face modificarea.
valoare este noua valoare sau o subinterogare ce produce noua valoare petru
coloana ce se modifica.
conditie identifica înregistrarile care trebuie modificate si este alcatuita din
expresii, nume de coloane, constante, subinterogari si operatori de
comparare.

8
Puteti avea confirmarea operatiei de modificare prin interogarea tabelului, afisând
rândurile modificate.

Nota: În general, folositi cheia primara pentru a identifica o singura înregistrare.


Folosirea altor coloane poate determina modificarea mai multor înregistrari.
De exemplu, identificarea unei singure înregistrari în tabelul EMP prin nume poate fi
periculoasa, deoarece pot exista mai multi angajati cu acelasi nume.

Comanda UPDATE modifica anumite înregistrari daca este specificata clauza


WHERE. Exemplul urmator transfera angajatul cu numarul 7782 (Clark) la
departamentul 20.

Actualizarea înregistrarilor dintr-un tabel

• Daca folositi clauza WHERE, o anumita înregistrare sau anumite înregistrari


sunt modificate
SQL>UPDATE EMP
2 SET deptno = 20
3 WHERE empno = 7768;
1 row updated.

• Daca omiteti clauza WHERE, sunt modificate toate înregistrarile dintr-un tabel.

SQL>UPDATE employee
2 Daca omiteti clauza
SET WHERE,
deptno = 20;vor fi modificate toate înregistrarile din baza
de date.
14 rows updated.
SQL>SELECT ename, deptno
2 FROM employee;

ENAME DEPTNO
______ ______
KING 20
BLAKE 20
CLARK 20
JONES 20
MARTIN 20
ALLEN 20
TURNER 20
...
14 rows selected.

Nota: Tabelul EMPLOYEE contine aceleasi date ca si EMP.

9
Actualizarea înregistrarilor folosind
subinterogari dupa mai multe câmpuri

Modifica pentru angajatul numarul 7698 departamentul si slujba astfel


încât sa coincida cu cele ale angajatului numarul 7499.

SQL> UPDATE emp


2 SET (job, deptno) =
3 (SELECT job, deptno
4 FROM emp
5 WHERE empno = 7499)
6 WHERE empno = 7698;
1 row updated.

Modificarea înregistrarilor folosind


subinterogari dupa mai multe câmpuri
În clauza SET a unei comenzi UPDATE pot fi implementate subinterogari
dupa mai multe câmpuri.
UPDATE tabel
SET (coloana, coloana, ... ) =
(SELECT coloana, coloana,
FROM tabel
WHERE condition)
WHERE condition;

Actualizarea înregistrarilor folosind valori dintr-un alt tabel

Folositi subinterogari în comenzi UPDATE pentru a actualiza


înregistrariledintr-un tabel pe baza valorilor din alt tabel

SQL> UPDATE employee


2 SET deptno = (SELECT deptno
3 FROM emp
4 WHERE empno = 7788)
5 WHERE job = (SELECT job
6 FROM emp
7 WHERE empno = 7788);
2 row updated.

10
Actualizarea înregistrarilor folosind valori dintr-un alt tabel:

Puteti folosi subinterogari în comenzi UPDATE pentru a modifica înregistrari


dintr-un tabel. Exemplul de mai sus arata cum se fac actualizari în tabelul EMPLOYEE
pe baza valorilor din tabelul EMP. Este schimbat numarul de departament pentru toti
angajatii cu aceeasi slujba ca a celui cu numarul 7788; noul lor numar de departament
devenind egal cu al acestuia.

Actualizarea înregistrarilor:
Incalcarea constrângerii de integritate

SQL>UPDATE emp
2 SET deptno = 55
3 WHERE deptno = 10;

UPDATE emp
*
ERROR at line 1
ORA-02291: integrity constraint (USR.EMP_DEPTNO_FK)
violated - parent key not found

Departamentul cu numarul 55 nu exista.

Incalcarea constrângerii de integritate:

Daca încercati sa atribuiti unui câmp o valoare care este legata de o constrângere
de integritate, va rezulta o eroare.
În exemplul de mai sus, departamentul cu numarul 55 nu exista în tabelul parinte,
DEPT, si astfel veti obtine eroarea parent key violation ORA-02291.
Nota: Constrângerile de integritate asigura ca datele adera la un set predefinit de
reguli. O lectie urmatoare va dezvolta acest subiect mai pe larg.

Stergerea unei înregistrari dintr-un tabel

Figura de mai jos ilustreaza stergerea departamentului DEVELOPMENT din


tabelul DEPT (presupunând ca nu exista constrângeri definite pe tabelul DEPT).

11
COMANDA DELETE

Puteti sterge înregistrari existente dintr-un tabel folosind comanda


DELETE.

DELETE [FROM] tabel


[WHERE conditie];

Stergerea înregistrarilor:

Puteti sterge înregistrari dintr-un tabel folosind DELETE.


În sintaxa:
tabel este numele tabelului (bazei de date).
conditie identifica înregistrarile care trebuie sterse si este
alcatuita din expresii, nume de coloane, constante,
subinterogari si operatori de comparare.

Stergerea unei înregistrari dintr-un tabel

DEPT
DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK “sterge o înregistrare din
20 RESEARCH DALLAS
tabelul EMP”
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 DEVELOPMENT DETROIT
60 MIS
...

DEPT
DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
60 MIS
...

12
Puteti sterge anumite înregistrari prin specificarea clauzei WHERE în comanda
DELETE. Exemplul de mai sus sterge departamentul DEVELOPMENT din tabelul
DEPARTMENT. Va puteti asigura ca stergerea s-a facut corect, încercând afisarea
rândurilor sterse printr-un SELECT.

SQL> SELECT *
2 FROM department
3 WHERE dname = 'DEVELOPMENT';
no rows selected.

Exemplu:
Stergeti toti cei angajati dupa data de 1 Ianuarie, 1997.
SQL> DELETE FROM emp
2 WHERE hiredate > TO_DATE('01.01.97', 'DD.MM.YY');
1 row deleted.

Daca ati omis clauza WHERE, toate rândurile din tabel vor fi sterse. Cel de-al
doilea exemplu din figura sterge toate rândurile din tabelul DEPARTMENT, deoarece nu
a fost specificata nici o clauza WHERE.

Nota: Tabelul DEPARTMENT contine aceleasi date ca si DEPT.

Stergerea înregistrarilor folosind valori dintr-un alt tabel

Folositi subinterogari în comanda DELETE pentru a sterge înregistrarile


dintr-un tabel pe baza valorilor din alt tabel

SQL> DELETE FROM employee


2 WHERE deptno =
3 (SELECT deptno
4 FROM dept
5 WHERE dname = 'SALES');
6 rows deleted.

Stergerea înregistrarilor folosind valori dintr-un alt tabel:

Puteti folosi subinterogari pentru a sterge înregistrari dintr-un tabel, folosind


informatiile din altul. Exemplul de mai sus sterge toti angajatii care sunt în departamentul
30. Subinterogarea cauta în tabelul DEPT numarul de departament pentru SALES, apoi
furnizeaza numarul de departament interogarii principale, care sterge înregistrari din
EMP pe baza acestuia.

Incalcarea constrângerii de integritate:


Daca încercati stergerea unei înregistrari care contine un câmp cu o valoare legata
de o constrângere de integritate, veti obtine o eroare.

13
În exemplul de mai jos se încearca stergerea departamentului cu numarul 10 din
tabelul DEPT, dar aceasta provoaca o eroare, deoarece numarul de departament este
folosit ca si cheie externa în tabelul EMP. Daca înregistrarea parinte pe care încercati sa o
stergeti are înregistrari fii, atunci veti primi un mesaj de eroare: child record found
violation ORA - 02292.

Stergerea înregistrarilor:
Incalcarea constrângerii de integritate

SQL>DELETE FROM dept


2 WHERE deptno = 10;

DELETE FROM dept


*
ERROR at line 1
ORA-02292: integrity constraint (USR.EMP_DEPTNO_FK)
violated - child record found

Nu puteti sterge o înregistrare care contine o cheie primara folosita ca cheie externa
în alt tabel.

Tranzactii

Constau dintr-un grup format din urmatoarele comenzi:

• Comenzi DML care se constituie într-o schimbare consistenta a


datelor
• O comanda DDL
• O comanda DCL

Tranzactii în baze de date:

Serverul Oracle asigura consistenta datelor pe baza tranzactiilor. Tranzactiile va


ofera mai multa flexibilitate si control la modificari aduse datelor si asigura consistenta
datelor în eventuala cadere a sistemului sau în cazul unei erori a procesului utilizator.
Tranzactiile constau din comenzi DML care se constituie într-o schimbare
consistenta asupra datelor. De exemplu, un transfer de fonduri între doua conturi ar trebui
sa includa debitul unui cont si creditul celuilalt cu o aceeasi suma de bani. Ambele actiuni
ar trebui fie sa reuseasca împreuna, fie sa esueze împreuna. Operatia de creditare nu ar
trebui sa poata fi efectuata fara ca cea de debit sa aiba succes

14
Tipuri de tranzactii

Tip Descriere

Limbaj de manipulare Consta din orice numar de comenzi DML pe care serverul Oracle le
a datelor (DML) trateaza ca o singura entitate sau unitate logica de lucru.

Limbaj de definire a Consta dintr-o singura comanda DDL


datelor (DDL)

Limbaj de control al Consta dintr-o singura comanda DCL


datelor (DCL)

Tranzactii în baze de date

• Încep odata cu executia primei comenzi SQL executabile


• Se termina la aparitia unuia dintre urmatoarele evenimente:
- COMMIT sau ROLLBACK
- Executia unei comenzi DDL sau DCL ( automatic commit)
- Deconectarea utilizatorului
- Caderea sistemului

Când începe si când se termina o tranzactie?

O tranzactie începe când este întalnita prima comanda SQL executabila si se


termina la aparitia unuia dintre evenimentele:
• O comanda COMMIT sau ROLLBACK
• O comanda DDL, de exemplu CREATE
• O comanda DCL
• Utilizatorul iese din SQL*Plus
• 'Pica' sistemul.

Dupa ce se încheie o tranzactie, urmatoarea tranzactie va începe automat la prima


comanda SQL executabila întâlnita.
O comanda DDL sau DCL este commited (modificarile facute sunt salvate)
automat si de aceea încheie în mod implicit o tranzactie.

15
Avantajele COMMIT si ROLLBACK

• Asigura consistenta datelor


• Ofera posibilitatea revederii schimbarilor facute înainte de a le salva
• Grupeaza operatii relationate logic

Comenzi pentru controlul explicit al tranzactiilor:

Puteti controla logica tranzactiilor folosind comenzile COMMIT, SAVEPOINT si


ROLLBACK.

Controlul tranzactiilor

INSERT UPDATE INSERT DELETE

COMMIT Savepoint A Savepoint B

ROLLBACK to Savepoint B

ROLLBACK to Savepoint A

ROLLBACK

Comanda Descriere

Încheie actuala tranzactie facând ca toate modificarile sa devina


COMMIT
permanente (salveaza modificarile)

Marcheaza un punct de întoarcere (savepoint) în cadrul tranzactiei


SAVEPOINT nume
curente
Comanda ROLLBACK încheie tranzactia curenta pierzându-se toate
ROLLBACK [TO modificarile temporare (pending changes) asupra datelor.
SAVEPOINT name] ROLLBACK TO SAVEPOINT name sterge savepoint-ul si toate
schimbarile de dupa el (temporare).
Nota: SAVEPOINT nu este ANSI standard SQL.

16
Procesarea implicita a tranzactiilor

• Un commit (salvarea modificarilor) automat are loc în urmatoarele


circumstante:
- Este data o comanda DDL
- Este data o comanda DCL
- O parasire normala a mediului SQL*Plus, fara a da explicit o
comanda COMMIT sau ROLLBACK
• Un rollback automat are loc în conditiile unei terminari anormale a
sesiunii SQL*Plus sau în cazul unei 'caderi' de sistem.

Stare Circumstante

Comanda DDL sau DCL


Commit automat Iesire normala din SQL*Plus, fara o comanda COMMIT sau
ROLLBACK explicita

Rollback automat Terminare anormala a SQL*Plus sau cadere sistem

Nota: În SQL*Plus mai este disponibila si o a treia comanda. Comanda SQL*Plus


AUTOCOMMIT poate fi setata ON sau OFF. Daca este setata pe ON, fiecare comanda
DML individuala duce la salvarea modificarilor, imediat ce este executata. Nu se mai
poate reveni la situatia dinainte (un rollback nu mai este posibil). Daca este setata pe
OFF, COMMIT poate fi data explicit. De asemeni, COMMIT este executata odata cu o
comanda DDL sau la iesirea din SQL*Plus.
Caderile sistemului: Când o tranzactie este întrerupta de o cadere a sistemului,
întreaga tranzactie este automat pierduta (este 'rolled back'). Aceasta împiedica eroarea sa
determine schimbari nedorite asupra datelor si reface starea bazelor din momentul
ultimului COMMIT. (explicit sau implicit). Astfel, SQL*Plus pastreaza integritatea
tabelelor (bazelor de date).

Salvarea modificarilor:

Fiecare modificare efectuata în timpul tranzactiei este temporara pâna când apare
un 'commit' (pâna la 'salvarea' tranzactiei).

Starea datelor înainte de un COMMIT sau ROLLBACK:


• Operatiile de manipulare a datelor afecteaza initial buffer-ul bazei de date; de
aceea, starea initiala a datelor poate fi refacuta.
• Utilizatorul curent poate urmari schimbarile facute prin interogarea tabelelor.
• Alti utilizatori nu pot vedea modificarile facute de utilizatorul curent. Serverul
Oracle instituie o consistenta la citire pentru a se asigura ca fiecare utilizator
vede datele asa cum existau ele în momentul ultimei salvari.
• Înregistrarile afectate sunt protejate (locked); alti utilizatori nu pot face
modificari asupra lor.

17
Starea datelor înainte de COMMIT sau ROLLBACK

• Starea anterioara a datelor poate fi refacuta.


• Utilizatorul curent poate revedea rezultatul operatiilor DML folosind
comanda SELECT.
• Alti utilizatori nu pot vedea rezultatul comenzilor DML date de
utilizatorul curent.
• Înregistrarile modificate sunt protejate (locked); alti utilizatori nu pot
modifica datele din aceste înregistrari.

Starea datelor dupa COMMIT

• Modificarile asupra datelor din baza de date devin permanente.


• Starea anterioara a datelor nu mai poate fi refacuta.
• Toti utilizatorii pot vedea rezultatele.
• Înregistrarile protejate (locked) sunt deblocate pentru modificare si
pot fi schimbate de alti utilizatori.
• Toate savepoint-urile sunt sterse.

Puteti salva toate modificarile prin folosirea comenzii COMMIT. Dupa


executarea unui COMMIT:
• Modificarile datelor sunt salvate în baza de date.
• Starea anterioara a datelor nu mai poate fi refacuta.
• Toti utilizatorii pot vedea rezultatele tranzactiei.
• Protectia înregistrarilor modificate este înlaturata; aceste înregistrari pot fi
modificate de alti utilizatori
• Toate savepoint-urile sunt sterse.

18
Salvarea modificarilor

• Faceti modificarile.
SQL>UPDATE emp
2 SET deptno = 10
3 WHERE empno = 7782;
1 row updated.
• Salvati modificarile

SQL>COMMIT;
Commit complete.

Exemplul de mai sus modifica tabelul EMP si seteaza numarul de


departament pentru angajatul numarul 7782 (Clark) la 10. Apoi face ca
modificarea sa devina permanenta prin comanda COMMIT.
Exemplu:
Creati un nou departament ADVERTISING cu cel putin un angajat. Salvati modificarile
facute.

SQL> INSERT INTO department(deptno, dname, loc)


2 VALUES (50, 'ADVERTISING','MIAMI');
1 row created.

SQL> UPDATE employee


2 SET deptno = 50
3 WHERE empno = 7876;
1 row updated.

SQL> COMMIT;
Commit complete.

19
Starea datelor dupa ROLLBACK

Anulati modificarile temporare facute folosind comanda ROLLBACK.


• Modificarile asupra datelor sunt pierdute.
• Starea anterioara a datelor este refacuta.
• Protectia asupra înregistrarilor implicate este ridicata.

SQL> DELETE FROM employee;


14 rows deleted.
SQL> ROLLBACK;
Rollback complete.

Stergerea modificarilor (refacerea starii initiale):

Puteti anula modificarile temporare folosind comanda ROLLBACK. Dupa un


ROLLBACK:
• Modificarile facute sunt pierdute.
• Starea anterioara a datelor este refacuta.
• Protectia asupra înregistrarilor implicate este ridicata.

Exemplu:
Încercând sa stergeti o înregistrare din tabelul TEST, puteti sterge accidental întreg
tabelul. Puteti corecta greseala, iar apoi sa dati comenzile corecte si sa salvati
modificarile.

SQL> DELETE FROM test;


25,000 rows deleted.
SQL> ROLLBACK;
Rollback complete.
SQL> DELETE FROM test
2 WHERE id = 100;
1 row deleted.
SQL> SELECT *
2 FROM test
3 WHERE id = 100;
No rows selected.
SQL> COMMIT;
Commit complete.

20
Anularea modificarilor pâna la un savepoint:

Anularea modificarilor pîna la un punct marcat (Marker)

• Creati un marcaj în tranzactia curenta folosind comanda


SAVEPOINT.
• Anulati modificarile pîna la acel marcaj folosind comanda
ROLLBACK TO SAVEPOINT.

SQL> UPDATE . . .
SQL> SAVEPOINT update_done;
Savepoint created.
SQL> INSERT. . .
SQL> ROLLBACK TO update_done;
Rollback complete.

Puteti crea un marcaj în cadrul tranzactiei curente folosind comanda SAVEPOINT.


Astfel, tranzactia poate fi împartita în sectiuni mai mici. Puteti apoi anula modificarile
temporare pâna la acel marcaj folosind comanda ROLLBACK TO SAVEPOINT.
Daca creati un al doilea savepoint cu acelasi nume ca unul anterior, savepoint-ul anterior
este sters.

Rollback la nivel de comanda

• Daca o singura comanda DML esueaza în timpul executarii ei, se


reface starea dinaintea acelei comenzi.
• Serverul Oracle implementeaza un savepoint implicit.
• Toate celelalte modificari sunt mentinute.
• Utilizatorul ar trebui sa încheie tranzactiile explicit, printr-o comanda
COMMIT sau ROLLBACK.

Rollback la nivel de comanda:

Se poate anula o parte din tranzactie printr-un rollback implicit daca este detectata o
eroare la executia unei comenzi. Daca o singura comanda DML esueaza în timpul
executiei unei tranzactii, efectul ei este anulat printr-un rollback la nivel de comanda, dar
schimbarile facute de comenzile DML anterioare în tranzactie nu vor fi anulate. Ele pot fi
salvate (commited) sau anulate (rolled back) în mod explicit de catre utilizator.
Oracle executa o comanda COMMIT implicita înainte si dupa orice comanda DDL.

21
Deci, chiar daca comanda voastra DDL nu se executa cu succes, nu puteti anula
comenzile anterioare pentru ca serverul a executat un commit (a salvat modificarile).
Terminati-va tranzactiile explicit, prin executarea unei comenzi COMMIT sau
ROLLBACK.

Consistenta la citire

• Consistenta la citire garanteaza o vedere consistenta a datelor în


fiecare moment.
• Schimbarile facute de un utilizator nu intra în conflict cu schimbarile
realizate de un altul.
• Asigura ca, pentru aceleasi date:
- Cei care citesc datele sa nu-i astepte pe cei care le modifica;
- Cei care modifica datele sa nu-i astepte pe cei care le citesc.

Consistenta la citire:

Utilizatorii bazei de date o acceseaza pe aceasta în doua moduri:


• Operatii de citire (comanda SELECT);
• Operatii de scriere (comenzile INSERT, UPDATE, DELETE).
Consistenta la citire este necesara pentru ca:
• Cei care citesc/modifica datele sa aiba o vedere consistenta a datelor;
• Cei care citesc datele sa nu vada datele care sunt în curs de modificare;
• Cei care modifica datele sa aiba siguranta ca schimbarile în baza de date se fac
în mod consistent;
• Schimbarile facute de un utilizator sa nu intre în conflict sau sa afecteze
schimbarile facute de un altul.
Scopul consistentei la citire este sa asigure ca fiecare utilizator vede datele în starea în
care erau la ultima salvare, înainte sa înceapa o operatie DML.

Implementarea consistentei la citire:


Consistenta la citire este implementata în mod automat. Este pastrata o copie partiala a
bazei de date în segmente rollback.
Când se realizeaza o operatie de adaugare, actualizare sau stergere asupra bazei de date,
serverul Oracle scrie o copie a datelor dinainte de modificare într-un segment rollback.
Toti utilizatorii, cu exceptia celui care a initiat modificarea, vad înca baza de date în
starea de dinainte de începerea modificarii; ei vad datele din segmentul rollback.
Înainte ca schimbarile sa fie salvate în baza de date, numai utilizatorul care modifica
datele vede baza de date modificata, toti ceilalti vazând datele din segmentul rollback.
Aceasta garanteaza ca utilizatorii citesc consistent datele care nu sufera schimbari în chiar
acel moment.
Când o comanda DML este salvata, schimbarea facuta în baza de date devine vizibila
oricui executa o comanda SELECT. Spatiul ocupat de 'vechile' date din segmentul
rollback este eliberat pentru a fi reutilizat.
Daca tranzactia este anulata, schimbarile sunt la rândul lor anulate.

22
• Versiunea originala mai veche a datelor din segmentul rollback este scris
înapoi în tabel.
• Toti utilizatorii vad baza de date asa cum era înainte de a începe tranzactia.

Protectia la scriere (locking)


Lacatele Oracle:
• Previn interactiunile destructive între tranzactii concurente
• Nu necesita actiuni din partea utilizatorului
• Folosesc în mod automat cel mai mic nivel de restrictionare
• Sunt valabile pe durata unei tranzactii
• Sunt de doua moduri:
- Exclusive;
- Partajate.
Ce sunt lacatele?

Lacatele sunt mecanisme care previn interactiunea destructiva între tranzactii ce


acceseaza aceeasi resursa: fie un obiect utilizator (de ex. tabele sau înregistrari), fie
obiecte sistem care nu sunt vizibile utilizatorilor (de ex. structuri de date partajate si
înregistrari "data dictionary").

Cum protejeaza Oracle datele

Protejarea unei baze de date Oracle este automatizata în întregime si nu necesita actiuni
din partea utilizatorului. Implicit, protejarea are loc pentru toate comenzile SQL cu
exceptia lui SELECT. Mecanismul implicit de protectie în Oracle foloseste în mod
automat cel mai mic nivel aplicabil de restrictionare, astfel furnizând cel mai mare grad
de concurenta existent, precum si integritate maxima a datelor. Oracle permite si
protejarea datelor manual de catre utilizator.

Modurile de protectie

Oracle foloseste doua moduri de protectie într-o baza de date multiutilizator.


Mod de protectie Descriere

Împiedica partajarea unei resurse.


exclusiva Prima tranzactie care blocheaza resursa în mod exclusiv este singura
(lacat exclusiv) tranzactie care poate modifica resursa pâna când lacatul exclusiv este
anulat.
Permite resursei sa fie partajata.
Mai multi utilizatori care citesc datele le pot folosi în comun prin
partajata crearea unor lacate partajate ce împiedica accesul concurent pentru
(lacat partajat) scriere (care necesita un lacat exclusiv).
Mai multe tranzactii pot obtine lacate partajate pentru aceeasi
resursa.

23
Rezumat
Comanda Descriere

INSERT Adauga o înregistrare noua la tabel.

Modifica înregistrari existente în


UPDATE
tabel.
Sterge înregistrari existente din
DELETE
tabel.
Face ca schimbarile sa devina
COMMIT
permanente.

SAVEPOINT Permite întoarcerea la un savepoint.

Anuleaza toate schimbarile


ROLLBACK
temporare.

Rezumat:

Puteti manipula datele dintr-o baza de date utilizând comenzile: INSERT, UPDATE si
DELETE.
Puteti controla modificarile datelor utilizând comenzile: COMMIT, SAVEPOINT si
ROLLBACK.
Serverul Oracle garanteaza o vedere consistenta a datelor în orice moment.
Protejarea poate fi implicita sau explicita.

Trecerea în revista a exercitiilor

• Inserarea de înregistrari în tabele


• Actualizarea si stergerea înregistrarilor din tabele
• Controlul tranzactiilor

În aceste exercitii, veti adauga noi înregistrari la tabelul MY_EMPLOYEE, veti actualiza
si sterge date din tabel si va veti controla tranzactiile.

24
Exercitii:

Inserarea de date în tabelul MY_EMPLOYEE.


1. Executati scriptul lab9_1.sql pentru a crea baza de date MY_EMPLOYEE, care va fi
folosita pentru laborator.
2. Descrieti structura tabelului MY_EMPLOYEE pentru a identifica numele câmpurilor.
3. Adaugati prima înregistrare a tabelului din exemplul de mai jos. Nu folositi lista
coloanelor în clauza INSERT.
ID LAST_NAME FIRST_NAME USERID SALARY
1 Patel Ralph rpatel 795
2 Dancs Betty bdancs 860
3 Biri Ben bbiri 1100
4 Newman Chad cnewman 750
5 Ropeburn Audry aropebur 1550
4. Introduceti în tabelul MY_EMPLOYEE si al doilea rând de date din exemplul de mai
sus. De data aceasta, specificati coloanele explicit în clauza INSERT.
5. Verificati adaugarea la tabel.
6. Creati un script numit loademp.sql pentru a insera înregistrari în tabelul
MY_EMPLOYEE interactiv. Cereti utilizatorului numele mic(FIRST_NAME),
numele de familie (LAST_NAME) si salariul fiecarui angajat. Concatenati prima
litera a numelui mic si primele 7 caractere ale numelui de familie pentru a crea userid.
7. Inserati urmatoarele doua înregistrari în tabel, prin intermediul scriptului creat.
8. Verificati adaugarile.
9. Salvati modificarile.
Stergerea si actualizarea datelor din tabelul MY_EMPLOYEE.
10. Modificati numele de familie al angajatului cu ID = 3 în Drexler.
11. Modificati salariul la 1000 pentru toti cei cu salariul mai mic decat 900.
12. Verificati modificarile facute.
13. Stergeti-o pe Betty Dancs din tabelul MY_EMPLOYEE.
14. Verificati modificarile.
15. Salvati toate modificarile temporare.
Controlul tranzactiilor de date asupra tabelului MY_EMPLOYEE.
16. Inserati în tabel ultima înregistrare rulând scriptul creat la punctul 6.
17. Verificati adaugarea.
18. Marcati un savepoint în cadrul tranzactiei.
19. Stergeti toate înregistrarile din tabel.
20. Verificati ca tabelul este gol.
21. Anulati cea mai recenta operatie DELETE fara a anula si INSERT -ul anterior.
22. Verificati ca rândul nou este intact.
23. Salvati adaugarea, facând-o permanenta.

25

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