Documente Academic
Documente Profesional
Documente Cultură
Conexiune la SQL*Plus
Dup ce utilizatorul se conecteaz la SQL*Plus, sistemul afieaz un prompt
(SQL>) i ateapt comenzile utilizatorului. Utilizatorul poate da:
comenzi SQL pentru accesarea bazei de date;
blocuri PL/SQL pentru accesarea bazei de date;
comenzi SQL*Plus.
Activarea interfeei SQL*Plus
SQLPLUS [nume_utiliz/parola][@nume_baza_de_date] [@nume_fisier] [-SILENT]
nchiderea sesiunii de lucru SQL*Plus i preluarea controlului
sistemului de operare al calculatorului gazd se realizeaz cu QUIT sau EXIT.
Conectarea la o alt baz de date, dect cea deschis iniial, n timpul
unei sesiuni de lucru SQL*Plus:
CONNECT [nume_utilizator[/parola]][@nume_baza_de_date]
Conexiunea rmne valid pn cnd apare una din urmtoarele situaii:
se prsete SQL*Plus;
se d comanda de deconectare DISCONNECT (comanda nu nchide
sesiunea de lucru SQL*Plus);
se face conectarea la o alt baz de date.
Crearea unei legturi ntre BD local i o BD aflat la distan:
CREATE [PUBLIC] DATABASE LINK nume_legatura
CONNECT TO nume_utilizator
IDENTIFIED BY parola
USING baza_de_date_distanta
Dup ce legtura a fost creat, pot fi fcute interogri asupra tabelelor
corespunztoare BD distante prin specificarea numelui legturii n clauza FROM
din cerere. Dac se specific opiunea PUBLIC, legtura este disponibil tuturor
utilizatorilor cu excepia celor care i-au definit o legtur privat cu acelai nume.
Suprimarea unei legturi ntre dou BD, una local i una la distan:
DROP [PUBLIC] DATABASE LINK nume_legatura.
SQL 3
Editarea comenzilor
Editorul integrat SQL *PLUS (mini-editor mod linie) se ncarc prin:
EDIT [nume_fisier[.extensie]]
Dac se dorete lansarea n execuie a unui alt editor, se modific variabila
EDITOR cu ajutorul comenzii DEFINE. De exemplu:
DEFINE _EDITOR = vi
SQL*Plus pstreaz n memorie ultima comand executat. Comenzile
SQL*Plus nu sunt depuse n buffer-ul SQL. Ele se dau secvenial, cte una la un
moment dat. Dac comanda este prea lung, ea va fi continuat pe linia urmtoare
tastnd caracterul la sfritul liniei, nainte de a tasta RETURN.
Pentru editarea comenzilor SQL i a blocurilor PL/SQL se pot folosi:
A[PPEND] text adaug textul specificat la sfritul liniei curente din
buffer-ul SQL;
C[HANGE] separator old [separator [new [separator]]] schimb textul
old cu textul new (ca separator se poate folosi orice caracter care nu este
alfanumeric);
DEL {n | n m | n * | n LAST | * | * n | * LAST | LAST} terge una sau
mai multe linii din buffer-ul SQL (caracterul * indic linia curent);
DEL fr nici o clauz are ca efect tergerea liniei curente;
I[NPUT] [text] adaug una sau mai multe linii de text dup linia
curent din buffer;
L[IST] {n | n m | n * | n LAST | * | * n | * LAST | LAST} listeaz una
sau mai multe linii din buffer (caracterul * indic linia curent); LIST
fr nici o clauz listeaz toate liniile din buffer.
SQL 5
Comenzi interactive
SQL*Plus dispune de comenzi ce permit comunicarea direct cu utilizatorul:
comanda PAUSE permite afiarea unei linii vide sau unui text suspendnd
temporar aciunea i ateptnd un RETURN de la utilizator;
comanda PROMPT trimite o linie goal sau un mesaj pe ecran;
comanda ACCEPT permite citirea unei linii de pe ecran i atribuirea
valorii sale unei variabile (utilizator) specificate (variabila poate s fie
deja definit prin comanda DEFINE).
ACCEPT variabila [NUMBER | CHAR | DATE]
[FORMAT format] [PROMPT text | NOPROMPT] [HIDE]
Observaii:
tipul implicit al variabilei este CHAR;
textul de la opiunea PROMPT este tiprit nainte ca utilizatorul s dea
valoarea efectiv;
opiunea HIDE face ca valoarea dat de utilizator s fie mascat (de
exemplu, o parol);
opiunea FORMAT indic modul de formatare;
variabila de substituie, dac este prezent, nu trebuie prefixat de
simbolul &.
Exemplu:
ACCEPT alfa PROMPT Numarul de exemplare:
ACCEPT beta PROMPT Numele autorului:
SELECT *
FROM carte
WHERE nrex = &alfa
AND autor = β
Variabilele de substituie (&nume) sunt utilizate pentru stocarea
temporar a unor valori. Variabilele pot s apar n comenzi SQL sau SQL*Plus.
Interfaa cere utilizatorului s dea valori de fiecare dat cnd ntlnete o variabil
nedefinit. Dac variabila este precedat de simbolurile &&, doar la prima
apelare se va solicita o valoare. Pentru variabilele de tip caracter sau de tip dat
calendaristic este obligatorie folosirea ghilimelelor. Variabilele de substituie pot
s apar n condiia WHERE, n clauza ORDER BY, n expresia unei coloane, n
numele unui tabel, n locul unei ntregi comenzi SELECT.
6 Oracle
Exemplu:
SELECT &coloana
FROM &tabel
WHERE &conditie
ORDER BY &ordine;
SQL*Plus permite definirea variabilelor utilizator de tip CHAR prin:
DEFINE variabil = valoare
Variabila rmne definit pn cnd fie se prsete SQL*Plus, fie se d
comanda UNDEFINE pentru variabila respectiv. Tiprirea tuturor variabilelor
utilizator, a valorilor i tipurilor acestora se obine prin forma DEFINE.
Exemplu:
SQL> DEFINE autor1 = Zola
SQL> DEFINE autor2 = Blaga
SQL> SELECT titlu, nrex
2 FROM carte
3 WHERE autor = &autor1
4 OR autor = &autor2;
Setri n SQL*Plus
Pentru a preciza opiunile de lucru cu SQL*Plus se utilizeaz comanda SET.
Setrile SQL standard se gsesc n fiierul login.sql, care poate fi modificat pentru a
conine setri adiionale. Cnd se termin sesiunea toate setrile sunt pierdute.
Comanda SET are dou forme sintactice:
una din ele se folosete ca Help pentru utilizator;
cealalt se folosete pentru setarea variabilelor sistem.
O variabil sistem este un cmp rezervat n care se reine o valoare de ctre
sistemul Oracle, valoare care indic o stare a sistemului. Pentru a afia valorile
tuturor variabilelor de mediu la un moment dat se d comanda SHOW ALL.
SET variabila_sistem valoare
Parametrul variabila_sistem poate lua oricare din valorile care apar la
execuia comenzii SHOW ALL.
SQL 7
Formatarea rezultatelor
Pentru afiarea unui titlu la nceputul sau sfritul fiecrei pagini a unui
raport se folosesc comenzile TTITLE sau BTITLE, avnd sintaxa urmtoare:
{TTI | BTI}[TLE] [spec_tiparire [text | variabila]] [OFF | ON]
Semnificaia parametrilor mpreun cu valorile posibile sunt:
spec_tiparire controleaz amplasamentul i formatarea titlului prin
combinarea unora dintre urmtoarele opiuni:
- COL n indenteaz titlul la coloana n a liniei curente;
- S[KIP] n realizeaz un salt peste n linii, la nceputul unei noi
linii; dac n are valoarea 0, atunci sare la nceputul liniei
curente;
- TAB n realizeaz un salt peste n coloane pe linia curent (salt
nainte dac n este pozitiv i salt napoi dac n este negativ);
- LE[FT], CE[NTER], RI[GHT] aliniaz datele la stnga, n centru
sau la dreapta;
- BOLD realizeaz ngroarea caracterelor textului;
- FOR[MAT] format formateaz coloana conform cu
specificaia dat de format (de exemplu, dac coloana este de tip
caracter atunci An are semnificaia c valoarea coloanei se va
scrie pe n caractere la afiare);
text reprezint textul titlului ncadrat de ghilimele simple (n cazul
n care conine mai multe cuvinte se poate folosi caracterul |
pentru mprirea unui titlu pe mai multe linii);
variabila este o variabil sistem sau o variabil definit de
utilizator (de exemplu, SQL.PNO este o variabil sistem care
specific numrul paginii curente; SQL.LNO specific numrul
liniei curente; variabila SQL.USER specific numrul utilizatorului
curent etc.).
Comanda COLUMN permite controlul afirii coloanelor i a numelor.
COL[UMN] [{coloana | expresie} [opiune]]
coloana este numele coloanei asupra creia se aplic sau creia i se citete
formatarea ntr-o comand SELECT. Dintre valorile parametrului opiune:
NOPRI[NT] | PRI[NT] controleaz afiarea unei coloane;
ALI[as] alias specific un alias pentru coloana sau expresia respectiv;
SQL 9
Exemplu:
S se nlocuiasc coninutul tabelului produse cu informaii ce provin dintr-o
baz de date distant (biblioteca). Aceste informaii se refer la crile de
informatic din tabelul carte.
COPY FROM vasile/ana@biblioteca
REPLACE produse
USING SELECT *
FROM carte
WHERE coded = I;
Exemplu:
S se creeze un fiier care tiprete codul crilor mprumutate i codul
cititorilor care au mprumutat aceste cri, la o dat ce aparine unui interval
specificat. S se concateneze cele dou coduri astfel nct s apar separate prin
virgul i avnd numele informatii.
Soluie:
SET ECHO OFF FEEDBACK OFF
ACCEPT low_date DATE FORMAT MM/DD/YY
PROMPT dati limita inferioara a datei:
ACCEPT high_date DATE FORMAT MM/DD/YY
PROMPT dati limita superioara a datei:
COLUMN informatii FORMAT A25
SELECT codel || , || codec informatii, dataim
FROM imprumuta
WHERE dataim BETWEEN
TO_DATE(&low_date, MM/DD/YY)
AND TO_DATE(&high_date, MM/DD/YY)
/
UNDEFINE low_date
UNDEFINE high_date
CLEAR COLUMNS
SET ECHO ON
SET FEEDBACK ON
Exemplu:
SQL 13
Soluie:
SET ECHO OFF FEEDBACK OFF
ACCEPT num PROMPT Dati numarul de exemplare:
COLUMN autor HEADING NUME|AUTOR FORMAT A15
COLUMN titlu HEADING TITLU|CARTE FORMAT A15
COLUMN intdom HEADING DOMENIU|CARTE FORMAT A15
COLUMN val HEADING VALOARE|TOTALA FORMAT $99,999
BREAK ON autor
SELECT autor, titlu, intdom, pret*nrex val
FROM carte c, domeniu d
WHERE c.coded = d.coded
AND nrex = &num
ORDER BY autor
/
UNDEFINE num
SET ECHO ON FEEDBACK ON
CLEAR BREAKS
CLEAR COLUMNS
14 Oracle
Exemplu:
S se creeze un script la a crui rulare s apar urmtorul raport:
CONTRACTELE SUBANTREPRENORULUI CONSTRUCT SA
LA DATA DE 14/10/2001
NUMAR VALOARE
NUME CONTRACT CONTRACT
----------------------
---------------- ---------------
CONSTRUCT SA 100 50000
101 120000
******************** ---------
VALOAREA MAXIMA 120000
TOTAL 170000
Pagina 1
NUMAR VALOARE
NUME CONTRACT CONTRACT
---------------- --------------- ----------------
ERBASU SA 107 20000
108 300000
109 750000
******************** ---------
VALOAREA MAXIMA 750000
TOTAL 1070000
Pagina 2
CONTRACTELE SUBANTREPRENORULUI GAUDI
LA DATA DE 14/10/2001
NUMAR VALOARE
NUME CONTRACT CONTRACT
----------- --------------- ----------------
GAUDI 104 500000
105 27000
106 10000
******************** ---------
VALOAREA MAXIMA 500000
TOTAL 537000
Pagina 3
SQL 15
Soluie:
SET ECHO OFF FEEDBACK OFF
COLUMN cod NOPRINT
COLUMN name NEW_VALUE nv_name HEADING 'NUME'
COLUMN nrct FORMAT A8 HEADING 'NUMAR|CONTRACT'
COLUMN val HEADING 'VALOARE|CONTRACT'
COLUMN azi NOPRINT NEW_VALUE nv_azi
TTITLE SKIP 1 LEFT 'CONTRACTELE SUBANTREPRENORULUI'-
nv_name SKIP 1 LEFT 'LA DATA DE 'nv_azi SKIP 2
BTITLE SKIP 1 LEFT 'Pagina:' FORMAT 99 SQL.PNO
COMPUTE MAX LABEL 'VALOAREA MAXIMA' SUM LABEL
'TOTAL' OF val ON name
BREAK ON name SKIP PAGE ON name
SELECT ct.cod_contractant cod,sub.nume name,
ct.nr_contract nrct, ct.val_investitie val,
TO_CHAR(SYSDATE,'DD/MM/YYYY') azi
FROM contract ct, subantreprenor sub
WHERE ct.cod_contractant = sub.cod_contractant
AND ct.tip_contract = 1
ORDER BY cod
/
SET ECHO ON FEEDBACK ON
CLEAR BREAKS
CLEAR COLUMNS
CLEAR COMPUTES
16 Oracle
Exemplu:
Presupunem c tabelul carte conine un cmp suplimentar numit tip, prin
care se specific tipul unei cri. Acest tip poate fi: roman, poezie, monografie,
culegere sau diverse. S se genereze un raport care s conin pentru fiecare autor:
numrul exemplarelor de fiecare tip scrise de acesta i numrul total de exemplare.
De asemenea, s se obin n finalul raportului, numrul exemplarelor de fiecare tip
din bibliotec.
Soluie:
SET ECHO OFF FEEDBACK OFF
COLUMN autor FORMAT A12 HEADING Nume|autor
COLUMN roman FORMAT 99999 HEADING Roman
COLUMN poezie FORMAT 99999 HEADING Poezie
COLUMN monografie FORMAT 99999 HEADING Monografie
COLUMN culegere FORMAT 99999 HEADING Culegere
COLUMN diverse FORMAT 99999 HEADING Diverse
COLUMN total FORMAT 99999 HEADING Total
BREAK ON REPORT SKIP 2
COMPUTE SUM OF roman ON REPORT
COMPUTE SUM OF poezie ON REPORT
COMPUTE SUM OF monografie ON REPORT
COMPUTE SUM OF culegere ON REPORT
COMPUTE SUM OF diverse ON REPORT
COMPUTE SUM OF total ON REPORT
TTITLE CENTER Raport carte
SELECT autor,
SUM(DECODE(tip,roman,nrex,0)) roman,
SUM(DECODE(tip,poezie,nrex,0)) poezie,
SUM(DECODE(tip,monografie,nrex,0))monografie,
SUM(DECODE(tip,culegere,nrex,0))culegere,
SUM(DECODE(tip,diverse,nrex,0)) diverse,
SUM(nrex) total
FROM carte
GROUP BY autor
/
CLEAR BREAKS
CLEAR COLUMNS
CLEAR COMPUTES
SET ECHO ON FEEDBACK ON
SQL 17
Exemplu:
S se genereze un raport prin care s se obin pentru fiecare domeniu de
carte informaii despre numele domeniului, titlurile crilor din domeniu, numrul
de exemplare din fiecare carte i din fiecare domeniu, iar n final raportul s conin
i numrul total de cri din bibliotec.
Soluie:
SET ECHO OFF FEEDBACK OFF
COLUMN intdom FORMAT A25 HEADING denumire|domeniu
COLUMN titlu FORMAT A30 HEADING titlu|carte
COLUMN nrex FORMAT 99999 HEADING numar|carti
BREAK ON intdom SKIP 2 ON REPORT SKIP 1
COMPUTE SUM OF nrex ON intdom
COMPUTE SUM OF nrex ON REPORT
TTITLE CENTER Raport carti SKIP 1 LINE
SELECT intdom, titlu, nrex
FROM carte c, domeniu d
WHERE c.coded = d.coded
ORDER BY intdom
/
COLUMN denumire CLEAR
COLUMN titlu CLEAR
COLUMN nrex CLEAR
CLEAR BREAKS
CLEAR COMPUTES
SET ECHO ON FEEDBACK ON
18 Oracle
SQL
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.
Informaii relative la timp sau dat calendaristic se obin utiliznd tipul
DATE. Pentru fiecare dat de tip DATE sunt depuse: secolul, anul, luna, ziua, ora,
minutul, secunda. Pentru o coloan de tip DATE sistemul rezerv 7 bytes, indiferent
dac se memoreaz doar timpul, sau doar data calendaristic.
20 Oracle
Tabele
titlu VARCHAR2(30),
autor VARCHAR2(30),
pret NUMBER(8,2),
nrex NUMBER(3),
coded CHAR(5) NOT NULL,
PRIMARY KEY (codel),
FOREIGN KEY (coded)
REFERENCES domeniu (coded));
Dac cheia primar are mai mult de o coloan atunci cheile trebuie indicate
la nivel de tabel.
CREATE TABLE imprumuta
(codel CHAR(5),
codec CHAR(5),
dataim DATE DEFAULT SYSDATE,
datares DATE,
dataef DATE,
PRIMARY KEY (codel, codec, dataim),
FOREIGN KEY (codel)
REFERENCES carte(codel),
FOREIGN KEY (codec)
REFERENCES cititor(codec));
4. Crearea structurii unui tabel prin copiere din alt tabel:
CREATE TABLE carte_info
AS SELECT codel, titlu, autor
FROM carte
WHERE coded = I;
Constrngerile din primul tabel nu se pstreaz i pentru al doilea tabel.
Comanda creeaz un tabel, dar i insereaz date n tabel.
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:
SQL 23
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.
Constrngeri declarative: constrngeri de domeniu, constrngerea de
integritate a entitii, constrngerea de integritate referenial.
Constrngerile de domeniu definesc valori luate de un atribut (DEFAULT,
CHECK, UNIQUE, NOT NULL).
constrngerea (coloan) DEFAULT ;
constrngerea (coloan sau tabel) CHECK ; constrngerea CHECK la nivel de
tabel poate compara coloane ntre ele, poate face referin la una sau mai multe
24 Oracle
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 ));
DESCRIBE USER_TABLES;
SELECT TABLE_NAME, NUM_ROWS, NESTED
FROM USER_TABLES;
Indeci
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;
SQL 33
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}]
CACHE k | NOCACHE specific numrul de valori alocate de server-ul Oracle
pe care le va pstra n memoria cache pentru a oferi utilizatorilor un acces rapid
(implicit sunt alocate 20 de valori);
ORDER | NOORDER specific dac valorile generate de secven sunt ordonate
n conformitate cu cererile.
Exemplu:
1) S se creeze o secven domeniuseq care s fie utilizat pentru a insera noi
domenii n tabelul domeniu i s se insereze un nou domeniu.
2) S se afieze informaiile referitoare la secvena domeniuseq.
CREATE SEQUENCE domeniuseq
START WITH 1
INCREMENT BY 1;
INSERT INTO domeniu
VALUES (domeniuseq.NEXTVAL,Informatica);
SELECT INCREMENT, START, MAXVALUE, MINVALUE,
FROM USER_SEQUENCES
WHERE SEQUENCE_NAME = 'domeniuseq';
Modificarea unei secvene se face prin comanda ALTER SEQUENCE.
Sintaxa comenzii este similar instruciunii CREATE SEQUENCE , dar:
noua valoare maxim pentru MAXVALUE nu poate fi mai mic dect
valoarea curent;
opiunea START WITH nu poate fi modificat de comand.
Suprimarea unei secvene se face cu ajutorul comenzii:
DROP SEQUENCE [<nume_schema>.]<nume_secventa>;
Dup ce a fost tears, secvena nu mai poate fi referit. Pentru a putea terge
sau modifica secvena trebuie fie s fi proprietarul acesteia, fie s ai privilegiul de
sistem DROP ANY SEQUENCE, respectiv privilegiul ALTER SEQUENCE.
SQL 35
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 | COLUMN
nume_obiect.nume_coloana}
IStextcomentariu
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] SYNONYM [schema.]nume_sinonim FOR
[schema.]obiect
Administratorul bazei poate produce i poate suprima sinonime publice sau
private, iar utilizatorii pot genera sau suprima doar sinonime private. Pentru
suprimarea unui sinonim din baza de date se utilizeaz comanda:
DROP [PUBLIC] SYNONYM [schema.]nume_sinonim
36 Oracle
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.
SQL 37
WHERE cod_salariat = 3;
va genera urmtoarea eroare:
ORA-01752: cannot delete from view without exactly one
key-preserved TABLE.
Modificarea unei nregistrri se face prin secvena care urmeaz. Toate
actualizrile care se fac n view se fac i n tabelele de baz.
UPDATE vederea4
SET tip = 'designer'
WHERE cod_salariat = 3;
Exemplu:
Care dintre coloanele unei vizualizri sunt actualizabile?
SELECT column_name, updatable
FROM user_updatable_columns
WHERE table_name = 'vederea4';
Exemplu:
1. S se creeze un view (vederea3) care s conin, pentru fiecare categorie de
salariat, salariile medii i numrul de angajai din tabelul salariat.
2. S se insereze, s se actualizeze i s se tearg o nregistrare n view.
Soluie:
CREATE VIEW vederea3 (nr, job, salmed)
AS SELECT COUNT(*), job, AVG(salariu)
FROM salariat
GROUP BY job;
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
SQL 43
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
FROM contractant c, contract co
WHERE c.cod_contractant=co.cod_contractant;
La inserarea unei nregistrri creia i se specific valorile tuturor cmpurilor
din ambele tabele:
INSERT INTO vederea44(cod_contractant, adresa,
nr_contract, data_incheiere)
VALUES (200, 'Str. Marmurei, 14', '6235',
TO_DATE('January 03,2002','Month dd,yyyy'));
se obine eroarea:
ORA-01779: cannot modify a column which maps to a non
key-preserved TABLE
Cele dou tabele de baz, contractant i contract, se afl ntr-o relaie one-
to-many, iar view-ul creat conine cheile primare din ambele tabele. Datorit
acestei situaii, doar tabelul contract este protejat prin cheie i, prin urmare, doar el
poate fi modificat prin intermediul view-ului. Aceasta, deoarece ar putea exista mai
multe nregistrri n view, cu aceeai valoare corespunztoare cmpului
cod_contractant (CP n contractant). Exact aceeai eroare se obine dac ncercm
inserarea unei nregistrri n vederea44, specificnd fie i numai un cmp
provenind din tabela contractant (indiferent dac el conine sau nu CP).
Singura operaie de inserare permis este aceea efectuat prin specificarea
cheilor provenind doar din tabelul contract. Astfel, prin executarea comenzii:
INSERT INTO vederea44(nr_contract, tip_contract)
VALUES ('6234', 0);
este creat o nregistrare, dar este modificat i tabelul contract. Dac la inserie nu
se specific cheia primar din contract:
INSERT INTO vederea44(tip_contract)
VALUES (1);
44 Oracle
Grupri
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).
SQL 45
Exerciiu:
S se obin un cluster referitor la lista crilor din fiecare domeniu.
Varianta 1
CREATE CLUSTER cdoml(cdom CHAR(1));
CREATE INDEX indcom ON CLUSTER cdoml;
CREATE TABEL domino
CLUSTER cdoml(coded)
AS SELECT * FROM domeniu;
DROP TABEL domeniu;
RENAME domino TO domeniu;
ALTER TABLE carte
MODIFY coded NOT NULL;
CREATE TABEL carticica
CLUSTER cdoml(coded)
AS SELECT * FROM carte;
DROP TABLE carte;
RENAME carticica TO carte;
Varianta 2
CREATE CLUSTER cdoml(cdom CHAR(1));
CREATE INDEX indcom ON CLUSTER cdoml;
-- crearea spatiului
CREATE TABLE domeniu
(coded CHAR(1) NOT NULL,
intdom CHAR() ... )
CLUSTER cdoml(coded);
CREATE TABLE carte
(codel CHAR(5) NOT NULL,
coded CHAR(1) NOT NULL)
CLUSTER cdoml(coded);
Pentru a scoate un tabel dintr-un cluster sunt parcurse urmtoarele etape: se
creeaz un nou tabel, n afara cluster-ului, prin duplicarea celui vechi; se distruge
tabelul din cluster; se suprim cluster-ul.
CREATE TABLE alfa
AS SELECT * FROM domeniu;
DROP TABLE domeniu;
46 Oracle
Un alt tip de cluster oferit de Oracle este cluster-ul hash. n acest caz, pentru
a accesa o nregistrare, cluster-ul hash nu folosete un index, ci o funcie numeric,
numit funcia hash. Funcia are ca parametru cheia cluster-ului i returneaz o
anumit valoare (valoare hash). Aceast valoare corespunde blocului de date din
cluster pe care Oracle l va citi sau scrie pe baza comenzii executate.
De exemplu, apelurile telefonice efectuate de un client ntr-o lun vor fi
facturate mpreun. Apelurile pot fi depozitate ntr-un cluster hash a crui cheie
este format din coloanele ce conin numrul telefonului, anul i luna n care a avut
loc convorbirea.
Suprimarea unui cluster din baza de date se face prin comanda:
DROP CLUSTER nume_cluster
n urma tergerii unui cluster, tabelele pe care acesta le conine nu mai sunt
grupate. Secvena urmtoare suprim: cluster-ul, toate tabelele definite relativ la
acest cluster i constrngerile lor de integritate.
DROP CLUSTER nume_cluster
INCLUDING TABLES
CASCADE CONSTRAINTS;
Modificarea unui cluster permite redefinirea condiiilor, modificarea
parametriilor de stocare i a caracteristicelor de stare (ALTER CLUSTER).
SQL 47
Comanda INSERT
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 INTO grafician (cod_salariat)
SELECT cod_salariat
FROM salariat
WHERE job = grafician;
INSERT INTO tehnoredactor (cod_salariat)
SELECT cod_salariat
FROM salariat
WHERE job = tehnoredactor;
INSERT INTO redactor_sef (cod_salariat)
SELECT cod_salariat
FROM salariat
WHERE job = redactor_sef;
Exemplu:
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 INTO realizeaza (cod_salariat, nr_publicatie,
nr_capitol, nr_frame)
SELECT s.cod_salariat,f.nr_publicatie, f.nr_capitol,
f.nr_frame
FROM salariat s, frame f
SQL 51
Comanda DELETE
Observaii:
Pentru a se putea executa instruciunea DELETE, utilizatorul care o
lanseaz n execuie trebuie s aib acest privilegiu.
Comanda DELETE nu terge structura tabelului.
n clauza WHERE pot fi folosite i subcereri.
Comanda nu poate fi folosit pentru tergerea valorilor unui cmp
individual. Acest lucru se poate realiza cu ajutorul comenzii UPDATE.
Atenie la tergere, pentru a nu afecta integritatea referenial!
Exemplu:
S?seeliminecititoriicareaunumelePopaicei
careaurestituitast?zicelpu?inocarte.
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.
52 Oracle
Comanda UPDATE
Valorile cmpurilor care trebuie modificate pot fi furnizate explicit sau pot fi
obinute n urma unei cereri SQL.
UPDATE tablename / viewname
SET (column1[,column2[,]]) = (subquery) / column = expr / (query)
[WHERE condition]
Observaii:
Pentru a se putea executa instruciunea UPDATE, utilizatorul care o
lanseaz n execuie trebuie s aib acest privilegiu.
Dac nu este specificat clauza WHERE se vor modifica toate liniile.
Cererea trebuie s furnizeze un numr de valori corespunztor numrului
de coloane din paranteza care precede caracterul de egalitate.
Exemplu:
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 carte
SET pret = (SELECT MAX(pret)
FROM carte
WHERE coded = I)
WHERE 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.
SQL 53
Soluie:
UPDATE carte
SET pret = (SELECT SUM(pret)
FROM carte
WHERE autor = Zola)
WHERE nrex < (SELECT AVG(nrex)
FROM carte);
Exemplu:
S se mreasc cu 5% salariile redactorilor efi care coordoneaz 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
GROUP BY nr_publicatie)));
Exemplu:
S se reduc cu 10% salariile redactorilor efi care nu sunt asociai nici unei
publicaii.
Soluie:
UPDATE salariat
SET salariu = 0,9*salariu
WHERE cod_salariat IN
(SELECT cod_salariat
FROM redactor_sef
WHERE cod_salariat NOT IN
(SELECT cod_salariat
FROM publicatie));
54 Oracle
Comanda SELECT
Exemplu:
S se afieze data i ora curent.
SELECT TO_CHAR(SYSDATE,DD/MM/YY HH24:MI:SS)
FROM 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 se obin numrul de cte ori a fost mprumutat fiecare carte.
SELECT codel, COUNT(*)
FROM imprumuta
GROUP BY codel;
Exemplu:
Pentru fiecare domeniu de carte s se obin numrul crilor din domeniu,
media preurilor i numrul total de exemplare.
SELECT coded,COUNT(*),AVG(pret),SUM(nrex)
FROM carte
GROUP BY coded;
SQL 57
Exemplu:
Pentru departamentele n care salariul maxim depete 5000$ s se obin
codul acestor departamente i salariul maxim pe departament.
SELECT deptno, MAX(sal)
FROM emp
GROUP BY deptno
HAVING MAX(sal)>5000;
Exemplu:
S se afieze numele i salariul celor mai prost pltii angajai din fiecare
departament.
SELECT ename, sal
FROM emp
WHERE (deptno, sal) IN
(SELECT deptno, MIN(sal)
FROM emp
GROUP BY deptno);
Exemplu:
S se obin pentru fiecare carte, codul su i numrul de exemplare care nu
au fost nc restituite.
SELECT codel, COUNT(*)
FROM imprumuta
WHERE dataef IS NULL
GROUP BY codel;
Exemplu:
S se obin numrul crilor mprumutate cel puin o dat.
58 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.
SQL 59
SELECT codec
FROM cititor
MINUS
SELECT DISTINCT codec
FROM imprumuta;
Operaii de compunere
Un join simplu (natural join) este o instruciune SELECT care returneaz
linii din dou sau mai multe tabele. Este preferabil ca tabelul care are linii mai
puine s fie al doilea n operaia de compunere. Comanda dureaz mai puin, dac
tabela este indexat dup coloana, relativ la care se face compunerea. Compunerea
a n tabele cere minim (n-1) condiii de join.
Exemplu:
S se obin codurile i titlurile crilor mprumutate.
SELECT carte.codel, titlu
FROM carte, imprumuta
WHERE carte.codel = imprumuta.codel;
S-ar putea ca tabelele legate prin operaia de compunere s nu aib coloane
comune (non-equijoin). n acest caz n clauza WHERE nu apare operatorul egalitate
i sunt folosii operatorii: <=, >=, BETWEEN.
Pentru a simplifica scrierea i pentru a elimina ambiguitile care pot s
apar este necesar folosirea alias-ului pentru tabele. Alias-ul este valid doar pentru
instruciunea SELECT curent.
Exemplu:
S se obin pentru fiecare salariat numele, salariul i grila de salarizare ( join).
SELECT e.ename, e.sal, s.grade
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.lasal AND s.hisal;
Exemplu:
S se obin titlurile i preurile crilor mai scumpe dect cartea avnd titlul
Baze de date, al crui autor este Oszu (self join).
SELECT x.titlu, x.pret
FROM carte x, carte y
WHERE x.pret > y.pret
AND y.titlu = Baze de date
AND y.autor = Oszu;
62 Oracle
Subcereri
De cele mai multe ori, pentru a implementa anumite interogri, nu este
suficient o singur cerere SELECT ci sunt necesare subcereri. Subcererile sunt
comenzi SELECT ncapsulate n oricare din clauzele WHERE, HAVING, FROM.
Dac subcererea urmeaz clauzei WHERE sau HAVING, ea poate conine
unul dintre operatorii ALL, ANY, IN (=ANY), EXIST, NOT IN (!=ALL) care sunt
specifici cererilor care ntorc mai multe linii (multiple-row subquery) sau unul
dintre operatorii de comparare (=, <, >, >=, <=, <>) care sunt specifici cererilor
care ntorc o singur linie (single-row subquery).
Subcererile trebuie incluse ntre paranteze i trebuie plasate n partea dreapt
a operatorului de comparare. Subcererea nu poate conine ORDER BY.
Exemplu:
S se obin numele i salariul angajailor, avnd salariul minim.
SELECT ename, sal
SQL 65
FROM emp
WHERE sal=(SELECT MIN(sal)
FROM emp);
Exemplu:
S se obin job-ul i salariul minim.
SELECT job, AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal)=(SELECT MIN(AVG(sal))
FROM emp
GROUP BY job);
Exemplu:
S se gseasc salariaii din fiecare departament, care au salariul minim n
departamentul respectiv.
SELECT ename, sal, deptno
FROM emp
WHERE sal IN (SELECT MIN(sal)
FROM emp
GROUP BY deptno);
Operatorul ANY presupune c este adevrat condiia dac comparaia este
adevrat pentru cel puin una din valorile returnate. Sunt evidente relaiile:
< ANY mai mic ca maximul;
> ANY mai mare ca minimul;
= ANY IN.
Pentru operatorul ALL se presupune c este adevrat condiia, dac
comparaia este adevrat pentru toate elementele listei returnate. Pentru operatorul
ALL sunt evidente relaiile:
< ALL mai mic ca minimul;
> ALL mai mare ca maximul;
! = ALL NOT IN.
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:
66 Oracle
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 col,col,
FROM tabel
WHERE (col,col,) IN (SELECT col,col,
FROM tabel
WHERE 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
WHERE sal IN (SELECT sal
FROM emp
WHERE deptno=7)
AND 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
SQL 67
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 m.mgr
FROM 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 celor mai scumpe cri.
SELECT titlu
FROM carte
WHERE pret = (SELECT MAX(pret)
FROM carte);
Exemplu:
S se obin lista scriitorilor care au n bibliotec un numr de exemplare mai
mare dect numrul mediu al crilor din bibliotec.
SELECT DISTINCT autor
FROM carte
WHERE nrex > (SELECT AVG(nrex)
FROM carte);
68 Oracle
Exemplu:
S se obin informaii despre crile al cror pre depete media preurilor
crilor ce aparin aceluiai domeniu
SELECT *
FROM carte c
WHERE pret > (SELECT AVG(pret)
FROM carte
WHERE coded = c.coded);
Exemplu:
S se obin lista cititorilor care au mprumutat cel puin o carte.
SELECT nume
FROM cititor
WHERE codec IN (SELECT DISTINCT codec
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.
SELECT nume
FROM cititor
WHERE codec IN (SELECT DISTINCT codec
FROM imprumuta
WHERE dataef IS NULL
AND dares<SYSDATE);
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
SQL 69
FROM imprumuta
WHERE codel IN
(SELECT codel
FROM carte
WHERE autor=ZOLA));
Exemplu:
S se obin numele cititorilor care nu au mprumutat nici o carte scris de
ZOLA.
SELECT nume
FROM cititor
WHERE codec NOT IN
(SELECT DISTINCT codec
FROM imprumuta
WHERE codel IN
(SELECT codel
FROM carte
WHERE autor=ZOLA));
Operatorul IN poate fi nlocuit cu = ANY (un element este n list dac i
numai dac este egal cu un element al listei), iar operatorul NOT IN poate fi
nlocuit prin !=ALL.
Exemplu:
S se obin codurile cititorilor care au mprumutat o carte de algebr.
SELECT DISTINCT codec
FROM imprumuta
WHERE codel IN
(SELECT codel
FROMcarte
WHERE coded=
(SELECT coded
FROM domeniu
WHERE intdom=ALGEBRA));
Exemplu:
S se obin cititorii care au mprumutat numai cri scrise de ZOLA.
SELECT nume
FROM cititor
WHERE codec NOT IN
70 Oracle
Exemplu:
S se obin titlurile crilor care sunt momentan mprumutate.
Soluia 1 (cu sincronizare):
SELECT titlu
FROM carte
WHERE EXISTS
(SELECT *
FROM imprumuta
WHERE codel = carte.codel
AND dataef IS NULL);
Soluia 2 (fr sincronizare):
SELECT titlu
FROM carte
WHERE codel IN
(SELECT DISTINCT codel
FROM imprumuta
WHERE 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)
SELECT codel
FROM carte
WHERE codel NOT IN
(SELECT DISTINCT codel
FROM imprumuta);
Exemplu:
S se obin lista salariailor avnd salariul minim n departamentul n care
lucreaz.
SELECT ename,sal
SQL 73
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
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 codec
74 Oracle
FROM imprumuta i
WHERE NOT EXISTS
(SELECT codel
FROM imprumuta
WHERE codec=i.codec
MINUS
SELECT codel
FROM imprumuta
WHERE codec=&ccc)
AND NOT EXISTS
(SELECT codel
FROM imprumuta
WHERE codec=&ccc
MINUS
SELECT codel
FROM imprumuta
WHERE codec=i.codec)
AND codec!=&ccc);
Ultimul operator (AND), asigur s nu apar n rezultat cititorul specificat.
n cazul formei relaionale de rezolvare a cererii, drumul de acces la
informaie este n sarcina SGBD-lui i prin urmare nu mai apar cereri imbricate.
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin o carte.
Soluia 1 (forma relaional):
SELECT DISTINCT nume
FROM cititor,imprumuta
WHERE cititor.codec=imprumuta.codec;
Soluia 2 (forma procedural):
SELECT nume
FROM cititor
WHERE codec IN
(SELECT DISTINCT codec
FROM imprumuta);
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin dou cri.
Soluia 1 (forma relaional):
SQL 75
SELECT nume
FROM cititor, imprumuta
WHERE cititor.codec=imprumuta.codec
GROUP BY nume
HAVING COUNT(*)>1;
Soluia 2 (forma procedural):
SELECT nume
FROM cititor
WHERE codec IN
(SELECT codec
FROM imprumuta
GROUP BY codec
HAVING COUNT(*)>1);
Exemplu:
S se obin numele cititorilor i titlurile crilor de informatic mprumutate
de aceti cititori.
SELECT nume, titlu
FROM cititor, carte, imprumuta, domeniu
WHERE imprumuta.codel = carte.codel
AND carte.coded = domeniu.coded
AND imprumuta.codec = cititor.codec
AND intdom = INFORMATICA;
Exemplu:
S se obin numele salariailor care nu cunosc nici o limb strin.
SELECT nume, prenume
FROM salariat
WHERE NOT EXISTS
(SELECT *
FROM limba
WHERE limba.cod_salariat = salariat.cod_salariat
AND limba.limba_cun IS NOT NULL);
Exemplu:
S se afieze graficienii care au ntrziat s predea frame-urile.
a) cu sincronizare:
SELECT nume, prenume
FROM salariat
76 Oracle
WHERE EXISTS
(SELECT *
FROM realizeaza r
WHERE salariat.cod_salariat=r.cod_salariat
AND data_lim < SYSDATE);
b) fr sincronizare:
SELECT nume, prenume
FROM salariat
WHERE cod_salariat IN
(SELECT DISTINCT cod_salariat
FROM realizeaza
WHERE data_lim < SYSDATE);
Exemplu:
S se determine revistele coordonate de redactori efi care nu cunosc limba
n care sunt scrise. Se tie c n urma inspectrii vizuale a rezultatului interogrii se
poate decide schimbarea redactorilor efi ai revistelor respective, de aceea se
dorete blocarea nregistrrilor gsite.
SELECT p.nr_publicatie
FROM salariat s, publicatie p
WHERE s.cod_salariat = p.cod_salariat
AND p.limba NOT IN
(SELECT limba_cun
FROM limba
WHERE limba.cod_salariat = s.cod_salariat)
FOR UPDATE OF p.cod_salariat;
Funcii n SQL
funcii pentru manipularea caracterelor,
funcii aritmetice,
funcii pentru manipularea datelor calendaristice,
funcii de conversie,
funcii grup
funcii diverse.
Funcii de conversie
SQL 77
Observaii:
Funciile grup opereaz pe un grup de linii i nu cer folosirea clauzei
GROUP BY.
Funciile grup ignor valorile null.
Orice funcie grup ntoarce o singur valoare.
Ele ntorc valoarea null cnd sunt aplicate unei mulimi vide, cu excepia
operatorului COUNT care ntoarce valoarea zero.
80 Oracle
Funcii diverse
DECODE(value, if1, then1, if2, then2, , ifN, thenN, else) returneaz
then1 dac value este egal cu if1, then2 dac value este egal cu if2 etc.;
dac value nu este egal cu nici una din valorile if, atunci funcia ntoarce
valoarea else (selecie multipl);
NVL(e1, e2) dac e1 este NULL, returneaz e2; altfel, returneaz e1;
UID returneaz ID-ul utilizatorului curent;
USER returneaz username-ul utilizatorului curent;
VSIZE(expr) returneaz numrul de octei ai unei expresii de tip DATE,
NUMBER sau VARCHAR2;
EMPTY_BLOB iniializeaz o variabil sau o coloan de tip BLOB;
NLS_CHARSET_NAME(id_set_caractere) returneaz numele setului
de caractere NLS asociat cu identificatorul setului transmis ca argument.
Aceast funcie nu exist n versiuni anterioare Oracle8.
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,
SQL 83
UNIVERS,pret*3,
XXX,pret/2,
pret) pret_revizuit
FROM carte;
(b) SAVEPOINT a;
SELECT AVG(salariu)
FROM salariat;
(e) ROLLBACK TO b;
SELECT AVG(salariu)
FROM salariat;
(f) ROLLBACK TO a;
INSERT INTO salariat
VALUES (18,Ion,Mihai,5,580,redr_sef);
COMMIT;
Exemplu:
SELECT salariu
FROM salariat
WHERE cod_salariat = 1234
FOR UPDATE OF salariu;
UPDATE salariat
SET salariu = 23456
WHERE 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
90 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.