Documente Academic
Documente Profesional
Documente Cultură
SQL
Structured Query Language (SQL) este un limbaj universal care poate fi
utilizat pentru a defini, interoga, reactualiza i gestiona baze de date relaionale.
SQL este accesibil utilizatorilor nceptori, dar n acelai timp poate oferi
programatorilor experimentai faciliti deosebite. SQL este un limbaj nonprocedural, adic se specific ce informaie este solicitat, dar nu modul cum se
obine aceast informaie. SQL poate fi utilizat autonom sau prin inserarea
comenzilor sale ntr-un limbaj de programare. SQL a sistemului Oracle este o
extensie a normei SQL89 i o implementare a normei SQL92.
n SQL se disting trei familii de comenzi:
Comenzi pentru definirea datelor, care permit descrierea (definirea)
obiectelor ce modeleaz sistemul studiat. Aceste comenzi definesc
limbajul de definire a datelor (LDD).
Comenzi pentru manipularea datelor, care permit consultarea,
reactualizarea, suprimarea sau inserarea datelor. Aceste comenzi definesc
limbajul de manipulare a datelor (LMD).
Comenzi pentru controlul datelor, care permit asigurarea confidenialitii
i integritii datelor, salvarea informaiei, realizarea fizic a modificrilor
n baza de date, rezolvarea unor probleme de concuren. Aceste comenzi
definesc limbajul de control al datelor (LCD).
Sistemul impune anumite restricii asupra identificatorilor.
Numele unui obiect nu poate depi 30 de caractere, cu excepia numelui
bazei de date care este limitat la 8 caractere i a numelui legturii unei
baze care poate ajunge la 128 caractere.
Nu se face distincie ntre litere mici i litere mari.
Numele trebuie s nceap printr-un caracter alfabetic i nu poate fi un
cuvnt cheie rezervat; poate s conin literele mari i mici ale alfabetului
englez, cifrele 0 - 9 i caracterele $, _, #.
Oracle
Tipuri de date
Pentru memorarea datelor numerice, tipurile cele mai frecvent folosite sunt:
NUMBER, INTEGER, FLOAT, DECIMAL.
Pentru memorarea irurilor de caractere, cele mai frecvent tipuri de date
utilizate sunt: CHAR, VARCHAR2 i LONG.
Exist restricii referitoare la folosirea tipului de date LONG.
ntr-un tabel poate s fie o singur coloan de tip LONG.
Nu pot fi comparate dou iruri de caractere de tip LONG.
O coloan de tip LONG nu poate fi parametru ntr-o procedur.
O funcie nu poate ntoarce ca rezultat o valoare de tip LONG.
O coloan de tip LONG nu poate fi folosit n clauzele WHERE, ORDER BY,
GROUP BY, CONNECT.
Operatorii sau funciile Oracle nu pot fi folosii n SQL pentru a modifica
coloane de tip LONG.
O coloan de tip LONG nu poate fi indexat.
Alte tipuri de date scalare furnizate de SQL sunt NCHAR i NVARCHAR2,
folosite pentru reprezentarea caracterelor limbilor naionale.
SQL
Tabele
Crearea unui tabel
Crearea unui tabel const din generarea structurii sale, adic atribuirea unui
nume tabelului i definirea caracteristicelor sale (se definesc coloanele, se definesc
constrngerile de integritate, se specific parametrii de stocare etc.).
Pentru a crea un tabel, utilizatorul trebuie s aib acest privilegiu i s
dispun de spaiul de memorie n care s creeze obiectul. La nivelul schemei sale,
un utilizator are toate privilegiile.
CREATE TABLE [<nume_schema>.] <nume_tabel> (
<nume_coloana_1> <tip_date> [DEFAULT <expresie>],
Oracle
fr a indica cheile;
indicnd cheile la nivel de coloan;
indicnd cheile la nivel de tabel;
prin copiere din alt tabel.
1. Crearea structurii unui tabel fr a indica cheile:
CREATE TABLE
carte
(codel
CHAR(5),
titlu
VARCHAR2(30),
autor
VARCHAR2(30),
pret
NUMBER(8,2),
nrex
NUMBER(3),
coded
CHAR(5));
2. Crearea structurii unui tabel indicnd cheile la nivel coloan:
CREATE TABLE
carte
(codel
CHAR(5) PRIMARY KEY,
titlu
VARCHAR2(30),
autor
VARCHAR2(30),
pret
NUMBER(8,2),
nrex
NUMBER(3),
coded
CHAR(5) NOT NULL
REFERENCES domeniu(coded));
Constrngerea de cheie primar sau extern ce presupune?
CREATE TABLE
(codel
titlu
autor
pret
nrex
coded
carte
CHAR(5) PRIMARY KEY,
VARCHAR2(30),
VARCHAR2(30),
NUMBER(8,2),
NUMBER(3),
CHAR(5) NOT NULL
REFERENCES domeniu(coded)
ON DELETE CASCADE);
SQL
Oracle
Constrngeri
Constrngere este un mecanism care asigur c valorile unei coloane sau a
unei mulimi de coloane satisfac o condiie declarat. Unei constrgeri i se poate da
un nume unic. Dac nu se specific un nume explicit atunci sistemul automat i
atribuie un nume de forma SYS_Cn, unde n reprezint numrul constrngerii.
Constrngerile pot fi terse, pot fi adugate, pot fi activate sau dezactivate, dar nu
pot fi modificate.
Exemplu:
S se defineasc o constrngere la nivel de coloan prin care s se specifice
cheia primar i cheia extern.
CREATE TABLE carte
(codel
CHAR(5)
CONSTRAINT cp_carte PRIMARY KEY,
titlu
VARCHAR2(30),
coded
CHAR(5)
CONSTRAINT nn_coded NOT NULL
CONSTRAINT ce_coded
REFERENCES domeniu(coded));
Exemplu:
S se defineasc o constrngere la nivel de tabel prin care s se specifice
cheia primar i cheia extern.
CREATE TABLE carte
(codel
CHAR(5),
titlu
VARCHAR2(30),
coded
CHAR(5) NOT NULL,
CONSTRAINT cp_carte PRIMARY KEY (codel),
CONSTRAINT ce_coded
FOREIGN KEY (coded)
REFERENCES domeniu(coded));
Observaii
Liniile ce nu respect constngerea sunt depuse automat ntr-un tabel special.
Constrngerile previn tergerea unui tabel dac exist dependene.
Constrngerile pot fi create o dat cu tabelul sau dup ce acesta a fost creat.
Constrngerile pot fi activate sau dezactivate n funcie de necesiti.
SQL
Oracle
este executat comanda COMMIT. Dac vreuna din comenzile tranzaciei ncalc
restricia, atunci ntreaga tranzacie este derulat napoi i este returnat o eroare.
Opiunea implicit este NOT DEFERRABLE.
O noutate introdus n Oracle8 este posibilitatea de a partiiona tabele,
adic de a mpri tabelul n mai multe pri independente, fiecare cu parametri de
stocare diferii i cu posibilitatea ca pri diferite ale tabelului s se gseasc pe
spaii tabel diferite. Fiecare partiie a tabelului va conine nregistrri care au
valoarea cheii ntr-un interval specificat. Partiionarea este transparent pentru
utilizatori i aplicaii. Dac o parte a tabelului este inaccesibil, celelalte pri pot fi
disponibile pentru reactualizare. De asemenea, se poate bloca accesul la o parte a
tabelului n timp ce restul nregistrrilor sunt disponibile.
Exemplu:
CREATE TABLE carte (
)
PARTITIONED BY RANGE (nrex)
((PARTITION mic VALUES LESS THAN(2)
TABLESPACE
STORAGE ),
PARTITION mediu VALUES LESS THAN (10)
TABLESPACE
STORAGE ),
PARTITION mare VALUES LESS THAN (MAXVALUE)
TABLESPACE
STORAGE ));
Modificarea structurii unui tabel
Comanda care realizeaz modificarea structurii tabelului (la nivel de coloan
sau la nivel de tabel), dar nu modificarea coninutului acestuia, este ALTER TABLE.
Comanda ALTER TABLE permite:
adugarea (ADD) de coloane, chei (primare sau externe), constrngeri
ntr-un tabel existent;
modificarea (MODIFY) coloanelor unui tabel;
specificarea unei valori implicite pentru o coloan existent;
activarea i dezactivarea (ENABLE, DISABLE) unor constrngeri;
suprimarea (DROP) cheii primare, a cheii externe sau a unor constrngeri.
SQL
nume_tabel
(nume_coloana
nume_coloana
constrangere,
constrangere);
3. Pentru a suprima cheia primar sau alte constrngeri sunt utilizate formele:
ALTER TABLE
nume_tabel
DROP PRIMARY KEY;
ALTER TABLE
nume_tabel
DROP CONSTRAINT nume_constrangere;
4. Pentru a activa (ENABLE) sau dezactiva (DISABLE) constrngeri este utilizat
forma:
ALTER TABLE
nume_tabel
ENABLE
nume_constrangere;
Observa?ii
Schimbarea definiiei unei coloane din NOT NULL n NULL O.K.
Schimbarea definiiei unei coloane din NULL n NOT NULL se poate face doar
dac exist sigurana c fiecare linie a coloanei respective este NOT NULL sau
dac tabelul (???sau coloana???) este vid.
Pentru mrirea lungimii coloanei nu exist condiii speciale. Pot reduce
lungimea unei coloane sau pot schimba tipul unei coloane doar dac coloana nu
conine valori sau conine doar valori NULL.
Definirea cheii primare sau a cheii externe dup crearea tabelului.
10
Oracle
CREATE TABLE
carte
(CODEL char(5),
);
ALTER TABLE
carte
ADD CONSTRAINT cheie_prim PRIMARY KEY (codel);
Suprimarea cheii primare.
ALTER TABLE carte
DROP PRIMARY KEY;
Dac exist o CE care refer o CP i dac se ncearc tergerea cheii primare,
aceast tergere nu se poate realiza (tabelele sunt legate prin declaraia de cheie
extern). tergerea este totui permis dac n comanda ALTER apare opiunea
CASCADE, care determin i tergerea cheilor externe ce refer cheia primar.
ALTER TABLE carte
DROP PRIMARY KEY CASCADE;
Suprimarea cheii externe.
ALTER TABLE
carte
ADD CONSTRAINT beta
FOREIGN KEY (coded) REFERENCES domeniu;
ALTER TABLE
carte
DROP CONSTRAINT
beta;
Schimbarea cheii primare. Este destul de complicat procesul schimbrii cheii
primare fr a afecta modul de proiectare a bazei de date. Schimbarea se face n
dou etape: se terge cheia primar i apoi se recreeaz.
ALTER TABLE
carte
ADD
(PRIMARY KEY(codel));
ALTER TABLE
carte
DROP PRIMARY KEY;
ALTER TABLE
carte
ADD
PRIMARY KEY(titlu, autor));
Adugarea unei coloane. Aceast coloan iniial va fi null (pentru toate liniile).
Nu se poate specifica unde s apar coloana, ea devenind ultima coloan a
tabelului.
ALTER TABLE
carte
ADD
(rezumat LONG);
SQL
11
12
Oracle
Numele tabelului
Spaiul tabel n care se afl tabelul
Numele cluster-ului din care face parte tabelul
Procentul de spaiu pstrat liber n interiorul fiecrui bloc
Procentul de spaiu ce poate fi utilizat n fiecare bloc
Numrul iniial de tranzacii concurente n interiorul unui
bloc
Dimensiunea spaiului alocat pentru prima extensie
Dimensiunea spaiului alocat pentru urmtoarea extensie
Numrul minim de extensii ce se aloc la crearea unui tabel
Numrul maxim de extensii ce se aloc la crearea unui tabel
Procentul cu care crete dimensiunea unei extensii
Y sau N, dup cum tabelului i-a fost fcut o copie de
siguran de la ultima modificare
Numrul de nregistrri din tabel
Numrul de blocuri utilizate de tabel
Numrul de blocuri ce nu conin date
Spaiul mediu liber din tabel
Lungimea medie, n octei, a unei linii
ENABLED (activat) sau DISABLED (dezactivat): este
activat sau nu blocarea tabelului
YES sau NO, indic dac tabelul este partiionat (sau nu)
Y sau N, indic dac tabelul este temporar (sau nu)
YES sau NO, indic dac tabelul este imbricat (sau nu)
DESCRIBE USER_TABLES;
SELECT
TABLE_NAME, NUM_ROWS, NESTED
FROM
USER_TABLES;
SQL
13
Indeci
Un index este un obiect al schemei unei baze de date care:
crete viteza de execuie a cererilor;
garanteaz c o coloan conine valori unice.
Server-ul Oracle utilizeaz identificatorul ROWID pentru regsirea liniilor n
structura fizic a bazei de date. Indexul, din punct de vedere logic, este compus
dintr-o valoare cheie i din identificatorul adres ROWID.
Cheia indexului poate fi coloana unui tabel sau concatenarea mai multor
coloane (numrul maxim de coloane care pot defini cheia indexului este 32).
Coloanele care apar n cheia indexului trebuie declarate NOT NULL n tabel.
Indecii, fiind obiecte ale schemei bazei, beneficiaz de procesul de definire
a unui obiect. Un index unic este creat automat cnd n definirea unui tabel apar
constrngerile PRIMARY KEY sau UNIQUE. Crearea unui index pe una sau mai
multe coloane ale unui tabel se face prin comanda:
CREATE [UNIQUE] INDEX <nume_index>
ON [<nume_schema>.] <nume_tabel>
(<nume_col> [ASC | DESC], <nume_col> [ASC | DESC], )
| CLUSTER <nume_cluster>];
Cnd este creat un index, un segment de date este rezervat automat n spaiul
tabel. Alocarea de memorie este controlat prin clauzele INITIAL, PCTINCREASE,
PCTFREE, NEXT, care pot s apar n comanda CREATE INDEX. Gestiunea
inseriilor i a reactualizrilor se face, ca i la tabele, utiliznd parametrii
PCTFREE i PCTUSED.
Exemplu:
1) S se creeze un index descresctor relativ la coloana adresa din tabelul cititor.
2) S se afieze informaiile referitoare la indexul cititor_idx.
Soluie:
CREATE INDEX cititor_idx
ON cititor (adresa DESC);
SELECT
TABLE_NAME, UNIQUENESS, MIN_EXTENTS
FROM
USER_INDEXES
14
Oracle
WHERE
INDEX_NAME='cititor_idx';
SQL
15
Numele indexului
Tipul indexului (NORMAL, LOB, CLUSTER etc.)
Proprietarul tabelului indexat
Numele tabelului indexat
Tipul tabelului indexat (TABLE, CLUSTER etc.)
Starea de unicitate (UNIQUE, NONUNIQUE)
Spaiul tabel n care este stocat indexul
Spaiul alocat pentru prima extensie
Spaiul alocat pentru urmtoarea extensie
Numrul minim de extensii alocate
Numrul maxim de extensii
Procentul cu care cresc extensiile
Nivelul din B-arbore. Acesta arat adncimea indexului de
la ramuri la frunze
Numrul de blocuri frunz din index
Numrul de chei distincte n index
Starea indexului (VALID, INVALID, DIRECT_LOAD)
Numrul de linii utilizate. Acesta nu trebuie s includ
valorile NULL din tabelul de baz
Determin dac indexul este partiionat (YES sau NO)
16
Oracle
GENERATED
Exemplu:
S se obin informaii referitoare la indecii tabelului carte.
SELECT
a.index_name, a.column_name,
a.column_position poz, b.uniqueness
FROM
user_indexes b, user_ind_columns a
WHERE
a.index_name = b.index_name
AND
a.table_name = carte;
Secvene
O secven este un obiect n baza de date care servete pentru a genera ntregi
unici n sistemele multi-utilizator, evitnd apariia conflictelor i a blocrii.
Secvenele sunt memorate i generate indiferent de tabele aceeai
secven poate fi utilizat pentru mai multe tabele. O secven poate fi creat de un
utilizator i poate fi partajat de mai muli utilizatori.
Crearea unei secvene se face cu ajutorul comenzii:
CREATE SEQUENCE [<nume_schema>.]<nume_secventa>
[INCREMENT BY n] [START WITH m]
[{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}]
[{CACHE k | NOCACHE}]
[{ORDER | NOORDER}]
SQL
17
18
Oracle
Comentarii
Sistemul Oracle ofer posibilitatea de a comenta obiectele create, printr-un
text care este inserat n dicionarul datelor. Comentariul se poate referi la tabele,
vizualizri, cliee sau coloane.
COMMENT ON
{TABLE
nume_obiect.nume_coloana}
IStextcomentariu
nume_obiect
COLUMN
Sinonime
Oracle ofer posibilitatea de a atribui mai multe nume aceluiai obiect.
Aceste nume adiionale sunt numite sinonime (synonymes). Ele sunt utile deoarece
permit simplificarea formulrii cererii i referirea la obiecte, fr a fi nevoie s se
specifice proprietarii obiectelor sau localizarea acestora.
Spre deosebire de alias a crui durat de via este limitat la cererea ce
conine alias-ul, sinonimele sunt salvate n dicionarul datelor i pot fi reutilizate.
Sistemul Oracle permite crearea de sinonime pentru obiecte de tipul: tabel,
vizualizare, secven, funcie, procedur, pachet, clieu, sinonim.
CREATE [PUBLIC]
[schema.]obiect
SYNONYM
[schema.]nume_sinonim FOR
SQL
19
Vizualizri
Vizualizarea (view) este un tabel logic (virtual) relativ la date din una sau mai
multe tabele sau vizualizri. Vizualizarea este definit plecnd de la o cerere a
limbajului de interogare a datelor, motenind caracteristicile obiectelor la care se
refer. Vizualizarea, fiind virtual, nu solicit o alocare de memorie pentru date. Ea
este definit n DD cu aceleai caracteristici ca i un tabel.
Textul cererii care definete vizualizarea este salvat n DD. Nucleul Oracle
determin fuzionarea cererii relative la vizualizare cu comanda de definire a
vizualizrii, analizeaz rezultatul fuziunii n zona partajat i execut cererea.
Oracle transform cererea referitoare la o vizualizare ntr-o cerere relativ
la tabelele de baz.
Dac sunt utilizate clauzele UNION, GROUP BY i CONNECT BY, atunci
Oracle nu determin fuzionarea, el va rezolva vizualizarea i apoi va aplica cererea
rezultatului obinut.
O vizualizare reflect la orice moment coninutul exact al tabelelor de baz.
Orice modificare efectuat asupra tabelelor se repercuteaz instantaneu asupra
vizualizrii. tergerea unui tabel implic invalidarea vizualizrilor asociate
tabelului i nu tergerea acestora.
Vizualizrile sunt definite pentru:
furnizarea unui nivel mai nalt de securizare a bazei;
simplificarea formulrii unei cereri;
mascarea complexitii datelor;
afiarea datelor ntr-o alt reprezentare dect cea a tabelelor de baz;
asigurarea independenei datelor;
asigurarea confidenialitii anumitor informaii;
definirea constrngerilor de integritate;
restricionarea acesului la date.
20
Oracle
SQL
21
22
Oracle
SQL
23
ALL_UPDATABLE_COLUMNS,
DBA_UPDATABLE_COLUMNS
i
USER_UPDATABLE_COLUMNS sunt vizualizri din DD ce conin informaii
referitoare la coloanele vizualizrilor existente, care pot fi reactualizate.
Exmplu:
1. S se creeze un view ce conine cmpurile nume, prenume, job din tabelul
salariat.
2. S se insereze, s se actualizeze i s se tearg o nregistrare n acest view.
Ce efect vor avea aceste aciuni asupra tabelului de baz?
Soluie:
CREATE VIEW
AS SELECT
FROM
vederea2
nume, prenume, job
salariat;
24
Oracle
Exemplu:
S se creeze un view care conine cmpurile nume, prenume, job din tabelul
salariat. S se introduc n view doar persoanele care sunt graficieni.
CREATE VIEW vederea21
AS SELECT
nume, prenume, job
FROM
salariat
WHERE
job = 'grafician'
WITH CHECK OPTION;
Exemplu:
S se creeze o vizualizare care s conin cod_salariat, nume, prenume din
tabelul salariat i coloana tip din tabelul grafician. Apoi s se insereze, s se
actualizeze i s se tearg o nregistrare din acest view (vizualizarea conine cheia
primar cod_salariat din tabelele salariat i grafician).
Soluie:
CREATE VIEW
AS SELECT
FROM
WHERE
vederea4
s.cod_salariat,nume,prenume,tip
salariat s, grafician g
s.cod_salariat=g.cod_salariat;
more
than
one
base
TABLE
Pot fi inserate date doar ntr-un tabel de baz (n oricare, dar n unul singur)
prin intermediul view-ului, astfel:
INSERT INTO vederea4 (cod_salariat, nume)
VALUES
(30, 'Popescu');
Comanda pentru tergerea unei nregistrri:
DELETE
vederea4
WHERE
cod_salariat = 3;
va genera urmtoarea eroare:
SQL
25
Nu se pot face inserri, actualizri sau tergeri ntr-un view ce conine funcii
grup. Dup oricare din aceste operaii apare acelai mesaj:
ORA-01732: data manipulation operation not legal on
this view
Exemplu:
S se creeze o vizualizare care s conin coloanele cod_contractant, adresa,
telefon din tabelul contractant i coloanele nr_contract, tip_contract,
data_incheiere din tabelul contract. S se insereze o nregistrare n vizualizare.
CREATE VIEW vederea44
AS SELECT
c.cod_contractant, adresa, telefon,
co.nr_contract, tip_contract,
data_incheiere
26
FROM
WHERE
Oracle
contractant c, contract co
c.cod_contractant=co.cod_contractant;
Grupri
SQL
27
Cluster-ul este o regrupare fizic a dou sau mai multe tabele, relativ la una
sau mai multe coloane, cu scopul mririi performanelor. Coloanele comune
definesc cheia cluster-ului.
Un cluster este un obiect al bazei care necesit:
un nume unic la nivelul schemei,
specificare a coloanelor care compun cheia cluster-ului,
specificare a spaiului de stocare (opional),
un index (relativ la cheia cluster-ului).
Un cluster trebuie s aib cel puin un index. Acest index trebuie creat
naintea oricrei comenzi LMD care va aciona asupra tabelelor cluster-ului. Un
index al cluster-ului se deosebete de un index al tabelului (de exemplu, absena
indexului afecteaz utilizatorul datele cluster-ului nu sunt accesibile).
Coloanele comune definite pentru cluster, reprezint cheia cluster-ului i
criteriul de regrupare. Liniile diferitelor tabele sunt regrupate n interiorul aceluiai
bloc urmrind cheia cluster-ului. Dac liniile asociate unei aceiai valori a cheii
cluster-ului necesit un spaiu de mai multe blocuri, atunci blocurile sunt nlnuite.
Crearea unui cluster presupune:
crearea structurii cluster-ului;
crearea indexului cluster-ului;
crearea tabelelor care vor compune cluster-ul.
Crearea unui cluster:
CREATE CLUSTER nume_cluster
(nume_coloana tip_data [,nume_coloana tip_data] ) [SIZE n]
Exist dou modaliti pentru introducerea unui tabel ntr-un cluster.
O prim variant presupune c cluster-ul este creat pentru un tabel care deja
exist. De fapt, nu se poate asocia un cluster unui tabel care exist!
A doua variant presupune c introducerea tabelului n cluster se face n
momentul crerii structurii tabelului (comanda CREATE TABLE).
Exerciiu:
S se obin un cluster referitor la lista crilor din fiecare domeniu.
Varianta 1
CREATE CLUSTER cdoml(cdom
CHAR(1));
28
Oracle
SQL
29
30
Oracle
SQL
31
Comanda INSERT
INSERT INTO nume_tabel / nume_view [(col1[, col2[,]])]
VALUES (expresia1[, expresia2[,]]) / subcerere;
expresia1, expresia2, reprezint expresii a cror evaluare este atribuit
coloanelor precizate (se insereaz o linie);
subcerere, reprezint o interogare (se insereaz una sau mai multe linii).
Observaii:
Exemplu:
32
Oracle
carte
*
carte_info;
carte(codel,titlu,autor,nrex,pret,coded)
(c34,algebra,null,null,500,null);
Exemplu:
INSERT INTO carte(codel, nrex)
VALUES ('c25', 25);
INSERT INTO domeniu
VALUES ('&cod','&intdom');inserare prin parametrizare
Exemplu:
Presupunnd c tabelul salariat a fost completat cu datele tuturor salariailor
editurii, s se completeze tabelele grafician, tehnoredactor i redactor_sef, n
concordan cu datele coninute n tabelul salariat (nu pot exista graficieni,
tehnoredactori sau redactori efi care s nu fie salariai!).
Soluie:
INSERT
SELECT
FROM
WHERE
INSERT
SELECT
FROM
WHERE
INSERT
SELECT
FROM
WHERE
Exemplu:
SQL
33
Se dorete ca toi graficienii avnd salariile mai mari dect media salariilor
s colaboreze la realizarea tuturor frame-urilor din publicaii coordonate de
redactori efi avnd vechimea maxim. S se completeze tabelul realizeaza cu
nregistrrile corespunztoare.
Soluie:
INSERT
SELECT
FROM
WHERE
AND
AND
Comanda DELETE
DELETE
[WHERE
Observaii:
Exemplu:
34
Oracle
S se elimine cititorii care au numele Popai cei care au restituit astzi cel
puin o carte.
DELETE FROM cititor
WHERE
nume=Popa
OR
codec IN (SELECT codec
FROM
imprumuta
WHERE
data_ef=SYSDATE);
Exemplu:
S se tearg toi tehnoredactorii care colaboreaz la mai puin de trei
publicaii.
Soluie:
DELETE
FROM salariat
WHERE
job = tehnoredactor
AND
COUNT
(SELECT DISTINCT c.nr_publicatie
FROM
capitol c
WHERE
c.cod_salariat = cod_salariat)< 3;
Comanda UPDATE
Valorile cmpurilor care trebuie modificate pot fi furnizate explicit sau pot fi
obinute n urma unei cereri SQL.
UPDATE
SET
[WHERE
tablename / viewname
(column1[,column2[,]]) = (subquery) / column = expr / (query)
condition]
Observaii:
Exemplu:
SQL
35
Preul crilor scrise de Lucian Blaga s fie modificat, astfel nct s fie egal
cu preul celei mai scumpe cri de informatic din bibliotec.
Soluie:
UPDATE
SET
WHERE
carte
pret = (SELECT
MAX(pret)
FROM
carte
WHERE
coded = I)
autor = Lucian Blaga;
Exemplu:
S se modifice preul crilor din bibliotec, care se gsesc ntr-un numr de
exemplare mai mic dect media numrului de exemplare pe bibliotec. Noua
valoare a preului s fie egal cu suma preurilor crilor scrise de Zola.
Soluie:
UPDATE
SET
WHERE
carte
pret = (SELECT
FROM
WHERE
nrex < (SELECT
FROM
SUM(pret)
carte
autor = Zola)
AVG(nrex)
carte);
Exemplu:
S se mreasc cu 5% salariile redactorilor efi care lucreaz la publicaia
care are cel mai mare numr de frame-uri.
Soluie:
UPDATE salariat
SET
salariu = 1,05*salariu
WHERE cod_salariat IN
(SELECT cod_salariat
FROM
publicatie
WHERE
nr_publicatie IN
(SELECT
nr_publicatie
FROM
frame
GROUP BY nr_publicatie
HAVING
COUNT(*) > ANY
(SELECT
COUNT(*)
FROM
frame
36
Oracle
GROUP BY
nr_publicatie)));
Exemplu:
S se reduc cu 10% salariile redactorilor efi care nu sunt asociai nici unei
publicaii.
Soluie:
UPDATE
SET
WHERE
salariat
salariu = 0,9*salariu
cod_salariat IN
(SELECT cod_salariat
FROM
redactor_sef
WHERE
cod_salariat NOT IN
(SELECT cod_salariat
FROM
publicatie));
Comanda SELECT
SELECT
FROM
[WHERE
[START WITH
[CONNECT BY
[GROUP BY
[HAVING
[ORDER BY
[FOR UPDATE
[ALL | DISTINCT]
{* | list de atribute selectate | expr AS alias}
{ [schema.]{tabel [PARTITION (partition_name)] |
[THE] (subquery)} [alias_tabel] }
condiie]
condiie]
condiie]
list de expresii
condiie]]
{expresie | poziie | c_alias} [ASC | DESC]]
[OF [schema.]{table | view}.coloan] [NOWAIT]
SQL
37
Exemplu:
n ce interogri este necesar utilizarea cuvntului cheie HAVING?
A. cnd este necesar s eliminm linii duble din rezultat;
B. cnd este necesar s ordonm mulimea rezultat;
C. cnd este necesar s efectum un calcul pe grup;
38
Oracle
Cererimonorela?ie
Exemplu:
S?seafiezedataioracurent?.
SELECT
FROM
TO_CHAR(SYSDATE,DD/MM/YY HH24:MI:SS)
DUAL;
Exemplu:
Utiliznd ideea c directorul este salariatul care nu are ef, s se tipreasc
numele directorului.
SELECT
ename,NVL(TO_CHAR(mgr),Nu are sef)
FROM
emp
WHERE
mgr IS NULL;
Exemplu:
S se afieze codurile cititorilor care nu au mprumutat cri ntr-un interval
precizat.
SELECT
DISTINCT codec
FROM
imprumuta
WHERE
dataim NOT BETWEEN &d1 AND &d2;
Clauza GROUP BY
Exemplele care urmeaz arat modul general de constituire a subansamblelor
virtuale folosind clauza GROUP BY. Fiecare expresie care apare n SELECT
trebuie s aib aceeai valoare pentru toate liniile care aparin aceleiai partiii.
Numele coloanelor din GROUP BY nu trebuie s figureze obligatoriu n lista de la
SELECT.
Exemplu:
S?seob?in?num?ruldecteoriafostmprumutat?
fiecarecarte.
SELECT
codel, COUNT(*)
FROM
imprumuta
GROUP BY codel;
Exemplu:
SQL
39
40
Oracle
Relaii ierarhice
SQL permite afiarea rndurilor unui tabel innd cont de relaiile ierarhice
care apar ntre rndurile tabelului. Parcurgerea n mod ierarhic a informaiilor se
poate face doar la nivelul unui singur tabel. Operaia se realizeaz cu ajutorul
clauzelor START WITH i CONNECT BY.
n comanda SELECT pot s apar clauzele:
CONNECT BY {expresie = PRIOR expresie | PRIOR expresie = expresie}
[START WITH conditie]
Clauza CONNECT BY specific coloanele prin care se realizeaz relaia
ierarhic. Operatorul PRIOR stabilete direcia n care este parcurs arborele. Dac
apare n stnga, atunci arborele este parcurs de sus n jos, iar dac apare n dreapta
arborele este parcurs de jos n sus. Clauza START WITH specific nodul
(nregistrarea de nceput) arborelui. Dac lipsete, orice nod poate fi rdcin.
Clauza SELECT poate conine pseudo-coloana LEVEL, care indic nivelul
nregistrrii n arbore (ct de departe este de nodul rdcin). Nodul rdcin are
nivelul 1, fii acestuia au nivelul 2 .a.m.d.
Exemplu:
Ierarhia poate fi reprezentat cu ajutorul unui tabel. De exemplu:
Se presupune c fiecare salariat are un singur superior (este o ierarhie). S se
afieze superiori ierarhic lui Ion.
SQL
41
42
Oracle
SQL
43
FROM
WHERE
carte, imprumuta
carte.codel = imprumuta.codel;
44
Oracle
Un outer-join (join extern) este reprezentat prin operatorul (+) care este
plasat n clauza WHERE dup numele tabelului ale crui linii trebuie s nu se
piard din rezultatul cererii. Semnul (+) poate fi plasat n oricare parte a condiiei
din clauza WHERE, ns nu n ambele pri. Efectul operatorului (+) este c se
genereaz valori null pentru coloanele tabelului lng care apare scris, ori de cte
ori tabelul nu are nici o linie care s poat fi reunit cu o linie din cellalt tabel.
Exemplu:
S se obin titlurile crilor i numele domeniului cruia i aparin,
remarcnd situaiile n care domeniul nu ar avea cri (dac domeniul este fr cri
atunci apare null la titlul crii).
SELECT
titlu, intdom
FROM
carte, domeniu
WHERE
carte.coded(+) = domeniu.coded;
Exemplu:
Considerm c tabelele dept i emp au urmtorul coninut:
dept
emp
deptno
1
2
dname
algebra
analiza
empno
101
102
103
105
106
deptno
null
null
null
1
1
SQL
45
1
1
algebra 105
algebra 106
1
1
b.deptno
1
1
null
nume_dep
analiza
***
***
***
algebra
algebra
46
Oracle
SQL
47
Exemplu:
WHERE codec > ALL (C1, C2) este superior tuturor elementelor din list;
WHERE codec > ANY (C1, C2) este superior cel puin unui element din
list.
Exemplu:
S se obin salariaii al cror salariu este mai mare ca salariile medii din
toate departamentele.
SELECT
ename, job
FROM
emp
WHERE
sal > ALL(SELECT
AVG(sal)
FROM
emp
GROUP BY
deptno);
Exist subcereri care au ca rezultat mai multe coloane (multiple-column
subquery). Aceste interogri au urmtoarea sintax general:
SELECT
FROM
WHERE
col,col,
tabel
(col,col,) IN (SELECT
FROM
WHERE
col,col,
tabel
condiie);
Exemplu:
S se obin numele, numrul departamentului, salariul i comisionul tuturor
funcionarilor ale cror salarii i comisioane coincid cu salariile i comisioanele
unor salariai din departamentul 7.
SELECT
ename, deptno, sal, com
FROM
emp
WHERE
(sal,NVL(com,-1)) IN
(SELECT
sal,NVL(com,-1)
FROM
emp
WHERE
deptno = 7);
Rezultatul acestei interogri este diferit de rezultatul urmtoarei interogri:
SELECT
ename, deptno, sal, com
FROM
emp
48
Oracle
WHERE
AND
sal IN (SELECT
sal
FROM
emp
WHERE
deptno=7)
NVL(com,-1) IN (SELECT
NVL(com,-1)
FROM
emp
WHERE
deptno=7);
Dac una din valorile returnate de subcerere este valoarea null atunci cererea
nu ntoarce nici o linie. Prin urmare, dac valoarea null poate s fac parte din
rezultatul subcererii nu trebuie utilizat operatorul NOT IN. Problema nu mai apare
dac se utilizeaz operatorul IN.
Exemplu:
S se obin salariaii care nu au subordonai.
SELECT
e.ename
FROM
emp e
WHERE
e.empno NOT IN (SELECT
FROM
m.mgr
emp m);
n acest caz, instruciunea SQL nu ntoarce nici o linie deoarece una din
valorile furnizate de subcerere este valoarea null.
Exemplu:
S se obin numele salariailor, salariile, codul departamentului n care
lucreaz i salariul mediu pe departament pentru toi angajaii care au salariul mai
mare ca media salariilor din departamentul n care lucreaz (folosirea subcererii n
clauza FROM).
SELECT a.ename,a.sal,a.deptno,b.salavg
FROM
emp a,(SELECT
deptno,avg(sal) salavg
FROM
emp
GROUP BY deptno) b
WHERE
a.deptno=b.deptno
AND
a.sal>b.salavg
Exemplu:
S se obin lista cititorilor care au mprumutat cel puin o carte.
SELECT
nume
FROM
cititor
WHERE
codec IN (SELECT DISTINCT codec
SQL
49
FROM
imprumuta);
Exemplu:
S se obin codurile cititorilor care nu au mprumutat niciodat cri.
SELECT
codec
FROM
cititor
WHERE
codec NOT IN
(SELECT DISTINCT codec
FROM
imprumuta);
Exemplu:
S se obin lista cititorilor care sunt n ntrziere cu predarea crilor.
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin o carte scris de
ZOLA.
SELECT
nume
FROM
cititor
WHERE
codec IN
(SELECT DISTINCT codec
FROM
imprumuta
WHERE
codel IN
(SELECT codel
FROM
carte
WHERE
autor=ZOLA));
Exemplu:
S se obin numele cititorilor
ZOLA.
SELECT
nume
FROM
cititor
WHERE
codec NOT IN
(SELECT
FROM
WHERE
DISTINCT codec
imprumuta
codel IN
(SELECT codel
FROM
carte
WHERE
autor=ZOLA));
50
Oracle
SQL
51
FROM
WHERE
AND
imprumuta
codel = carte.codel
dataef IS NULL);
Exemplu:
S se obin titlurile crilor al cror
din domeniul respectiv.
SELECT
titlu
FROM
carte c
WHERE
pret > (SELECT
FROM
WHERE
AVG(pret)
carte
coded = c.coded);
Exemplu:
S se obin codurile cititorilor i codul ultimei cri mprumutate.
SELECT
codec, codel
FROM
imprumuta i
WHERE
dataim>=ALL (SELECT dataim
FROM
imprumuta
WHERE
codec=i.codec);
Pentru aceast interogare, clauza WHERE putea fi scris i sub forma:
WHERE
dataim=(SELECT
MAX(dataim)
FROM
imprumuta
WHERE
codec=i.codec);
Exemplu:
S se obin lista codurilor crilor mprumutate i codul primului cititor care
a mprumutat aceste crti.
SELECT
codel,codec
FROM
imprumuta i
WHERE
dataim<=ALL (SELECT dataim
FROM
imprumuta
WHERE
i.codel=codel);
Exemplu:
S se obin codurile crilor din care cel puin un exemplar este mprumutat.
SELECT
codel
FROM
carte
WHERE
EXISTS
52
Oracle
(SELECT
FROM
WHERE
AND
codel
imprumuta
codel = carte.codel
dataef IS NULL);
*
imprumuta
codel = carte.codel
dataef IS NULL);
DISTINCT codel
imprumuta
dataef IS NULL);
Exemplu:
S se obin codurile crilor care nu au fost mprumutate niciodat.
Soluia 1 (cu sincronizare)
SELECT
codel
FROM
carte
WHERE
NOT EXISTS
(SELECT codel
FROM
imprumuta
WHERE
codel = carte.codel);
Soluia 2 (fr sincronizare)
SQL
53
SELECT
FROM
WHERE
codel
carte
codel NOT IN
(SELECT
FROM
DISTINCT codel
imprumuta);
Exemplu:
S se obin lista salariailor avnd salariul minim n departamentul n care
lucreaz.
SELECT
ename,sal
FROM
emp e
WHERE
sal=(SELECT MIN(sal)
FROM
emp
WHERE
deptno=e.deptno);
Exemplu:
S se obin numele primilor trei salariai avnd retribuia maxim (ideea
rezolvrii este de a verifica dac numrul salariailor care au leafa mai mare dect
leafa salariatului considerat, este mai mic dect 3).
SELECT
ename
FROM
emp a
WHERE
3>(SELECT
COUNT(*)
FROM
emp
WHERE
sal > a.sal);
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin aceleai cri ca
i cititorul avnd codul C19 (ideea problemei este de a selecta cititorii pentru care
este vid lista crilor mprumutatede C19 mai puin lista crilor mprumutate de
acei cititori).
SELECT
nume
FROM
cititor
WHERE
NOT EXISTS
(SELECT codel
FROM
imprumuta
WHERE
codec=C19
MINUS
SELECT codel
FROM
imprumuta
54
Oracle
WHERE
codec= cititor.codec);
Dac problema era modificat n sensul c cel puineste nlocuit prin cel
mult atunci trebuiau inversate interogrile legate prin MINUS.
Exemplu:
S se obin codurile cititorilor care au mprumutat aceleai cri ca i
cititorul avnd un cod specificat.
Rezolvarea problemei se bazeaz pe urmtoarea idee: A = B A B i B
A (A-B) = i (B-A) = A-B i B-A nu furnizeaz nici un tuplu rezultat.
SELECT
FROM
WHERE
AND
AND
codec
imprumuta i
NOT EXISTS
(SELECT codel
FROM
imprumuta
WHERE
codec=i.codec
MINUS
SELECT codel
FROM
imprumuta
WHERE
codec=&ccc)
NOT EXISTS
(SELECT codel
FROM
imprumuta
WHERE
codec=&ccc
MINUS
SELECT codel
FROM
imprumuta
WHERE
codec=i.codec)
codec!=&ccc);
SQL
55
WHERE
cititor.codec=imprumuta.codec;
56
Oracle
Func?iinSQL
Funcii de conversie
Conversiile pot fi fcute:
implicit de ctre server-ul Oracle ;
explicit de ctre utilizator.
Conversii implicite
n cazul atribuirilor, sistemul poate converti automat:
VARCHAR2 sau CHAR n NUMBER ;
VARCHAR2 sau CHAR n DATE;
VARCHAR2 sau CHAR n ROWID;
NUMBER, ROWID, sau DATE n VARCHAR2.
Pentru evaluarea expresiilor, sistemul poate converti automat:
VARCHAR2 sau CHAR n NUMBER, dac irul de caractere reprezint un
numr;
SQL
57
Dac formatul este omis, convertirea se face conform unui format implicit.
Funcia TO_DATE are forma TO_DATE(ir_de_caractere [,fmt]). Funcia este
utilizat dac se dorete conversia unui ir de caractere care nu are formatul
implicit al datei calendaristice (DD-MON-YY).
Alte funcii de conversie sunt: CHARTOROWID, CONVERT, HEXTORAW,
RAWTOHEX, ROWIDTOCHAR etc., iar denumirea semnificativ arat rolul
fiecreia.
Exemplu:
SELECT TO_DATE(Feb 22,1981,Mon dd,YYYY)
FROM DUAL;
58
Oracle
Funcii aritmetice
Cele mai importante funcii aritmetice sunt: ABS (valoarea absolut),
ROUND (rotunjire cu un numr specificat de zecimale), TRUNC (trunchiere cu un
numr specificat de zecimale), EXP (ridicarea la putere a lui e), LN (logaritm
natural), LOG (logaritm ntr-o baz specificat), MOD (restul mpririi a dou
numere specificate), POWER (ridicarea la putere), SIGN (semnul unui numr),
SQL
59
Funcii grup
VARIANCE (dispersia).
Observaii:
Funciile grup opereaz pe un grup de linii i nu cer folosirea clauzei
GROUP BY.
Ele ntorc valoarea null cnd sunt aplicate unei mulimi vide, cu excepia
operatorului COUNT care ntoarce valoarea zero.
Exemplu:
S se afieze numrul crilor distincte mprumutate.
SELECT
FROM
COUNT(DISTINCT codel)
imprumuta;
Exemplu:
Comanda care urmeaz este greit! De ce?
60
Oracle
SELECT
FROM
titlu, COUNT(*)
carte;
Exemplu:
S se calculeze media preurilor crilor din bibliotec.
SELECT
FROM
AVG(pret)
carte;
Exemplu:
ROUND(25-jul-95, MONTH) este 01-AUG-95,
ROUND(25-jul-95, YEAR) este 01-JAN-96,
TRUNC(25-jul-95, MONTH) este 01-JUL-95,
TRUNC(25-jul-95, YEAR) este 01-JAN-95.
SQL
61
Descriere
Secunda relativ la minut
Secunda relativ la zi
Minut
Ora
Ora
Ziua sptmnii
Ziua sptmnii
Ziua lunii
Ziua anului
Numrul lunii
Numele prescurtat al lunii
Luna
Ultimele dou cifre ale anului
Anul
Anul n litere
Secolul
Numrul trimestrului
Sptmna lunii
Sptmna anului
Domeniu
0-59
0-86399
0-59
0-12
0-24
SUNDAY-SATURDAY
1-7
1-31 (depinde de lun)
1-366 (depinde de an)
1-12
JAN-DEC
JANUARY-DECEMBER
de exemplu, 99
de exemplu, 1999
de exemplu, 17
1-4
1-5
1-52
Rezultat
Data
Data
Numr zile
Data
Funcii diverse
Descriere
Adaug un numr de zile la o dat
Scade un numr de zile dintr-o dat
Scade dou date calendaristice
Adun un numr de ore la o dat
62
Oracle
NVL(e1, e2) dac e1 este NULL, returneaz e2; altfel, returneaz e1;
Exemplu:
NVL(comision, 0) este 0 dac comisionul este null. Prin urmare, expresia
salariu*12 + comision nu este corect, deoarece rezultatul su este null dac
comisionul este null. Forma corect este salariu*12 + NVL(comision, 0).
Exemplu:
S se afieze preul modificat al unor cri n funcie de editur. Pentru crile
din editura ALL s se dubleze preurile, pentru cele din editura UNIVERS s se
tripleze preurile, iar pentru cele din editura XXX s se reduc la jumtate acest pre.
SELECT
pret,editura,
DECODE(editura, ALL,pret*2,
UNIVERS,pret*3,
XXX,pret/2,
pret) pret_revizuit
FROM
carte;
SQL
63
normal (commit);
anormal (rollback).
64
Oracle
SQL
65
SETAUTO[COMMIT]{ON|OFF]
Comanda ROLLBACK permite restaurarea unei stri anterioare a BD.
ROLLBACK [TO [SAVEPOINT] savepoint];
Dac nu se specific nici un savepoint, toate modificrile fcute n tranzacia
curent sunt anulate, iar dac se specific un anumit savepoint, atunci doar
modificrile de la acel savepoint pn n momentul respectiv sunt anulate.
Executarea unei instruciuni ROLLBACK presupune terminarea tranzaciei curente
i nceperea unei noi tranzacii.
Punctele de salvare pot fi considerate ca nite etichete care refer o
submulime a schimbrilor dintr-o tranzacie, marcnd efectiv un punct de salvare
pentru tranzacia curent. Server-ul Oracle implementeaz un punct de salvare
implicit pe care l mut automat dup ultima comand LMD executat. Dac este
creat un punct de salvare avnd acelai nume cu unul creat anterior, cel definit
anterior este ters automat.
SAVEPOINT savepoint;
Exemplu:
Comanda ROLLBACK nu va genera terminarea tranzaciei.
COMMIT
INSERT
SAVEPOINT a
UPDATE
INSERT
SAVEPOINT b
DELETE
ROLLBACK TO a
Starea datelor nainte de COMMIT sau ROLLBACK este urmtoarea:
starea anterioar a datelor poate fi recuperat;
utilizatorul curent poate vizualiza rezultatele operaiilor LMD prin
interogri asupra tabelelor;
ali utilizatori nu pot vizualiza rezultatele comenzilor LMD fcute de
utilizatorul curent (read consistency);
nregistrrile afectate sunt blocate i, prin urmare, ali utilizatori nu pot
face schimbri n datele acestor nregistrri.
66
Oracle
a;
SQL
67
(e) ROLLBACK TO
SELECT
FROM
b;
AVG(salariu)
salariat;
(f) ROLLBACK TO a;
INSERT INTO salariat
VALUES
(18,Ion,Mihai,5,580,redr_sef);
COMMIT;
ntr-un sistem multi-user, sistemul Oracle furnizeaz read consistency la
nivel de instruciune SQL, adic o singur comand SQL nu poate da rezultate care
sunt contradictorii sau inconsistente. Read consistency asigur c fiecare utilizator
vede datele aa cum existau la ultimul commit, nainte s nceap o operaie
LMD. Prin urmare, modificrile efectuate asupra unei baze de date nu sunt vizibile
dect dup ce operaia de actualizare a fost validat. Numai utilizatorul care a
executat tranzacia poate vedea modificrile fcute de el n cursul acestei tranzacii.
Modelul multiversiune, furnizat de Oracle, asigur consistena la citire:
garanteaz c setul de date vzut de orice instruciune SQL este consistent i
nu se schimb n timpul execuiei unei instruciuni (Oracle asigur o
consisten la citire la nivel de instruciune);
operaiile de citire(SELECT) nu trebuie s vad datele care sunt n proces de
schimbare;
operaiile de scriere (INSERT, DELETE, UPDATE) nu trebuie s afecteze
consistena datelor i s ntrerup sau s intre n conflict cu alte operaii de
scriere concurente.
Cum se implementeaz modelul multiversiune? Dac asupra bazei este
executat o comand LMD, server-ul Oracle face o copie a datelor dinainte de
modificare i o depune n segmentul rollback. Toi utilizatorii (cu excepia celor
care modific datele) vor vedea datele cum sunt nainte de modificare (vd
coninutul segmentului rollback). Dac comanda LMD este commit, atunci
schimbrile din baza de date devin vizibile oricrui utilizator care folosete
instruciunea SELECT. Cnd se termin tranzacia, spaiul ocupat n segmentul
rollback de vechea dat este liber pentru reutilizare. Server-ul Oracle asigur
astfel o vizualizare consistent a datelor n orice moment.
68
Oracle
SQL
69
salariat
salariu = 23456
cod_salariat = 1234;
COMMIT;
La executarea primei comenzi, rndul cu cod_salariat = 1234 este blocat n
mod X n timp ce tabelul salariat este blocat n modul RS. La executarea celei de a
doua comenzi, blocarea la nivel de linie se menine n timp ce blocarea la nivel de
tabel devine RX. La executarea comenzii COMMIT, tranzacia este permanentizat
i toate blocrile sunt eliberate.
Unul sau mai multe tabele pot fi blocate n oricare din modurile prezentate
mai sus folosind comanda LOCK TABLE, care are sintaxa:
LOCK TABLE nume_tabel [, nume tabel]
IN mod_blocare MODE [NOWAIT]
unde mod_blocare poate avea valorile ROW SHARE, ROW EXCLUSIVE, SHARE,
SHARE ROW EXCLUSIVE, EXCLUSIVE. Dac se specific NOWAIT i rndurile
selectate sunt deja blocate de alt tranzacie, atunci utilizatorul este ntiinat de
acest lucru, returnndu-i-se controlul.
Datorit accesului concurent la date este posibil ca mai muli utilizatori s se
blocheze reciproc. Aceast situaie este numit interblocare (deadlock), pentru c
fiecare dintre utilizatori ateapt ca cellalt s elibereze resursa blocat. n cazul
70
Oracle
acesta problema nu se poate rezolva prin simpla ateptare, una din tranzacii
trebuind s fie derulat napoi. Oracle detecteaz automat interblocrile. n acest
caz, Oracle semnaleaz o eroare uneia dintre tranzaciile implicate i deruleaz
napoi ultima instruciune din aceast tranzacie. Acest lucru rezolv interblocarea,
dei cealalt tranzacie poate nc s atepte pn la deblocarea resursei pentru care
ateapt.
Care din urmtoarele comenzi ncheie o tranzacie?
SELECT
ROLLBACK
UPDATE
DELETE
CREATE TABLE