Sunteți pe pagina 1din 27

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 cnd:
- 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. Cnd 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.

Considerati o baza de date din domeniul bancar. Atunci cnd 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 nct sa mentina echilibrul necesar ntre conturi.
Atunci cnd, 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
Adaugareaunei
uneinoi
noinregistrari
nregistrarintr-un
ntr-untabel
tabel
...insereaza o noua
nregistrare n baza de
50DEVELOPMENTDETROITNoua nregistrare
50DEVELOPMENTDETROITNoua nregistrare
date DEPT ...
DEPT
DEPT

DEPTNODNAMELOC10ACCOUNTINGNEW DEPT
DEPTNODNAMELOC10ACCOUNTINGNEW
DEPTNODNAMELOC10ACCOUNTINGNEW
YORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON
YORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON
YORK20RESEARCHDALLAS30SALESCHICAGO
40OPERATIONSBOSTON50DEVELOPMENTDET
ROIT

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

COMANDA
COMANDAINSERT
INSERT
Puteti
Puteti adauga
adauga noi
noi nregistrari
nregistrari ntr-un
ntr-un tabel
tabel folosind
folosind comanda
comanda
INSERT.
INSERT.
INSERT
INSERT INTO
INTO
VALUES
VALUES

tabel
tabel[(coloana
[(coloana[,coloana...]
[,coloana...])])]
(valoare
(valoare[,valoare...]
[,valoare...]););

Folosind
Folosind aceasta
aceasta sintaxa,
sintaxa, sese poate
poate insera
insera inin tabel,
tabel, doar
doar oo
nregistrare
nregistrareodata
odata

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 cte un rnd odata la
un tabel.

Inserarea
Inserareaunor
unornoi
noinregistrari
nregistrari
Inserarea
Inserareaunei
uneinoi
noinregistrari
nregistraricontinnd
continndvalori
valoripentru
pentrufiecare
fiecarecoloana.
coloana.
Valorile
se
dau
n
ordinea
prestabilita
a
coloanelor
din
tabel.
Valorile se dau n ordinea prestabilita a coloanelor din tabel.
Precizarea
Precizareacoloanelor
coloaneloreste
esteoptionala.
optionala.
SQL>INSERT
SQL>INSERTINTO
INTO
22
VALUES
VALUES

dept(deptno,
dept(deptno,dname,
dname,loc)
loc)
(50,
DEVELOPMENT,
(50, DEVELOPMENT,DETROIT);
DETROIT);

Valorile
Valorilede
detip
tipcaracter
caractersau
saudata
datatrebuie
trebuiencadrate
ncadratede
deghilimele
ghilimelesimple.
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
_________________
DEPTNO
DNAME
LOC

Null?
________
NOT NULL

Type
_________
NUMBER(2)
VARCHAR2(14)
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.

Inserarea
Inserareade
denregistrari
nregistraricu
cuvalori
valoride
deNULL
NULL
Metoda
Metodaimplicita:
implicita:Omiterea
Omitereacoloanei
coloaneidin
dinlista.
lista.
SQL>INSERT
dept(deptno,
SQL>INSERTINTO
INTO
dept(deptno,dname)
dname)
22
VALUES
(60,
MIS);
VALUES
(60, MIS);
11row
created.
row created.
Metoda
Metodaexplicita:
explicita:Specificarea
Specificareacuvntului
cuvntuluicheie
cheieNULL.
NULL.
SQL>INSERT
SQL>INSERTINTO
INTO
22
VALUES
VALUES
11row
created.
row created.

dept
dept
(70,
(70,FINANCE,
FINANCE,NULL);
NULL);

Metode de inserare a valorilor NULL:


Metoda
Implicita
Explicita

Descriere
Omiteti coloanei din lista.
Specificati cuvntul 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 constrngerile 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
Inserareaunor
unorvalori
valorispeciale
speciale
Functia
FunctiaSYSDATE
SYSDATEfurnizeaza
furnizeazadata
datasisitimpul
timpulcurent
curent
SQL>INSERT
emp(empno,
SQL>INSERTINTO
INTO
emp(empno,ename,
ename,job,
job,mgr,
mgr,
22
hiredate,
sal,
comm,
deptno)
hiredate, sal, comm, deptno)
33
VALUES
(7196,
VALUES
(7196,GREEN,
GREEN,SALESMAN,
SALESMAN,
7782,
SYSDATE,
2000,
NULL,
10);
7782, SYSDATE, 2000, NULL, 10);
11row
rowcreated.
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 cmpul 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:

SQL> SELECT
2
FROM
3
WHERE
EMPNO
_____
7196

ENAME
______
GREEN

empno, ename, job, hiredate, comm


emp
empno = 7196;
JOB
________
SALESMAN

HIREDATE
________
01-DEC-97

COMM
________

Inserarea
Inserareaunor
unorvalori
valorispecifice
specificede
detip
tipdata
datacalendaristica
calendaristica
Adaugarea
Adaugareaunui
unuinou
nouangajat:
angajat:
SQL>INSERT
SQL>INSERTINTO
INTO emp
emp
22
VALUES
(2269,
VALUES
(2269,AROMANO,
AROMANO,SALESMAN,7782,
SALESMAN,7782,
TO_DATE(FEB-3
,
1997,
'MON
DD,
YY'),
TO_DATE(FEB-3 , 1997, 'MON DD, YY'),
1300,
1300,NULL,
NULL,10);
10);
11row
rowcreated.
created.
Verificarea
Verificareaadaugarii:
adaugarii:
EMPNO
JOB
MGR
SAL
EMPNO ENAME
ENAME
JOB
MGR HIREDATE
HIREDATE
SAL COMM
COMM
DEPTNO
DEPTNO
________ ____________ ________________ ______ ______________
______ __________ __________
__
2296
1300
2296 AROMANO
AROMANO SALESMAN
SALESMAN 7782
7782 01-DEC-97
01-DEC-97
1300
1010
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. Cmpul HIREDATE primeste valoarea February 3, 1997.

Inserare
Inserarede
devalori
valorifolosind
folosindvariabile
variabilede
desubstitutie
substitutie
Inserarea de
valori folosindfolosirea
variabile de substitutie:
Crearea
Creareaunui
unuiscript
scriptinteractiv
interactivprin
prin folosireavariabilelor
variabilelorde
desubstitutie
substitutieSQL*Plus
SQL*Plus
Se poate scrie o comanda INSERT care sa permita utilizatorului sa adauge valori
interactiv
folosind variabilele
de substitutie
SQL*Plus.
SQL>INSERT
INTO
dept(deptno,
dname,
loc)
SQL>INSERT
INTO
dept(deptno,
dname,
loc)
Exemplul
de
mai
sus
nregistreaza
informatia
pentru
un departament n tabelul
22
VALUES
(&department_id,
&department_name,
VALUES
(&department_id,
&department_name,
DEPT.
Numarul
departamentului,
numele
si
locatia
sunt
cerute
interactiv utilizatorului.
33
'&location');
'&location');
Pentru valori de tip data calendaristica sau sir de caractere, ampersandul si numele
variabilei sunt ncadrate de ghilimele simple (apostroafe).

Enter
Entervalue
valuefor
fordepartment_id:
department_id:80
80
Enter
value
for
department_name:
Enter value for department_name:EDUCATION
EDUCATION
Enter
value
for
location:
ATLANTA
Enter value for location: ATLANTA
11row
rowcreated.
created.
Crearea
Creareaunui
unuiscript
scriptcu
cuinteractiv
interactiv
ACCEPT
ACCEPT
PROMPT
PROMPT

memoreaza
memoreazavaloarea
valoareantr-o
ntr-ovariabila
variabila
afiseaza
textul
specificat.
afiseaza textul specificat.

ACCEPT
ACCEPT
ACCEPT
ACCEPT
ACCEPT
ACCEPT
INSERT
INSERTINTO
INTO
VALUES
VALUES

department_id
department_idPROMPT
PROMPT'Introduceti
'Introduceti
numarul
departamentului:'
numarul departamentului:'
department_name
department_namePROMPT
PROMPT'Introduceti
'Introduceti
numele
departamentului:'
numele departamentului:'
location
locationPROMPT
PROMPT'Introduceti
'Introducetiorarul:'
orarul:'
dept(deptno,
dept(deptno,dname,
dname,loc)
loc)
(&department_id,'&department_name',
(&department_id,'&department_name',
'&location');
'&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 cnd se executa fisierul, sunt cerute valori noi
pentru variabile. Prin intermediul comenzii SQL*Plus ACCEPT, mesajele afisate la
cererea introducerii valorilor pot fi modificate.

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 & cnd este referit ntro 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 cmpuri fiind extrase dintr-un tabel existent. Pentru aceasta se foloseste, n
locul clauzei VALUES, o subinterogare.

Copierea
Copiereanregistrarilor
nregistrarilordintr-un
dintr-unalt
alttabel
tabel
Folositi
Folositicomanda
comandaINSERT
INSERTcu
cuoosubinterogare.
subinterogare.
SQL>
managers(id,
SQL>INSERT
INSERTINTO
INTO
managers(id,name,
name,salary,
salary,hiredate)
hiredate)
SELECT
empno,
ename,
sal,
hiredate
SELECT empno, ename, sal, hiredate
FROM
FROMemp
emp
WHERE
WHEREjob
job=='MANAGER';
'MANAGER';
33rows
created.
rows created.
Nu
Nusesemai
maifoloseste
folosesteclauza
clauzaVALUES.
VALUES.
Numarul
coloanelor
din
clauza
Numarul coloanelor din clauzaINSERT
INSERTtrebuie
trebuiesasacorespunda
corespundacelor
celordin
din
subinterogare.
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 cmpurilor (coloanelor) din lista specificata n comanda INSERT trebuie
sa corespunda numarului si tipului valorilor din subinterogare.

Modificarea datelor dintr-un tabel


EMP
EMP

EMPNOENAMEJOB...DEPTNO7839KINGPRESIDENT107698BLAKEMANAGER307782CLARKMANAGER1075
EMPNOENAMEJOB...DEPTNO7839KINGPRESIDENT107698BLAKEMANAGER307782CLARKMANAGER1075
...modifica o nregistrare
66JONESMANAGER20. . .
66JONESMANAGER20. . .

n tabelul EMP...

Modificarea datelor dintr-un tabel:


Figura de mai sus arata modificarea numarului departamentului pentru Clark din
10 n 20.
EMP
EMPNOENAMEJOB...DEPTNO7839KINGPRESIDENT10
Actualizarea nregistrarilor:
nregistrarile existente pot fi

7698BLAKEMANAGER307782CLARKMANAGER207566J
ONESMANAGER20
. . . UPDATE.
modificate
folosind comanda

COMANDA
COMANDAUPDATE
UPDATE
Actualizati
Actualizatinregistrarilor
nregistrarilorexistente
existentefolosind
folosindcomanda
comandaUPDATE.
UPDATE.
UPDATE
UPDATE
SET
SET
[WHERE
[WHERE

tabel
tabel
coloana
]]
coloana==valoare
valoare[,coloana=valoare
[,coloana=valoare
conditie
conditie];];

Daca
Dacaeste
estenevoie,
nevoie,sesepot
potmodifica
modificamai
maimulte
multenregistrari
nregistrarisimultan.
simultan.

n sintaxa de mai sus:


tabel
coloana
valoare
conditie

este numele tabelului (bazei de date).


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

Puteti avea confirmarea operatiei de modificare prin interogarea tabelului, afisnd


rndurile 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
Actualizareanregistrarilor
nregistrarilordintr-un
dintr-untabel
tabel
Daca
Dacafolositi
folositiclauza
clauzaWHERE,
WHERE,ooanumita
anumitanregistrare
nregistraresau
sauanumite
anumitenregistrari
nregistrarisunt
sunt
modificate
modificate
SQL>UPDATE
SQL>UPDATE EMP
EMP
22
SET
deptno
SET
deptno==20
20
33
WHERE
empno
=
7768;
WHERE empno = 7768;
11row
updated.
row updated.
Daca
Dacaomiteti
omiteticlauza
clauzaWHERE,
WHERE, sunt
suntmodificate
modificatetoate
toatenregistrarile
nregistrariledintr-un
dintr-untabel.
tabel.
SQL>UPDATE
SQL>UPDATE employee
employee
omiteti clauza
WHERE,
vor fi modificate toate nregistrarile din baza
22 Daca
SET
deptno
==20;
SET
deptno
20;
de date.
14
14rows
rowsupdated.
updated.
SQL>SELECT
2
FROM

ename, deptno
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.

Actualizarea
Actualizareanregistrarilor
nregistrarilorfolosind
folosind
subinterogari
dupa
mai
multe
subinterogari dupa mai multecmpuri
cmpuri
Modifica
Modificapentru
pentruangajatul
angajatulnumarul
numarul7698
7698departamentul
departamentulsisislujba
slujbaastfel
astfel
nct
sa
coincida
cu
cele
ale
angajatului
numarul
7499.
nct sa coincida cu cele ale angajatului numarul 7499.
SQL>
SQL>UPDATE
UPDATE
SET
SET

WHERE
WHERE
11row
updated.
row updated.

emp
emp
(job,
(job,deptno)
deptno)==
(SELECT
(SELECTjob,
job,deptno
deptno
FROM
emp
FROM emp
WHERE
WHEREempno
empno==7499)
7499)
empno
=
7698;
empno = 7698;

Modificarea nregistrarilor folosind


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

Actualizarea
Actualizareanregistrarilor
nregistrarilorfolosind
folosindvalori
valoridintr-un
dintr-unalt
alttabel
tabel
Folositi
Folositi subinterogari
subinterogari nn comenzi
comenzi UPDATE
UPDATE pentru
pentru aa actualiza
actualiza
nregistrariledintr-un
tabel
pe
baza
valorilor
din
alt
tabel
nregistrariledintr-un tabel pe baza valorilor din alt tabel
SQL>
SQL>UPDATE
UPDATE
SET
SET
WHERE
WHERE
22row
rowupdated.
updated.

employee
employee
deptno
deptno== (SELECT
(SELECTdeptno
deptno
FROM
emp
FROM emp
WHERE
WHEREempno
empno==7788)
7788)
job
=
(SELECT
job
job =
(SELECT job
FROM
FROMemp
emp
WHERE
WHEREempno
empno==7788);
7788);

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
Actualizareanregistrarilor:
nregistrarilor:
Incalcarea
constrngerii
Incalcarea constrngeriide
deintegritate
integritate
SQL>UPDATE
SQL>UPDATE emp
emp
22
SET
deptno
SET
deptno==55
55
33
WHERE
deptno
=
10;
WHERE deptno = 10;
UPDATE
UPDATE emp
emp
**
ERROR
ERRORatatline
line11
ORA-02291:
ORA-02291:integrity
integrityconstraint
constraint(USR.EMP_DEPTNO_FK)
(USR.EMP_DEPTNO_FK)
violated
parent
key
not
found
violated - parent key not found
Departamentul
Departamentulcu
cunumarul
numarul55
55nu
nuexista.
exista.
Incalcarea constrngerii de integritate:
Daca ncercati sa atribuiti unui cmp o valoare care este legata de o constrngere
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: Constrngerile 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 (presupunnd ca nu exista constrngeri definite pe tabelul DEPT).

11

Stergerea
Stergereanregistrarilor
nregistrarilordintr-un
dintr-untabel
tabel
OO anumita
anumita nregistrare
nregistrare sau
sau anumite
anumite nregistrari
nregistrari sunt
sunt sterse
sterse daca
daca folositi
folositi clauza
clauza
WHERE.
WHERE.
SQL>DELETE
department
SQL>DELETE FROM
FROM
COMANDA
DELETE
department
COMANDA
DELETE
22
WHERE
dname
WHERE
dname=='DEVELOPMENT';
'DEVELOPMENT';
11row
deleted.
Puteti
row
deleted.
sterge
Puteti
stergenregistrari
nregistrariexistente
existentedintr-un
dintr-untabel
tabelfolosind
folosindcomanda
comanda
DELETE.
DELETE.
Toate
dintr-un
tabel
daca
Toatenregistrarile
nregistrarile
dintr-un
tabelsunt
suntsterse
sterse
dacaomiteti
omiteticlauza
clauzaWHERE.
WHERE.
DELETE
[FROM]
tabel
DELETE [FROM]
tabel
[WHERE
conditie];
[WHERE
conditie];
SQL>DELETE
FROM
department;
SQL>DELETE FROM
department;
44rows
rowsdeleted.
deleted.

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
Stergereaunei
uneinregistrari
nregistraridintr-un
dintr-untabel
tabel
DEPT
DEPT

DEPTNODNAMELOC10ACCOUNTINGNEW
DEPTNODNAMELOC10ACCOUNTINGNEW
YORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON50DEVELOPMENTDETROIT60MIS.
.
sterge o nregistrare din
YORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON50DEVELOPMENTDETROIT60MIS.
.
.
tabelul
EMP

DEPT
DEPTNODNAMELOC10ACCOUNTINGNEW
YORK20RESEARCHDALLAS30SALESCHICAGO40OPER
ATIONSBOSTON60MIS. . .

12

13

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, ncercnd afisarea
rndurilor sterse printr-un SELECT.
SQL> SELECT
2
FROM
3
WHERE
no rows selected.

*
department
dname = 'DEVELOPMENT';

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 rndurile din tabel vor fi sterse. Cel de-al
doilea exemplu din figura sterge toate rndurile din tabelul DEPARTMENT, deoarece nu
a fost specificata nici o clauza WHERE.
Nota: Tabelul DEPARTMENT contine aceleasi date ca si DEPT.

Stergerea
Stergereanregistrarilor
nregistrarilorfolosind
folosindvalori
valoridintr-un
dintr-unalt
alttabel
tabel
Folositi
Folositisubinterogari
subinterogarinncomanda
comanda DELETE
DELETEpentru
pentruaasterge
stergenregistrarile
nregistrarile
dintr-un
tabel
pe
baza
valorilor
din
alt
tabel
dintr-un tabel pe baza valorilor din alt tabel
SQL>
SQL>DELETE
DELETE FROM
FROM
22
WHERE
WHERE
33
44
55
66rows
rowsdeleted.
deleted.

employee
employee
deptno
deptno==
(SELECT
(SELECTdeptno
deptno
FROM
dept
FROM dept
WHERE
WHEREdname
dname=='SALES');
'SALES');

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 constrngerii de integritate:
Daca ncercati stergerea unei nregistrari care contine un cmp cu o valoare legata
de o constrngere de integritate, veti obtine o eroare.

14

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
Stergereanregistrarilor:
nregistrarilor:
Incalcarea
constrngerii
Incalcarea constrngeriide
deintegritate
integritate
SQL>DELETE
SQL>DELETE FROM
FROM
22
WHERE
WHERE
DELETE
DELETE FROM
FROM

dept
dept
deptno
deptno==10;
10;

dept
dept
**

ERROR
ERRORatatline
line11
ORA-02292:
ORA-02292:integrity
integrityconstraint
constraint(USR.EMP_DEPTNO_FK)
(USR.EMP_DEPTNO_FK)
violated
child
record
found
violated - child record found
Nu
Nuputeti
putetisterge
stergeoonregistrare
nregistrarecare
carecontine
contineoocheie
cheieprimara
primarafolosita
folositacacacheie
cheieexterna
externa
nnalt
tabel.
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

15

16

Tipuri de tranzactii
Tip
Limbaj de manipulare
a datelor (DML)

Descriere
Consta din orice numar de comenzi DML pe care serverul Oracle le
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

Cnd ncepe si cnd se termina o tranzactie?


O tranzactie ncepe cnd 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 ntlnita.
O comanda DDL sau DCL este commited (modificarile facute sunt salvate)
automat si de aceea ncheie n mod implicit o tranzactie.

17

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
Controlultranzactiilor
tranzactiilor
INSERT
COMMIT

UPDATE

Savepoint A

INSERT

DELETE

Savepoint B

ROLLBACK to Savepoint B

ROLLBACK to Savepoint A

ROLLBACK
Comanda

Descriere

COMMIT

ncheie actuala tranzactie facnd ca toate modificarile sa devina


permanente (salveaza modificarile)

SAVEPOINT nume

Marcheaza un punct de ntoarcere (savepoint) n cadrul tranzactiei


curente

Comanda ROLLBACK ncheie tranzactia curenta pierzndu-se toate


modificarile temporare (pending changes) asupra datelor.
ROLLBACK TO SAVEPOINT name sterge savepoint-ul si toate
schimbarile de dupa el (temporare).
Nota: SAVEPOINT nu este ANSI standard SQL.

ROLLBACK [TO
SAVEPOINT name]

18

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

Commit automat

Comanda DDL sau DCL


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: Cnd 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 pna cnd apare
un 'commit' (pna 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.

19

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.

20

Salvarea
Salvareamodificarilor
modificarilor
Faceti
Facetimodificarile.
modificarile.
SQL>UPDATE
SQL>UPDATE
22
SET
SET
33
WHERE
WHERE
11row
updated.
row updated.
Salvati
Salvatimodificarile
modificarile

emp
emp
deptno
deptno==10
10
empno
=
7782;
empno = 7782;

SQL>COMMIT;
SQL>COMMIT;
Commit
Commitcomplete.
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
2
VALUES
1 row created.
SQL> UPDATE
2
SET
3
WHERE
1 row updated.

department(deptno, dname, loc)


(50, 'ADVERTISING','MIAMI');

employee
deptno = 50
empno = 7876;

SQL> COMMIT;
Commit complete.

21

Starea
Stareadatelor
datelordupa
dupaROLLBACK
ROLLBACK
Anulati
Anulatimodificarile
modificariletemporare
temporarefacute
facutefolosind
folosindcomanda
comandaROLLBACK.
ROLLBACK.
Modificarile
asupra
datelor
sunt
pierdute.
Modificarile asupra datelor sunt pierdute.
Starea
Stareaanterioara
anterioaraaadatelor
dateloreste
esterefacuta.
refacuta.
Protectia
asupra
nregistrarilor
implicate
Protectia asupra nregistrarilor implicateeste
esteridicata.
ridicata.
SQL>
SQL>DELETE
DELETE FROM
FROM
14
rows
deleted.
14 rows deleted.
SQL>
SQL>ROLLBACK;
ROLLBACK;
Rollback
Rollbackcomplete.
complete.

employee;
employee;

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:
ncercnd 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
25,000 rows deleted.
SQL> ROLLBACK;
Rollback complete.
SQL> DELETE
FROM
2
WHERE
1 row deleted.
SQL> SELECT
*
2
FROM
test
3
WHERE
id = 100;
No rows selected.
SQL> COMMIT;
Commit complete.

test;

test
id = 100;

22

Anularea modificarilor pna la un savepoint:

Anularea
Anulareamodificarilor
modificarilorpna
pnalalaun
unpunct
punctmarcat
marcat(Marker)
(Marker)
Creati
Creati un
un marcaj
marcaj nn tranzactia
tranzactia curenta
curenta folosind
folosind comanda
comanda
SAVEPOINT.
SAVEPOINT.
Anulati
Anulati modificarile
modificarile pna
pna lala acel
acel marcaj
marcaj folosind
folosind comanda
comanda
ROLLBACK
TO
SAVEPOINT.
ROLLBACK TO SAVEPOINT.
SQL>
SQL>UPDATE
UPDATE. .. .. .
SQL>
SQL>SAVEPOINT
SAVEPOINTupdate_done;
update_done;
Savepoint
created.
Savepoint created.
SQL>
SQL>INSERT.
INSERT.. .. .
SQL>
SQL>ROLLBACK
ROLLBACKTO
TOupdate_done;
update_done;
Rollback
complete.
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
pna 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.

23

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.
Cnd 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 vaznd datele din segmentul rollback.
Aceasta garanteaza ca utilizatorii citesc consistent datele care nu sufera schimbari n chiar
acel moment.
Cnd 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 rndul lor anulate.

24

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 furniznd 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
exclusiva
(lacat exclusiv)

partajata
(lacat partajat)

mpiedica partajarea unei resurse.


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

25

Rezumat
Comanda

Descriere

INSERT

Adauga o nregistrare noua la tabel.

UPDATE
DELETE
COMMIT

Modifica nregistrari existente n


tabel.
Sterge nregistrari existente din
tabel.
Face ca schimbarile sa devina
permanente.

SAVEPOINT

Permite ntoarcerea la un savepoint.

ROLLBACK

Anuleaza
temporare.

toate

schimbarile

Rezumat:
Puteti manipula datele dintr-o baza de date utiliznd comenzile: INSERT, UPDATE si
DELETE.
Puteti controla modificarile datelor utiliznd 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.

26

Exercitii:

ID
1
2
3
4
5

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 cmpurilor.
3. Adaugati prima nregistrare a tabelului din exemplul de mai jos. Nu folositi lista
coloanelor n clauza INSERT.
LAST_NAME
FIRST_NAME
USERID
SALARY
Patel
Ralph
rpatel
795
Dancs
Betty
bdancs
860
Biri
Ben
bbiri
1100
Newman
Chad
cnewman
750
Ropeburn
Audry
aropebur
1550
4. Introduceti n tabelul MY_EMPLOYEE si al doilea rnd 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 rulnd 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 rndul nou este intact.
23. Salvati adaugarea, facnd-o permanenta.

27