0% au considerat acest document util (0 voturi)
486 vizualizări352 pagini

SQL - Baze de Date Relationare

Un document care va va ajuta sa invatati sau sa va extindeti cunostintele deja dobandite in domeniul bazelor de date.

Încărcat de

Eugen Lupu
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
486 vizualizări352 pagini

SQL - Baze de Date Relationare

Un document care va va ajuta sa invatati sau sa va extindeti cunostintele deja dobandite in domeniul bazelor de date.

Încărcat de

Eugen Lupu
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 352

'Standard Oracle7' care dispune de o multime comprehensiva de facilitati asupra bazelor

de date,mai sunt cateva facilitati suplimentare.


Acestea includ:
Optiunea procedurala
Asigura un "motor" P!S" versiunea # in interiorul serverului Oracle,care are
bilitatea de a stoca proceduri b.d.,functii si mecanism$ de siguranta pentru
utilizarea de catre aplicatii .
Optiunea distribuita
Suporta tranzactii care actualizeaza informatia din mai multe baze de date dintr%o
retea de baze de date distribuita,utilizand e&ecutia in doua faze.
Paralel Server Option
Suporta sisteme cuplate liber.
Oracle de incredere '"(rusted Oracle")
Pune la dispozitie o multime de facilitati aditionale de inalta securitate.
Produsele Oracle
Printre multele dezvoltari de aplicatii si produse pentru utilizatori accesibile in familia
Oracle,e&ista o posibilitate comuna pentru a accesa baza de date.
*aca direct sau indirect,aceasta este realizata prin imba+ul cu Structura de
,nterogare'S"),va fi un subiect pe care noi il vom trata in acest curs.
Produsele Oracle contin:
Oracle (e&t-etrieval
O tehnologie care adauga capabilitati de refacere completa a te&tului intr%o baza
de date Oracle.
Pro.Oracle
O serie de precomilatoare care permit accesul bazelor de date Oracle la limba+ele
de programare /, /obol,0ortran,P!1,Pascal si Ada.
Oracle /ard
O interfata utilizator pentru producerea aplicatiilor cu baze de date usor de folosit
ce incorporeaza grafice si facilitati multimedia.
Oracle /AS2
O familie de instrumente care a+uta la analiza , designul si generarea aplicatiilor
Oracle.
S".Plus
3n instrument care permite o utilizare directa si interactiva a limba+ului S"
pentru a accesa serverul Oracle,utilizand comenzi ad%hoc sau prin rularea
fisierelor de comanda.
Mediul de dezvoltare auxiliar(CDE)
,nstrumentul de dezvoltare a aplicatiilor principale formeaza un set inchis integrat numit
'4ediul de *ezvoltare Au&iliar'.2lementele de baza ale /*2 includ limba+ul procedural
al lui Oracle,P!S",facilitati grafice si comunicare intre produse.
Principalele instrumente /*2 sunt:
Oracle 0orms 56
Permite ca aplicatii sofisticate bazate pe utilizarea ecranului sa fie construite
repede si usor si permite utilizatorului sa ceara si sa manipuleze date intr%o
structura cu forma convenabila ,la fel de bine ca afisarea imaginilor vizuale,si
facilitati de accesare prevazute de alte produse /*2.
Oracle -eports 5#
3n puternic instrument de scriere a rapoartelor pentru constructia si e&ecutia
rapoartelor sofisticate cu fonturi de te&t si imagini multiple.
Oracle 7raphics 5#
Permite construirea si afisarea aplicatiilor vizuale, incluzand harti,grafice,imagini
si desene.
Oracle 8oo9 51
Prevede abilitatea de a crea si vizualiza documente care includ hiperte&te,sunete
digitale si videoclipuri.
SQL,SQL*PLUS si PL/SQL
S",S".P3S si P!S" sunt facilitatile Oracle care vor fi discutate in acest curs.2ste
important de inteles in fiecare caz diferentele lor,rolul si locul lor in familia Oracle.
.S"
este limba+ul utilizat pentru a accesa o baza de date relationala, inclusiv Oracle.
poate fi utilizat de fiecare instrument Oracle,cand accesul la baza de date este
necesar.
.P!S"
este limba+ul Procedural al lui Oracle pentru scrierea aplicatiilor si pentru
manipularea datelor in afara bazei de date.
poate include un subset al comenzilor S",cand accesul la baza de date este cerut
este accesibil in fiecare din produsele /*2.*e asemenea in insusi serverul
Oracle'daca optiunea procedurala este instalata).
.S".Plus
este un produs Oracle in care limba+ele S" si P!S" pot fi utilizate.
de asemenea are propriul limba+ de comanda pentru controlul comportarii
produsului si pentru formatarea rezultatelor interogarilor S".
,n concluzie,S" si P!S" sunt limba+e care sunt utilizate intr%un numar de produse
Oracle .S".PluS este unul din produsele pe care acestea se afla.
:oi vom discuta acum principiile de baza ale bazelor de date relationale, pentru care
Oracle este un e&emplu.
AO!DA!EA !ELA"#O$ALA
--------------------------------------------------
| S# SNAME STATUS CITY |
|------------------------------------------------|
| S1 SMITH 20 LONDON |
| S2 JONES 10 PARIS |
| S3 BLAKE 30 PARIS |
--------------------------------------------------
PARTI
---------------------------------------------------------
| P# PNAME COLOUR WEIGHT CITY |
|-------------------------------------------------------|
| P1 NUT RED 12 LONDON |
| P2 BOLT GREEN 17 PARIS |
| P3 SCREW BLUE 17 ROME |
| P4 SCREW RED 14 LONDON |
---------------------------------------------------------

!"#"$%$
ORDINI
-------------------
| S# P# &TY |
|-----------------|
| S1 P1 300 |
| S1 P2 200 |
'$%(---------)| S1 P3 400 |
| S2 P1 300 |
| S2 P2 400 --|----!$*+
| S3 P3 200 |
-------------------
A%ordarea relatio&ala
Principiile modelului relational au fost pentru prima data e&puse de *r. 2. 0./odd,care in
iunie 1;7< a publicat un articol numit '3n model relational de date pentru marile banci de
date'.,n acest articol *r. /odd a propus modelul 'relational' pentru sistemele de baze de
date.
8aza de date relationala este perceputa de utilizatorii sai ca o colectie de tabele
bidimensionale care sunt usor de inteles.Sunt doar patru concepte de inteles:
tabele
coloane
randuri
campuri
4odelul relational imita procesele unei ramuri a algebrei cunoscuts sub numele de
'Algebra relationala'. Aceste procese implica:
o colectie de obiecte cunoscute sub numele de -2A(,,
o multime de operatori ce actioneza asupra relatiilor pentru a produce noi relatii.
O -elatie poate fi inteleasa ca o (abela.4odificarea datelor este reali% zata prin operatiile
relationale aplicate asupre tabelelor.
-------------------------------------------
RESTRICTIE | |
| |
| |
|#########################################|
| |
| |
| |
|#########################################|
| |
|#########################################|
| |
| |
-------------------------------------------
PROIECTIE -------------------------------------------
| ### ######## |
| ### ######## |
| ### ######## |
| ### ######## |
| ### ######## |
| ### ######## |
| ### ######## |
| ### ######## |
| ### ######## |
| ### ######## |
| ### ######## |
| ### ######## |
-------------------------------------------
O'eratori relatio&ali
Operatorii relationali sunt definiti mai +os:
-elatia *escrierea
-estrictia
este o operatie care preia si afiseaza datele din relatie.2ste posibil sa se afiseze
toate randurile sau doar randurile care indeplinesc o conditie sau mai multe
conditii .Aceasta este de multe ori numita 'submultime orizontala'
Proiectia
este operatia care afiseaza anumite coloane din relatie si de aceea este numita
'submultime verticala'.
Produs
este rezultatul obtinut cand randurile a doua multimi de date sunt concatenate
conform conditiilor specificate.
=oin
este rezultatul obtinut cand randurile a doua multimi de date sunt concatenate
conform conditiilor specificate.
-euniunea
afiseaza toate randurile care apar in una ,in cealalta sau in ambele din cele doua
relatii.
,ntersectia
afiseaza toate randurile care apar in ambele din cele doua relatii.
*iferenta
afiseaza randurile care apar numai intr%o singura relatie 'S" utilizeaza
operatorul minus ).
PRODUS
----------- ---------- -------------------
| SMITH | | CLERK | | SMITH | CLERK |
| JONES | +'"(,- | MANAGER|------)| SMITH | MANAGER |
| ADAMS | ---------- | | |
----------- | JONES | CLERK |
| JONES | MANAGER |
| | |
| ADAMS | CLERK |
| ADAMS | MANAGER |
-------------------
JOIN
--------------- ------------------- -------------------------------
| CLARK | 10 | | 10 | ACCOUNTING | | CLARK | 10 | 10 | ACCOUNTING|
| MILLER | 10 | J | 20 | RESEARCH | | MILLER| 10 | 10 | ACCOUNTING|
| SMITH | 20 |--)| 30 | SALEH | | SMITH | 20 | 20 | RESEARCH |
| TURNER | 30 | | 40 | OPERATIONHS| | TURNER| 30 | 30 | SALES |
--------------- ------------------- -------------------------------
Pro'rietati ale %azelor de date relatio&ale
O baza de date relationala apare ca o colectie de relatii'tabele) catre utilizator.
0ormatul coloanei!randului este familiar si usor pentru vizualizarea datelor .
2&ista o multime de operatori pentru partitionarea si combinarea
relatiilor'selectia,proiectia,produsul,+oinul,uniunea, intersectia, diferenta).
:u sunt pointeri e&pliciti>cone&iunile sunt facute numai pe baza datelor.
imba+ul utilizat pentru interogarea bazei de date este non%procedural si similar
limbii engleze.
3tilizatorul nu specifica calea de acces si nu are nevoie sa stie cum este
informatia aran+ata fizic.
/omenzile pentru refacerea datelor si acelea pentru realizarea schimbarilor in
baza de date sunt incluse intr%un singur limba+ S".
2&ista o independenta totala a datelor.
Pro'rietatile relatiilor ta%elare
O singura tabela are urmatoarele proprietati:
:u e&ista randuri duplicate
:u e&ista nume de coloana duplicate
Ordinea randurilor este neimportanta
Ordinea coloanalor este neimportanta
5alorile sunt atomice'nedecompozabile).
C A P I T O L U L 2
#$"!ODUCE!E #$ SQL
Acest capitol realizeaza o introducere in limba+ul de interogare utilizat pentru a accesa o
baza de date Oracle. 4ultimea comenzilor S" sunt conturate ca blocuri de interogare de
baza.,n particular, noi discutam declaratiile S" folosite la:
e&ecutia calculelor
specificarea alternativa a capetelor de coloana
concatenarea coloanelor
sortarea rindurilor
introducerea criteriilor de cautare.
Privire de a&sa(%lu asu'ra SQL
3n sistem de management al bazei de date necesita un limba+ de interogare pentru a
permite utilizatorului sa acceseze datele.S" 'limba+ de interogare structurata) este
limba+ul utilizat de ma+oritatea sistemelor de baza de date relational.
imba+ul S" a fost dezvoltat intr%un prototip de sistem de management a bazelor de
date relationale % S?stem - %de ,84 la mi+locul anilor 1;7<.,n 1;7;, /orporatia Oracle
introduce prima implementare a S" in varianta comerciala.
"rasaturi caracteristice SQL
S" este prezentat in limba engleza. 0oloseste cuvintele select, insert,delete ca
parti ale setului de comenzi.
S" este un limba+ neprocedural :specifica ce informatii doresti,nu cum sa le
obtii./u alte cuvinte S" nu iti cere sa specifici metoda de acces la date.(oate
cererile S" folosesc optimizarea cererilor% o parte a -*84S% pentru a
determina rapid remedierea datelor specifi% cate.Aceste trasaturi usureaza
obtinerea rezultatelor dorite.
Procesarea S" asupra inregistrarilor nu se poate face decit asupra unei singure
inregistrari la un moment dat./ea mai comuna forma a unui set de inregistrari este
un tabel.
S" poate fi folosit de un sir de utilizatori incluzand *8A, programatori de
aplicatii ,personal de management si multe alte tipuri de utilizatori.
S" pune la dispozitie comenzi pentru o varietate de tascuri incluzand:
" date interogate
" inserarea,e&tragerea si stergerea rindurilor intr%un tabel.
" crearea,modificarea si stergerea obiectelor de tip baza de date
" controlul accesului la baza de date si la obiectele de tip baza de date.
" garantarea consistentei bazei de date
a inceput sistemele de management a bazei de date a utilizat un limba+ separat pentru
fiecare categorie in parte.S" le%a unificat pe toate acestea intr%un singur limba+.
S" a devenit un limba+ standard industrial pentru bazele de date relatio% nale . ,nstitutul
:ational American de Standarde'A:S,) a adoptat S" ca limba+ standard pentru
-*84S in anul 1;@A.Organizatia ,nternationala de Standarde ',SO) a adoptat
deasemenea S" ca limba+ standard pentru -*84S.(oate -*84S%urile suporta unele
forme de S" si toti vinzatorii de -*84S intentioneaza sa se alinieze la standardele
A:S,.
Setul de co(e&zi SQL
/omanda B *escriere:
S22/(
este comanda cea mai utilizata > este folosita pentru obtinerea datelor din bazele
de date
,:S2-(
aceste trei comenzi sunt utilizate pentru a introduce noi
3P*A(2
rinduri,pentru a schimba rindurile e&istente si stergerea
*22(2
rindurilor nedorite din tabelele bazelor de date respective. '2le sunt cunoscute in
ansamblu ca *4 sau comenzi ale limba+ului de manipulare a datelor.)
/-2A(2
aceste trei comenzi sunt utilizate dinamic pentru a crea ,
A(2-
utiliza si sterge orice structura de date,de e&emplu,tabele,
*-OP
e&puneri ,indecsi.'2le sunt cunoscute sub numele colectiv ** sau comenzi ale
limba+elor de definire a datelor).
7-A:(
aceste doua comenzi sunt utilizate pentru a da sau a lua
-25OC2
drepturile de acces pentru bazele de date si structurile din Oracle.
:.8. Acestea sunt o parte a comenzilor S". Pentru o lista mai completa de comenzi se
recomanda % 4anualul de -eferinta a imba+ului S"% .
Scrierea co(e&zilor SQL
/and scriem comenzi S" ,este important sa ne reamintim cateva reguli simple pentru
construirea unor declaratii valide care sunt si usor de citit si de editat:
/omenzile S" pot fi pe una sau mai multe linii.
/lauzele sunt uzual plasate pe linii separate.
(abelarea poate fi folosita.
/uvintele de comanda nu pot fi separate pe mai multe linii.
/omenzile S" nu sunt 'case sensitive'.
O comanda S" este introdusa la promptul S" si liniile subsecventelor sunt
numarate.
O singura declaratie poate fi considerata curenta cat timp ea este in buffer si poate
fi rulata intr%un numar de moduri :
" plasand un punct si virgula'>) la sfarsitul ultimei clauze.
" plasand un punct si virgula !slash la ultima linie in buffer.
" plasand un slash'!) la promptul S".
" scriind un -D3:E 'comanda S") la promptul S".

./0!$'0 (/% ,'*$1"$'0#0 (0!#$'$1// -,%1 2$#/(03
SELECT 4 .ROM EMP5
SELECT
4
.ROM
EMP
5
SELECT 4
.ROM EMP5
I% $!0-1 *$%,$# !"*0%6/#0 S&L -,%1 -+$'10 /% !#$,60 +0%1',
!#$'/1$107

locul de i&tero)are de %aza
*eclaratia S22/( regaseste informatia din baza de date implementand toti operatorii
din algebra relationala .
,n cele mai simple forme trebuie sa contina:
1. O clauza S22/( ,care listeaza coloanele pentru afisare astfel incat este esentiala
o Proiectie.
#. O clauza 0-O4 care specifica tabela implicata.

P0%1', $ #/-1$ 1"$10 %,*0'0#0 (0+$'1$*0%10#"'8%,*0#0 $%9$:$1/#"' -/
%,*$',# *$%$90'/#"' /% 1$;0#$ EMP /%1'"(,!01/ ,'*$1"$'0#03
SELECT DEPTNO8ENAME8MGR
.ROM EMP5
DEPTNO ENAME MGR
------ ---------- -----
20 SMITH 7<02
30 ALLEN 7=<>
30 WARD 7=<>
20 JONES 7>3<
30 MARTIN 7=<>
30 BLAKE 7>3<
10 CLARK 7>3<
20 SCOTT 7?==
10 KING
30 TURNER 7=<>
20 ADAMS 77>>
30 JAMES 7=<>
20 .ORD 7?==
10 MILLER 77>2

*e remarcat ca numele coloanelor sunt separate prin spatiu.

E-10 +"-/;/# -$ -0#0!1$* 1"$10 !"#"$%0#0 (/% 1$;0#$ +'/%
-+0!/@/!$'0$
,%,/ $-10'/A BC4CD (,+$ !,2$%1,# SELECT 7
SELECT 4
.ROM EMP5
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ------- ------- ---- --------- --------- ------- ------
73=< SMITH CLERK 7<02 13-JUL->3 >00700 20
74<< ALLEN SALESMAN 7=<> 1?-AUG->3 18=00700 300700 30
7?21 WARD SALESMAN 7=<> 2=-MAR->4 182?0700 ?00700 30
7?== JONES MANAGER 7>3< 31-OCT->3 28<7?700 20
7=?4 MARTIN SALESMAN 7=<> 0?-DEC->3 182?0700 17400700 30
7=<> BLAKE MANAGER 7>3< 11-JUN->4 28>?0700 30
77>2 CLARK MANAGER 7>3< 14-MAY->4 284?0700 10
77>> SCOTT ANALYST 7?== 0?-MAR->4 38000700 20
7>3< KING PRESIDENT 0<-JUL->4 ?8000700 10
7>44 TURNER SALESMAN 7=<> 04-JUN->4 18?00700 700 30
7>7= ADAMS CLERK 77>> 04-JUN->4 18100700 20
7<00 JAMES CLERK 7=<> 23-JUL->4 <?0700 30
7<02 .ORD ANALYST 7?== 0?-DEC->3 38000700 20

Alte ele(e&te i& clauza SELEC"
2ste posibil sa se includa si alte elemente in clauza S22/(.
2&presii aritmetice
Alias%uri de coloane
/oloane concatenate
iterali
(oate aceste optiuni a+uta utilizatorul sa ceara date si sa le manipuleze in functie de
scopurile interogarii > de e&emplu,e&ecutia calculelor,legarea coloanelor impreuna,sau
afisarea sirurilor de litere din te&t.
Ex'resii arit(etice
O e&presie este o combinatie de una sau mai multe valori,operatori si functii care sa
evalueaza la o valoare.
2&presiile aritmetice pot contine nume de coloane ,valori numerice constante si operatori
aritmetici:
O+0'$1"'/ D0-!'/0'0
--------- ---------
E $(,%$'0
- -!$(0'0
4 /%*,#1/'0
F /*+$'1/'0
SELECT ENAME8 SAL4128 COMM
.ROM EMP5
*aca e&presia aritmetica contine mai mult decat un operator, prioritatile sunt .,!,la
inceput,apoi B,% 'de la stanga la dreapta pentru operatorii de aceeasi prioritate).
,n urmatorul e&emplu,inmultirea '#F<.1#) este evaluata prima>apoi valoarea salariului
este adunata la rezultatul multiplicarii'G<<<). Astfel pentru randul lui S4,(H avem :
@<<BG<<<IG@<<.

SELECT ENAME8SAL E 2?0 4 12
.ROM EMP5

Parantezele pot fi utilizate p$ntru specificarea ordinii de e&ecutie a operatorilor ,daca,de
e&emplu ,adunarea e dorita inainte de inmultire:

SELECT ENAME8BSAL E 2?0D 4 12
.ROM EMP5

Aliasuri de coloa&a
/and se afiseaza rezultatul unei interogari,S".Plus in mod normal utilizeaza numele
coloanelor selectate ca titlu.,n multe cazuri acest nume poate fi criptic sau fara inteles.
Puteti schimba un titlu de coloana utilizand un 'A,AS'.
3n alias de coloana da unei coloane un nume de titlu alternativ la iesire.
Specificati aliasul dupa coloana in lista selectata.Prin default, titlurile alias vor fi fortate
la litere mari si nu pot contine blan9uri,numai daca aliasul este inclus intre ghilimele'" ").
Pentru a afisa titlul de coloana A::SA pentru salariul anual insemnand
SA.1#,utilizati un alias de coloana:

SELECT ENAME8SAL412 ANNSAL8COMM
.ROM EMP5

Odata definit ,un alias poate fi utilizat de comenzile S" care sunt tratate in capitolele 1<
si 11.
$ota*
#&tr+o declaratie SQL ,u& alis de coloa&a 'oate ,i utilizat &u(ai i& clauza SELEC"-
O'eratorul de co&cate&are
Operatorul de concatenare 'JJ) permite coloanelor sa fie legate cu alte coloane,e&presiilor
aritmetice sau valorilor constante sa creeze o e&presie de caractere.
/oloanele din cealalta parte a operatorului sunt combinate pentru a obtine o singura
coloana.
Pentru a combina 24P:O si 2:A42 si sa se dea aliasul 24POK22 e&presiei,
introduceti:

SELECT EMPNO||ENAME EMPLOYEE
.ROM EMP5
EMPLOYEE
-------------------------------------------------------
73=<SMITH
74<<ALLEN
7?21WARD
7?==JONES
7=?4MARTIN
7=<>BLAKE
77>2CLARK
77>>SCOTT
7>3<KING
7>44TURNER
7>7=ADAMS
7<00JAMES
7<02.ORD
7<34MILLER

Literali
3n literal este orice caracter ,e&presie ,numar inclus in lista lui S22/( care nu este un
nume de coloana sau un alias de coloana.
3n literal in lista lui S22/( este reprezentat de fiecare rand returnat la iesire.Sirurile de
literali dintr%un te&t cu un format oarecare pot fi incluse in rezultatul interogarii si sunt
tratate ca o coloana lista selectata.
iteralii de tip data calendaristica si caracter pot fi inchisi intre ghilimele
simple'')>literlalii de tip numar nu au nevoie de ghilimele simple'').
3rmatoarea declaratie contine literali selectati prin concatenare si printr%un alias de
coloana:

SELECT EMPNO||C-C||ENAME EMPLOYEE8
CWORKS IN DEPARTMENTC8
DEPTNO
.ROM EMP5
EMPLOYEE CWORKS IN DEPARTMENTC DEPTNO
------------------ -------------------- ------
73=<-SMITH WORKS IN DEPARTMENT 20
74<<-ALLEN WORKS IN DEPARTMENT 30
7?21-WARD WORKS IN DEPARTMENT 30
7?==-JONES WORKS IN DEPARTMENT 20
7=?4-MARTIN WORKS IN DEPARTMENT 30
7=<>-BLAKE WORKS IN DEPARTMENT 30
77>2-CLARK WORKS IN DEPARTMENT 10
77>>-SCOTT WORKS IN DEPARTMENT 20
7>3<-KING WORKS IN DEPARTMENT 10
7>44-TURNER WORKS IN DEPARTMENT 30
7>7=-ADAMS WORKS IN DEPARTMENT 20
7<00-JAMES WORKS IN DEPARTMENT 30
7<02-.ORD WORKS IN DEPARTMENT 20
7<34-MILLER WORKS IN DEPARTMENT 10

"ratarea valorilor &ule
*aca unui rand ii lipseste o valoare pentru o anumita coloana ,despre acea valoare se
spune ca este nula.
O valoare nula este o valoare care este sau incorecta,sau necunoscuta,sau inaplicabila.O
valoare nula nu este la fel ca 'zero'.Lero este un numar.5aloarea nula ocupa un octet in
reprezentarea interna.
5aloarea nula este tratata corect de catre S".
*aca orice valoare de coloana intr%o e&presie este nula atunci rezultatul este nul.,n
urmatoarea declaratie numai Salesman are un rezultat al salariului:

SELECT ENAME8SAL412 E COMM ANNUALGSAL
.ROM EMP5
ENAME ANNUALGSAL
--------- ----------
SMITH
ALLEN 1<?00
WARD 1??00
JONES
MARTIN 1=400
BLAKE
CLARK
SCOTT
KING
TURNER 1>000
ADAMS
JAMES
.ORD
MILLER

*aca dorim sa obtinem un rezultat pentru toti anga+atii,este necesar sa convertim valoarea
nula la un numar . :oi folosim functia :5 pentru a converti o valoare nula la o valoare
nenula.
0olositi functia :5 pentru a converti valoarea nula de la declaratia precedenta la <.

SELECT ENAME8 SAL412ENHLBCOMM80D ANNUALGSAL
.ROM EMP5
ENAME ANNUALGSAL
--------- ----------
SMITH <=00
ALLEN 1<?00
WARD 1??00
JONES 3?700
MARTIN 1=400
BLAKE 34200
CLARK 2<400
SCOTT 3=000
KING =0000
TURNER 1>000
ADAMS 13200
JAMES 11400
.ORD 3=000
MILLER 1?=00

:5 asteapta doua argumente:
1. o e&presie
#. o valoare nenula
*e notat ca puteti folosi functia :5 pentru a converti un numar nul , data calendaristica
sau sir de caractere la un alt numar , data calendaristica sau sir de caractere de acceasi
lungime si de acelasi tip de date asteptate.

NHLBDATECOLUMN8C01-JAN->>CD
NHLBNUMBERCOLUMN8<D
NHLBCHARCOLUMN8CSTRINGCD

Preve&irea selectiei ri&durilor du'licate
*aca nu se indica altfel, S".Plus afiseaza rezultatul unei interogari fara eliminarea
intrarilor duplicate .
Pentru a lista toate numerele de departament din tabela 24P, introduceti:

SELECT DEPTNO
.ROM EMP5
DEPTNO
------
20
30
30
20
30
30
10
20
10
30
20
30
20
10

Clauza D#S"#$C"
Pentru eliminarea valorilor duplicate din rezultat, includeti restrictia *,S(,:/( in
comanda S22/(.
Pentru a elimina valorile duplicate afisate in e&emplul urmator introduceti:

SELECT DISTINCT DEPTNO
.ROM EMP5
DEPTNO
------
10
20
30

/oloane multiple pot fi specificate dupa restrictia *,S(,:/( si restrictia *,S(,:/t
afecteaza toate coloanele selectate.
Pentru a afisa valorile distincte ale lui *2P(:O si =O8,introduceti:

SELECT DISTINCT DEPTNO8JOB
.ROM EMP5
DEPTNO JOB
------ ---------
10 CLERK
10 MANAGER
10 PRESIDENT
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN

Aceasta afiseaza o lista a tuturor combinatiilor diferite de ocupatie si numere de
departamente.
*e notat ca restrictia *,S(,:/( poate sa fie referita numai o singura data si trebuie sa
urmeze imediat dupa cuvantul de comanda S22/(.
Clauza O!DE! .
,n mod normal ordinea rindurilor intoarse in rezultatul unei cereri este nedefinita ./lauza
O-*2- 8K poate fi utilizata pentru a sorta rindurile.
*aca o folosim, clauza O-*2K 8K trebuie sa fie intotdeauna ultima in declaratia
S22/(.
Pentru a sorta dupa 2:A42, introduceti:

SELECT ENAME8JOB8SAL4128DEPTNO
.ROM EMP
ORDER BY ENAME5
ENAME JOB SAL412 DEPTNO
--------- ------- -------- ------
ADAMS CLERK 13200 20
ALLEN SALESMAN 1<200 30
BLAKE MANAGER 34200 30
CLARK MANAGER 2<400 10
.ORD ANALYST 3=000 20
JAMES CLERK 11400 30
JONES MANAGER 3?700 20
KING PRESIDENT =0000 10
MARTIN SALESMAN 1?000 30
MILLER CLERK 1?=00 10
SCOTT ANALYST 3=000 20
SMITH CLERK <=00 20
TURNER SALESMAN 1>000 30
WARD SALESMAN 1?000 30

Ordo&area de de,ault a datelor
Ordinea sortarii de default este ascendenta:
5alorile numerice cele mai mici primele
5alorile de tip date calendaristice cele mai mici primele.
5alorile de tip caracter in ordinea alfabetica.
#&versarea ordi&ii de de,ault
Pentru a inversa aceasta ordine cuvintul de comanda *2S/ este specificat dupa numele
coloanei in clauza O-*2- 8K.
Pentru a inversa ordinea coloanei H,-2*A(2, deci datele cele mai tirzii sa fie afisate
primele,introduceti:

SELECT ENAME8JOB8HIREDATE
.ROM EMP
ORDER BY HIREDATE DESC5
ENAME JOB HIREDATE
--------- --------- ---------
JAMES CLERK 23-JUL->4
KING PRESIDENT 0<-JUL->4
BLAKE MANAGER 11-JUN->4
TURNER SALESMAN 04-JUN->4
ADAMS CLERK 04-JUN->4
CLARK MANAGER 14-MAY->4
WARD SALESMAN 2=-MAR->4
SCOTT ANALYST 0?-MAR->4
MARTIN SALESMAN 0?-DEC->3
.ORD ANALYST 0?-DEC->3
MILLER CLERK 21-NOH->3
JONES MANAGER 31-OCT->3
ALLEN SALESMAN 1?-AUG->3
SMITH CLERK 13-JUN->3

Ordo&area du'a (ai (ulte coloa&e
2ste posibil sa se ordoneze dupa mai multe coloane.imita este numarul de coloane din
tabela.,n clauza O-*2- 8K se specifica coloanele pentru ordonat separate prin
virgula.*aca una sau toate coloanele trebuie sa fie inversate specificati *2S/ dupa
fiecare coloana.
Pentru a ordona dupa doua coloane si afisa in ordinea inversa a salariului, introduceti:

SELECT DEPTNO8JOB8ENAME
.ROM EMP
ORDER BY DEPTNO8SAL DESC5
DEPTNO JOB ENAME
------ ------------ -------
10 PRESIDENT KING
10 MANAGER CLARK
10 CLERK MILLER
20 ANALYST SCOTT
20 ANALYST .ORD
20 MANAGER JONES
20 CLERK ADAMS
20 CLERK SMITH
30 MANAGER BLAKE
30 SALESMAN ALLEN
30 SALESMAN TURNER
30 SALESMAN WARD
30 SALESMAN MARTIN
30 CLERK JAMES

Pentru a ordona dupa o coloana nu este necesar sa o avem S22/(%ata.
O!DE! . si valorile &ule
,n Oracle7,valorile nule sunt afisate ultimele pentru secventele ascendente si sint
raportate primele cind rindurile sunt sortate in ordine descendenta.
Atentie:
/lauza O-*2- 8K este utilizata intr%o interogare cind se doreste sa se afiseze rindurile
intr%o ordine specifica .0ara clauza O-*2- 8K randurile sunt returnate intr%o ordine
convenita de O-A/2 si va trebui sa ne bazam pe el% ordinea determinata fiind
consistenta de la cerere la cerere.*e notat ca ordinea de afisare a rindurilor nu
influenteaza ordinea interna a rindurilor asa cum sunt stocate in tabela.
Clauza /0E!E
/lauza MH2-2 corespunde operatorului '-estrictie' din algebra relationala.
/ontine o conditie pe care rindurile trebuie sa o indeplineasca in ordinea afisarii lor.
/lauza MH2-2 ,daca este folosita , trebuie sa urmeze clauzei 0-O4 :

SELECT !"#"$%0
.ROM 1$;0#$
WHERE $%,*/10 !"%(/1// -,%1 /%1/#%/10

/lauza MH2-2 poate compara valori in coloana ,valori literale,e&presii aritmetice sau
functii.
/lauza MH2-2 asteapta trei elemente:
1. 3n nume de coloana
#. 3n operator de comparatie
G. 3n nume de coloana, constanta sau lista de valori.
Operatorii de comparatie sunt utilizati in clauza MH2-2 si pot fi impartiti in doua
categorii: logici si S".
O'eratorii lo)ici
Acesti operatori verifica urmatoarele conditii:
O+0'$1"' S0*%/@/!$1/0
-------- ------------
I 09$# !,
) *$/ *$'0 (0!/1
)I *$/ *$'0 -$, 09$#
J *$/ */! (0!/1
JI *$/ */! -$, 09$#
Sirurile de caractere si datele cale&daristice i& clauza
/0E!E
/oloanele din O-A/2 pot avea urmatoarele tipuri:caracter,numar sau data
calendaristica.
Sirurile de caractere si datele calendaristice din clauza MH2-2 trebuie sa fie inchise in
ghilimele simple''). Sirurile de caractere trebuie sa se supra% puna cu valoarea coloanei
daca nu, trebuie modificate de o functie. 3tilizati "0unctii pe /aractere" din capitolul 6.
Pentru a afisa numele,numerele,ocupatia si departamentele tuturor functionarilor,
introduceti:

SELECT ENAME8 EMPNO8 JOB8 DEPTNO
.ROM EMP
WHERE JOB I CCLERKC5
ENAME EMPNO JOB DEPTNO
--------- ----- ------- ------
SMITH 73=< CLERK 20
ADAMS 7>7= CLERK 20
JAMES 7<00 CLERK 30
MILLER 7<34 CLERK 10

Pentru a gasi toate numele de departamente cu numerele de departament mai mare ca
#< ,introduceti:

SELECT DNAME8 DEPTNO
.ROM DEPT
WHERE DEPTNO )205
DNAME DEPTNO
---------- ------
SALES 30
OPERATIONS 40
Co('ararea u&ei coloa&e cu alta i& cadrul aceluiasi
ra&d
Puteti compara o coloana cu o alta coloana in acelasi rand,la fel ca si cu o valoare
constanta.
*e e&emplu ,presupunem ca dorim sa obtinem acei anga+ati al caror comision est$ mai
mare decat salariul lor:

SELECT ENAME8 SAL8 COMM
.ROM EMP
WHERE COMM) SAL5
ENAME SAL COMM
------ -------- --------
MARTIN 182?0700 18400700

O'eratori SQL
Sint patru operatori S" care opereaza pe toate tipuril de date:
O+0'$1"'/ S&L
O+0'$1"' S0*%/@/!$1/0
-------- ------------
BETWEEN77AND777 /%1'0 (",$ 2$#"'/B/%!#,-/2D
INB#/-1D !"*+$'$ !, " #/-1$ (0 2$#"'/
LIKE !"*+$'$ !, ,% *"(0# (0 1/+ !$'$!10'
IS NULL 0-1K " 2$#"$'0 %,#$
O'eratorul E"/EE$
-ealizeaza teste pentru valori intre,si inclusiv,o valoare minima si o valoare ma&ima.
Presupunind ca dorim sa vedem anga+atii ai caror salariu este intre 1<<< si #<<<:

SELECT ENAME8SAL
.ROM EMP
WHERE SAL BETWEEN 1000 AND 20005
ENAME SAL
------- ----------
ALLEN 18=00700
WARD 182?0700
MARTIN 182?0700
TURNER 18?00700
ADAMS 18100700
MILLER 18300700

*e notat ca valorile specificate sunt inclusive si ca limita minima trebuie specificata
prima.
O'eratorul #$
(esteaza valorile dintr%o lista specificata.
Presupunem ca dorim sa gasim anga+atii care au unul din cele trei numere de
marca'47-):

SELECT EMPNO8 ENAME8 SAL8 MGR
.ROM EMP
WHERE MGR IN B7<0287?==877>>D5
EMPNO ENAME SAL MGR
----- ----- --------- -----
73=< SMITH >00700 7<02
77>> SCOTT 38000700 7?==
7>7= ADAMS 18100700 77>>
7<02 .ORD 38000700 7?==

*aca, caracterele sau datele calendaristice sunt utilizate,ele trebuie introduse intre
ghilimele'' ').
O'eratorul L#1E
3neori nu se cunosc valorile e&acte pe care le cautam.3tilizand operatorul ,C2 este
posibil sa selectam randurile care se potrivesc cu un model specificat de
caractere.Operatia de petter%matching a caracterelor poate fi asemanata cu o cautare
'Nild%card'.*oi simboli se pot utiliza la construirea sirului de cautare.
S/*;"# R0+'060%1$'0
------ ------------
L "'/!0 -0!20%1$ (0 60'" -$, *$/ *,#10 !$'$!10'0
- ,% -/%9,' !$'$!10' "$'0!$'0
Pentru a lista toti anga+atii al caror nume incepe cu un S,introduceti:

SELECT ENAME
.ROM EMP
WHERE ENAME LIKE CSLC5
ENAME
--------
SMITH
SCOTT
/aracterul 'O' poate fi utilizat pentru cautarea unui anumit numar de carac% tere.
*e e&emplu pentru a lista toti anga+atii care au un nume e&act de patru caractere lungime:

SELECT ENAME
.ROM EMP
WHERE ENAME LIKE CGGGGC5
ENAME
-----
WARD
KING
.ORD
Semnele 'P' si 'O'pot fi utilizate in orice combinatie de caractere.
O'eratorul #S $ULL
Operatorul ,S :3 face teste specifice pentru valorile care sunt :3.

SELECT ENAME8MGR
.ROM EMP
WHERE MGR IS NULL5
ENAME MGR
------ ----
KING
$e)area ex'resiilor
U'*$1"'// "+0'$1"'/ @$! 10-10 (0 %09$1/03
O+0'$1"' D0-!'/0'0
--------- ----------
MI (/@0'/1 (0BHAN8UNIN8PCD
I (/@0'/1 (0BIBMD
J) (/@0'/1 (0B1"$10 "F-D
NOT NUMECOLI (/@0'/1 (0
NOT NUMECOL) *$/ */! -$, 09$#
O+0'$1"'/ S&L
O+0'$1"' D0-!'/0'0
-------- ---------
NOT BETWEEN %, -0 $@#$ /%1'0 (",$ 2$#"'/ ($10
NOT IN %, -0 $@#$ /%1'-" #/-1$ ($1$ (0 2$#"'/
NOT LIKE (/@0'/1 (0 -/',#
IS NOT NULL %, 0-10 " 2$#"$'0 %,#$
Pentru a gasi anga+atii ai caror salariu nu este intr%un interval,introdu% ceti:

SELECT ENAME8SAL
.ROM EMP
WHERE SAL NOT BETWEEN 1000 AND 20005
ENAME SAL
--------- --------
SMITH >00700
JONES 28<7?700
BLAKE 28>?0700
CLARK 284?0700
SCOTT 38000700
KING ?8000700
JAMES <?0700
.ORD 38000700
P0%1', $ $@#$ $!0/ $%9$:$1/ $ !$'"' *0-0'/0 %, /%!0+0 !, M8/%1'"(,!01/3

SELECT ENAME8JOB
.ROM EMP
WHERE JOB NOT LIKE CMLC5
ENAME JOB
-------- --------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
MARTIN SALESMAN
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
.ORD ANALYST
MILLER CLERK

P0%1', $ $@#$ 1"1/ $%9$:$1// !$'0 $, ,% *$%$90'BMGRD8/%1'"(,!01/3
SELECT ENAME8MGR
.ROM EMP
WHERE MGR IS NOT NULL5
ENAME MGR
------- -----
SMITH 7<02
ALLEN 7=<>
WARD 7=<>
JONES 7>3<
MARTIN 7=<>
BLAKE 7>3<
CLARK 7>3<
SCOTT 7?==
TURNER 7=<>
ADAMS 77>>
JAMES 7=<>
.ORD 7?==
MILLER 77>2

$ota*
Daca o valoare $ULL este utilizata i&tr+o co('aratie ,atu&ci o'eratorul de
co('aratie tre%uie sa ,ie #S sau #S $O" $ULL- Daca acesti o'eratori &u su&t uti
lizati si valoarea $ULL este co('arata,atu&ci rezultatul este i&totdeau&a 2ALSE
De exe('lu, COMM34$ULL este i&totdeau&a ,alsa-!ezultatul este ,als deoarece o
valoare $ULL 'oate sa &u ,ie e)ala sau di,erita cu orice alta valoare alta decat
$ULL-
De &otat ca o ast,el de eroare &u este se(&alata,rezultatul ,ii&d i&totdea+ u&a ,als-
#&tero)area datelor cu co&ditii (ulti'le
Operatorii A:* sau O- pot fi utilizati pentru a compune e&presii logice.
Predicatul A:* este adevarat numai daca ambele conditii sunt 'adevarate'> predicatul O-
este adevarat daca cel putin una din conditii este 'adevarata'.
,n urmatoarele doua e&emple,conditiile sunt aceleasi,dar predicatele difera Priviti cum
rezultatul este dramatic modificat.

P0%1', $ 9$-/ 1"1/ @,%!1/"%$'// !$'0 !$-1/9$ /%1'0
1000 -/ 20008/%1'"(,!01/3
SELECT EMPNO8ENAME8JOB8SAL
.ROM EMP
WHERE SAL BETWEEN 1000 AND 2000
AND JOB I CCLERKC5
EMPNO ENAME JOB SAL
---- ------- -------- --------
7>7= ADAMS CLERK 18100700
7<34 MILLER CLERK 18300700
P0%1', $ $@#$ 1"1/ $%9$:$1// !$'0 -,%1 -/ @,%!1/"%$'/ -/F-$,
@,%!1/"%$'/ !$'0 !$-1/9$ /%1'0 1000 -/ 20008/%1'"(,!01/3
SELECT EMPNO8ENAME8JOB8SAL
.ROM EMP
WHERE SAL BETWEEN 1000 AND 2000
OR JOB I CCLERKC5
EMPNO ENAME JOB SAL
----- -------- ------- --------
73=< SMITH CLERK >00700
74<< ALLEN SALESMAN 18=00700
7?21 WARD SALESMAN 182?0700
7=?4 MARTIN SALESMAN 182?0700
7>44 TURNER SALESMAN 18?00700
7>7= ADAMS CLERK 18100700
7<00 JAMES CLERK <?0700
7<34 MILLER CLERK 18300700
Puteti combina A:* sau O- in acceasi e&presie logica. /and A:* sau O- apar in
aceeasi clauza MH2-2, toti operatorii A:* sunt evaluati mai intai si apoi toti operatorii
O-. 5om spune ca operatorii A:* au o precedenta mai mare decat O-.
*eoarece A:* are o precedenta mai mare decat O- urmatoarea declaratie S" intoarce
toti managerii cu salarii peste 1F<<Q si toti vanzatorii.

SELECT EMPNO8ENAME8JOB8SAL8DEPTNO
.ROM EMP
WHERE SAL) 1?00
AND JOB I CMANAGERC
OR JOB I CSALESMANC5
EMPNO ENAME JOB SAL DEPTNO
----- ------- -------- -------- ------
74<< ALLEN SALESMAN 18=00700 30
7?21 WARD SALESMAN 182?0700 30
7?== JONES MANAGER 28<7?700 20
7=?4 MARTIN SALESMAN 182?0700 30
7=<> BLAKE MANAGER 28>?0700 30
77>2 CLARK MANAGER 284?0700 10
7>44 TURNER SALESMAN 18?00700 30
D$!$ ("'/1/ -$ -0#0!1$1/ 1"1/ *$%$90'// -/ 2$%6$1"'//
!, -$#$'// +0-10 1?00O +,101/ /%1'"(,!03
SELECT EMPNO8ENAME8JOB8SAL8DEPTNO
.ROM EMP
WHERE SAL )1?00
AND BJOB I CMANAGERC
OR JOB I CSALESMANCD5
EMPNO ENAME JOB SAL DEPTNO
----- ------ --------- -------- ------
74<< ALLEN SALESMAN 18=00700 30
7?== JONES MANAGER 28<7?700 20
7=<> BLAKE MANAGER 28>?0700 30
77>2 CLARK MANAGER 284?0700 10
Parantezele specifica ordinea in care operatorii vor fi evaluati. ,n al doilea e&emplu
operatorul O- este evaluat inaintea operatorului A:*.
"#PU!# DE DA"E CA!AC"E! S# CO$D#"##
ENAME
BHARCHAR2D
GGGGGGGGGGG
WHERE ENAME I CSCOTTC | |
| SCOTT H H|
| GGG|
| SCOTT|GGGG
| |
| MILLER |
| |
PPPP PP PPP
O'$!#0 nu face ,*+#0'0$ !, ;#$%!,'/ #$ !"*+$'$'0$
!, !"#"$%0#0 HARCHAR2
ENAME
BCHARD
------------
| |
| SCOTT H H|
WHERE ENAME I CSCOTTC | 7777|
| SCOTT|H H|
| |7 |
| MILLER| H|
PPPP PPPP PP
O'$!#0 face ,*+#0'0$ !, ;#$%!,'/ #$ !"*+$'$'0$
!, !"#"$%0#0 CHAR7
"i'urile de date caracter si co&ditii
(ipurile de baza ale datelor stocate intr%o tabela oracle sunt:caracter, valoare numerica
sau data calendaristica.5om discuta toate variantele in detaliu mai tarziu.*e cate ori
rezultatele unei conditii implica date de tip caracter, acestea pot varia in functie de tipul
coloanei>O-A/2 inzestreaza coloanela cu tipul /HA- pentru valori de lungime fi&a si
cu tipul 5A-/HA-# pentru valori de lungime variabila.
Pentru coloanele cu tipul 5A-/HA-# ,Oracle nu umple sirul de comparare si de aceea
va face o potrivire e&acta.,n primul e&emplu,doar un singur rand este intors pentru
conditia:
WHERE ENAME I CSCOTTC
cand un alt rand stocat in coloana 2:A4e are mai multe caractere decat sirul de
comparat.
Pentru coloanele cu tipul /HA- ,oricum,Oracl$ face umplere cand valorile coloanelor
sunt initial stocate,facandu%le pe toate de aceeasi lungime.
Aceeasi conditie va intoarce ambele randuri pentru S/O(( ,indiferent de cate spatii de
sfarsit au fost adaugate cand valorile au fost stocate in tabela.
Oracle umple cu blancuri sirul de comparat in cel deal doilea caz si de aceea spatiile
stocate sunt nesemnificative.
Precede&ta o'eratorilor
(oti operatorii sunt aran+ati intr%o ierarhie ceea ce le determina precedenta .,ntr%o
e&presie operatiile sunt e&ecutate in ordinea precedentei lor de la mare la mica.
/and operatorii au precedenta egala atunci ei se evalueaza de la stanga la dreapta.
1. (oti operatorii de comparatie si S" au precedenta egala: I,R
I,S,T,SI,TI,82(M22:...A:*,,:,,C2,,S :3.
#. :O('pentru a inversa rezultatul unei e&presii logice.*e e&: MH2-2
not'salT#<<<))
G. A:*
6. O-.
*e fiecare data cand sunteti in dubiu despre care dintre doua operatii vor fi e&ecutate mai
intai cand o e&presie este evaluata, sunteti liberi sa utilizati parantezele pentru a clarifica
semnificatia dorita si pentru a va asigura ca S".Plus face ceea ce doriti.
Sa presupunem ca doriti sa gasiti toti managerii, din orice departament,si toti functionarii
din departamentul 1<:

SELECT 4
.ROM EMP
WHERE JOBICMANAGERC OR BJOB I CCLERKC AND DEPTNO I 10D5

Parantezele de deasupra sunt necesare, A:* are o precedenta mai mare decat O- ,dar ele
clarifica semnificatia e&presiei.
SELEC"+Su(ar
3rmatoarele clauze sunt inchise in comanda S22/(:

SELECT QDISTINCTR Q48!"#"$%$ $#/$-R8777R
.ROM 1$;0#$
WHERE !"%(/1/0B//D
ORDER BY Q!"#"$%$80A+'R QASCFDESCR5

S22/(
selecteaza cel putin o coloana
Alias
poate fi folosit pentru coloanele din lista selectata
.
desemneza toate coloanele
*,S(,:/(
poate fi utilizat pentru eliminarea duplicatelor
0-O4 (abela
desemneaza tabela din care provin coloanele
MH2-2
restrictioneaza cererea la randurile care indeplinesc o conditie.Poate contine valori
de coloane,e&presii si literali
A:*!O-
poate fi utilizat intr%o clauza MH2-2 pentru a construi conditii mai comple&e.
A:* are prioritate peste O-.
')
pot fi utilizate pentru a forta prioritatea
O-*2- 8K
intotdeauna apare la sfarsit .Specifica ordinea de sortare.3na sau mai multe
coloane pot fi specificate aici.
AS/
ordinea ascendenta este ordinea de sortar$ ' implicita) si nu trebuie specificat.
*2S/
inverseaza ordinea de sortare de default si trebuie specificat dupa un nume de
coloana.
/lauzele pot fi introduse pe linii separate in buffer si tabelarea este utilizata pentru
claritate si in editare.
Lo)area la SQL*Plus
Aceasta sectiune e&plica cum sa ne logam la S".Plus si liniile de iesire ale tipurilor de
comenzi ce pot rezulta in cadrul sau.
SQL*Plus
S".Plus este un program scris de /orporatia Oracle,ce produce un mediu pentru
comenzile S" ce pot fi tastate direct sau rulate dintr%un fisier de comanda.,n plus
,comenzile S" pot fi derivate.2le sunt folosite pentru:
formatarea rezultatelor
setarea optiunilor
editarea si stocarea declaratiilor S"
Odata ce v%ati logat la sistemul vostru de operare,sunt G moduri pentru a va loga la
S".Plus:
1. S"P3S
" 5eti vedea dupa aceasta un mesa+ ca acesta:
" S".Plus: 5ersion G.1.1 Production on 4on Oct 6 1;;G /op?right 'c)
1;;#,Oracle /orporation,/alifornia,3SA. All rights reserved. 2nter
3sername:
" ,ntroduceti numele vostru de user si apasati -2(3-:: S".Plus va afisa
promptul :"2nter PassNord:". ,ntroduceti parola voastra si apasati din nou
-2(3-:.
" Pentru protectia voastra ,parola nu va apare pe ecran. S".Plus va afisa
promptul sau: S"T
" Aceasta indica linia de comanda .Acolo sunt doua feluri de comenzi si
puteti introduce pe acesta linie de comanda:comenzi S" sau comenzi
S".Plus.
#. S"P3S username
" 5eti fi indemnati sa va dati parola.
G. S"P3S username!passNord
" 5eti fi logati la S".Plus.,n acest caz parolz v a fi afisata.
Alegeti metoda pe care o preferati.
Editarea declaratiilor SQL utiliza&d co(e&zi SQL*Plus
1. /and veti introduce o comanda S",aceasta este stocata intr%o zona de memorie
utilizata de buferul S" si ramane acolo pana ce veti introduce o noua comanda.
#. *aca apasati D-2(3-:E inainte de a completa o comanda,S".Plus va afisa un
numar de linie.
G. (erminatorul pentru declaratiile S" este un '>'.
6. /at timp declaratia S" este in bufer,sunt cateva operatii de editare directe care
pot fi e&ecutate utilizand comenzi S".Plus:
C"*$%($ A;'02/0'0$ ROL
------------------------------------------------------------------
----
APPEND 10A1 A 10A1 $($,9$ C10A1C #$ -@$'-/1,# #/%/0/
!,'0%107
CHANGE CF"#(F%0S -!T/*;$ 20!T/,# 10A1 !, %",# 10A1 /%
#/%/$
!,'0%1$7
CHANGE CF10A1F -10'90 C10A1C-,# (/% #/%/$ !,'0%1$
CLEAR BU..ER CL BU.. -10'90 1"$10 #/%//#0 (/% ;,@0',# S&L7
DEL -10'90 #/%/$ !,'0%1$7
INPUT I /%-0'0$6$ ,% %,*$' %0(0@/%/1 (0 #/%//7
INPUT I 10A1 /%-0'0$6$ " #/%/0 !"%-1/1,/1$ (/%
C10A1C-,#
'0-+0!1/2
LIST L #/-10$6$ 1"$10 #/%//#0 (/% ;,@0',# S&L7
LIST % L% #/-10$6$ " #/%/0 B-+0!/@/!$1$ (0 %D
LIST *8 % L * % #/-10$6$ ,% %,*$' (0 #/%//B(0 #$ * #$
%D7
RUN R $@/-0$6$ -/ 0A0!,1$ !"*$%($ S&L
!,'0%1$ (/%
;,@@0'7
F 0A0!,1$ !"*$%($ S&L !$'0 0-10
!,'0%1$ /%
;,@0'7
Diversitatea co(e&zilor SQL*Plus
/omenzile S" 'precum S22/() sunt mi+loace de acces la date prin 9ernelul
Oracle./omenzile S" sunt utilizate in special pentru controlul mediului, formatarea
rezultatelor interogarilor si controlul fisierelor./omenzile identificate aici sunt
amestecate si trebuie sa le folositi in urmatoarele e&ercitii.
/omenzile S" sunt introduse la promptul S"T pe o linie ,ele nu vor deschide un
buffer.
/omanda B *escriere
SA52 numefis
permite salvarea intr%un fisier a continutului buferului S".
72( numefis
incarca continutul unui fisier salvat in prealabil in buffer.
S(A-( numefis
ruleaza un fisier de comanda salvat in prealabil. 0isierele de comanda sunt tratate
in capitolul 1<.
2* numefis
utilizeaza un editor de default pentru a edita continutul unui fisier salvat.
2U,(
paraseste S".Plus.
Ca'itolul 5 Exercitii+#&troducere i& SQL
Aceste e&ercitii intentioneaza sa dezvaluie toate subiectele neobservate la o lectura
anterioara.*aca aveti timp incercati intrebarea 1G.
W"'U-T"+
1. Selectati toate informatiile din tabela SALGRADE.
GRADE LOSAL HISAL
----- ----- -----
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
? 3001 <<<<
2. Selectati toate informatiile din tabela EMP.
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ----- ------- ---- -------- -------- ------- ------
73=< SMITH CLERK 7<02 13-JUN->3 >00700 20
74<< ALLEN SALESMAN 7=<> 1?-AUG->3 18=00700 300700 30
7?21 WARD SALESMAN 7=<> 2=-MAR->4 182?0700 ?00700 30
7?== JONES MANAGER 7>3< 31-OCT->3 28<7?700 20
7=?4 MARTIN SALESMAN 7=<> 0?-DEC->3 182?0700 18400700 30
7=<> BLAKE MANAGER 7>3< 11-JUL->4 28>?0700 30
77>2 CLARK MANAGER 7>3< 14-MAY->4 284?0700 10
77>> SCOTT ANALYST 7?== 0?-MAR->4 38000700 20
7>3< KING PRESIDENT 0<-JUL->4 ?8000700 10
7>44 TURNER SALESMAN 7=<> 04-JUN->4 18?00700 700 30
7>7= ADAMS CLERK 77>> 04-JUN->4 18100700 20
7<00 JAMES CLERK 7=<> 23-JUL->4 <?0700 30
7<02 .ORD ANALYST 7?== 0?-DEC->3 38000700 20
7<34 MILLER CLERK 77>2 21-NOH->3 18300700 10
14 /%'09/-1'$'/ -0#0!1$107
3. Listati toti angajatii care au salariul intre 1 si 2.
ENAME DEPTNO SAL
----- ------ --------
ALLEN 30 18=00700
WARD 30 182?0700
MARTIN 30 182?0700
TURNER 30 18?00700
ADAMS 20 18100700
MILLER 10 18300700
= /%'09/-1'$'/ -0#0!1$107
!.Listati numerele de de"artament si numele in ordinea numelor
de"artamentelor.
DEPTNO DNAME
------ ----------
10 ACCOUNTING
40 OPERATIONS
20 RESEARCH
30 SALES
#. Afisati toate ti"urile diferite de job$uri.
JOB
---------
ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN
%. Listati detaliile angajatilor din de"artamentele 1 si 2 in
ordinea alfabetica a numelui.
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ----- ----- ---- --------- -------- ---- ------
7>7= ADAMS CLERK 77>> 04-JUN->4 18100700 20
77>2 CLARK MANAGER 7>3< 14-MAY->4 284?0700 10
7<02 .ORD ANALYST 7?== 0?-DEC->3 38000700 20
7?== JONES MANAGER 7>3< 31-OCT->3 28<7?700 20
7>3< KING PRESIDENT 0<-JUL->4 ?8000700 10
7<34 MILLER CLERK 77>2 21-NOH->3 18300700 10
77>> SCOTT ANALYST 7?== 0?-MAR->4 38000700 20
73=< SMITH CLERK 7<02 13-JUN->3 >00700 20
> /%'09/-1'$'/ -0#0!1$107
&.Listati numele si ocu"atiile tuturor functionarilor
in de"artamentul 2.
ENAME JOB
------ -----
SMITH CLERK
ADAMS CLERK
'. Afisati toti angajatii ai caror nume contine () sau LL
in interior.
ENAME
------
SMITH
ALLEN
MILLER
*. Listati urmatoarele detalii "entru toti angajatii care
au un manager.
ENAME JOB SAY
------ -------- --------
SMITH CLERK >00700
ALLEN SALESMAN 18=00700
WARD SALESMAN 182?0700
JONES MANAGER 28<7?700
MARTIN SALESMAN 182?0700
BLAKE MANAGER 28>?0700
CLARK MANAGER 284?0700
SCOTT ANALYST 38000700
TURNER SALESMAN 18?00700
ADAMS CLERK 18100700
JAMES CLERK <?0700
.ORD ANALYST 38000700
MILLER CLERK 18300700
13 /%'09/-1'$'/ -0#0!1$107
1. Afisea+a numele si totalul remuneratiei "entru toti angajatii.
ENAME REMUNERATION
------- ------------
SMITH <=00
ALLEN 1<?00
WARD 1??00
JONES 3?700
MARTIN 1=400
BLAKE 34200
CLARK 2<400
SCOTT 3=000
KING =0000
TURNER 1>000
ADAMS 13200
JAMES 11400
.ORD 3=000
MILLER 1?=00
14 /%'09/-1$'/ -0#0!1$107
11. Afisea+a toti salariatii care au fost angajati in anul 1*'3.
ENAME DEPTNO HIREDATE
------- ------ ---------
SMITH 20 13-JUN->3
ALLEN 30 1?-AUG->3
JONES 20 31-OCT->3
MARTIN 30 0?-DEC->3
.ORD 20 0?-DEC->3
MILLER 10 21-NOH->30
= /%'09/-1'$'/ -0#0!1$107
12. Afisati numele,salariul anual si comisionul "entru toti
-an+atorii
ai caror salariu lunar este mai mare decat comisionul lor..esirea
-a fi
ordonata du"a salariu , cele m ai mari "rimele. Daca doi sau mai
multi
angajati au acelasi salariu trebuie sortati du"a nume in odinea
celor
mai mari salarii.
ENAME ANNUALGSAL COMM
------ ---------- --------
ALLEN 1<200 300700
TURNER 1>000 700
WARD 1?000 ?00700
I%!0'!$1/-2$ $+1/1,(/%/#0 !, $!0-1$7
13. Selectati informatiile du"a cum sunt selectate.
C/%08!$%( -/ !,*
--------------------------------------------------------------------
SMITH HAS HELD THE POSITION O. CLERK IN DEPT 20 SINCE 13-JUN->3
ALLEN HAS HELD THE POSITION O. SALESMAN IN DEPT 30 SINCE 1?-AUG->3
WARD HAS HELD THE POSITION O. SALESMAN IN DEPT 30 SINCE 2=-MAR->4
JONES HAS HELD THE POSITION O. MANAGER IN DEPT 20 SINCE 31-OCT->3
MARTIN HAS HELD THE POSITION O. SALESMAN IN DEPT 30 SINCE 0?-DEC->3
BLAKE HAS HELD THE POSITION O. MANAGER IN DEPT 30 SINCE 11-JUN->4
CLARK HAS HELD THE POSITION O. MANAGER IN DEPT 10 SINCE 14-MAY->4
SCOTT HAS HELD THE POSITION O. ANALYST IN DEPT 20 SINCE 0?-MAR->4
KING HAS HELD THE POSITION O. PRESIDENT IN DEPT 10 SINCE 0<-JUL->4
TURNER HAS HELD THE POSITION O. SALESMAN IN DEPT 30 SINCE 04-JUN->4
ADAMS HAS HELD THE POSITION O. CLERK IN DEPT 20 SINCE 04-JUN->4
JAMES HAS HELD THE POSITION O. CLERK IN DEPT 30 SINCE 23-JUL->4
.ORD HAS HELD THE POSITION O. ANALYST IN DEPT 20 SINCE 0?-DEC->3
MILLER HAS HELD THE POSITION O. CLERK IN DEPT 10 SINCE 21-NOH->3
14 /%'09/-1'$'/ -0#0!1$107
Ca'itolul 5 + !ezolvari

17 SELECT 4
.ROM SALGRADE5
27 SELECT 4
.ROM EMP5
37 SELECT ENAME8 DEPTNO8 SAL
.ROM EMP
WHERE SA# BETWEEN 1000 AND 20005
47 SELECT DEPTNO8 DNAME
.ROM DEPT
ORDER BY DNAME5
?7 SELECT DISTINCT JOB
.ROM EMP5
=7 SELECT 4
.ROM EMP
WHERE DEPTNO IN B10820D
ORDER BY ENAME5
77 SELECT ENAME8JOB
.ROM EMP
WHERE JOB I CCLERKC
AND DEPTNO I 205
>7 SELECT ENAME
.ROM EMP
WHERE ENAME LIKE CLTHLC
OR ENAME LIKE CLLLLC5
<7 SELECT ENAME8 JOB8 SAL
.ROM EMP
WHERE MGR IS NOT NULL5
107 SELECT ENAME8 SAL412ENHLBCOMM80D REMUNERATION
.ROM EMP5
117 SELECT ENAME8 DEPTNO8 HIREDATE
.ROM EMP
WHERE HIREDATE LIKE CL>3C5
127 SELECT ENAME8 SAL412 ANNUAL SAL8 COMM
.ROM EMP
WHERE SAL )COMM
AND JOB I CSALESMANC
ORDER BY SAL DESC8 ENAME5
137 SELECT ENAME||
C HAS HELD THE POSITION O. C||
JOB||
C IN DEPT C||
DEPTNO||
C SINCE C||
HIREDATE VWT"8 ST$1 $%( ST0%V
.ROM EMP5

C A P I T O L U L 3
!ularea cererilor sta&dard cu varia%ile su%stituite-
,n acest capitol sunt descrise variabilele substituite.5ariabilele substituite sunt folosite in
declaratiile S" si permite utilizarea valorilor specificate la rulare.
6aria%ile i& SQL *Plus
,n plus fata de variabilele pe care le vom vedea in limba+ul P!S", S".Plus este
inzestrat cu doua tipuri de variabile ale sale:
5ariabile legate
3tilizate pentru stocarea valorilor individuale ce pot fi asignate si citite in timpul
rularii'vor fi discutate mai tarziu in acest curs).
5ariabile substituite
3tilizate pentru stocarea partilor de te&t de comanda ,care sunt "editate" in
comenzi inainte de e&ecutia lor.
6aria%ile su%stituite cu u& si&)ur a('ersa&d-
Puteti utiliza 'variabile substituite' intr%un fisier de comanda sau intr%o declaratie S"
pentru a reprezenta valori ce vor fi aflate la e&ecutie.
O variabila poate fi vazuta ca un container in care valoarea este stocata temporar.
O variabila substituita este prefi&ata de un singur ampersand'V) si o valoare care ii este
asignata.
3rmatoarea declaratie obliga utilizatorul sa dea un numar de departament la e&ecutie:
SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE DEPTNO = &DEPARTAMENT_NUMBER;
Enter value for department_number: 10
EMPNO ENAME SAL
----- --------- -----------
7782 CLARK 2,450.00
7839 KING 5,000.00
7934 MILLER 1,300.00
2&emplul anterior utilizeaza conditia MH2-2 *2P(:OI1<.
/u un singur ampersand utilizatorul este obligat sa dea o valoare de fiecare data cand
comanda este e&ecutata,deoarece variabila nu este definita si de fiacare data valoarea
introdusa nu este salvata .
O valoare de tip caracter sau data are nevoie sa fie inchisa in ghilimele simple cand sunt
introduse la cerere.Pentru a evita ghilimelele simple ce tre% buie sa fie introduse la
e&ecutie ,puteti pune variabilele in ghilimele simple.
,n urmatoarea declaratie ,variabila este pusa intre ghilimele simple, asa ca ghilimele nu
mai sunt necesare la introducerea valorii respective:
SELECT ENAME,DEPTNO,SAL*12
FROM EMP
WHERE JOB = ' <JOB_TITLE';
Enter value for job_title:MANAGER
ENAME DEPTNO SAL*12
----- ------ --------
JONES 20 35700
BLAKE 30 34200
CLARK 10 29400
/at timp variabila este variabila 'nedefinita' ,valoarea va fi ceruta de fiecare data cand
declaratia este e&ecutata.
2ste posibil sa fie cerut numele unei coloane sau chiar numele unei tabele in timpul
e&ecutiei.
,n urmatorul e&emplu vi se cere o e&presie aritmetica:
SELECT DEPTNO, <ARITHMETIC_EXPRESION
FROM EMP;
Enter value for arithmetic_expression:sal/12
DEPTNO SAL/12
------ -------
20 66.6667
30 133.333
30 104.167
20 247.917
30 104.167
30 237.5
10 204.167
20 250
10 416.667
30 125
20 91.6667
30 79.1667
20 250
10 108.333
6aria%ile su%stituite cu du%lu a('ersa&d-
*aca variabila este prefi&ata de dublu ampersand'VV),S".Plus va cere valoarea pentru
variabila doar o singura data .S".Plus stocheaza prima valoare furnizata si o foloseste
din nou de fiecare data cand declaratia S" este rulata
SELECT ENAME,DEPTNO,JOB
FROM EMP
WHERE DEPTNO = &&DEPTNO_PLEASE;
Enter value for deptno_please: 10
ENAME DEPTNO JOB
----- ------ --------
CLARK 10 MANAGER
KING 10 PRESIDENT
MILLER 10 CLERK
Puteti folosi comanda S".Plus *20,:2 pentru a determina daca variabila este de+a
definita.*aca variabila este de+a definita se afiseaza valoarea asignata.
SQL> DEFINE
DEFINE DEPTNO_PLEASE = "10" (CHAR)
/omanda *20,:2 este de asemenea folosita pentru a crea o variabila utilizator.
Su%stitutia datelor ca o co(a&da text
/and informatia dintr%o comanda substituita este introdusa intr%o co% manda inaintea
e&ecutiei sale,variabila poate fi folosita pentru a inzestra orice parte a structurii comenzii
e&ceptand numele insusi al comenzii.*e e&emplu:
SELECT * FROM SALGRADE
WHERE &CONDITION
Enter value for CONDITION: losal>2000
5ariabila /O:*,(,O: ,de mai sus,trece intreaga conditie a clauzei MH2-2 intr%o
comanda.4ai departe intregul cod al comenzii'incepand cu cuvantul S22/() poate fi
trecut intr%o variabila.
SELECT &THE_REST;
Co(a&da DE2#$E
O valoare poate fi asignata unei variabile folosind comanda *20D,:2E a lui
S".P3S.5aloarea definita trebuie referita intr%o construc% tie S22/( sau un fisier
de comenzi , prefi&ind numele variabilei cu V. 5ariabilele pot fi golite folosind
3:*20D,:2E.
,n urmatorul e&emplu , o variabila a fost definita folosind o e&presie aritmetica ce
calculeaza remuneratia. ,n urmatoarele constructii, variabila -24 e referita de un numar
de ori. 5ariabila e apoi golita fo% losind 3:*20,:2.
SQL> DEFINE REM ='SAL*12+NVL(COMM,0)'
SQL>SELECT ENAME, JOB, <REM
SQL>FROM EMP
SQL>ORDER BY <REM;
SQL >undefine REM
ENAME JOB SAL*12+NUL(COMM,0)
------------------------------------------------
SMITH CLERK 9600
JAMES CLERK 11400
ADAMS CLERK 13200
WARD SALESMAN 15500
MILLER CLERK 15600
MARTIN SALESMAN 16400
TURNER SALESMAN 18000
ALLEN SALESMAN 19500
CLARK MANAGER 29400
BLAKE MANAGER 34200
JONES MANAGER 35700
SCOTT ANALYST 36000
FORD ANALYST 36000
KING PRESIDENT 60000
'' de la e&presii sunt optionale , daca e&presia nu contine spatii. 7hilimelele pot fi
deasemenea folosite si sunt optionale dar folositoare daca e&presia contine blancuri sau
apostrofi.
Pornirea unui fisier cu comenzi care contine substitutii de variabile
Presupunind ca doriti o serie de rapoarte care sa listeze anga+atii cu functii diferite % de
e&emplu , una pentru SA2S42: , una pentru /2-CS, una pentru 4A:A72-S si tot
asa./unoasteti cum sa folositi substitutia de variabile pentru a obtine aceste rapoarte
dintr%o singura constructie S22/(.
/u toate acestea , e&ista o tehnica alternativa pe care s%o folositi si anume sa scrieti
constructia S22/( intr%un fisier si apoi folosind comanda S(A-( sa%l e&ecutati.
Aceasta tehnica impune folosirea unor substitutii speciale de variabile. 2&ista ; asemenea
variabile si ele au intregii de la 1 la ; ca nume. Pentru folosirea acestor variabile , puneti
un 'V' urmat de un intreg '1%;) in comanda S".Aceste variabile pot fi folosite de ori de
cite ori doriti si in orice ordine .
*e fiecare data cind comanda e rulata, fiecare 'V1' din comanda e inlocuit de primul
parametru dupa S(A-( fisier, fiecare 'V#' e inlo% cuit de al doilea parametru s.a.m.d.
Pentru a crea un fisier de comenzi care ia un parametru specificind functia care trebuie
afisata , introduceti:
SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE JOB = ' <1' ;
SQL>SAVE JOB1
SQL*PLUS intoarce mesajul:
Created file job1
Apoi rulati comanda cu parametrul 'CLERK'.
SQL*PLUS inlocuieste variabila cu valoarea parametrului.
SQL> START JOB1 CLERK
EMPNO ENAME SAL
----- ----- ---
7369 SMITH 800
7876 ADAMS 1100
7900 JAMES 950
Observati ca nu se pot folosi variabile cind e&ecutati o comanda cu -3:. (rebuie sa
introduceti comanda in fisier si sa o rulati cu S(A-( comanda.
Co(a&da ACCEP"
/omanda A//2P( permite unei variabile sa fie create si unei valori , care e introdusa sa
fie memorata in ea. Aceasta variabila poate fi apoi referita in constructia S". A//2P(
este folosita deseori intr%un fisier de comenzi . Sunt citeva avanta+e rezultate din folosirea
lui A//2P( pentru definirea substitutiei de variabile:
(ipurile de date pot fi verificate
Prompturile pot fi mai e&plicative
5alorile de raspuns pot fi ascunse
Sinta&a comenzii este:
ACC[EPT] variabila [ NUMBER/CHAR] [PROMPT/NOPROMPT 'text']
[HIDE]
Sinta&a B *escrierea
:3482-!/HA-
determina tipul variabilei.*aca valoarea introdusa este nevalida , va fi afisat un
mesa+.
P-O4P( 'te&t'
afiseaza daca te&t e specificat
:OP-O4P(
face A//2P( sa sara o linie asteptind intrarea
H,*2
suprima raspunsul utilizatorului. folositor pentru parole
2&emple
SQL> ACCEPT SALARY NUMBER PROMPT 'Salary figure :'
Salary figure : 30000
SQL>ACCEPT PASSWORD CHAR PROMPT 'Password :' HIDE
Password :
SQL>ACCEPT COMM NUMBER NOPROMPT
500
SQL>DEFINE
DEFINE SALARY =30000(NUMBER)
DEFINE PASSWORD ="FREEBIES(CHAR)
DEFINE COMM =500(NUMBER)
!ezu(at
/ind S".Plus intilneste Vvariabila:
1. *aca Vvariabila este de+a definita, definitia de+a e&istenta e folosita.
#. *aca V variabila nu e definita:
" 3tilizatorul e gata pentru definitie
" *efinitia furnizata de utilizator e apoi folosita
" *efinitia furnizata de utilizator e apoi pierduta
/ind S" Plus intilneste VVvariabila :
a fel ca pasii 1 si # de deasupra cu e&ceptia faptului ca valoarea variabilei e salvata.
Observatie: V1 parametru e tratat ca VV.
Pentru a afla daca o variabila e de+a definita, folositi comanda
*20D,:2E:
*20 *2PA-(A42:(
daca e definit, da definitia lui *2PA-(A42:( daca nu specifica 'nedefinit'
Pentru a defini o variabila , se poate folosi deasemenea comanda
*20D,:2E.
*20 /O44 I
7hilimelele nu sunt necesare , dar a+uta daca ":5 '/O44,<)" e&presia contine
blancuri imbricate sau apostrofi.
/it timp ramin variabilele definiteW Pina cind le 3:*20DineE sau le redefinim sau pina
iesim din S".P3S.
Alte # modalitati de definire a unei variabile:
SQL>ACCEPT variabila [tip] [PROMPT text][HIDE]
SQL>COL[UMN] nume coloana /alias NEW_VALUE variabila (tratata in
capitolul 11)
Ca'-7 Exercitii +!uli&d cereri cu 'ara(etrii-
Acest e&ercitiu va ofera oportunitatea sa creati fisiere care pot fi rulate interactiv , si care
folosesc substitutii de variabile pentru crearea unor criterii de selectie.
"EME
1. Generati o constructie "rin care sa afisati angajatii cu date
de
angajare intre 2 date date. Rulati de 2 ori cererea.
Modificati cererea "entru a folosi //-ariabila .Rulati$o de
cite-a
ori. 0bser-ati diferenta.
2. 0btineti o cerere care sa acce"te o functie data. Pentru
testare e1ecutati cererea de cite-a ori.
ENAME JOB SAL MGR DEPTINO
----------------------------------------------
SCOTT ANALYST 38000700 7?== 20
.ORD ANALYST 38000700 7?== 20
3. Definiti o -ariabila re"re+entind e1"resia folosita "entru
calculul remuneratiei anuale a angajatilor.2olositi -ariabile
intr$o constructie care gaseste toti angajatii care cistiga
3. 3 "e an sau mai mult.
ENAME SAL412ENULBCOMM80D
----------------------------------
JONES 3?700
BLAKE 34200
SCOTT 3=000
KING =0000
.ORD 3=000
4a".3 Solutii
17 SELECT ENAME8HIREDATE
.ROM EMP
WHERE HIREDATE
BETWEENCW.IRSTGDATECANDCWLASTGDATEC5
27 SELECT ENAME8JOB8SAL8MGR8DEPTNO
.ROM EMP
WHERE JOB ICWJOBC5
37 SELECT ENAME8WREM
.ROM EMP
WHERE WREM )300005
C A P I T O L U L 4
2U$C"##
,n acest capitol, sunt introduse functiile.0unctiile fac ca cererile de baza sa devina mai
puternice si sint folosite pentru manipularea valorilor.Acest capitol acopera functiile
numerice si pe caracter. 0unctiile de conversie si care opereaza pe tipuri de date sunt
tratate in cap.F. ,n final functiile de grup sunt tratate in cap.A.
#$"!ODUCE!E
0unctiile sint folosite pentru manipularea datelor.2le accepta unul sau mai multe
argumente si intorc o valoare.3n argument este o constanta , variabila sau o referire de
coloana.0ormatul pentru functie este urmatorul: functionOname'arg1,arg#,...)
0unctiile pot fi folosite pentru:
a calcula
a modifica datele individuale
a manipula iesirea pentru grupuri de siruri
a schimba formatul datelor pentru afisare
a converti tipurile de date
2&ista diferite tipuri de functii:
/HA-A/(2-
:3482-
*A(2
/O:52-S,O:
03:/(,O: (HA( A//2P( A:K *A(A (KP2 AS ,:P3(
7-O3P
3nele functii opereaza pe un singur sir , altele pe grupuri de siruri.
/ele mai folosite functii sunt prezentate in acest manual. Puteti recurge la S".Plus
-202-2:/2 73,*2 pentru lista completa a functiilor.
0unctiile care se aplica unui singur sir vor fi discutate in capitolul prezent si in
cap.F.0unctiile de grup vor fi tratate in cap.A.
0unctii care se aplica unui singur sir.
actioneaza asupra fiecarui sir returnat din cerere
intoarce un rezultat pentru fiecare sir
asteapta unul sau mai multe argumente
pot fi imbricate
pot fi folosite acolo unde se folosesc variabile , coloane sau e&presii , de
e&emplu , in constructiile :S22/(,MH2-2,O-*2- 8K.
2&plicatia notatiei:
:otatie B Semnificatie:
col
un nume de coloana dintr%o baza de date
value'valoare)
orice valoare literale'caracter!data!numar)
n
reprezinta un sir
'string'
reprezinta caracterul string
chars
reprezinta un numar de caractere specificate
date
reprezinta o coloana date sau o valoare date
2u&ctii &u(erice si 'e caracter
Acestea accepta la intrare un caracter si poate returna si caracter si valoare numerica.
3rmatoarele functii prezentate sunt:
OM2-'col!value)
forteaza caracterele alfa care sunt scrise cu litere mari sau mi&te in caractere
scrise cu litere mici.
Pentru a afisa cu litere mici numele departamentului ca si sirul ' S" /O3-S2'
introduceti:
SELECT LOWER (DNAME),LOWER('SQL course')
FROM DEPT;
LOWER(DNAME) LOWER(SQL COURSE)
------------------------------------
research sql course
sales sql course
operations sql course
accounting sql course


3PP2-'col!value)
forteaza caracterele alfa care sunt scrise cu litere mici , sau o combinatie de litere
mici si mari in caractere scrise cu litere mari.
,n urmatorul e&emplu , functia 3PP2- e folosita pentru a forta intrarea utilizatorului la
litere mari.
SELECT ENAME
FROM EMP
WHERE ENAME =UPPER('&ENAME');
Enter value for ename :smith
ENAME
-----
SMITH
,:,(/AP'col!value)
forteaza prima litera a fiecarui cuvint in litera mare
Pentru afisarea numelor departamentelor si locatiile , introduceti:
SELECT INITCAP(DNAME), INITCAP(LOC)
FROM DEPT;
INITCAP(DNAME) INITCAP(LOC)
----------------------------
Accounting New York
Research Dallas
Sales Chicago
Operations Boston
/O:/A('char 1,char#)
intoarce char1 concatenat cu char# 'Alternativa a operatorului JJ)
SELECT CONCAT (ename,job) "JOB"
FROM EMP
WHERE EMPNO =7900;
JOB
-----------
JAMESCLERK
0unctiile PA* si -PA* aduc sirurile de caractere la o lungime specificata.
PA*'col!value,n,'string')
adauga la coloana sau la valoarea literala spre stinga pina la lungimea totala n.
Primele spatii sunt umplute cu 'string'. *aca 'string' e omis atunci sunt umplute cu
blancuri.
SELECT LPAD(DNAME,20,'*'),LPAD(DNAME,20),LPAD(DEPTNO,20,'.')
FROM DEPT;
LPAD(DNAME,20,'*') LPAD(DNAME,20) LPAD(DEPTNO,20,'.')
------------------------------------------------------------
************RESEARCH RESEARCH.....................20
***************SALES SALES.....................30
**********OPERATIONS OPERATIONS.....................40
**********ACCOUNTING ACCOUNTING.....................10
Observati ca a doua coloana e completata in stinga cu spatii, implicit , si ca a treia
coloana este de tipul numar.
-PA*'col!value,n,'string')
adauga la coloana sau la valoarea literala spre dreapta pina la lungimea totala n.
3ltimele pozitii sunt umplute cu 'string' sau daca acesta e omis cu blancuri.
SELECT RPAD(DNAME,20,'*'),RPAD(DNAME,20),RPAD(DEPTNO,20,'.')
FROM DEPT;
RPAD (DNAME,20,'*') RPAD(DNAME,20) RPAD(DEPTNO,20,'.')
------------------------------------------------------------
RESEARCH************ RESEARCH 20..................
SALES*************** SALES 30..................
OPERATIONS********** OPERATIONS 40..................
ACCOUNTING********** ACCOUNTING 10..................
,n acest caz a doua coloana are in dreapta blancuri puse implicit.
3rmatoarele functii presupun ca caracterele din string sunt numerotate de la stinga la
dreapta , incepind cu 1.
S38S(-'col!value,pos,n)
intoarce un string de n caractere lungime dintr%o coloana sau valoare literala ,
incepind de la pozitia pos. *aca n e omis, e e&tras sirul din pozitia pos la sfirsit.
3rmatorul e&emplu afiseaza urmatoarele "substringuri":
6 caractere din literalul 'O-A/2' incepind de la al doilea caracter
continutul lui *:A42 incepind cu al doilea caracter
F caractere din *:A42 incepind cu al treilea caracter
SELECT SUBSTR('ORACLE',2,4),SUBSTR(DNAME,2),
SUBSTR(DNAME,3,5)
FROM DEPT;
SUBSTR('ORACLE',2,4) SUBSTR(DNAME,2) SUBSTR(DNAME,3,5)
---------------------------------------------------------
RACL ESEARCH SEARC
RACL ALES LES
RACL PERATIONS ERATI
RACL CCOUNTING COUNT
Observati ca valorile sint aliniate la stinga.Aceasta deoarece S".Plus intotdeauna
afiseaza de la stinga, implicit.
,:S(-'col!value,'string')
gaseste pozitia caracterului in care apare prima data 'string'.
,:S(-'col!value,'string',pos,n)
gaseste pozitia caracterului pentru a n%a aparitie a lui string in coloana sau
valoarea literala incepind din pozitia pos.
SELECT DNAME,INSTR(DNAME,'A'),
INSTR(DNAME,'ES'),INSTR(DNAME,'C',1,2)
FROM DEPT;
DNAME INSTR(DNAME,'A') INSTR(DNAME,'ES')
INSTR(DNAME,'C',1,2)
----------------------------------------------------------------
-----
ACCOUNTING 1 0
3
RESEARCH 5 2
0
SALES 2 4
0
OPERATIONS 5 0
0
O folosire obisnuita a lui ,:S(- este de a determina daca inceputul utilizatorului contine
un caracter particular sau mai multe. ,n e&emplul anterior , de e&emplu, e&presia
,:S(-'*:A42,'2S') e < pentru A//O3:(,:7 deoarece acesta nu contine sirul dat.
(-,4 si -(-,4 sterg caracterele specificate din sir.
(-,4 'col!value,'char!s')
sterge de la stinga prima aparitie a caracterului specificat'sau o combinatie a
caracterelor specificate). *aca nu e specificat nici un caracter sterge toate
blancurile din stinga.
SELECT DNAME,LTRIM(DNAME,'A'),LTRIM(DNAME,'AS'),
LTRIM(DNAME,'ASOP')
FROM DEPT;
DNAME LTRIM(DNAME,'A') LTRIM(DNAME,'AS')
LTRIM(DNAME,'ASOP')
----------------------------------------------------------------
---
RESEARCH RESEARCH RESEARCH RESEARCH
SALES SALES LES LES
OPERATIONS OPERATIONS OPERATIONS ERATIONS
ACCOUNTING CCOUNTING CCOUNTING CCOUTING
-(-,4 'col!value,'char!s')
sterge de la dreapta, aparitiile lui char 'sau combinatie de caractere spe%
cificate) .*aca nu e specificat 'char!s' atunci sterge blancurile.
SELECT DNAME, RTRIM(DNAME,'G'),RTRIM(DNAME,'GHS')
RTRIM(DNAME,'N')
FROM DEPT;
DNAME RTRIM(DNAME,'G') RTRIM(DNAME,'GHS') RTRIM(DNAME,'N')
---------------------------------------------------------------
RESEARCH RESEARCH RESEARC RESEARCH
SALES SALES SALE SALES
OPERATIONS OPERATIONS OPERATION OPERATIONS
ACCOUNTING ACCOUNTIN ACCOUNTIN ACCOUNTING
-(-,4 poate fi in mod particular folositor in a sterge blancurile de la sfirsit la
coloane.*e e&emplu , presupunind ca in transferul datelor la tabela 'emp' blancurile au
fost adaugate neintentionat dupa fiecare 2:A42.3rmatoarea comanda va sterge toate
blancurile finale:
UPDATE EMP
SET ENAME =RTRIM(ENAME);
Observatie: comanda UPDATE e tratata complet mai tirziu.
SO3:*2U'col!value)
intoarce un sir de caractere reprezentind pronuntia'sunetul) cuvintului pentru
fiecare coloana sau valoare literala.Aceasta functie intoarce o reprezentare
fonetica a fiecarui cuvint si ne permite sa comparam cuvinte care sunt scrise
diferit, dar se pronunta'suna) la fel.
SELECT ENAME, SOUNDEX(ENAME)
FROM EMP
WHERE SOUNDEX(ENAME) = SOUNDEX('FRED');
ENAME SOUNDEX(ENAME)
-----------------------------
FORD F630
2:7(H'col!value)
intoarce numarul de caractere'sau digiti) din coloana sau din valoarea literala.
SELECT LENGTH('SQL COURSE'),LENGTH(DEPTNO),LENGTH(DNAME)
FROM DEPT;
LENGTH('SQLCOURSE') LENGTH(DEPTNO) LENGTH(DNAME)
-------------------------------------------------
10 2 8
10 2 5
10 2 10
10 2 10
Observati ca 2:7(H la fel ca si functia ,:S(- intoarce o valoare numerica.
0unctiile (-A:SA(2 si -2PA/2 sunt folosite pentru substitutia caracterelor.
(-A:SA(2'col!value,from,to) translateaza la iesire caracterele 'from' la cele 'to'.4ai
mult de un caracter , se poate potrivi. (oate operatiile lui 'from' sunt inlocuite de
corespondentul din 'to'. *aca caracterul corespunzator din 'to'nu e rezervat , caracterul din
'from'e sters'vezi functiile imbricate).
SELECT ,ENAME,TRANSLATE(ENAME,'C','P'),JOB
TRANSLATE(JOB,'AR','IT')
FROM EMP
WHERE DEPTNO=10;
ENAME TRANSLATE(ENAME,'C','P') JOB TRANSLATE(JOB,'AR','IT')
-----------------------------------------------------------------
CLARK PLARK MANAGER MINIGET
KING KING PRESIDENT PTESIDENT
MILLER MILLER CLERK CLETK
-2PA/2'col!value,string,replacementOstring)
intoarce col!value cu orice aparitie a 'string%ului', inlocuita cu repla%
cementOstring.*aca 'replacementOstring' e omis, toate operatiile lui 'string'sunt
sterse.*aca sunt emise si 'string' si 'replacementOstring'atunci se semnaleaza
eroare.
SELECT JOB , REPLACE(JOB,'SALESMAN','SALESPERSON'),
ENAME ,REPLACE(ENAME,'CO','PX')
FROM EMP;
JOB REPLACE(JOB,'SALESMAN','SALESPERSON') ENAME
REPLACE(ENAME,'CO','PX')
-------------------------------------------------------------------AN
ALYST
ANALYST SCOTT SPXTT
SALESMAN SALESPERSON TURNER TURNER
SALESMAN SALESPERSON ALLEN ALLEN
MANAGER MANAGER CLARK CLARK
0unctia -2PA/2 suplimenteaza functionalitatea furnizata de functia
(-A:SA(2.(-A:SA(2 furnizeaza caractere singulare , unul cite unul , pentru
substitutie.-2PA/2 va permite sa substituiti un sir cu altul ca si sa stergeti un sir 'daca
nu specificati 'replacement Ostring'). Observati ca 'string' si 'replacementOstring' pot fi de
orice lungime. -2PA/2 poate sa faca si conversia caracter la caracter -2PA/2''/',
,P).
2U$C"## #M!#CA"E
0unctiile singulare aplicate liniilor'sirurilor) pot fi imbricate la orice adincime.*aca
functiile sunt imbricate, ele sunt evaluate din interior spre e&terior.
Sa presupunem ca vreti sa aflati nr. de ori in care un caracter apare intr%un sir./um veti
procedaW Puteti imbrica functiile 2:7H( si (-A:SA(2 pentru a obtine rezultatul
dorit. 3rmatorul e&emplu va permite sa numarati de cite ori apare S intr%un sir.
SELECT DNAME,LENGTH(DNAME),LENGTH(DNAME)
LENGTH(TRANSLATE(DNAME,'AS,'A'))
FROM DEPT;
DNAME LENGTH(DNAME)LENGTH(DNAME)-
LENGTH(TRANSLATE(DNAME,'AS','A'))
----------------------------------------------------------------------
----
RESEARCH 8
1
SALES 5
2
OPERATIONS 10
1
ACCOUNTING 10
0
Pasii pentru a obtine rezultatul sunt:
1. 0olositi 2:7(H pentru a identifica nr. de caractere din sir.
#. Apoi folositi (-A:SA(2 pentru a lua fiecare aparitie a lui S din sir.
3.
4.
5. SELECT TRANSLATE(DNAME,'AS','A')
6. FROM DEPT;
7.
8. TRANSLATE(DNAME,'AS',A')
9. ------------------------
10. REEARCH
11. ALE
12. OPERATION
13. ACCOUNTING
147
1F. Observati ca A e inlocuit cu A si S nu are un caracter corespunzator cu care sa fie
inlocuit . S e inlocuit cu nimic % e sters din sir. A serveste de plasare W
1A. Acum, scadeti din lungimea initiala a sirului pe cea din care am scos toate
aparitiile lui S. 2:7(H'*:A42)%2:7(H'(-A:SA(2'*:A42,'AS','A'))
17. -ezultatul e o valoare reprezentind nr. de aparitii ale lui S in sir.
O tehnica alternativa este de a folosi functia -2PA/2.
1. 0olositi -2PA/2 pentru a sterge fiecare aparitie a lui S din sir. 5aloarea
intoarsa va reprezenta nr. de caractere care au ramas dupa ce S a fost sters. /u alte
cuvinte , o valoare minus nr. de operatii ale lui S in sir.
2.
3. SELECT DNAME, LENGTH(DNAME), LENGTH(REPLACE(DNAME,'S'))
4. FROM DEPT;
5.
6. DNAME LENGTH(DNAME) ENGTH(REPLACE(DNAME,'S'))
7. ----------------------------------------------------
8. ACCOUTING 10 10
9. RESEARCH 8 7
10. SALES 5 3
11. OPERATIONS 10 9
127
1G. Apoi scadeti din lungimea totala , lungimea sirului fara S.
14.
15. SELECT DNAME,LENGTH(DNAME), LENGTH(DNAME)
16. LENGTH(REPLACE(DNAME,'S'))
17. FROM DEPT;
18.
19. DNAME LENGTH(DNAME) LENGTH(DNAME)-
LENGTH(REPLACE(DNAME,'S'))
20. ----------------------------------------------------------
---------
21. ACCOUTING 10
0
22. RESEARCH 8
1
23. SALES 5
2
24. OPERATIONS 10
1
2?7
#A. -ezultatul e o valoare care reprezinta nr. de operatii ale lui S in sir .
2U$C"## $UME!#CE
Acestea accepta intrare numerica si intorc ca rezultat un numar. Aceasta sectiune descrie
citeva din functiile numerice. -O3:*'col!value,n) rotu+este coloana , e&presie sau
valoare la n zecimale. *aca n e omis nu are zecimale , daca e negativ , numarul din stinga
punctului zecimal e rotun+it.
SELECT ROUND(45.923,1),
ROUND(45.923),
ROUND(45.323,1),
ROUND(42.323,-1),
ROUND(SAL/32,2)
FROM EMP
WHERE DEPTNO =10;
ROUND(45.923,1)ROUND(45.923)ROUND(45.323,1)Round(42.323,-
1)ROUND(SAL/32,2)
----------------------------------------------------------------------
--
45.9 46 45.3 40
76.56
45.9 46 45.3 40
156.23
45.9 46 45.3 40
40.63
TRUNC(col/value,n) trunchiaza coloana sau valoarea la n
zecimale, sau
daca nu e om is , fara zecimale.Daca n e negativ , numarul din
stinga
punctului zecimal e trunchiat la zero.
SELECT TRUNC(45.923,1),
TRUNC(45.923),
TRUNC(45.323,1),
TRUNC(42.323,-1),
TRUNC(SAL/32,2)
FROM EMP
WHERE DEPTNO= 10;
TRUNC(45.923,1)TRUNC(45.923)TRUNC(45.323,1)TRUNC(42.323,-
1)TRUNC(SAL/32,2)
-----------------------------------------------------------------------
-----
45.9 45 45.3 40
76.56
45.9 45 45.3 40
156.25
45.9 45 45.3 40
40.62
CEIL (col/value) gaseste cel mai mic intreg mai mare sau egal cu
coloana,
expresie sau valoare.
SELECT CEIL(SAL),CEIL(99.9),CEIL(101.76),CEIL(-11.1)
FROM EMP
WHERE SAL BETWEEN 3000 AND 5000;
CEIL(SAL) CEIL(99.9) CEIL(101.26) CEIL(-11.1)
-------------------------------------------------
3000 100 102 -11
5000 100 102 -11
3000 100 102 -11
FLOOR (col/value) gaseste cel mai mare intreg mai mic sau egal cu
coloana expresie sau valoare.
SELECT FLOOR(SAL), FLOOR(99.9),FLOOR(101.76),FLOOR(-11.1)
FROM EMP
WHERE FLOOR(SAL) BETWEEN 3000 AND 5000;
FLOOR (SAL) FLOOR(99.9) FLOOR(101.76) FLOOR(-11.1)
-----------------------------------------------------
3000 99 101 -12
5000 99 101 -12
3000 99 101 -12
POWER(col/value,n) ridica coloana, expresia sau valoarea la
puterea n. Poate fi negativa.
SELECT SAL,POWER(SAL,2), POWER(SAL,3), POWER(50,5)
FROM EMP
WHERE DEPTNO=10;
SAL POWER(SAL,2) POWER(SAL,3) POWER(50,5)
----------------------------------------------
2450.00 6002500 14706125000 312500000
5000.00 25000000 125000000000 312500000
1300.00 1690000 2197000000 312500000
EXP(n) intoarce e ridicat la puterea n
e=2.71828183.
SELECT EXP(4)
FROM DUAL;
EXP(4)
------
54.59815
SQRT(col/value) gaseste radacina patrata a coloanei sau valorii.
Daca col/value e NULL sau negativ atunci e
intors rezultatul NULL.
SELECT SAL, SQRT(SAL),SQRT(40), SQRT(COMM)
FROM EMP
WHERE COMM>0;
SAL SQRT(SAL) SQRT(40) SQRT(COMM)
-----------------------------------------------
1600.00 40 6.32455532 17.3205081
1250.00 35.3553391 6.32455532 22.3606798
1250.00 35.3553391 6.32455532 37.4165739
SIGN(col/value) intoarce -1 daca e coloana, expresie sau valoare
e
un nr. negativ , intoarce 0 daca e zero,+1 daca e
nr.pozitiv.
SELECT SAL -COMM,SIGN(SAL-COMM),COMM-SAL, SIGN(COMM-SAL)
FROM EMP
WHERE DEPTNO=30;
SAL-COMM SIGN(SAL-COMM) COMM-SAL SIGN(COMM-SAL)
---------------------------------------------------
1300 1 -1300 -1
750 1 -750 -1
- 150 -1 150 1
1500 1 -1500 -1
Frecvent , functia SIGN este folosita pentru a testa daca o
valoare
este mai mica ca , mai mare ca sau egala cu a doua valoare.
Urmatorul exemplu tipareste toti angajatii al caror salariu este
mai mare decit comisionul lor.
SELECT ENAME ,SAL,COMM
FROM EMP
WHERE SIGN (SAL-COMM)=1;
ENAME SAL COMM
-----------------------------
ALLEN 1600 300
WARD 1250 500
TURNER 1500 0
ABS(col/value) gaseste valoarea absoluta a coloanei sau
valorii.
SELECT SAL,COMM,COMM-SAL,ABS(COMM-SAL),ABS(-35)
FROM EMP
WHERE DEPTNO =30;
SAL COMM COMM-SAL ABS(COMM-SAL) ABS(-35)
-------------------------------------------------------
1600.00 300.00 -1300 1300 35
1250.00 500.00 -750 750 35
1250.00 1400.00 150 150 35
2850.00 35
1500.00 00 -1500 1500 35
950.00 35
MOD(value1,value2) gaseste restul impartirii lui 'value1'la
'value2'.
SELECT SAL , COMM , MOD(SAL,COMM), MOD(100,40)
FROM EMP
WHERE DEPTNO =30
ORDER BY COMM;
SAL COMM MOD(SAL,COMM) MOD(100,40)
--------------------------------------------------------
2,850.00 20
950.00 20
1,600.00 300.00 100 20
1,250.00 500.00 250 20
1,250.00 1,400.00 1250 20
1,500.00 00 1500 20
Alte citeva functii matematice:
O7'm,n)
intoarce logaritmul cu baza m si argument n.
S,:'n)
intoarce sinusul lui n
S,:H'n)
intoarce sinusul hiperbolic al lui n
(A:'n)
intoarce tangenta lui n
(A:H'n)
intoarce tangenta hiperbolica a lui n
/OS'n)
cosinus de n
/OSH'n)
cosinus hiperbolic al lui n
Exercitii+ca'-8+ 2olosirea ,u&ctiilor
Aceste e&ercitii acopera folosirea functiilor nu doar in constructiile S22/( dar si in
MH2-2 si O-*2- 8K. *aca sunt folosite aliasuri ale coloanelor in rezultat , folo% siti%
le in constructia S22/( a propozitiei S".
"EME
1. Listati "entru toti angajatii numele si salariul marit cu
1# 5 si e1"rimat ca un nr. de dolari.
DEPTNO ENAME PCTSAL
---------------------------
20 SMITH <20
30 ALLEN 1>40
30 WARD 143>
20 JONES 3421
30 MARTIN 143>
30 BLAKE 327>
10 CLARK 2>1>
20 SCOTT 34?0
10 KING ?7?0
30 TURNER 172?
20 ADAMS 12=?
30 JAMES 10<3
20 .ORD 34?0
10 MILLER 14<?
14 -0#0!1$107
2. 0btineti urmatoarea iesire6
EMPLOYEEGANDGJOB
----------------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
JONES MANAGER
MARTIN SALESMAN
BLAKE MANAGER
CLARK MANAGER
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
.ORD ANALYST
MILLER CLERK
3. 0btineti urmatoarea iesire
EMPLOYEE
--------
SMITHBC#0'UD
ALLENBS$#0-*$%D
WARDBS$#0-*$%D
JONESBM$%$90'D
MARTINBS$#0-*$%D
BLAKEBM$%$90'D
CLARKBM$%$90'D
SCOTTBA%$#X-1D
KINGBP'0-/(0%1D
TURNERBSA#0-*$%D
ADAMSBC#0'UD
JAMESBC#0'UD
.ORDBA%$#X-1D
MILLERBC#0'UD
!. 2aceti o cautare "entru a obtine o lista a angajatilor
cu
functia 7job7 s"ecificata de utili+ator.
E%10' 2$#,0 @"' :"; 3!#0'U
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
-----------------------------------------------------------
73=< SMITH CLERK 7<02 17-DEC->0 1000 20
7>7= ADAMS CLERK 77>> 12-JAN->3 1100 20
7<00 JAMES CLERK 7=<> 03-DEC->1 10<27? 30
7<34 MILLER CLERK 77>2 23-JAN->2 1300 10
#. S$ a desco"erit ca nu toti angajatii din de"artamentul 3
sunt barbati .0btineti urmatoarea iesire6
ENAME DEPTNO JOB
----------------------------
ALLEN 30 S$#0-+0'-"%
WARD 30 S$#0-+0'-"%
MARTIN 30 S$#0-+0'-"%
BLAKE 30 M$%$90'
TURNER 30 S$#0-+0'-"%
JAMES 30 C#0'U
SOLU"## Ca'-8
1. SELECT DEPTNO,ENAME, ROUND(SAL*1.15) PCTSAL
FROM EMP;
2. SELECT RPAD(ENAME,10)||LPAD(JOB,10) EMPLOYEE_AND_JOB
FROM EMP;
3. SELECT ENAME ||'('||initcap(job)||')' EMPLOYEE
FROM EMP;
4. SELECT *
FROM EMP
WHERE UPPER(JOB)=UPPER('&JOB');
5. SELECT ENAME,DEPTNO,INITCAP
(REPLACE(JOB,'SALESMAN','SALESPERSON')) JOB
FROM EMP
WHERE DEPTNO =30;
Capitolul 5
Alte ,u&ctii si&)ulare a'licate li&iilor u&ei %aze de date
,n acest capitol vom trata functiile 'de tip) referitoare la date calendaristice '*A(2',
functiile de conversie si functii care accepta orice tip de data de intrare.
2u&ctiile de ti' data cale&daristica
Aceste functii se aplica asupra datelor O-A/2.
(oate functiile de tip data calendaristica intorc valoarea tipului *A(2 cu e&ceptia lui
4O:(HSO82(M22: care intoarce o valoare numerica.
Stocarea datelor cale&daristice O!ACLE
O-A/2 stocheaza datele calendaristice intr%un format numeric intern reprezentind:
Secolul
Anul
una
Liua
Ora
4inutele
Secundele
0ormatul implicit de afisare sau intrare pentru o data calendaristica e **%4O:%
KK.*atele calendaristice O-A/2 pot varia intre 1 ian 671# ien si G1 dec 671# e.n
S9sdate
S?sdate intoarce data curenta si timpul.Puteti folosi SKS*A(2 la fel ca folosirea oricarui
nume de coloana. *e e&emplu , puteti afisa data curenta selectind SKS*A(2 dintr%o
tabela. 2ste obisnuit sa se selecteze SKS*A(2 dintr%o tabela 'dumm?' numita *3A.
(abela *3A apartine utilizatorului 'SKS' si poate fi accesata de toti utilizatorii./ontine
o singura coloana ,*344K si o linie cu valoarea '&'.
(abela *3A e folositoare cind doriti sa obtineti o singura valoare%de e&emplu , valoarea
unei constante , pseudo%coloane sau e&presii care nu e derivata dintr%o tabela cu data
'user'.
Pentru a afisa date curenta:
SELECT SYSDATE
FROM SYS.DUAL;
Puteti selecta usor SKS*A(2 din 24P, dar 16 linii cu aceeasi SKS*A(2 vor fi
intoarse , una pentru fiecare linie din tabela 24P.
*3A e preferata pentru ca e suficienta o singura linie intoarsa.
2olosirea o'eratorilor arit(etici
Pornind de la faptul ca data calendaristica e memorata ca un numar , e posibil sa se faca
calcule cu date calendaristice, folosind operatori aritmetici ca B sau %.Puteti aduna sau
scadea constante numerice ca si date calendaristice.
Operatiile pe care le puteti face sunt:
data B numar
aduna un numar de zile la data, reintorcind o data calendaristica
data % numar
scade un numar de zile dintr%o data, producind o data calendaristica
date % date
scade o data dintr%o data , obtinind un nr. de zile.
date B numar!#6
aduna un nr. de ore pentru a obtine o data calen% daristica.
SELECT HIREDATE,HIREDATE+7, HIREDATE-7,SYSDATE - HIREDATE
FROM EMP
WHERE HIREDATE LIKE '%JUN%';
HIREDATE HIREDATEE7 HIREDATE-7 SYSDATE-HIREDATE
-------------------------------------------------------
13-:,%->3 20-:,%->3 0=-:,%->3 1<>2770=2>
11-:,%->4 1>-:,%->4 04-:,%->4 1=1>770=2>
04-:,%->4 11-:,%->4 2>-*$X->4 1=2?770=2>
04-:,%->4 11-:,%->4 2>-*$X->4 1=2?770=2>
Scazind din SKS*A(2 ,H,-2*A(2 din tabela 24P intoarce nr.de zile de la anga+area
fiecarui om.
4O:(HSO82(M22:'data1,data#)
gaseste nr. de luni intre data1 si data#. -ezultatul poate fi pozitiv sau negativ.
*aca data1 e mai tarzie decat data# , -2L3(A(3 2 POL,(,5, daca data# este
mai tirzie decit data1 , -2L3(A(3 2 :27A(,5.
SELECT MONTHS_BETWEEN (SYSDATE,HIREDATE),
MONTHS_BETWEEN('01-jan-84','05-nov-88')
FROM EMP
WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE)>59;
MONTHSGBETWEENBSYSDATE8HIREDATED MONTHSGBETWEENBC01-:$%->4C8C0?-
%"2->>CD
-------------------------------------------------------------------
----
=?70>73=22 -?>712<032
=3 -?>712<032
=07?0=7171 -?>712<032
?<734?42=7 -?>712<032
?<734?42=7 -?>712<032
?<7>2<2<77 -?>712<032
= '0!"'(- -0#0!10(
Partea neintreaga a rezultatului reprezinta o portiune dintr%o luna.
A**O4O:(HS'data,n)
aduna n numar de luni calendaristice la 'data'. n trebuie sa fie intreg si poate fi si
negativ.
SELECT HIREDATE, ADD_MONTHS(HIREDATE,3),ADD_MONTHS(HIREDATE,-3)
FROM EMP
WHERE DEPTNO =20;
HIREDATE ADDGMONTHSBHIREDATE83D ADDGMONTHSBHIREDATE8-3D
----------------------------------------------------------------
13-:,%->3 13--0+->3 13-*$'->3
31-"!1->3 31-:$%->4 31-:,#->3
0?-*$'->4 0?-:,%->4 0?-(0!->3
04-:,%->4 04--0+->4 04-*$'->4
0?-(0!->3 0?-*$'->4 0?--0+->3
:2U(O*AK'data1,,char)
data urmatoarei zile a saptaminii'char) urmind data1. /har trebuie sa fie un numar
reprezentind o zi sau un caracter.
SELECT HIREDATE,NEXT_DAY(HIREDATE,'FRIDAY'),NEXT_DAY(HIREDATE,6)
FROM EMP
WHERE DEPTNO =10;
HIREDATE NENTGDAYBHIREDATE8C.RIDAYCD NENTGDAYBHIREDATE8=D
------------------------------------------------------------------
14-*$X->4 1>-*$X->4 1>-*$X->4
0<-:,#->4 13-:,#->4 13-:,#->4
21-%"2->3 2?-%"2->3 2?-%"2->3
AS(O*AK'data1)
gaseste data reprezentind ultima zi a lunii care contine data 1.
SELECT SYSDATE,LAST_DAY(SYSDATE),HIREDATE,LAST_DAY(HIREDATE),
LAST_DAY('15-FEB-88')
FROM EMP
WHERE DEPTNO =20;
SYSDATE LASTGDAYBSYSDATED HIREDATE LASTGDAYBHIREDATED LASTGDAYBC1?-
@0;->>CD
--------------------------------------------------------------------
--------
04-DEC->< 31-DEC->< 17-DEC->0 31-DEC->0 2<-.EB->>
"4-(0!->< 31-(0!->< 02-$+'->1 30-$+'->1 2<-@0;->>
04-(0!->< 31-(0!->< 0<-(0!->2 31-(0!->2 2<-@0;->>
04-(0!->< 31-(0!->< 12-:$%->3 31-:$%->3 2<-@0;->>
04-(0!->< 31-(0!->< 03-(0!->1 31-(0!->1 2<-@0;->>
0unctia -O3:* poate fi aplicata pe date calendaristice.
-ound'data1)
intoarce data1 cu timpul setat la 1#:<<A4'noaptea). Aceasta e folositor cind
comparam date care au timpuri diferite.
-O3:* 'data1,'4O:(H')
intoarce prima zi a lunii continind data1 daca data1 este in prima parte a lunii,
altfel intoarce prima zi a urmatoarei luni.
-O3:*'data 1,' K2A-')
intoarce prima zi a anului continind data1, daca data1 este in prima +umatate a
anului, altfel intoarce prima zi a urmatorului an.
SELECT SYSDATE,ROUND(SYSDATE,'MONTH'),ROUND(SYSDATE,'YEAR')
FROM SYS.DUAL;
SYSDATE ROUNDBSYSDATE8CMONTHCD ROUNDBSYSDATE8CYEARCD
----------------------------------------------------------
04-(0!->< 01-(0!->< 01-:$%-<0
(-3:/'data1,'char')
gaseste prima zi a lunii care e continuta in data1, cind charI'4O:(H'.*aca charI
'K2A-', gaseste prima zi a anului care contine data1.
SELECT SYSDATE,TRUNC(SYSDATE,'MONTH'),TRUNC(SYSDATE,'YEAR')
FROM SYS.DUAL;
SYSDATE TRUNCBSYSDATE8CMONTHCD TRUNCBSYSDATE8CYEARCD
-----------------------------------------------------------
"4-(0!->< 01-(0!->< 01-:$%-><
(-3:/ e folositor cind vreti sa stergeti timpul dintr%o data. (impul component al zilei
este sters implicit.
2u&ctii de co&versie
S" furnizeaza un numar de functii care controleaza conversiile datelor
calendaristice.Aceste functii de conversie , convertesc o valoare de la un tip de data la alt
tip.
(OO/HA-'numar!data,X'fmt'Y)
converteste numar sau data la caractere in format 'fmt'.
(OO:3482-'char)
converteste 'char' care contine un numar in ':3482-'.
(OO*A(2''char','fmt')
converteste valoarea 'char' reprezentind o data calendaristica, intr%o valoare data
in felul 'fmt' specificat. *aca fmt e omis , formatul e **%4O:%KK.
"O:C0A!
0unctia (OO/HA- este folosita frecvent pentru a schimba un format de data de la cel
implicat la un format de afisare alternativ. (OO/HA- 'data,'date picture') specifica ca
data va fi convertita la un nou format de iesire.
Pentru a converti date curente de la formatul implicit '**%4O:%KK) la un nou format
'date picture':
SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY')
FROM SYS.DUAL;
TOGCHAR BSYSDATE8CDAY8DDTHMONTHYYYYCD
-------------------------------------
TUESDAY 80?TH SEPTEMBER 1<><
Observati ca:
'*ate picture', care trebuie incadrate de apostrofi poate contine orice format dintre
cele tratate mai +os./oloana si 'date picture' trebuie separate de virgula.
*AK si 4O:(H la iesire sunt automat aduse la lungimea ; adaugind blancuri.
Pentru a sterge blancurile adaugate folositi prefi&ul 04'0, 4O*2).
SELECT TO_CHAR (SYSDATE,'fmDAY,ddth Month YYYY')
FROM SYS.DUAL;
TOGCHARBSYSDATE8C.MDAY8DDTHMONTHYYYYCD
--------------------------------------
T,0-($X 8 ?1T S0+10*;0' 1<><
04 poate fi folosit pentru a sterge zerourile de la inceput din formatul ddth e&:<F(H este
schimbat in Fth. /azul in care 'date picture' este introdusa este cazul in care va fi afisata.
(OO/HA- poate fi deasemenea folosita pentru e&tragerea timpului din zi , si afisarea lui
intr%un format specificat.
Pentru afisarea timpului dintr%o zi:
SELECT TO_CHAR (SYSDATE.'HH:MI:SS')
FROM SYS.DUAL;
TOGCHARBSYSDATE8CHH3MI3SSCD
---------------------------
0>31=324
0unctia (OO/HA- este de asemenea folosita pentru conversia unei valori de tip data
numerica la o valoare de tip data caracter.
TO_CHAR(numar,'number picture')
SELECT TO_CHAR (SAL,'$9,999')
FROM EMP;
TOGCHARBSAL8CO<8<<<CD
--------------------
O18000
O18=00
O182?0
O28<7?
Observati ca formatul este optional.*aca'date picture' e omis, data este convertita la o
valoare de tip caracter in format Oracle, implicit **%4O:%KK.
*aca 'number picture ' nu e specificat, numarul e convertit intr%o valoare de tip caracter.
Observati de asemenea ca formatele nu afecteaza actuala reprezentare interna a valorii
coloanei.2le afecteaza doar cum valoarea coloanei este afisata cind e regasita cu o
constructie S22/(.
2or(ate 'e&tru date cale&daristice
2lementele unui format de data calendaristica sunt:
S// or //
Secol>Prefi&ul 'S'face ca datele i.e.n. sa fie prefi&ate de'%'.
KKKK or SKKKK
An>Prefi&ul 'S' face ca datele i.e.n. sa fie prefi&ate de '%'.
KKK or KK or K
3ltimele G,#,1 cifre din an
K,KKK
An cu virgula in pozitie specificata.
SK2A- or K2A-
An in litere >Prefi&ul 'S' face ca pt.anii i.e.n. sa se puna '%'.
8/ or A*
,ndicatorul 8/!A*'pt.i.e.n. sau e.n.).
8./.or A.*.
,ndicatorul 8/!A* cu puncte.
"
Sfert de an.
44
una.
4O:(H
:umele lunii adaugind blancuri pina la lungimea ;.
4O:
:umele lunii abreviat la G litere.
MM or M
Saptamina a anului sau a lunii.
*** or ** or *
Li a anului, lunii,saptaminii.
*AK
:umele zilei ,adaugind blancuri pina la lungimea de ; caractere.
*K
:umarul zilei abreviat la G litere.
=
:r.de zile din decembrie G1,671G i.e.n.
A4 or P4
,ndicator meridian.
A.4. or P.4.
,ndicator meridian cu puncte.
HH or HH1#
Ora din zi '1%1#).
HH#6
Ora din zi '<%#G).
4,
4inute.
SS
Secunde.
SSSSS
Secunde dupa miezul noptii'<%@AG;;).
!.,etc.
2 reprodusa punctuatia in rezultat.
"..."
Sirul cu apostrofi reprodus in rezultat.
Prefi&ul de mai +os poate fi adaugat astfel:
fm
'0, mode'.Prefi&ind 4O:(H sau *AK, suprima blancurile, lasind un rezultat
de lungime variabila ,04 va suprima zerourile de inceput din formatul ddth.:u e
folositor cu alte coduri.A doua aparitie a lui 'fm' pune blan% curile din nou.
Sufi&ele de mai +os pot fi adaugate astfel:
(H
nr.ordinal'e&:''**(H" transformat in "6(H").
SP
nr.transformat in sir 'e&.**SP"pt"0O3-").
SP(H sau thsp
confirma numerele ordinale cu transformarea numar% cadru 'e&.**SP(H
pt.0O3-(H).
O%servatie*
W /odurile sunt case sensitive si vor afecta afisarea datelor calendaristice astfel:
DAY MONDAY
D$X M"%($X
M"%1T J,#X
((1T 141T
((TT 141T
2or(atul de date !!
*aca%l folositi in locul lui KK, secolul variaza in acord cu anul specificat cu # cifre si
ultimii # digiti ai anului curent.
(abloul de mai +os rezuma comportamentul elementului --.
2O!MA"UL DE DA"E !!(O!ACLE ;)
Pe&tru a&ii i& alte secole
--------------------------------------------------------------------
--
| | | D$!$ !0/ 2 (/9/1/ $/ $%,#,/ -/%1
|
| D$!$ !0/
---------------------------------------------------------
| 2 (/9/1/ | | 0-4< ?0-<<
|
| $/ $%,#,/
---------------------------------------------------------
| !,'0%1 | |
|
| -,%1 | 0 | ($1$ /%1"$'-$ 0-10 ($1$ /%1"$'-$ 0-10
|
| | - | /% -0!"#,# !'17 /% -0!"#,# $%10'/"'
|
| | 4< | !0#,/ !'17
|
| |
----------------------------------------------------------
| | ?0 | ($1$ /%1"$'-$ 0-10 ($1$ /%1"$'-$ 0-10
/%|
| | - | /% -0!"#,# (,+$ -0!"#,# !'17
|
| | << | !0# !'17
|
---------------------------------------------------------------------
---
2U24P2:
--------------------------------------------------------------
| A%,# !'17 H$#"$'0$ @"'*$1$1$ A%,# /%10'+'01$1 |
| BDDG MONGRRD |
--------------------------------------------------------------
| 1<<4 27-"!1-<? 1<<? |
--------------------------------------------------------------
| 1<<4 27-"!1-17 2017 |
--------------------------------------------------------------
| 2001 27-"!1-<? 1<<? |
--------------------------------------------------------------
| 2001 27-"!1-17 2017 |
--------------------------------------------------------------
2or(atul 'e&tru &u(ere
2lementele modelului pt.formatul de numere sunt:
."'*$1 S0*%/@/!$1/0 EA0*+#0
------------------------------------------------------------
< %,*0'0B%'7(0 < <<<<<< 1234
(010'*/%$ #,%9 (0
$@/-$'0D
0 $@/-760'",'/#0 (0
#$ /%!0+,1 0<<<<< 001234
O -0*%,# ("#$' O<<<<<< O1234
7 +,%!1 60!/*$# /% <<<<<<7<< 1234700
8 +"6/1/0 -+0!/@/!$1$ <<<8<<< 18234
MI -0*%0#0 */%,- #$
('0$+1$B2$#"'/
%09$1/20D <<<<<<MI 1234-
PR +$'$%1060 +0%1',
%,*0'0 %09$1/20 <<<<<<PR J1234)
EEEE %"1$1/0 -1//%1/@/!$
B@"'*$1,# 1'0;,/0
-$ $/;$ 4ED <<7<<<EEEE 17234EE03
H /%*,#1/'0 !, 10
B%I%,*$' (0 < (,+$ HD <<<<H<< 123400
B $@/-0$6$ 2$#"'/ 60'"
!$ ;#$%!,'/ %, 0 B<<<<7<< 1234700
-----------------------------------------------------------------
Observatie:
0ormatele numerice afisate mai +os in tablou pot fi folosite cu comanda
S".P3S/O34:'vezi cap.1<).
TO_NUMBER
,n e&emplul urmator , functia (OO:3482- e folosita pentru a transforma un numar
memorat sub forma unui caracter intr%un tip numar.
SELECT EMPNO, ENAME,JOB,SAL
FROM EMP
WHERE SAL>TO_NUMBER('1500');
TO_DATE
Pentru a afisa toti anga+atii cu data anga+arii 6 iulie 1;@6, puteti folosi functia (OO*A(2:
SELECT EMPNO,ENAME, HIREDATE
FROM EMP
WHERE HIREDATE =TO_DATE('June 4,1984','Month dd, YYYY');
EMPNO ENAME HIREDATE
------------------------
7>44 TURNER 04-:,%->4
/onstanta e convertita intr%o data si apoi comparata cu valoarea H,-2*A(2.
0unctia (OO*A(2 e frecvent folosita pentru a transforma o valoare in O-A/2 intr%un
format diferit de cel implicit. *e e&emplu , cind inserati o data , Oracle asteapta o data in
formatul implicit **O4O:OKK. *aca nu vreti sa folositi formatul implicit , trebuie sa
folositi functia (OO*A(2 si masca formatului dorit.
*e e&emplu:
Pentru a introduce in tabela 24P % o linie cu un format nestandard introduceti:
INSERT INTO EMP(EMPNO,DEPTNO,HIREDATE)
VALUES(777,,20,TO_DATE('19/08/90','DD/MM/YY'));
/omanda ,:S2-( e tratata in detaliu mai tirziu.
2u&ctii care acce'ta orice ti' de data la i&trare
DECODE
*2/O*2 este cea mai puternica functie S".
Aceasta faciliteaza interogarile, facind munca unui 'case' sau a unei constructii'if%then%
else'.
S?nta&:
DECODE (col/expression,
search1,rezult1,[search2,rezult2,....,]
default)
/ol!e&pression e comparata cu fiecare valoare'search'si intoarce 'rezult' daca
col!e&pression este egal cu valoarea 'search'.
*aca nu e gasita nici o egalitate, functia *2/O*2 intoarce valoarea 'default'.*aca
valoarea'default' e omisa, :3 e intors pentru cazurile de nepotrivire.
A!<UME$"E
*2/O*2 trebuie sa aiba minim 6 parametrii ca argumente.
/O!2UP-2SS,O:
numele coloanei sau e&presie pentru a fi evaluate
S2A-/H1
prima valoare pentru testare
-2S3(1
valoarea intoarsa daca se potriveste cu S2A-/H1.
S2A-/H1 si -2S3(1 pot fi repetate de cite ori e necesar%DS2A-/H#,
-2S3(#,...E
*20A3(
valoarea pentru a fi reintoarsa daca nu e&ista nici o potrivire.
Observatie:
col!e&pression pot fi orice tip de data
S2A-/H poate fi acelasi tip ca e&pression !col
5aloarea intoarsa este fortata la acelasi tip ca al treilea argument 'result1)
2&emplul urmator decodifica tipurile '/2-C'si' 4A:A72-'>altele nu testate.Acestea
devin implicite pentru 3:*20,:2.
SELECT ENAME,
JOB,
DECODE(JOB,'CLERK','WORKER',
'MANAGER','BOSS',
'UNDEFINED') DECODED_JOB
FROM EMP;
ENAME JOB DECODEDGJOB
-------------------------------
SMITH CLERK WORKER
ALLEN SALESMAN UNDE.INED
WARD SALESMAN UNDE.INED
JONES MANAGER BOSS
MARTIN SALESMAN UNDE.INED
BLAKE MANAGER BOSS
CLARK MANAGER BOSS
SCOTT ANALYST UNDE.INED
KING PRESIDENT UNDE.INED
TURNER SALESMAN UNDE.INED
ADAMS CLERK WORKER
JAMES CLERK WORKER
.ORD ANALYST UNDE.INED
MILLER CLERK WORKER
Pentru a afisa procenta+ele in functie de coloane 7-A*2 din tabela SA7-A*2:
SELECT GRADE,
DECODE(GRADE,'1','15%'
'2','10%',
'3','8%',
'5%')BONUS FROM SALGRADE;
GRADE BONUS
---------------
1 1?L
2 10L
3 >L
4 ?L
? ?L
Acest e&emplu ilustreaza ca valoarea intoarsa e fortata la tipul celui de al treilea
argument, la folosirea functiei *2/O*2. ,l sfatuim pe utilizator sa specifice ordinea in
care informatia e afisata introducind o valoare la fiecare rulare:
select * from emp
order by decode (&orderby,
1,
sal,
2,
ename,
sal);
Enter value for orderby:2
order by decode (2,1,sal,2,ename,sal)
*
ERROR at line 2:ORA -1722: invalid number
Observati ca aceata comanda produce o eroare fiindca tipul lui 'ename''char) difera de cel
al lui 'sal''numar) care e al treilea argument.
,n e&emplul de mai +os , dorim sa introducem salariul crescut in functie de meseria
fiecarui anga+at.
SELECT JOB,SAL,DECODE(JOB,'ANALYST',SAL*1.1,
'CLERK',SAL*1.15,
'MANAGER',SAL*0.95,
SAL) DECODED_SALARY FROM EMP;
JOB SAL DECODEDGSALARY
--------------------------------
CLERK >00 <20
SALESMAN 18=00 1=00
SALESMAN 182?0 12?0
MANAGER 28<7? 2>2=72?
SALESMAN 182?0 12?0
MANAGER 28>?0 27077?
MANAGER 284?0 23277?
ANALYST 38000 3300
PRESIDENT?8000 ?000
SALESMAN 18?00 1?00
CLERK 18100 12=?
CLERK <?0 10<27?
ANALYST 38000 3300
CLERK 18300 14<?
:5'col!value,val) converteste o valoare :3 la 'val' (ipul datei trebuie sa se
potriveasca cu 'col!value si val).
SELECT SAL*12+NVL(COMM,0),NVL(COMM,1000),SAL*12+NVL(COMM,1000)
FROM EMP
WHERE DEPTNO=10;
SAL412ENHLBCOMM80D NHLBCOMM81000D SAL412ENHLBCOMM81000D
----------------------------------------------------------
2<400 1000 30400
=0000 1000 =1000
1?=00 1000 1==00
7-2A(2S('col'value1,col!value#....) %intoarce cel mai mare dintr%o lista de valori.(oate
'col!value#' sint convertite la tipul col!value1 inaintea comparatiei.
SELECT GREATEST(1000,2000),GREATEST(SAL,COM)
FROM EMP
WHERE DEPTNO=30;
GREATESTB100082000D GREATESTBSAL8COMMD
-------------------------------------------
2000 1=00
2000 12?0
2000 1400
2000
2000 1?00
2000
= '0!"'(- -0#0!10(7
2AS('col!value1,col!value#....) intoace cea mai mica valoare.
(oate col!value # sint convertite la tipul col!value1 inainte de comparatie.
SELECT LEAST(1000,2000),LEAST(SAL,COMM)
FROM EMP
WHERE DEPTNO=30;
LEASTB100082000D LEASTBSAL8COMMD
---------------------------------
1000 300
1000 ?00
1000 12?0
1000
1000 0
1000
= '0!"'(- -0#0!10(7
5S,L2'col!value) % intoarce nr.de biti din reprezentarea interna O-A/2 a lui col!value'.
SELECT DEPTNO,VSIZE(DEPTNO),VSIZE(HIREDATE),VSIZE(SAL),
VSIZE(ENAME)
FROM EMP
WHERE DEPTNO=10;
DEPTNO HSIYEBDEPTNOD HSIYEBHIREDATED HSIYEBSALD HSIYEBENAMED
---------------------------------------------------------
10 2 7 3 ?
10 2 7 2 4
10 2 7 2 =
2U$C"## #M!#CA"E !E6#=#"A"E
Amintim ca functiile pot fi imbricate la orice nivel si functiile interioare sunt evaluate
intii mergind pina la functia cea mai e&terioara.2ste bine sa se tina nr. de paranteze de
inceput 'deschidere) si de sfirsit'inchidere).(rebuie sa fie acelasi numar din fiecare tip de
paranteze.
0unctiile de mai +os sint imbricate si sint evaluate dupa cum urmeaza.
SELECT ENAME,NVL(TO_CHAR(MGR),'UNMANAGEABLE')
FROM EMP
WHERE MGR IS NULL;
ENAME NHLBTOGCHARBMGRD8CUNMANAGEABLECD
-----------------------------------------------
KING UNMANAGEABLE
1. /oloana 47- e convertita la caracter cu functia (OO/HA-
#. 0unctia :5 inlocuieste :3 mgr cu un sir de caractere '3:4A:A72A82'.
0unctiile imbricate pot fi de asemenea folosite pentru a afisa date de vineri , la doua luni
de azi in formatul *a? dd 4onth KKKK.
SELECT SYSDATE,
TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'Day
dd
Month YYYY')
FROM SYS.DUAL;
SYSDATE
TOGCHARBNENTGDAYBADDGMONTHSBSYSDATE82D8C.RIDAYCD8CDAYDDMONTHYYYYCD
------------------------------------------------------------------
-------
04-(0!->< .'/($X 0< .0;',$'/0 1<<0

17 .,%!1/$ ADDGMONTHS $(,%$ 2 #,%/ #$ #,%$ !,'0%1$B(0!0*;'/0D
27
37 .,%!1/$ NENTGDAY 9$-0-10 2/%0'/ #$ 2 #,%/ (0 SYSDATE
47
?7 .,%!1/$ TOGCHAR !"%20'10-10 !"#"$%$ ($1$ #$ 1/+,# CHAR +0%1',
=7 $@/-$'0$ /% @"'*$1,# D$X (( M"%1T YYYY
77
4a"itolul # E1ercitii $ 2unctii
A!0-10 0A0'!/1// $!"+0'$ @,%!1//#0 (/-!,1$10 /% $!0-1 !$+/1"#8 !$
-/
+0 !0#0 (/% !$+/1"#,# 47

17 A@/-$1/ +17@/0!$'0 $%9$:$1 (/% (0+$'1$*0%1,# 20 %,*0#0 -/ ($1$
27 $%9$:$'//7
37 ./1/ -/9,'/ !$ -+0!/@/!$1/ $#/$-,# CDATEGHIREDC (,+$
0A+'0-/$
47 2"$-1'$ $#1@0# !"#"$%$ '0-+0!1/2$ 2$ @/ +/0'(,1$7 S0
@"#"-
?7 -0-10 " #,%9/*0 (0 >0 (0 !$'$!10'0 !$'0 0-10 #,%9/*0$
/*+#/!/1$
=7 +0%1', !"#"$%0 (0 !$'$!10'7
77 ENAME DATEGHIRED
>7 ---------------------------
<7 SMITH J,%08TT/'100%1T 1<>3
107 JONES O!1";0'8TT/'1X-./'-1 1<>3
117 SCOTT M$'!T8./@1T 1<>4
127 ADAMS J,%08.",'1T 1<>4
137 .ORD D0!0*;0'8./@1T 1<>3
147
1?7

1=7 A@/-$1/ +17@/0!$'0 $%9$:$1 %,*0#08 ($1$ $%9$:$'// -/ $($,9$1/
177 ,% $% #$ ($1$ $%9$:$'// +17@/0!$'07 O'("%$1/ /0-/'0$ /%
1>7 "'(/%0$ !'0-!$1"$'0 $ ($10/ $%9$:$'// #$ !$'0 --$
$($,9$1
1<7 ,% $%7
207 ENAME HIREDATE REHIEW
217 ---------------------------
227 SMITH 13-:,%->3 13-:,%->4
237 ALLEN 1?-$,9->3 1?-$,9->4
247 JONES 31-"!1->3 31-"!1->4
2?7 MILLER 21-%"2->3 21-%"2->4
2=7 MARTIN 0?-(0!->3 0?-(0!->4
277 .ORD 0?-(0!->3 0?-(0!->4
2>7 SCOTT 0?-*$'->4 0?-*$'->?
2<7 WARD 2=-*$'->4 2=-*$'->?
307 CLARK 14-*$X->4 14-*$X->?
317 TURNER 04-:,%->4 04-:,%->?
327 ADAMS 04-:,%->4 04-:,%->?
337 BLAKE 11-:,%->4 11-:,%->?
347 KING 0<-:,%->4 0<-:,%->?
3?7 JAMES 23-:,%->4 23-:,%->?
3=7 14 '0!"'(- -0#0!10(
377
3>7

3<7 A@/-$1/ #/-1$ $%9$:$1/#"' 8 +0%1', @/0!$'0 $@/-/%( -$#$'/,#
407 ($!$ $!0-1$ 0 *$/ *$'0 !$ 1?008 ($!$ 0 09$# !, 1?00
$@/-0$6$
417 CO% T$'901C8 ($!$ 0 *$/ */! (0!/1 1??8 $@/-0$6$ CBELOW
1?00C7
427 ENAME SALARY
437 ------------------
447 ADAMS B0#"S 1?00
4?7 ALLEN 1=00
4=7 BLAKE 2>?0
477 CLARK 24?0
4>7 .ORD 3000
4<7 JAMES B0#"S 1?00
?07 JONES 2<7?
?17 KING ?000
?27 MARTIN B0#"S 1?00
?37 MILLER B0#"S 1?00
?47 SCOTT 3000
??7 SMITH B0#"S 1?00
?=7 TURNER O% T$'901
?77 WARD B0#"S 1?00
?>7
?<7 14 '0!"'(- -0#0!10(
=07
=17
=27

=37 S!'/01/ " !0'0'0 !$'0 /%1"$'!0 6/,$ (/% -$+1$*/%$
=47 B0A3MONDAYD8 +17 @/0!$'0 ($1$ /%1'"(,-$ /% @"'*$1,#
=?7 DD7MM7YY7
==7 E%10' 2$#,0 @"' $%X($103127117>>
=77
=>7 DAY
=<7 ------------------------
707 SATURDAY
717
727

737 S!'/01/ " !0'0'0 +17 $ (010'*/%$ !/1 1/*+ $, @"-1 $%9$:$1/
$/
747 !"*+$%/0/ 7."#"-/1/ DE.INE +0%1', $ 02/1$ '0+01$'0$
1/+,#,/
7?7 @,%!1//#"'7
7=7 E%10' 2$#,0 @"' 0*+#"X00G%$*03U/%9
777
7>7
7<7 ENAME LENGTH O. SERHICE
>07 -------------------------------
>17 KING 4 YEARS 4 MONTHS
>27
>37

>47 D/%(,--0 ,% -/' /% @"'*$1,# C%%F%%C8 20'/@/!$1/ ($!$ +'/*0#0
>?7 -/ ,#1/*0#0 2 !$'$!10'0 -,%1 %,*0'0 -/ ($!$ !$'$!10',#
(/%
>=7 */:#"! 0-10 CFC7
>77 A@/-$1/ 0A+'0-/$ CY0-C ($!$ 0 $-$ 8 -$, CN"C $#1@0#7
."#"-/1/
>>7 ,'*$1"$'0#0 2$#"'/ +0%1', $ 10-1$ -"#,1/$ 2"$-1'$3
><7 C12F34C801F#$C8C<<F>>C
<07 HALUE HALIDZ
<17 -----------
<27 12F34 YES
<37
<47

<?7 A%9$:$1// +0 1? $#0 @/0!$'0/ #,%/ -$, /%$/%10 -/%1 +#$1/1/
<=7 /% ,#1/*$ 2/%0'/ $ $!0#0/ #,%/ 7 C0/ $%9$:$1/ (,+$
($1$ (0
<77 1? -,%1 +#$1/1/ /% ,#1/*$ 2/%0'/ $ ,'*$1"$'0/ #,%/7
<>7 A@/-$1/ " #/-1$ $ $%9$:$1/#"' 8 !, ($1$ (0 $%9$:$'0 -/
+'/*$
<<7 ($1$ (0 +#$1$7S"'1$1/ /% @,%!1/0 (0 ($1$ $%9$:$'//7
1007 ENAME HIREDATE PAYDAY
1017 ---------------------------
1027 SMITH 13-:,%->3 24-:,%->3
1037 ALLEN 1?-$,9->3 2=-$,9->3
1047 JONES 31-"!1->3 2?-%"2->3
10?7 MILLER 21-%"2->3 30-(0!->3
10=7 MARTIN 0?-(0!->3 30-(0!->3
1077 .ORD 0?-(0!->3 30-(0!->3
10>7 SCOTT 0?-*$'->4 30-*$'->4
10<7 WARD 2=-*$'->4 27-$+'->4
1107 CLARK 14-*$X->4 2?-*$X->4
1117 TURNER 04-:,%->4 2<-:,%->4
1127 ADAMS 04-:,%->4 2<-:,%->4
1137 BLAKE 11-:,%->4 2<-:,%->4
1147 KING 0<-:,#->4 27-:,#->4
11?7 JAMES 23-:,#->4 31-$,9->4
11=7
1177 14 '0!"'(- -0#0!10(
11>7
11<7
4AP.(0L8L # S0L8(..
17 SELECT ENAME8
27 TOGCHARBHIREDATE8C@*M"%1T8D(-+1T YYYYCD
37 ($10GT/'0(
47 .ROM EMP
?7 WHERE DEPTNOI205
=7
77
>7 SELECT ENAME8HIREDATE8ADDGMONTHSBHIREDATE812D REHIEW
<7 .ROM EMP
107 ORDER BY ADDGMONTHSBT/'0($10812D5
117
127
137 SELECT ENAME8
147 DECODEBSIGNB1?00-SALD818CBELOW 1?00C808CO%
1?7 T$'901C8SALD
1=7 SALARY
177 .ROM EMP
1>7 ORDER BY ENAME5
1<7
207
217 SELECT TO-CHARBTOGDATEBCWANYDATEC8CDD7MM7YYCD8CDAYCD
DAY
227 .ROM SYS7DUAL5
237
247
2?7 DE.INE TIMEIMONTHSGBETWEENBSYSDATE8HIREDATED
2=7 SELECT ENAME8
277 .LOORBWTIMEF12D||CYEARSC||
2>7 .LOORBMODBWTIME812DD||CMONTHSC
2<7 VLENGTH O. SERHICEV
307 .ROM EMP
317 WHERE ENAMEIUPPERBCWEMPLOYEEGNAMECD5
327
337
347 SELECT C12F34C HALUE
3?7 DECODEB
3=7 TRANSLATEBC12F34C8C1234?=7><0C8
377 C<<<<<<<<<<CD8
3>7 C<<F<<C8CYESC8NOCD VHALIDZV
3<7 .ROM SYS7DUAL5
407
417
427 SELECT ENAME8
437 HIREDATE8
447 DECODEBSIGNBTOGCHARBHIREDATE8CDDCD-1?
4?7 18NENT-DAYBLAST-
DAYBADDGMONTHSBHIREDATE81DD8
4=7 C.RIDAYCD-78
477 NENT-DAYBLASTGDAYBHIREDATED8C.RIDAYCD-7D
4>7 PAYDAY
4<7 .ROM EMP
?07 ORDER BY HIREDATE5
?17
?27 -$,
?37 SELECT ENAME8HIREDATE8
?47 NENTGDAYBLASTGDAYBROUNDBHIREDATE8CMONTHCDD
-7
??7 C.RIDAYCD PAYDAY
?=7 .ROM EMP
?77 ORDER BY HIREDATE5
?>7
?<7
Capitolul 6
2u&ctii de )ru'
Acest capitol e&plica cum informatiile concise pot fi obtinute pen% tru grupuri de siruri
folosind functiile de grup.
5om discuta cum puteti divide sirurile dintr%o tabela in seturi mai mici si cum sa
specificati criteriile de cautare intr%un grup de siruri.
0unctiile de grup se aplica unui set de siruri.2le intorc rezultate bazate pe grupuri de
siruri , spre deosebire de un rezultat pe sir care e returnat de functii singulare.*e regula ,
toate sirurile din tabela sunt tratate ca un grup./lauza 7-O3P 8K din cadrul lui
S22/( e folosita pentru a imparti sirurile in grupuri mai mici.
0unctiile de grup sunt listate mai +os:
H$#"$'0 '01,'%$1$
A57'X*,S(,:/(!AY)
valoarea medie a lui n, ignorind valorile nule.
/O3:('X*,S(,:/(!AY e&pr.)
nr. de siruri unde e&presia e evaluata la altceva decit :3. '.) face ca /O3:(
sa numere toate sirurile selectate, incluzind duplicatele si sirurile cu :3.
4AU'X*,S(,:/(!AYe&pr)
ma&imul valorilor e&pr.
4,:'X*,S(,:/(!AYe&pr)*
minimul valorilor e&presiei e&pr.
S(**25'X*,S(,:/!AYn)
deviatia standard a lui n , ignorind valorile nule.
S34'X*,S(,:/!AYn)
suma valorilor lui n , ignorind valorile nule.
5A-,A:/2'X*,S(,:/(!AYn)
variatia lui n , ignorind valorile nule.
(oate functiile de deasupra opereaza pe un nr. de siruri 'de e&., o intreaga tabela) si sunt
cunoscute ca functii de grup sau agregate. *,S(,:/( face ca functia de grup sa
considere doar valorile'nedupli% cate).
A considera fiecare valoare , incluzind si toate duplicatele. ,mplicit este A.
(ipul datelor argumentelor poate fi /HA-,:3482- sau *A(A unde e&pr e listata.
(oate fuctiile de grup cu e&ceptia lui /O3:('.) ignora valorile nule. 0olositi :5 ca de
obicei pentru a include null.
2U$C"## DE <!UP
2olosirea ,u&ctiilor de )ru'
Pentru a calcula salriul mediu al tuturor anga+atilor, introducem :
SELECT AVG(SAL)
FROM EMP;
AHGBSALD
--------
207372142<
:otati ca liniile din tabela 24P sint considerate ca un singur grup.
O functie de grup poate fi aplicata pe un subset de linii din tabela prin folosirea clauzei
MH2-2.
Pentru a gasi salariul minim cistigat de un functionar, introducem :
SELECT MIN(SAL)
FROM EMP
WHERE JOB = 'CLERK';
MINBSALD
--------
>00
Pentru a numara anga+atii din departamentul #<, introducem :
SELECT COUNT(*)
FROM EMP
WHERE DEPTNO = 20;
COUNTB4D
--------
?
Clauza <!OUP .
/lauza 7-O3P 8K poate fi folosita pentru a imparti liniile dintr%o tabela in grupuri mai
mici. 0unctiile de rup pot fi folosite pentru a intorece informatii sumare pentru fiecare
grup.
Pentru a calcula salariul mediu pentru fiecare functie diferita, introducem:
SELECT JOB, AVG(SAL)
FROM EMP
GROUP BY JOB;
JOB AHGBSALD
------- -----------
ANALYST 3000
CLERK 10377?
MANAGER 27?>733333
PRESIDENT ?000
SALESMAN 1400
Excluderea li&iilor ci&d ,olosi( <!OUP .
iniile pot fi e&cluse mai intii cu o clauza MH2-2, inainte de a le imparti in grupuri.
Pentru a determina salariul mediu pentru fiecare functie in afara de manager,
introducem :
SELECT JOB, AVG(SAL)
FROM EMP
WHERE JOB != 'MANAGER'
GROUP BY JOB;
JOB AHGBSALD
------- -----------
ANALYST 3000
CLERK 10377?
PRESIDENT ?000
SALESMAN 1400
Solutii
17 SELECT MINBSALD MINIMUM
27 .ROM EMP5
G.
47 SELECT MANBSALD8 MINBSALD8 AHGBSALD
?7 .ROM EMP5
A.
77 SELECT JOB8
>7 MANBSALD MANIMUM8
<7 MINBSALD MINIMUM
107 .ROM EMP
117 GROUP BY JOB5
1#.
137 SELECT COUNTB4D MANAGERS
147 .ROM EMP
1?7 WHERE JOB I CMANAGERC5
1A.
177 SELECT JOB8
1>7 AHGBSALD AHSAL8
1<7 AHGBSAL 4 12 E NHLBCOMM8 0DD AHCOMP
207 .ROM EMP
217 GROUP BY JOB5
##.
237 SELECT MANBSALD - MINBSALD DI..ERENCE
247 .ROM EMP5
#F.
2=7 SELECT DEPTNO8 COUNTB4D
277 .ROM EMP
2>7 GGROUP BY DEPTNO
2<7 HAHING COUNTB4D ) 35
G<.
317 SELECT EMPNO
327 .ROM EMP
337 GROUP BY EMPNO
347 HAHING COUNTB4D ) 15
GF.
3=7 SELECT MGR8 MINBSALD
377 .ROM EMP
3>7 GROUP BY MGR
3<7 HAHING MINBSALD )I 1000
407 ORDER BY MINBSALD5
61.
CAPITOLUL 7
E>"!A<E!EA DA"ELO! D#$ MA# MUL" DE O
"AELA
?oi&
=oin%ul este folosit cind o cerere S" necesita date din mai multe tabele din baza de date.
iniile dintr%o tabela pot fi unite cu liniile din alta tabela in functie de valorile comune
e&istente in coloanele corespunzatoare.
Sint doua tipuri de conditie de +oin :
1. 2Zui%+oin
#. :on%eZui%+oin
E@ui+Aoi&
Pentru a determina anga+atii din departamente, vom compara valorile din coloana
*2P(:O a anga+atului cu aceleasi valori din *2P(:O din tabela *2P(. -elatia dintre
tabela 24P si *2P( este un eZui%+oin, in care valorile din coloana *2P(:O din ambele
tabele sint egale. 'Operatorul de comparatie folosit este I.)
O conditie de +oin este specificata in clauza MH2-2:
SELECT column(s)
FROM tables
WHERE join condition is ...
Pentru a face +oin pe cele doua tabele 24P si *2P(, introducem:
SELECT ENAME, JOB, DNAME
FROM EMP, DEPT
WHERE EMP>DEPTNO + DEPT>DEPTNO;
ENAME JOB DNAME
------- ------ -------
CLARK MANAGER ACCOUNTING
MILLER CLERK ACCOUNTING
KING PRESIDENT ACCOUNTING
SMITH CLERK RESEARCH
SCOTT ANALYST RESEARCH
JONES MANAGER RESEARCH
ADAMS CLERK RESEARCH
.ORD ANALYST RESEARCH
ALLEN SALESMAN SALES
BLAKE MANAGER SALES
TURNER SALESMAN SALES
JAMES CLERK SALES
MARTIN SALESMAN SALES
WARD SALESMAN SALES

5om observa ca acum fiecare anga+at are listat numele departamentului lui.
iniile din 24P sint combinate cu liniile din *2P( si sint intoarse doar liniile pentru
care valorile 24P.*2P(:O si *2P(.*2P(:O sint eale.
Observati ca, conditia de +oin specifica numele coloanei precedat de numele
tabelei.Aceasta este o necesitate cind numele coloanelor sint aceleasi in ambele
tabele.2ste necesar sa specificam e&act ce coloane sint referite.
Aceasta necesitate este de asemenea aplicata coloanelor care pot fi ambigue in clauzele
S22/( sau O-*2- 8K.
Pentru a recunoaste diferentele dintre coloana *2P(:O din 24P si coloana *2P(:O
din *2P(, introducem:
SELECT DEPT.DEPTNO, ENAME, JOB, DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
ORDER BY DEPT.DEPTNO;
DEPTNO ENAME JOB DNAME
-------- ------- ------ -------
10 CLARK MANAGER ACCOUNTING
10 MILLER CLERK ACCOUNTING
10 KING PRESIDENT ACCOUNTING
20 SMITH CLERK RESEARCH
20 SCOTT ANALYST RESEARCH
20 JONES MANAGER RESEARCH
20 ADAMS CLERK RESEARCH
20 .ORD ANALYST RESEARCH
30 ALLEN SALESMAN SALES
30 BLAKE MANAGER SALES
30 TURNER SALESMAN SALES
30 JAMES CLERK SALES
30 MARTIN SALESMAN SALES
30 WARD SALESMAN SALES
Observati ca fiecarui numar de departament din tabela *2P( i se face +oin pentru a se
potrivi cu numerele de departament din tabela 24P.*e e&emplu, trei anga+ati lucreaza in
departamentul 1< % Accounting % deci e&ista trei potri% viri.Prin urmare A//O3:(,:7
este afisat pentru fiecare anga+at din acel depar% tament.
Folosirea alias-urilor de tabela
Poate fi foarte plictisitor sa tiparesti numele tabelelor repetat.2tichete temporare 'sau
alias%uri) pot fi folosite in clauza 0-O4.Aceste nume temporare sint valide doar in
instructiunea S22/( curenta.Alias%urile de tabele trebuie de asemenea sa fie specificate
in clauza S22/(.Aceasta creste efectiv viteza cererii, in care conte&tul contine
informatii foarte e&acte.
Alias%urile de tabela sint folosite in urmatorul conte&t:
SELECT E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY D.DEPTNO;
Alias%urile de tabele pot fi de lungime de ma&im G< de caractere, dar mai scurte sint mai
bune.*e asemenea incercati sa le faceti cit mai e&plicite.
*aca un alias de tabela este folosit pentru un nume particular de tabela in clauza 0-O4,
atunci acel alias trebuie sa fie substituit pentru numele tabelei in conte&tul din S22/(.
Produs
---------------------------------------------------------------------
--
| EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
|
---------------------------------------------------------------------
--
|
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII|
---------------------------------------------------------------------
--
| 77>> SCOTT ANALYST 7?== 0?-MAR->4 3000 20
|---
---------------------------------------------------------------------
-- |
|
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
| |
---------------------------------------------------------------------
-- |

|

|

|

|
----------------------------------------------------------------
-----|
|
|
|
|
| -------------------------------
| | DEPTNO DNAME LOC |
| -------------------------------
|--------| 10 ACCOUNTING NEW YORK |
|--------| 20 RESEARCH DALLAS |
|--------| 30 SALES CHICAO |
|--------| 40 OPERATIONS BOSTON |
-------------------------------
,n absenta unei conditii MH2-2, fiecare linie din 24P este unita in ordine cu fiecare
linie din *2P(.
Se vor afisa FG de linii.
Produs
/ind o conditie de +oin este invalida sau este omisa, rezultatul este omis si toate
combinatiile de linii vor fi listate.
3n produs tinde sa genereze un numar mare de linii si rezultatul sau este rar
folosit.(rebuie intotdeauna inclusa o conditie de +oin intr%o clauza MH2-2, in afara de
cazul in care este necesara combinarea tuturor liniilor din toate tabelele.
$o&+E@ui+?oi&
-elatia dintre tabelele 24P si SA7-A*2 este un non%eZui%+oin, in care nici o coloana
din 24P nu corespunde direct cu o coloana din SA7-A*2.-elatia este obtinuta
folosind un operator, altul decit operatorul de egalitate 'I).Pentru a evalua gradatia unui
ana+at, salariul lui trebuie sa fie intre salariul minim si salariul ma&im.
Operatorul 82(M22: este folosit pentru a construi conditia, introducem:
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
ENAME SAL GRADE
--------- ------- ---------
SMITH >00700 1
ADAMS 18100700 1
JAMES <?0700 1
WARD 182?0700 2
MARTIN 182?0700 2
MILLER 18300700 2
ALLEN 18=00700 3
TURNER 18?00700 3
JONES 28<7?700 4
BLAKE 28>?0700 4
CLARK 284?0700 4
SCOTT 38000700 4
.ORD 38000700 4
KING ?8000700 ?
Alti operatori cum ar fi SI si TI pot fi folositi, oricum 82(M22: este cel mai
simplu.:u uitati sa specificati mai intii valoarea minima si ultima va% loarea ma&ima cind
folositi 82(M22:.*in nou sint folosite alias%uri de tabele, nu din cauza posibilelor
ambiguitati, dar din motive de performanta.
!e)uli 'e&tru Aoi&+ul ta%elelor
Pentru a face +oin pe cele trei tabele este necesar sa construim doua condi% tii de
+oin.Pentru a face +oin pe patru tabele sint necesare minim trei condi% tii de +oin.
O regula simpla este:
numarul minim de conditii de +oin I numarul de tabele % 1
Aceasta regula nu poate fi aplicata daca tabela are o cheie primara, care identifica in mod
unic fiecare linie 'cheile primare sint e&plicate mai tirziu in manual).
Si&taxa
SELECT [DISTINCT] {[tabela].* | expresie [alias], ...}
FROM tabela [alias], ...
WHERE [conditie de join] ...
AND [conditie de linie] ...
OR [alta conditie de linie]
GROUP BY {expresie | coloana}
HAVING {conditie de grup}
ORDER BY {expresie | coloana} [ASC | DESC]
O%servatii
Se pot specifica conditii de +oin impreuna cu alte conditii 'non +oin)>
*e asemenea trebuie sa fiti atenti la precedenta operatorilor cind folo% siti
predicatul O-.
Exercitii - Join-uri simle
Aceste e&&ercitii au intentia de a va capata e&perienta practica in e&trage% rea datelor din
mai mult decit o tabela si includ teme discutate in capitolele anterioare.
"e(a
1. Afisati numele tuturor anga+atilor si numele departamentului lor, in ordi% nea
numelui departamentelor.
27 ENAME DNAME
37 -------- ---------
47 CLARK ACCOUNTING
?7 MILLER ACCOUNTING
=7 KING ACCOUNTING
77 SMITH RESEARCH
>7 SCOTT RESEARCH
<7 JONES RESEARCH
107 ADAMS RESEARCH
117 .ORD RESEARCH
127 ALLEN SALES
137 BLAKE SALES
147 TURNER SALES
1?7 JAMES SALES
1=7 MARTIN SALES
177 WARD SALES
1>7
1<7 H"' @/ -0#0!1$10 14 /%'09/-1'$'/7
#<. Afisati numele tuturor anga+atilor, numarul si numele departamentului.
217
227
237 ENAME DEPTNO DNAME
247 -------- --------- ---------
2?7 CLARK 10 ACCOUNTING
2=7 MILLER 10 ACCOUNTING
277 KING 10 ACCOUNTING
2>7 SMITH 20 RESEARCH
2<7 SCOTT 20 RESEARCH
307 JONES 20 RESEARCH
317 ADAMS 20 RESEARCH
327 .ORD 20 RESEARCH
337 ALLEN 30 SALES
347 BLAKE 30 SALES
3?7 TURNER 30 SALES
3=7 JAMES 30 SALES
377 MARTIN 30 SALES
3>7 WARD 30 SALES
3<7
407 H"' @/ -0#0!1$10 14 /%'09/-1'$'/7
61. Afisati numele, localitatea si departamentul anga+atilor al caror salariu lunar este
mai mare ca 1F<<.
427 ENAME LOCATION DNAME
437 -------- ---------- ---------
447 CLARK NEW YORK ACCOUNTING
4?7 KING NEW YORK ACCOUNTING
4=7 JONES DALLAS RESEARCH
477 .ORD DALLAS RESEARCH
4>7 SCOTT DALLAS RESEARCH
4<7 ALLEN CHICAGO SALES
?07 BLAKE CHICAGO SALES
?17
?27 H"' @/ -0#0!1$10 7 /%'09/-1'$'/7
FG. Afisati lista salariilor, gradatiilor anga+atilor.
?47 ENAME JOB SAL GRADE
??7 ---------- ------- ------- ----------
?=7 SMITH CLERK >00700 1
?77 ADAMS CLERK 18100700 1
?>7 JAMES CLERK <?0700 1
?<7 WARD SALESMAN 182?0700 2
=07 MARTIN SALESMAN 182?0700 2
=17 MILLER CLERK 18300700 2
=27 ALLEN SALESMAN 18=00700 3
=37 TURNER SALESMAN 18?00700 3
=47 JONES MANAGER 28<7?700 4
=?7 BLAKE MANAGER 28>?0700 4
==7 CLARK MANAGER 284?0700 4
=77 SCOTT ANALYST 38000700 4
=>7 .ORD ANALYST 38000700 4
=<7 KING PRESIDENT ?8000700 ?
7<. istati doar anga+atii cu gradatia G.
717 ENAME JOB SAL GRADE
727 ---------- ------- ------- ----------
737 ALLEN SALESMAN 18=00700 3
747 TURNER SALESMAN 18?00700 3
7F. istati toti anga+atii din *allas.
7=7 ENAME SAL LOCATION
777 ---------- ------- ----------
7>7 SMITH >00700 DALLAS
7<7 SCOTT 38000700 DALLAS
>07 JONES 28<7?700 DALLAS
>17 ADAMS 18100700 DALLAS
>27 .ORD 38000700 DALLAS
Alte e&ercitii daca aveti timp:
@G. Afisati numele anga+atilor, functia, salariul, gradatia si numele departa% mentului
pentru toti anga+atii din companie in afara de functionari.Sortati dupa salariu,
afisind mai intii salariul cel mai mare.
>47
>?7
>=7 ENAME JOB SAL GRADE DNAME
>77 -------- --------- -------- --------- ---------
>>7 KING PRESIDENT ?8000700 ? ACCOUNTING
><7 .ORD ANALYST 38000700 4 RESEARCH
<07 SCOTT ANALYST 38000700 4 RESEARCH
<17 JONES MANAGER 28<7?700 4 RESEARCH
<27 BLAKE MANAGER 28>?0700 4 SALES
<37 CLARK MANAGER 284?0700 4 ACCOUNTING
<47 ALLEN SALESMAN 18=00700 3 SALES
<?7 TURNER SALESMAN 18?00700 3 SALES
<=7 MARTIN SALESMAN 182?0700 2 SALES
<77 WARD SALESMAN 182?0700 2 SALES
<>7
<<7 H"' @/ -0#0!1$10 10 /%'09/-1'$'/7
1<<. Afisati urmatoarele detalii pentru anga+atii care cistiga GA<<<Q pe an sau
care sint functionari.
1017
1027
1037 ENAME JOB ANNUALGSAL DEPTNO DNAME
GRADE
1047 --------- ------- -------------- --------- ---------
--------
10?7 .ORD ANALYST 3=000 20 RESEARCH 4
10=7 SCOTT ANALYST 3=000 20 RESEARCH 4
1077 MILLER CLERK 1?=00 10 ACCOUNTING 2
10>7 JAMES CLERK 11400 30 SALES 1
10<7 ADAMS CLERK 13200 20 RESEARCH 1
1107 SMITH CLERK <=00 20 RESEARCH 1
1117
1127 H"' @/ -0#0!1$10 = /%'09/-1'$'/7
!olutii
17 SELECT ENAME8 DNAME
27 .ROM EMP8 DEPT
37 WHERE EMP7DEPTNO I DEPT7DEPTNO5
6.
?7 SELECT ENAME8 E7DEPTNO8 DNAME
=7 .ROM EMP E8 DEPT D
77 WHERE E7DEPTNO I D7DEPTNO5
@.
<7 SELECT ENAME8 LOC LOCATION8 DNAME
107 .ROM EMP8 DEPT
117 WHERE EMP7DEPTNO I DEPT7DEPTNO
127 AND SAL ) 1?005
1G.
147 SELECT ENAME8 JOB8 SAL8 GRADE
1?7 .ROM EMP8 SALGRADE
1=7 WHERE SAL BETWEEN LOSAL AND HISAL5
17.
1>7 SELECT ENAME8 JOB8 SAL8 GRADE
1<7 .ROM EMP8 SALGRADE
207 WHERE SAL BETWEEN LOSAL AND HISAL
217 AND GRADE I 35
##.
237 SELECT ENAME8 SAL8 LOC LOCATION
247 .ROM EMP8 DEPT
2?7 WHERE EMP7DEPTNO I DEPT7DEPTNO
2=7 AND LOC I CDALLASC5
#7.
2>7 SELECT ENAME8 JOB8 SAL8 GRADE8 DNAME
2<7 .ROM EMP8 SALGRADE8 DEPT
307 WHERE EMP7DEPTNO I DEPT7DEPTNO
317 AND SAL BETWEEN LOSAL AND HISAL
327 AND JOB MI CCLERKC
337 ORDER BY SAL DESC5
G6.
3?7 SELECT ENAME8 JOB8 SAL 4 12 ANNUALGSAL8 D7DEPTNO8 DNAME8
GRADE
3=7 .ROM EMP E8 SALGRADE8 DEPT D
377 WHERE E7DEPTNO I D7DEPTNO
3>7 AND SAL BETWEEN LOSAL AND HISAL
3<7 AND BSAL 4 12 E NHLBCOMM8 0D I 3=00 OR E7JOB I CCLERKCD
407 ORDER BY E7JOB5
61.
CAPITOLUL 8
AL"E ME"ODE DE ?O#$
Acest capitol prezinta diferite metode de constructie a conditiilor de +oin.
?oi& exter&
*aca o linie nu satisface o conditie de +oin, atunci linia respectiva nu va apare in
rezultatul cererii.*e fapt, in conditia de eZui%+oin pentru 24P si *2P(, departamentul 6<
nu apare.Aceasta se intimpla deoarece nu este nici un anga+at in departamentul 6<.
----------------------------------------------------------------------
--
| JOIN ENTERN
|
|
|
| ------------------------------------------------------
|
| | EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO |
|
| ------------------------------------------------------ Z
|
| |IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII|------
|
| ------------------------------------------------------ |
|
| |
|
| --------------------------------------------------------------|
|
| |
|
| | --------------------------------
|
| | | DEPTNO DNAME LOC |
|
| | --------------------------------
|
| | |IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII|
|
| | --------------------------------
|
| |---------| 40 OPERATIONS BOSTON |
|
| --------------------------------
|
|
|
----------------------------------------------------------------------
--
:u e&ista nici un anga+at in departamentul 6<, dar el poate fi afisat facind +oin intre
departamentul 6< cu o linie vida.
iniile ce lipsesc pot fi returnate daca este folosit un operator de +oin e&tern in conditia de
+oin.Operatorul este semnul plus inclus intre paranteze 'B) si este plasat in partea tabelei
deficiente in informatii.Operatorul are ca efect crearea uneia sau mai multor linii vide cu
care una sau mai multe linii din tabela nedeficitara in informatii poate face +oin.
O linie vida este creata pentru fiecare linie adaugata in tabela nedefici% tara in informatii.
SELECT E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
AND D.DEPTNO IN (30, 40);
ENAME DEPTNO DNAME
--------- --------- ---------
ALLEN 30 SALES
BLAKE 30 SALES
TURNER 30 SALES
JAMES 30 SALES
MARTIN 30 SALES
WARD 40 OPERATIONS
Operatorul de +oin e&tern pote apare doar intr%o parte a e&presiei si anume in partea in
care lipsesc informatii.5or fi intoarse acele linii dintr%o ta% bela care nu au corespondent
direct in cealalta tabela.
Alte restrictii pentru +oin e&tern sint:
nu se poate face +oin e&tern a unei tabele cu mai mult de o tabela ce di% fera de
prima intr%o singura declaratie S22/(>
o conditie ce include un +oin e&tern nu poate folosi operatorul ,: sau nu i se poate
fi unita cu alte conditii prin operatorul O-.
?oi&+ul u&ei ta%ele cu ea i&sasi
2ste posibila folosirea etichetelor de tabele 'alias%urilor) pentru a face +oin unei tabele cu
ea insasi, ca si cum ar fi doua tabele separate.Aceasta permite ca liniilor dintr%o tabela sa
li se faca +oin cu liniile din aceeasi tabela.
3rmatoarea cerere listeaza toti anga+atii care cistiga mai putin ca sefii lor :
SELECT E.ENAME EMP_NAME, E.SAL EMP_SAL,
M.ENAME MGR_NAME, M.SAL MGR_SAL
FROM EMP E, EMP M
WHERE E.MGR = E.EMPNO
AND E.SAL < M.SAL;
EMPGNAME EMPGSAL MGRGNAME MGRGSAL
----------- ----------- ----------- ----------
ALLEN 1=00 BLAKE 2>?0
WARD 12?0 BLAKE 2>?0
MARTIN 12?0 BLAKE 2>?0
TURNER 1?00 BLAKE 2>?0
JAMES <?0 BLAKE 2>?0
MILLER 1300 CLARK 24?0
ADAMS 1100 SCOTT 3000
JONES 2<7? KING ?000
BLAKE 2>?0 KING ?000
CLARK 24?0 KING ?000
SMITH >00 .ORD 3000
Observati ca, clauza 0-O4 se refera la 24P de doua ori si ca urmare 24P are asociata
cite un alias pentru ambele cazuri % 2 si 4.2ste a+utator ca alias% urile asociate sa fie cu
inteles, de e&emplu 2 inseamna anga+ati 'emplo?ees) si 4 inseamna sefi 'managers).
/lauza +oin poate fi e&primata:
"unde numarul sefului anga+atului este acelasi cu numarul anga+atului se% fului lui".
O'eratori de (ulti(i
,n cadrul acestui capitol vor fi discutate reuniunea, intersectia si dife% renta.
-euniunea, intersectia si diferenta sint folositoare in constructia cereri% lor care se refera
la tabelediferite.2le combina rezultatele a doua sau mai multe declaratii select in unul
singur.O cerere poate fi formata din doua sau mai multe declaratii S" inlantuite prin
operatori de multimi.Operatorii de multimi sint numiti +oin%uri verticale, deoarece +oin%ul
nu se face in raport cu liniile din cele doua tabele, ci in raport cu coloanele.
,n urmatoarele trei e&emple, cererile sint aceleasi, dar operatorul este diferit in fiecare
caz, generindu%se rezultate diferite pentru cereri.
!eu&iu&ea
Pentru a lista toate liniile diferite generate de fiecare din cereri, introducem:
SELECT JOB
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT JOB
FROM EMP
WHERE DEPTNO = 30;
JOB
-----
CLERK
MANAGER
PRESIDENT
SALESMAN
U$#O$ ALL
Pentru a lista toate liniile 'inclusiv duplicatele) generate de fiecare din cereri, introducem:
SELECT JOB
FROM EMP
WHERE DEPTNO = 10
UNION ALL
SELECT JOB
FROM EMP
WHERE DEPTNO = 30;
JOB
-----
PRESIDENT
MANAGER
CLERK
MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK
#&tersectia
Pentru a lista doar liniile generate de ambele cereri, introducem:
SELECT JOB
FROM EMP
WHERE DEPTNO = 10
INTERSECT
SELECT JOB
FROM EMP
WHERE DEPTNO = 30;
JOB
-----
CLERK
MANAGER
Di,ere&ta
Pentru a lista toate liniile generate de prima cerere care nu sint in a doua cerere,
introducem:
SELECT JOB
FROM EMP
WHERE DEPTNO = 10
MINUS
SELECT JOB
FROM EMP
WHERE DEPTNO = 30;
JOB
-----
PRESIDENT
2ste posibil sa se construiasca cereri cu mai multi operatori de multimi. *aca sint folositi
mai multi operatori de multimi, ordinea e&ecutiei pentru declaratiile S" este de sus in
+os.Parantezele pot fi folosite pentru a face ordinea e&ecutiei alternativa.
O!DE! .
O-*2- 8K poate fi folosita o data intr%o cerere ce foloseste operatori de multimi.*aca
este folosita, clauza O-*2- 8K trebuie plasata la sfirsitul cererii.*eoarece pot fi
selectate coloane diferite in fiecare S22/( nu se pot numi coloanele in clauza O-*2-
8K.,n scimb, coloanele din O-*2- 8K trebuie sa fie referite prin pozitiile relative din
lista din S22/(.
SELECT EMPNO, ENAME, SAL
FROM EMP
UNION
SELECT ID, NAME, SALARY
FROM EMP_HISTORY
ORDER BY 2;
Observati ca in clauza O-*2- 8K un numar '#) este folosit pentru a indica pozitia
coloanei 2:A42 in lista din S22/(.Aceasta inseamna ca liniile vor fi sortate in ordine
ascendenta a numelui anga+atilor.
!e)uli 'e&tru ,olosirea o'eratorilor de (ulti(i
1. *eclaratiile S22/( trebuie sa aiba acelasi numar de coloane.
#. /oloanele corespunzatoare trebuie sa aiba acelasi tip 'corespondenta este
pozitionala).
G. iniile duplicate sint automat eliminate 'nu poate fi folosit *,S(,:/().
6. :umele coloanelor din prima cerere apar in rezultat.
F. /lauza O-*2- 8K apare la sfirsitul declaratiei.
A. O-*2- 8K se face doar dupa pozitia coloanei 'nu dupa numele coloanei).
7. Operatorii de multimi pot fi folositi in subcereri.
@. 8locurile de cerere sint e&ecutate de sus in +os.
;. Operatorii de multimi multipli pot fi folositi cu paranteze, daca este necesara
schimbarea secventei e&ecutiei.
Exercitii
Aceste e&ercitii va vor da posibilitatea sa descoperiti diferite metode de +oin si sa capatati
e&perienta la folosirea operatorilor de multimi.
"e(a
1. Afisati departamentul care nu are nici un anga+at.
27 DEPTNO DNAME
37 -------- --------
47 40 OPERATIONS
F. Afisati toti anga+atii 'nume si numar) impreuna cu numele si numarul se% fului.
=7
77 EMPNO ENAME MGRNO MGRGNAME
>7 -------- --------- -------- ------------
<7 77>> SCOTT 7?== JONES
107 7<02 .ORD 7?== JONES
117 74<< ALLEN 7=<> BLAKE
127 7?21 WARD 7=<> BLAKE
137 7=?4 MARTIN 7=<> BLAKE
147 7>44 TURNER 7=<> BLAKE
1?7 7<00 JAMES 7=<> BLAKE
1=7 7<34 MILLER 77>2 CLARK
177 7>7= ADAMS 77>> SCOTT
1>7 7?== JONES 7>3< KING
1<7 7=<> BLAKE 7>3< KING
207 77>2 CLARK 7>3< KING
217 73=< SMITH 7<02 .ORD
227
237 H"' @/ -0#0!1$10 13 /%'09/-1'$'/7
#6. 4odificati solutia de la intrebarea # pentru a afisa C,:7 care nu are sef.
2?7 EMPNO ENAME MGRNO MGRGNAME
2=7 -------- --------- -------- ------------
277 7>3< KING
2>7 77>> SCOTT 7?== JONES
2<7 7<02 .ORD 7?== JONES
307 74<< ALLEN 7=<> BLAKE
317 7?21 WARD 7=<> BLAKE
327 7=?4 MARTIN 7=<> BLAKE
337 7>44 TURNER 7=<> BLAKE
347 7<00 JAMES 7=<> BLAKE
3?7 7<34 MILLER 77>2 CLARK
3=7 7>7= ADAMS 77>> SCOTT
377 7?== JONES 7>3< KING
3>7 7=<> BLAKE 7>3< KING
3<7 77>2 CLARK 7>3< KING
407 73=< SMITH 7<02 .ORD
417
427 H"' @/ -0#0!1$10 14 /%'09/-1'$'/7
6G. 7asiti functia care a fost ocupata in prima +umatate a anului 1;@G si aceeasi
functie a fost ocupata in timpul aceleiasi perioade in 1;@6.
447 JOB
4?7 ------
4=7 CLERK
477
4>7 H$ @/ -0#0!1$1$ " /%'09/-1'$'07
,ncercati si urmatoarele daca aveti timp:
6;. 7asiti toti anga+atii care au venit in companie inaintea sefilor lor.
?07 EMPLOYEE HIREDATE MANAGER HIREDATE
?17 ----------- ----------- ---------- -----------
?27 ALLEN 1?-AUG->3 BLAKE 11-JUN->4
?37 WARD 2=-MAR->4 BLAKE 11-JUN->4
?47 MARTIN 0?-DEC->3 BLAKE 11-JUN->4
??7 TURNER 04-JUN->4 BLAKE 11-JUN->4
?=7 MILLER 21-NOH->3 CLARK 14-MAY->4
?77 JONES 31-OCT->3 KING 0<-JUL->4
?>7 BLAKE 11-JUN->4 KING 0<-JUL->4
?<7 CLARK 14-MAY->4 KING 0<-JUL->4
=07 SMITH 13-JUN->3 .ORD 0?-DEC->3
=17
=27 H"' @/ -0#0!1$10 < /%'09/-1'$'/7
AG. 7asiti alta cerere pentru intrebarea 1.
=47 DEPTNO DNAME
=?7 --------- --------
==7 40 OPERATIONS
Solutii
17
27
37 SELECT D7DEPTNO8 DNAME
47 .ROM EMP E8 DEPT D
?7 WHERE E7DEPTNOBED I D7DEPTNO
=7 AND E7EMPNO IS NULL5
7.
>7 SELECT EMPS7EMPNO8 EMPS7ENAME8
<7 MGRS7EMPNO MGRNO8 MGRS7ENAME MGRGNAME
107 .ROM EMP EMPS8 EMP MGRS
117 WHERE EMPS7MGR I MGRS7EMPNO5
1#.
137 SELECT EMPS7EMPNO8 EMPS7ENAME8
147 MGRS7EMPNO MGRNO8 MGRS7ENAME MGRGNAME
1?7 .ROM EMP EMPS8 EMP MGRS
1=7 WHERE EMPS7MGR I MGRS7EMPNOBED5
17.
1>7 SELECT JOB
1<7 .ROM EMP
207 WHERE HIREDATE BETWEEN C01-JAN->3C AND C30-JUN->3C
217 INTERSECT
227 SELECT JOB
237 .ROM EMP
247 WHERE HIREDATE BETWEEN C01-JAN->4C AND C30-JUN->4C5
#F.
2=7 SELECT E7ENAME EMPLOYEE8 E7HIREDATE8
277 M7ENAME MANAGER8 M7HIREDATE
2>7 .ROM EMP E8 EMP M
2<7 WHERE E7MGR I M7MGRNO
307 AND E7HIREDATE J M7HIREDATE5
G1.
327 SELECT DEPTNO8 DNAME
337 .ROM DEPT
347 MINUS
3?7 SELECT EMP7DEPTNO8 DNAME
3=7 .ROM EMP8 DEPT
377 WHERE EMP7DEPTNO I DEPT7DEPTNO5
G@.
CAPITOLUL 9
SUCE!E!#
,n acest capitol se vor prezenta alte caracteristici ale declaratiei S22/(, cum ar fi cereri
continute in clauza MH2-2 sau HA5,:7 ale altei decla% ratii S".
Su%cereri ascu&se
O subcerere este o declaratie S22/( care este ascunsa in interiorul altei declaratii
S22/( si care intoarce rezultate intermediare.
*e e&emplu:
SELECT column1, column2, ...
FROM table
WHERE column =
(SELECT column
FROM table
WHERE condition)
Subcererea este adesea referita ca un subselect sau ca un S22/( interior> in general,
subcererea se e&ecuta prima si rezultatul sau este folosit pentru a completa conditia
cererii principale sau a cererii e&terne.0olosirea sub% cererilor permite consruirea de
comenzi puternice pornind de la unele simple. /ererea ascunsa poate fi foarte folositoare
cind este nevoie sa fie selectate linii dintr%o tabela printr%o conditie ce depinde de date din
propria tabela.
Su%cereri ce i&torc o li&ie
Pentru a gasi anga+atul care cistiga salariul minim din companie 'salariul minim este o
cantitate necunoscuta), trebuie parcursi doi pasi:
1. 7asirea salariului minim:
2.
3. SELECT MIN(SAL)
4. FROM EMP;
?7
=7 MINBSALD
77 ----------
>7 >00
;. 7asirea anga+atului care cistiga salariul minim:
10.
11.
12. SELECT ENAME, JOB, SAL
13. FROM EMP
14. WHERE SAL = (cel mai mic salariu care este cunoscut)
Putem combina cele doua cereri ca o subcerere ascunsa:
SELECT ENAME, JOB, SAL
FROM EMP
WHERE SAL = (SELECT MIN(SAL)
FROM EMP);
ENAME JOB SAL
------- ------ -----
SMITH CLERK >00
Cum sint relucrate subcererile ascunse "
O declarartie S22/( poate fi considerata ca un bloc de cerere.2&emplul de mai sus
consta din doua blocuri de cerere % cererea principala si cererea in% terioara.
*eclaratia S22/( interioara sau blocul de cerere este e&ecutata prima, producind un
rezultat al cererii: @<<.8locul de cerere principal este apoi prelucrat si foloseste valoarea
intoarsa de cererea interioara pentru a com% pleta conditia de cautare.*eci, cererea
principala in final va arata in felul urmator:
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE SAL = 800;
,n e&emplul de mai sus, @<< este o valoare unica.Subcererea care a intors valoarea @<< se
numeste subcerere ce intoarce o singura linie./ind o subcerere intoarce doar o linie, va fi
folosit un operator logic sau un operator de com% paratie.*e e&emplu: I, S, T, SI, etc.
Pentru a gasi toti anga+atii ce au aceeasi functie ca 8AC2, vom introduce:
SELECT ENAME, JOB
FROM EMP
WHERE JOB = (SELECT JOB
FROM EMP
WHERE ENAME = 'BLAKE');
ENAME JOB
------- -----
JONES MANAGER
BLAKE MANAGER
CLARK MANAGER
/ererea interioara intoarce functia lui 8AC2, care este folosita in partea dreapta a
clauzei MH2-2 di cererea principala 'dupa operatorul de comparatie).
Su%cereri ce i&torc (ai (ult de o li&ie
3rmatoarea cerere gaseste anga+atii care au salariul egal cu salariul minim din fiecare
departament:
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE SAL IN
(SELECT MIN(SAL)
FROM EMP
GROUP BY DEPTNO);
ENAME SAL DEPTNO
------- ----- ---------
SMITH >00 20
JAMES <?0 30
MILLER 1300 10
Observati ca, cererea interioara are clauza 7-O3P 8K.Aceasta inseamna ca va intoarce
mai mult decit o valoare.*eci este nevoie sa folosim un operator de comparatie multi
linie.,n acest caz, operatorul ,: trebuie sa fie folosit, deoarece rezulta o lista de valori.
-ezultatul obtinut nu arata si departamentul in care lucreaza anga+atul.
*eoarece se compara doar valorile salariilor, cererea interioara poate intoar% ce o valoare
simpla, pentru ca el cauta cel mai mic salariu pentru unul din departamente, nu in mod
necesar departamentul propriu al anga+atului.Prin urmare, cererea poate fi rescrisa pentru
a gasi combinatia salariul anga+a% tului si numarul departamentului cu salariul minim si
numarul departamentului:
Co('ararea a (ai (ultor valori
3rmatoarea cerere ggaseste anga+atii care cistiga salariul cel mai mic din departamentul
lor:
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE (SAL, DEPTNO) IN
(SELECT MIN(SAL), DEPTNO
FROM EMP
GROUP BY DEPTNO);
ENAME SAL DEPTNO
------- ----- ---------
SMITH >00 20
JAMES <?0 30
MILLER 1300 10
/ererea de mai sus compara o pereche de coloane.
Observatie : coloanele din partea stinga a conditiei de cautare sint in pa% ranteze si fiecare
coloana este separata printr%o virggula.
/oloanele listate in clauza S22/( a subcererii trebuie sa fie in aceeasi ordine ca si lista
coloanelor dintre paranteze din clauza MH2-2 a cererii e&terne.
/oloanele intoarse de cererea interioara trebuie, de asemenea sa se potri% veasca in numar
si tip de date cu coloanele cu care ele sint comparate in cererea e&terna.
*e e&emplu :
...WHERE (numcolumn, charcolumn) =
(SELECT datecolumn, numcolumn, charcolumn ...
nu este permis.
Erori i&til&ite
/ind o subcerere intoarce mai mult decit o linie si este folosit un opera% tor de comparatie
pt o singura linie, S".Plus da urmatorul mesa+ de eroare:
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE SAL = (SELECT MIN(SAL)
FROM EMP
GROUP BY DEPTNO);
2roare : subcerere ce trebuie sa intoarca o singura linie intoarce mai mult decit o linie.
:u este selectata nici o inregistrare.
*aca cererea interioara nu intoarce nici o linie, va fi dat urmatorul mesa+ de eroare :
SELECT ENAME, JOB
FROM EMP
WHERE JOB = (SELECT JOB
FROM EMP
WHERE ENAME = 'SMITHE');
2roare : subcerere ce trebuie sa intoarca o singura linie nu intoarce nici o linie.
:u este selectata nici o inregistrare.
O'eratorii SOME/A$., ALL
Operatorii A:K sau A pot fi folositi pentru subcererile care intorc mai mult de o
linie.2i sint folositi in clauzele MH2-2 sau HA5,:7 in legatura cu operatorii logici
'I, RI, S, T, TI, SB).
A:K 'sau sinonimul sau SO42) compara o valoare cu fiecare valoare intoarsa de o
subcerere.
Pentru a afisa anga+atii care cistiga mai mult decit cel mai mic salariu din departamentul
G<, introducem :
SELECT ENAME, SAL, JOB, DEPTNO
FROM EMP
WHERE SAL > SOME (SELECT DISTINCT SAL
FROM EMP
WHERE DEPTNO = 30)
ORDER BY SAL DESC;
ENAME SAL JOB DEPTNO
------- ----- ----- --------
KING ?000 PRESIDENT 10
SCOTT 3000 ANALYST 20
.ORD 3000 ANALYST 20
JONES 2<7? MANAGER 20
BLAKE 2>?0 MANAGER 30
CLARK 24?0 MANAGER 10
ALLEN 1=00 SALESMAN 30
MILLER 1300 CLERK 10
WARD 12?0 SALESMAN 30
ADAMS 1100 CLERK 20
/el mai mic salariu din departamentul G< este ;F<Q 'a lui =ames)./ererea principala
intoarce anga+atii care cistiga un salariu mai mare ca salariul minim din departamentul
G<.Asa ca 'T A:K' inseamna mai mare ca minim.'IA:K' este echivalent cu ,:.
/ind se foloseste SO42!A:K, *,S(,:/( este frecvent folosit pentru a impie% dica sa se
selecteze linniile de mai multe ori.
A compara o valoare cu fiecare valoare intoarsa de o subcerere.
3rmatoarea cerere gaseste anga+atii care cistiga mai mult ca fiecare anga+at din
departamentul G< :
SELECT ENAME, SAL, JOB, DEPTNO
FROM EMP
WHERE SAL > ALL (SELECT DISTINCT SAL
FROM EMP
WHERE DEPTNO = 30)
ORDER BY SAL DESC;
ENAME SAL JOB DEPTNO
------- ----- ----- ---------
KING ?000 PRESIDENT 10
SCOTT 3000 ANALYST 20
.ORD 3000 ANALYST 20
JONES 2<7? MANAGER 20
/el mai mare salariu din departamentul G< este #F<Q 'a lui 8la9e), asa ca cererea intoarce
acei anga+ati ai caror salariu este mai mare ca salariul ma&im din departamentul G<, prin
urmare mai mare ca fiecare salariu din de% partament.
Operatorul :O( poate fi folosit cu ,:, A:K sau A.
Clauza 0A6#$< cu su%cereri ascu&se
Subcererile ascunse pot fi folosite de asemenea in clauza HA5,:7.
'Observatie : clauza MH2-2 se refera la o singura linie si clauza HA5,:7 la grupuri de
linii specificate in clauza 7-O3P 8K.)
*e e&emplu, pentru a afisa departamentul'ele) care au un salariu mediu mai mare ca
departamentul G<, introducem :
SELECT DEPTNO, AVG(SAL)
FROM EMP
HAVING AVG(SAL) > (SELECT AVG(SAL)
FROM EMP
WHERE DEPTNO = 30)
GROUP BY DEPTNO;
DEPTNO AHGBSALD
-------- ----------
10 2<1=7====7
20 217?
Pentru a construi o cerere care gaseste functia cu cel mai mare salariu mediu,
introducem :
SELECT JOB, AVG(SAL)
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) = (SELECT MAX(AVG(SAL))
FROM EMP
GROUP BY JOB);
JOB AHGBSALD
----- ----------
PRESIDENT ?000
4ai intii cererea interioara gaseste salariul mediu pentru fiecare grup de functii diferit si
functia 4AU alege cel mai mare salariu mediu.Acea valoare 'F<<<) este folosita in
clauza HA5,:7./lauza 7-O3P 8K din cererea principala este necesara pentru ca lista
ce urmeaza dupa S22/(%ul din cererea principala contine atit o coloana agregat cit si o
coloana non%agragat.
Ordo&area datelor cu su%cereri
:u poate e&ista o clauza O-*2- 8K intr%o subcerere.
-egula este ca poate e&ista doar o singura clauza O-*2- 8K pentru o decla% ratie
S22/( si, daca este specificata, trebuie sa fie ultima clauza din co% manda S22/(.
Su%cereri ascu&se
Subcererile pot fi ascunse 'folosite in interiorul unei subcereri) :
Afisati numele, functia si data anga+arii pentru anga+atii al caror salariu este mai mare ca
cel mai mare salariu din orice departament de vinzari.
SELECT ENAME, JOB, HIREDATE, SAL
FROM EMP
WHERE SAL > (SELECT MAX(SAL)
FROM EMP
WHERE DEPTNO = (SELECT DEPTNO
FROM DEPT
WHERE DNAME = 'SALES'));
ENAME JOB HIREDATE SAL
------- ----- ---------- -----
JONES MANAGER 02-APR->1 2<7?
SCOTT ANALYST 0<-DEC->2 3000
KING PRESIDENT 17-NOH->1 ?000
.ORD ANALYST 03-DEC->1 3000
Li(itele de i(%ricare
imita nivelelor de imbricare pentru o subcerere este #FF.
!e)uli de scriere a cererilor
cererea interioara trebuie sa fie inclusa intre paranteze si trebuie sa fie in partea
dreapta a conditiei.
subcererile nu pot avea clauza O-*2- 8K.
clauza O-*2- 8K apare la sfirsitul declaratiei S22/( principale.
coloanele multiple din lista din S22/( a cererii interioare trebuie sa fie in
aceeasi ordine ca si coloanele ce apar in conditia din clauza cere% rii principale.*e
asemenea mai trebuie sa corespunda si tipul si numarul coloanelor listate.
subcererile sint intotdeauna e&ecutate de la cea mai adinca imbricare pina la
nivelul principal de imbricare, daca nu sint subcereri corelate 'acestea vor fi
discutate mai tirziu).
pot fi folositi operatorii logici si S" la fel de bine ca si A:K si A.
subcererile pot
" intoarce una sau mai multe linii>
" intoarce una sau mai multe coloane>
" folosi 7-O3P 8K sau functii de grup>
" fi folosite inlantuite cu predicate multiple A:* sau O- in aceesi cerere
e&terna.
" uni tabele.
" recupera dintr%o tabela diferita de cea a cererii e&terioare.
" apare in declaratii S22/(, 3P*A(2, *22(2, ,:S2-(, /-2A(2
(A82.
" fi corelate cu o cerere e&terioara.
" folosi operatori de multimi.
Su%cereri corelate
O subcerere corelata este o subcerere care este e&ecutata o data pentru fiecare linie
candidat considerata de cererea principala si care la e&ecutie foloseste o valoare dintr%o
coloana din cererea e&terioara.Aceasta determina ca subcererea corelata sa fie prelucrata
intr%un mod diferit de subcererea ascunsa obisnuita.
O subcerere corelata este identificata prin folosirea unei coloane a cererii e&terioare in
clauza predicatului cererii interioare.
/u o subcerere ascunsa obisnuita, S22/(%ul interior ruleaza primul si se e&ecuta o
data, intorcind valori ce vor fi folosite de cererea principala.Pe de alta parte, o subcerere
corelata se e&ecuta o data pentru fiecare linie candidat considerata de cererea
e&terna./ererea interioara este diri+ata de cererea e&terna.
Pasii de e&ecutie ai unei subcereri corelate :
1. Se obtine linia candidat. 'obtinuta de cererea e&terioara)
#. Se e&ecuta cererea interioara folosind valoarea liniei candidat.
G. Se folosesc valorile rezultate din cererea interioara pentru a pastra sau pentru a
inlatura linia candidat.
6. Se repeta pina nu mai ramine nici o linie candidat.
*esi subcererea corelata se e&ecuta repetat, o data pentru fiecare linie in cererea
principala, aceasta nu inseamna ca subcererile corelate sint mai putin eficiente ca
subcererile necorelate obisnuite.Se va vorbi despre eficienta mai tirziu in acest capitol.
Putem folosi o subcerere corelata pentru a gasi anga+atii care cistiga un salariu mai mare
ca salariul mediu al departamentului lor :
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP E
WHERE SAL > (SELECT AVG(SAL)
FROM EMP
WHERE DEPTNO = E.DEPTNO)
ORDER BY DEPTNO;
EMPNO ENAME SAL DEPTNO
------- ------- ------ --------
7>3< KING ?000 10
7?== JONES 2<7? 20
77>> SCOTT 3000 20
7<02 .ORD 3000 20
74<< ALLEN 1=00 30
7=<> BLAKE 2>?0 30
Putem observa imediat ca este o cerere corelata pentru ca am folosit o co% loana din
S22/(%ul e&tern in clauza MH2-2 din S22/(%ul interior.
Observati ca alias%ul este necesar doar pentru a indeparta ambiguitatea pentru numele
coloanelor.
Sa analizam e&emplul de mai sus folosind tabela 24P :
/ererea principala
1. Se selecteaza prima linie candidat % Smith din departamentul #< cistiga @<< [.
#. 24P in clauza 0-O4 are alias%ul 2 care obtine coloana *2P(:O referita in
clauza MH2-2 a cererii interioare.
G. /lauza MH2-2 compara @<< cu valoarea intoarsa de cererea interioara.
/ererea interioara
6. /alculeaza A57'SA) pentru departamentul anga+atului.
F. 5aloarea departamentului din clauza MH2-2 este departamentul candidatului
'2.*2P(:O), valoare transmisa cererii interioare din coloana *2P(:O a ce%
rerii e&terioare.
A. A57'SA) pentru departamentul lui Smith % #< % este #17F [.
7. inia candidat nu indeplineste conditia, asa ca este indepartata.
@. Se repeta de la pasul 1 pentru urmatoarea linie candidat> A2: din de%
partamentul G< cistiga 1A<< [.
Selectia liniilor candidat continua cu verificarea conditiei ce apare in re% zultatul cererii.
Observatie : o subcerere corelata este semnalata de un nume de coloana, un nume de
tabela sau un alias de tabela in clauza MH2-2, care se refera la va% loarea unei coloane
in fiecare linie candidat din S22/(%ul e&terior.*e aseme% nea subcererea corelata se
e&ecuta repetat pentru fiecare linie candidat in cererea principala.
/omenzile 3P*A(2 pot contine subcereri corelate :
UPDATE EMP E
SET (SAL, COMM) = (SELECT AVG(SAL) * 1.1, AVG(COMM)
FROM EMP
WHERE DEPTNO = E.DEPTNO)
HIREDATE = '11-JUN-85';
O'eratori
/ind se folosesc declaratii S22/( ascunse, operatorii logici, precum si A:K si A
sint toti valizi.,n plus poate fi folosit operatorul 2U,S(S.
Oeratorul E#$!T!
Operatorul 2U,S(S este frecvent folosit cu subcererile corelate.2l testeaza daca o valoare
e&ista ':O( 2U,S(S specifica daca ceva nu e&ista).*aca valoarea e&ista se intoarce
(-32> daca valoarea nu e&ista se intoarce 0AS2.
Pentru a gasi anga+atii ce au cel putin un subordonat, introducem :
SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP E
WHERE EXISTS (SELECT EMPNO
FROM EMP
WHERE EMP.MGR = E.EMPNO)
ORDER BY EMPNO;
EMPNO ENAME JOB DEPTNO
------- ------- ----- --------
7?== JONES MANAGER 20
7=<> BLAKE MANAGER 30
77>2 CLARK MANAGER 10
77>> SCOTT ANALYST 20
7>3< KING PRESIDENT 10
7<02 .ORD ANALYST 20
Sa gasim toti anga+atii al caror departament nu este in tabela *2P( :
SELECT EMPNO, ENAME, DEPTNO
FROM EMP
WHERE NOT EXISTS (SELECT DEPTNO
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO);
:u va fi selectata nici o inregistrare.
Alt mod de a gasi departamentul care nu are nici un anga+at este :
SELECT DEPTNO, DNAME
FROM DEPT D
WHERE NOT EXISTS (SELECT 1
FROM EMP E
WHERE E.DEPTNO = D.DEPTNO);
DEPTNO DNAME
-------- -------
40 OPERATIONS
Observati ca S22/(%ul interior nu este necesar sa intoarca o valoare spe% cifica, asa ca
poate fi selectata o cifra.
De ce sa %olosim o subcerere corelata "
Subcererea corelata este un mod de a 'citi' fiecare linie din tabela si de a compara valorile
din fiecare linie cu datele inrudite.Aceasta este folosita oricind o subcerere trebuie sa
intoarca un rezultat diferit sau o multime de rezultate pentru fiecare linie candidat
considerata de cererea principala./u alte cuvinte, o subcerere corelata este folosita pentru
a raspunde la intre% bari cu mai multe subpuncte al caror raspuns depinde de valoarea din
fiecare linie din cererea parinte.
S22/(%ul interior este e&ecutat normal o data pentru fiecare linie candi% dat.
Considerente de e%icienta
5om e&amina cele doua tipuri de subcereri.(rebuie mentionat ca subcererea corelata 'cu
2U,S(S) poate fi cel mai performant mod pentru unele cereri.
Performanta va depinde de folosirea inde&arilor, de numarul liniilor in% toarse de cereri,
de dimensiunea tabelelor si daca sint necesare tabelele temporare pentru a evalua
rezultatele temporare.(abelele temporare generate de O-A/2 nu sint inde&ate si acest
lucru conduce la degradarea performantelor pentru subcererile ce folosesc ,:, A:K si
A.
/ele de mai sus sint puncte de vedere generale.Performantele sint discutate mai in detaliu
in alte cursuri.
NOT E#$!T! contra NOT $N
*esi intr%o subcerere o operatie :O( ,: poate fi la fel de eficienta ca si :O( 2U,S(S,
:O( 2U,S(S este mult mai sigur daca subcererea intoarce niste valori :3, fata de de
:O( ,: pentru care conditia se evalueaza la 0AS2 cind in lista de comparatii sint
incluse valori :3.
/onsiderind urmatoarea cerere care gaseste anga+atii ce nu au nici un su% bordonat :
SELECT ENAME, JOB
FROM EMP
WHERE EMPNO NOT IN (SELECT MGR
FROM EMP);
:ici o linie nu va fi intoarsa de cererea de mai sus, deoarece coloana 47- contine o
valoare :3.
/ererea corecta este :
SELECT ENAME, JOB
FROM EMP E
WHERE NOT EXISTS (SELECT MGR
FROM EMP
WHERE MGR = E.EMPNO);
ENAME JOB
------- -----
SMITH CLERK
ADAMS CLERK
ALLEN SALESMAN
WARD SALESMAN
MARTIN SALESMAN
TURNER SALESMAN
JAMES CLERK
MILLER CLERK
Exercitii + Su%cereri
Aceste e&ercitii va vor permite sa scrieti cereri complete folosind S22/(% uri ascunse si
S22/(%uri corelate.
"e(a
1. 7asiti anga+atii care cistiga cell mai mare salariu pentru fiecare tip de
functie.Sortati in ordinea descrescatoare a salariului.
27 JOB ENAME SAL
37 ----- ------- ------
47 PRESIDENT KING ?8000700
?7 ANALYST SCOTT 38000700
=7 ANALYST .ORD 38000700
77 MANAGER JONES 28<7?700
>7 SALESMAN ALLEN 18=00700
<7 CLERK MILLER 18300700
107
117 H"' @/ = /%'09/-1$''/ -0#0!1$107
1#. 7asiti anga+atii care cistiga salariul minim pentru functia lor.Afisati rezultatul in
ordine crescatoare a salariului.
137 ENAME JOB SAL
147 ------- ----- -----
1?7 SMITH CLERK >00700
1=7 WARD SALESMAN 182?0700
177 MARTIN SALESMAN 182?0700
1>7 CLARK MANAGER 284?0700
1<7 SCOTT ANALYST 38000700
207 .ORD ANALYST 38000700
217 KING PRESIDENT ?8000700
227
237 H"' @/ 7 /%'09/-1$'/ -0#0!1$107
#6. 7asiti cei mai recenti anga+ati din fiecare departament.Ordonati dupa data
anga+arii.
2?7
2=7 DEPTNO ENAME HIREDATE
277 -------- ------- ----------
2>7 20 ADAMS 04-JUN->4
2<7 10 KING 0<-JUL->4
307 30 JAMES 23-JUL-B4
G1. Afisati urmatoarele detalii pentru orice anga+at care cistiga un salariu mai mare ca
media pentru departamentul lor.Sortati dupa numarul departa% mentului.
327 ENAME SALARY DEPTNO
337 ------- -------- --------
347 KING ?000 10
3?7 JONES 2<7? 20
3=7 SCOTT 3000 20
377 .ORD 3000 20
3>7 ALLEN 1=00 30
3<7 BLAKE 2>?0 30
407
417 H"' @/ -0#0!1$10 = /%'09/-1'$'/7
6#. istati toate departamentele care nu au anga+ati 'folositi o subcerere).
437 DEPTNO DNAME
447 -------- -------
4?7 40 OPERATIONS
6A. Afisati urmatoarele informatii pentru departamentul cu cea mai mare nota de plata
anuala.
477 DEPTNO COMPENSATION
4>7 -------- ---------------
4<7 20 130?00
F<. /are sint primii trei anga+ati in functie de salariul cistigat W Afisati numele lor si
salariul.
?17
?27
?37 ENAME SAL
?47 ------- -----
??7 SCOTT 38000700
?=7 KING ?8000700
?77 .ORD 38000700
F@. ,n ce an s%au anga+at cei mai multi in companie W Afisati anul si numarul
anga+atilor.
?<7 YEAR NUMBER O. EMPS
=07 ------ ----------------
=17 1<>4 >
A#. 4odificati intrebarea 6 pentru a afisa si salariul mediu pentru departa% ment.
=37 ENAME SAL DEPTNO DEPTAHG
=47 ------- ----- -------- ----------
=?7 ALLEN 1=00 30 1?==7====7
==7 BLAKE 2>?0 30 1?==7====7
=77 JONES 2<7? 20 217?
=>7 .ORD 3000 20 217?
=<7 SCOTT 3000 20 217?
707 KING ?000 10 2<1=7====7
717
727 H"' @/ -0#0!1$10 = /%'09/-1'$'/7
7G. Scrieti o subcerere care afiseaza o '.' linga linia celui mai recent anga+at.Afisati
2:A42, H,-2*A(2 si coloana 'ma&date) completata cu '.'.
747
7?7 ENAME HIREDATE MANDATE
7=7 ------- ---------- ---------
777 SMITH 13-JUN->3
7>7 ADAMS 04-JUN->4
7<7 ALLEN 1?-AUG->3
>07 BLAKE 11-JUN->4
>17 CLARK 14-MAY->4
>27 .ORD 0?-DEC->3
>37 JAMES 23-JUL->4 4
>47 JONES 31-OCT->3
>?7 KING 0<-JUL->4
>=7 MARTIN 0?-DEC->3
>77 MILLER 21-NOH->3
>>7 SCOTT 0?-MAR->4
><7 TURNER 04-JUN->4
<07 WARD 2=-MAR->4
<17
<27 H"' @/ -0#0!1$10 14 /%'09/-1'$'/7
Su%cereri
17 SELECT JOB8 ENAME8 SAL
27 .ROM EMP
37 WHERE BSAL8 JOBD IN BSELECT MANBSALD8 JOB
47 .ROM EMP
?7 GROUP BY JOBD
=7 ORDER BY SAL DESC5
7.
>7 SELECT ENAME8 JOB8 SAL
<7 .ROM EMP
107 WHERE BSAL8 JOBD IN BSELECT MINBSALD8 JOB
117 .ROM EMP
127 GROUP BY JOBD
137 ORDER BY SAL5
16.
1?7 SELECT DEPTNO8 ENAME8 HIREDATE
1=7 .ROM EMP
177 WHERE BHIREDATE8 DEPTNOD IN BSELECT MANBHIREDATED8 DEPTNO
1>7 .ROM EMP
1<7 GROUP BY DEPTNOD
207 ORDER BY HIREDATE5
#1.
227 SELECT ENAME8 SAL SALARY8 DEPTNO
237 .ROM EMP E
247 WHERE SAL ) BSELECT AHGBSALD
2?7 .ROM EMP
2=7 WHERE DEPTNO I E7DEPTNOD
277 ORDER BY DEPTNO5
#@.
2<7 SELECT DEPTNO8 DNAME
307 .ROM DEPT D
317 WHERE NOT ENISTS BSELECT C$%X1T/%9C
327 .ROM EMP
337 WHERE DEPTNO I D7DEPTNOD5
G6.
3?7 DE.INE REM I SAL 4 12 E NHLBCOMM8 0D
3=7 SELECT DEPTNO8 SUMBWREMD COMPENSATION
377 .ROM EMP
3>7 GROUP BY DEPTNO
3<7 HAHING SUMBWREMD I BSELECT MANBSUMBWREMDD
407 .ROM EMP
417 GROUP BY DEPTNOD5
6#.
437 SELECT ENAME8 SAL
447 .ROM EMP E
4?7 WHERE 3 ) BSELECT COUNTB4D
4=7 .ROM EMP
477 WHERE E7SAL J SALD5
6@.
4<7 SELECT TOGCHARBHIREDATE8 CYYYYCD YEAR8
?07 COUNTBEMPNOD NUMBERGO.GEMPS
?17 .ROM EMP
?27 GROUP BY TOGCHARBHIREDATE8 CYYYYCD
?37 HAHING COUNTBEMPNOD I BSELECT MANBCOUNTBEMPNODD
?47 .ROM EMP
??7 GROUP BY TOGCHARBHIREDATE8 CYYYYCDD5
FA.
?77 SELECT E7ENAME ENAME8 E7SAL8 E7DEPTNO8 AHGBA7SALD DEPTGAHG
?>7 .ROM EMP A8 EMP E
?<7 WHERE E7DEPTNO I A7DEPTNO
=07 AND E7SAL ) BSELECT AHGBSALD
=17 .ROM EMP
=27 WHERE DEPTNO I E7DEPTNOD
=37 GROUP BY E7ENAME8 E7SAL8 E7DEPTNO
=47 ORDER BY AHGBA7SALD5
AF.
==7 SELECT ENAME8 HIREDATE8 C4C MANDATE
=77 .ROM EMP
=>7 WHERE HIREDATE I BSELECT MANBHIREDATED .ROM EMPD
=<7 UNION
707 SELECT ENAME8 HIREDATE8 C C
717 .ROM EMP
727 WHERE HIREDATE J) BSELECT MANBHIREDATED .ROM EMPD
7G.
CAPITOLUL 10
SQL*PLUS S# !EPO!"#$<
,n acest capitol vom prezenta facilitatile pentru S".Plus.,n particular,capitolul prezinta
modul in care comenzile S".Plus pot fi folosite pentru aformata rezultatele cererilor in
rapoarte simple.
Co(e&zi SQL si SQL*Plus
S".Plus este un mediu in care pot apare doua tipuri de comenzi :
1. /omenzi S" 'cum ar fi S22/().
#. /omenzi S".Plus 'cum ar fi SA52).
/omenzile S".Plus difera de comenzile S" in urmatoarele moduri :
1. 2le nu sint conectate cu nici o declaratie particulara S22/(.
#. 2le se introduc pe o singura linie.Oricum, un caracter de continuare, li% niuta de
unire, poate fi folosit daca comanda este prea lunga pentru a o introduce pe o
singura linie.
/omenzile S".Plus pot fi folosite pentru a influenta prezentarea datelorfurnizate de
declaratiile S22/(, si din acest motiv sint folositoare pentruproducerea rapoartelor, la
fel de bine ca si pentru contolul mediului sipentru identificatorul de fisier.
/omenzile S".Plus sint introduse la promter%ul S" pe o singura linie, darele nu
deschid un buffer.3rmatoarele sint citeva comenzi suplimentare.
-3:0O-4 numeOfisier
ruleaza o aplicatie a Oracle 0orms din interiorul sesiunii tale S".Plus.
Spool numeOfisier
scrie toate comenzile ulterioare si!sau le scrie in fisierul cu numele numeOfisier.
0isierului de spool i se asociaza e&tensia .,S 'pe unele sisteme e&tensia .S().
SPODOE O00 J O3(
O00 inchide fisierul de spool si O3( opreste procesul de spool%ing si trimite
fisierul de spool la imprimanta.
*2S/D-,82E numeOdeOtabela
afiseaza structura tabelei din baza de date.
H2P
invoca help%ul intern din Oracle.
Q< J S comanda
HOS( comanda
invoca o comanda sistem din interiorul S".Plus 'Q este specific pentru 5AU).
/O::D2/(E identificatorOutilizator parola
produce logarea la alt utilizator Oracle din interiorul login%ului curent.
P-O4P( te&t
afiseaza te&tul cind se ruleaza un fisier de comenzi.
Co(e&zi SE"
/omenzile S2( controleaza 'mediul' in care ruleaza in mod curent S".Plus.,n general,
comenzile asociaza o valoare unei variabile de sistem sau o trecepe O: sau O00.Aceste
comenzi pot fi folosite in mod implicit pentru fiecaresesiune prin includerea lor intr%un
fisier numit O7,:.S", care este citit defiecare data cind se ruleaza S".Plus.*aca o
comanda S2( aparuta in timpul se%siunii modifica valoarea implicita, aceasta va fi
valabila doar pentru aceasesiune.,esirea '2U,() din S".Plus va reseta variabilele de
sistem la valo%rile lor implicite.
/omenzile S".Plus pot fi prescurtate.
/uvintele subliniate reprezinta starile implicite pentru comenzile de mai+os.
2/HO XO00 O:Y
O: face ca S".Plus sa afiseze comenzile asa cum sint ele e&ecutate dintr%un
fisier de comenzi.O00 suprima acest lucru.
022*D8A/CE XAn O00 O:Y
n face ca S".Plus sa afiseze numarul inre% gistrarilor selectate intr%o cerere cind
sint selectate cel putin n inregistrari sau mai multe.O: sau O00 face ca aceasta sa
fie sau nu afisata. (recerea feedbac9%ului pe O: face ca n sa fie setat la 1.Setarea
feed% bac9%ului la < este echivalent cu trecerea sa pe O00.
H2AD*,:7E XO00 O:Y
O: face ca S".Plus sa afiseze in rapoarte capetele de coloane.O00 suprima
capetele de coloane.
,:D2S,L2E X@<nY
seteaza numarul de caractere pe care S".Plus le va afisa pe o linie si de
asemenea con% troleaza centrarea si aliniamentul din dreapta a te&tului.5aloarea
ma&ima pentru n este F<<.
:2MPDA72E X1nY
seteaza numarul liniilor goale ce vor fi tiparite intre titlul de +os de la fiecare
pagina si titlul de sus al paginii urmatoa% re.5aloarea < face ca S".Plus sa
stearga ecranul pe ma+oritatea terminalelor.
:34D0O-4A(E te&t
seteaza formatul implicit pentru afisarea numarului articolelor de date.(e&t
trebuie sa fie un format de numar.5edeti optiunea /O34:, clauza 0O-4A(
pentru formatul nu% merelor descris sub titlul '/O34: % Optiuni', mai tirziu in
acest subcapitol.
:34DM,*(HE X1<nY
seteaza latimea implicita pentru afisarea valorilor numerice.
PA72SD,L2E X#6nY
seteaza numarul liniilor pe o pagina.Pentru rapoarte tiparite pe hirtie de lungime
de 11 inch, valoarea F6 'plus valoarea :2MPA72 A) lasa margini de 1 inch
deasupra si dede% subtul paginii.
52-D,0KE XO00 ! O: te&tY
O: face ca S".Plus sa afiseze te&tul unei comenzi inainte si dupa substituirea
va% riabilei cu valoarea sa.O00 suprima acest lucru.
(,4D,:7E XO00 ! O:Y
O: face ca S".Plus sa dea statistici de timp la fiecare declaratie S" ce este
rulata.O00 suprima acest lucru pentru fiecare comanda S".
SPAD/2E X1nY
seteaza numarul de spatii dintre coloane pentru o afisare de tabela.5aloarea
ma&ima pentru n este 1<.
(2-4DO3(E XO00 O:Y
O00 suprima afisarea iesirii generate de comenzi e&ecutate dintr%un fisier, asa ca
iesirea poate fi prelucrata fara sa apara pe ecran.O: permite ca iesirea sa fie
afisata.
S"/AS2 X4,U2* ! OM2- ! 3PP2-Y
OM2- ! 3PP2- convertesc comenzile S" chiar inainte de e&ecutie.(ot te&tul
din interi% orul comenzii este convertit.4,U2* lasa te&% tul nemodificat.
Pentru a gasi valoarea pentru o variabila S2( folosim comanda SHOM. *e e&emplu,
pentru a gasi dimensiunea paginii 'pagesize), introducem :
SHOW PAGES[IZE]
Pentru a vedea valorile pentru toate variabilele S2(, introducem :
SHOW ALL
|---------------------------------------------------------------------|
|
| | RAPOARTE S&L4PLUS
| |
| | T/1#,
| | |
| | |
| | |------------------------------|------------------------------|
| | | | |
| | | TT, A+'/# 10 | P$90 1 |
| | | | |
| | | | |
| | | COMPANY REPORT |
| | | |
| | | |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | IIIII |
| | | |
| | | |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | IIIII |
| | | |
| | | |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | | IIIII |
| | | | IIIII |
| | | | | |
| | | | C"%@/(0%1/$# | |
| | | | | |
| | | | | |
| | |------------------|---------------------------------|--------|
| | | |
| | | |
| | ."'*$10 (0 !"#"$%$ C$#!,#0
| |
| |
|
|---------------------------------------------------------------------|
COLUM$ + O'tiu&i
/omanda /O34: stabileste optiunile de afisare pentru o coloana.0ormatuleste :
COL[UMN] nume_coloana / alias lista_optiuni
Observatii asupra optiunilor pentru /O34: :
1. numeOcoloana trebuie sa se refere la un alias de coloana, daca un alias de coloana
este folosit in clauza S22/(.
#. Optiunile pot apare in orice ordine.
G. O data ce apare o declaratie de coloana, ea ramine activa tot timpul cit sesiunea
S".Plus ramine deschisa.2a continua sa fie setata in timp ce sint afisate alte
tabele 'fara aceasta coloana).
6. Optiunile pentru /O34: pot fi sterse in timpul unei sesiuni.
F. Pentru a gasi setarea optiunilor curente pentru o coloana, introducem :
COL nume_coloana / alias
Alte citeva optiuni pentru /O34: sint :
M-AP
permite specificarea catre S".Plus ca ori de cite ori
(-3:/
continutul actual al unei coloane depaseste latimea specifi% cata, informatia
aditionala este impachetata 'M-AP) prin rotun+ire in linia urmatoare sau
trunchiata '(-3:/).M-AP este valoarea implicita.
MO-*OM-APP2*
muta un cuvint de intrare pe linia urmatoare, in loc sa%l desparta pe doua linii.3n
cuvint nu va fi despartit pe doua linii daca nu este mai mare ca latimea coloanei.
H2A*,:7
specifica un cap pentru o coloana.
:3 sir
seteaza :3%uri in coloana la sirul specificat.
P-,:(
:OP-,:(
coloana va fi afisata ! nu va fi afisata pe rapotrul de iesire.
:2MO5A32 var
5aloarea coloanei este inscrisa in variabila specificata in momentul in care
coloana este selectata 'S22/().
Optiuni de forat in !oanda COLU"#
2or(atul de a,isare a coloa&elor
A% $#@$%,*0'/!8 (0 #,%9/*0 % < +"6/1/0 %,*0'/!$
<<<<<< 1234 0 @"'10$6$ 60'",'/ +'/%!/+$#0
0<<<<< 001234 O @#"$1/%9 ("##$'
O<<<<<< O1234 7 +,%!1 60!/*$#
<<<<<<7<< 1234700 8 2/'9,#$
<<<8<<< 18234 MI -0*%,# */%,- #$ ('0$+1$
<<<<<<MI 1234- PR %,*0'0 %09$1/20 /%1'0 +$'$%1060
<<<<<<PR J1234) EEEE %"1$1/0 -1//%1/@/!$
<<7<<<EEEE 17234EE03 H *,#1/+#/!$'0 !, 10 #$ %
<<<<H<< 123400 B% I %,*$' (0 < (,+$ HD B
2$#"'/#0 60'" (02/% ;#$%U-,'/ B<<<<7<<
$O"A*
1. 0ormatul ;;;;;; % afiseaza blan9%uri pentru zerouriR
#. 0ormatul 8;;;;.;; % daca punctul zecimal e inclus in formatul de afi% sare,
formatul 8 este cerut pentru a face valori% le nule blan9%uri.
G. 0ormatul 8;;;;;; % 0ormatul 8 nu are efect pentru ca ;;;;;; fara '8' descrie
zerourile ca blan9%uri.
MESA?E DE E!OA!E
### 7772$#"$'0 +'0$ *$'0 +0%1', @"'*$1 L 7771/+
9'0-/1 $# 2$#"'// +0%1', @"'*$1
Exe('le de ,or(at al coloa&elor
COLUMN DEPTNO FORMAT 099 HEADING 'Dept.' COLUMN JOB FORMAT A9
HEADING 'Job' JUSTIFY RIGHT COLUMN EMPNO FORMAT 9999 HEADING 'Empl|
No' COLUMN SAL FORMAT 99,999.99 HEADING 'Monthly|Salary' COLUMN
COMM FORMAT 99,990.99 HEADING 'Y-T-D|Commission' - NULL 'No Comm'
COLUMN REM FORMAT 999,999.99 HEADING 'Total Rem.' SELECT DEPTNO,
JOB, EMPNO, SAL, COMM,
SAL*12+NVL(COMM,0) REM FROM EMP;
-ezultatul cererii afiseaza caracteristici ale optiunilor de formatare a coloanelor. 0iecare
coloana are un titlu diferit. =ustificarea titlului a fost schimbata din cea implicita, si in
unele cazuri separata peste un numar de linii, folosind o bara verticala 'J), Optiunea
:3 a fost folo% sita sa forteze un sir de caractere sa fie afisat cand un null ar trebui in
mod normal sa apara.
/lauza S22/( poate contine alias%uri de coloane, coloane cu un prefi& de tabela,
e&presii si siruri literale care determina numele coloanei speci% ficat in comanda
/O34: a S".P3S.
D$!$ $!0$-1$ 0-10 #/-1$ ."#"-/1/ $!0-1 %,*0 (0 !"#"$%$ (0
$'1/!"#0 $ SELECT-,#,/ /% !"*$%($ COLUMN
------------------------- ------------------------------ -$#
-$# 0*+7-$# -$# 07-$#
-$# -$#412E%2#B!"**80D -$#412E%2#B!"**80D -$#412
$%%-$# $%%-$# -X-($10
-X-($10 0*+%"||C-C||0%$*0 0*+%"||C-C||0%$*0
T"G!T$'BH/'0($108C((1T T"G!T$'BH/'0($108C((1T MONYYYYCD
MONYYYYCD T"G!T$'B-X-($108CD$X T"($X M"% YYCDT"($X
Co(e&zile ""#"LE si "#"LE
/omenzile ((,(2 si 8(,(2 sunt folosite pentru a produce titluri pe o pagina.
C"*$%($ D0-!'/0'0 -------
--------- TTITLE C-/' (0 !$'$!10'0C 1/+$'0-10 ($1$ !,'0%1$ /%
!"#1,# (/% -1$%9$ -,- $# @/0!$'0/
+$9/%/8 %,*$',# +$9/%// /% !"#1,#
(/% ('0$+1$ -,- -/ !0%- 1'0$6$
1/1#,# +0 #/%/$ (0 (0(0-,+17 BTITLE C-/' (0 !$'$!10'0C
1/+$'0-10 10A1,# !0%1'$1 /% +$'10$ (0 :"-
$ @/0!$'0/ +$9/%/7 I% $*;0#0 !$6,'/ ,% !$-
'$!10' C|C 2$ @$!0 !$ ,'*$1"',# 10A1 -$
@/0 !0%1'$1 +0 #/%/$ ,'*$1"$'07 TTITLE
$@/-0$6$ TTITLE-,# -$, BTITLE-,# !,'0%1 BTITLE TTITLE O..
$%,#0$6$ $@/-$'0$ ,%,/ 1/1#, (0@/%/1 $%10- BTITLE O..
'/"' -$, $ ,%0/ %"10 (0 -,;-"#7
COLUMN DEPTNO FORMAT 099 HEADING 'Dept.' COLUMN JOB FORMAT A9
HEADING 'Job' JUSTIFY RIGHT COLUMN EMPNO FORMAT 9999 HEADING 'Empl|
No' COLUMN SAL FORMAT 99,999.99 HEADING 'Monthly|Salary' COLUMN
COMM FORMAT 99,990.99 HEADING 'Y-T-D|Commission' - NULL 'No Comm'
COLUMN REM FORMAT 999,999.99 HEADING 'Total Rem.' TTILTE 'COMPANY
REPORT|Produced by Personnel Dept' BTITLE 'Company Confidential'
SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM FROM
EMP;
/omenzile ((,(2 si 8(,(2 pot include un numar de clauze, facand posibil ca aparitia
titlului sa fie specificata mai detaliat.
TTIQTLER Q+'/%1-+0! O.. ONR +'/%1-+0! (0@/%0-10 1/1#,# -/ +"$10
!"%1/%0 *$/ *,#10 !#$,607 BTIQTLER
Q+'/%1-+0! O.. ONR +'/%1-+0! (0@/%0-10 %"1 (0 -,;-"# -/ +"$10
!"%1/%0 *$/ *,#10 !#$,607
Clauze i& Pri&ts'ec
COL % -$'0 1/+$'/'0$ +"6/1/0/ % $ #/%/0/
!,'0%10 B/%$+"/ ($!$ !"#"$%$ $ @"-1
1'0!,1$D7 SKIP % -$'0 (0 #$ -1$'1,# ,%0/ %"/
#/%// (0 % "'/7 D$!$ % 0-10 "*/-8 -$'0
" #/%/05 ($!$ % 0-10 08 /%$+"/ #$
/%!0+,1,# #/%/0/ !,'0%107 TAB % -$'0 /%$/%10
% +"6/1// (0 1/+$'/1 B/%$+"/ ($!$ %
0-10 %09$1/2D7 LE.T8CENTER $%( $#/%/0'0 -1$%9$8 !0%1',
-$, ('0$+1$ +0 #/%/$ RIGHT !,'0%1$7
A'1/!"#0#0 (0 ($10 !0 ,'*0$6$ $!0-- 10/
!#$,60 -,%1 $#/%/$10 !$ ,% 9',+8 +$%$ #$
-@$'-/1,# !"*0%6// TTILTE -$, +$%$ #$ ,'*$1"-
',# LE.T8 CENTER8 RIGHT -$, COLUMN7BCENTER -/
RIGHT @"#"-0-! 2$#"$'0$ #,/ SET LINESIYE
+0%1', $ !$#!,#$ +"6/1//#0 $'1/!"#0#"' (0 ($-
10D7 .ORMAT (0@/%0-10 @"'*$1,# $'1/!"#0#"' (0
($10 !$'0 " ,'*0$6$8 +$%$ #$ ,'*$1"$'0$
!#$,6$ .ORMAT -$, +$%$ #$ -@$'-/1,#
!"*0%6//7S+0!/@/!$'0$ @"'- *$1,#,/ 0-10
#$ @0# !, !0$ $ !#$,60/ .ORMAT $
!"*0%6// COLUMN7 O -/%9,'$ -+0!/@/!$'0 (0
@"'*$1 +"$10 @/ 0@0!1/2$ #$ ,% *"*0%1 ($17
D$!$ 0-10 $# ,%,/ 1/+ (0 ($10 9'0-/1 +0%1',
,% $'1/!"# +$'1/!,#$'8 %, $'0 0@0!1 $-,+'$
$!0#,/ $'1/!"# +$'1/!,#$'7 D$!$ %, 0-10
0@0!1/2$ %/!/ " !#$,6$ .ORMAT
+"1'/2/1$8 2$#"'/#0 %,*0'/!0 -,%1 1/+$'/10 /%
$!"'( !, @"'*$1,# SET NUM.ORMAT8 -$, ($!$
SET NUM.ORMAT %, $ @"-1 @"#"-/18 /% $!"'( !,
@"'*$1,# /*+#/!/17 H$#"'/#0 ($10/ -,%1 1/+$-
'/10 /% @"'*$1,# /*+#/!/17 S&L7PNO H$'/$;/#$
-/-10* +0%1', %,*$',# +$9/%// !,- '0%10
$ '$+"'1,#,/7 H$ +,101/ '0@0'/ #$ 2$-
#"$'0$ ,%0/ 2$'/$;/#0 -/-10* ($%(,-/ +'0@/A,#
S&L7 D0 0A0*+#,8 +0%1', $ @"#"-/ 2$'/$;/#$
PNO -!'/01/3 TTITLE RIGHT C+$90C
S&L7PNO A!0$-1$ 2$ +'"(,!0 C+$90 1C #$
*$'9/%0$ (/% ('0$+1$ $ #/%/0/ ($!$ 1
0-10 +$9/%$ !,'0%1$7
Eli(i&area valorilor du'licate si s'ar)erea u&ui ra'ort
i& sectiu&i
iniile unui raport pot fi sparte in sectiuni, folosind comanda 8-2AC. Prin spargerea
unei coloane, afisarea valorilor duplicate este eliminata. Puteti deasemenea sa lasati linii
goale sau sa incepeti o noua pagina intre sectiuni. Pana cand va aparea o 'spartura' ,
valorile coloanelor se schimba de fiecare data, trebuie sa va reamintiti sa 'O-*2- 8K'
coloana declaratia S22/( sau raportul dumneavoastra va fi rupt in sectiuni de
neinteles.
Poate fi o singura comanda 8-2AC activa la un moment dat> prin urmare, daca cereti
brea9%uri multiple ele trebuie sa fie specificate ca o singura comanda 8-2AC. (rebuie sa
listati coloanele sparte in ordinea importantei, 'sparturile' ma+ore mai intii.
O'tiu&i !EA1
8rea9%urile pot fi active la :
/olumn
-oN
Page
-eport
BREAK ON [column/alias ROW][SKIP n DUP PAGE] ON...[ON REPORT]
3n 8-2AC O: -2PO-( va permite calcule finale sumare. a orice "brea9", ur%
matoarele optiuni pot fi specificate:
O+1/,%0 D0-!'/0'0 -------
--------- PAGE '0%,%1$ #$ " +$9/%$ !$%( "
2$#"$'0 /% !"#"$%$ -0 -!T/*;$7 SKIP %
-$'0 % #/%// !$%( 2$#"$'0$ -0 -!T/*;$7 DUPQLICATER
(,+#/!$ 2$#"'/#07 I*+#/!/1 0-103
NODUPQLICATER7
2&emple:
BREAK ON REPORT ON DEPTNO PAGE ON JOB SKIP 2 BREAK ON
REPORT ON DEPTNO PAGE ON JOB DUP
Pentru a curata brea9%urile emiteti comanda:
CLEAR BREAKS
Pentru a tipari brea9%urile curente emiteti comanda:
BREAK
3rmatorul e&emplu ilustreaza folosirea 8-2AC%urilor:
COLUMN DEPTNO FORMAT 099 HEADING 'Dept.' COLUMN JOB FORMAT
A9 HEADING 'Job' JUSTIFY RIGHT COLUMN EMPNO FORMAT 9999 HEADING
'Empl|No' COLUMN SAL FORMAT 99,999.99 HEADING 'Monthly|Salary'
COLUMN COMM FORMAT 99,990.99 HEADING 'Y-T-D|Commission' - NULL 'No
Comm' COLUMN REM FORMAT 999,999.99 HEADING 'Total Rem.' TTILTE
'COMPANY REPORT|Produced by Personnel Dept' BTITLE 'Company
Confidential' BREAK ON DEPTNO SKIP 1 ON JOB ON REPORT SELECT
DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM FROM EMP
ORDER BY DEPTNO,JOB;
Calcule Su(are
/omanda /O4P3(2 e&ecuta calcule pe brea9%uri stabilite de comanda 8-2AC.
COMPUTE clauza(e) OF coloana(e) ON break(uri) C"*$%($
D0-!'/0'0 ------- --------- O.
-+0!/@/!$ !"#"$%$ -$, 0A+'0-/$ $ !$'0/ 2$#"$'0 2$
@/ !$#!,#$1$7 ON -+0!/@/!$ $'1/!"#,# (0 ($10
-$, 0#0*0%1,# (0 1$;0- #$ !$'0 -$ @/0
@"#"-/1 !$ ;'0$U7 C#$,6$ C$#!,#0 A+#/!$10 +0
1/+,# (0 !"#"$%$ ------ -------
---------------------------- AHG 2$#"$'0 *0(/0
%,*$' COUQNTR !"%1"'/60$6$ 2$#"'/ 1"$10 1/+,'/#0
%0%,#0 MANQIMUMR 2$#"$'0 *$A/*$ %,*$'8 !$'$!10'
MINQIMUMR 2$#"$'0 */%/*$ %,*$'8 !$'$!10' NUMQBERR
!"%1"'/6$'0 $ #/%//#"' 1"$10 1/+,'/#0 STD (02/$1/$
-1$%($'( %,*$' SUM -,*$ 2$#"'/#"' %0%,#0
%,*$' HARQIANCER 2$'/$1/0 %,*$'
Pot fi multe comenzi /O4P3(2, cu toate ca adesea este mai usor sa specificati toate
calculele cerute intr%o singura comanda.
*e e&emplu:
COMPUTE SUM AVG OF SAL COMM ON DEPTNO REPORT
va calcula salariile medii si totale si comisionul figurate in sectiunea *2P(:O si la
sfarsitul -2PO-(%ului.
2isierul de co(e&zi SQL*PLUS
1. compunere S22/( declaratie
#. SA52 nume fisier
G. 2* nume fisier
SET COL SET UP TTITLE
SQL*PLUS ENVIRONMENT BTITLE
BREAK SELECT ... SQL /
TTITLE OFF COL DEPTNO CLEAR RESET
SQL*Plus COL EMPNO CLEAR ENVIRONMENT Etc.
6. /(- L 5AU SP2/,0,/
F. 2UD,(E or "3,(
A. S(A-( nume fisier
CAPITOLUL 10 $%er!itiu & 'aport (u) fora de ta)el
1. Produce un raport care arata asemanator cu urmatorul. Asigurati%va la formatul
coloanelor de date, la capul de tabel, si la specificatia ti% tlului paginii si notei de
subsol.
#. Adaugati o comanda 8-2AC la script%ul S" astfel ca raportul dumneavoas% tra
sa sara o linie la sfarsitul detaliilor fiecarui departament, si e% limina duplicatele
numelor de slu+be.
Ca'itolul BC Solutie
SET ECHO OFF SET PAGESIZE 24 SET FEEDBACK OFF SET
LINESIZE 78 COL A FORMAT A10 HEADING 'Department' COL B
FORMAT A9 HEADING 'Job' COL C FORMAT 9999 HEADING 'Emp.|No.'
COL D FORMAT A8 HEADING 'Name' COL E FORMAT A5 HEADING 'Hire|
Date' COL F FORMAT B99,999.99 HEADING 'Monthly|Salary' COL
G FORMAT 9,990.99 HEADING 'Annual|Comm' COL H FORMAT
999,999.99 HEADING 'Total' BREAK ON A SKIP 1 ON B TTITLE
'EMPLOYEE REPORT' BTITLE 'CONFIDENTIAL' SELECT DNAME A,
JOB B, EMPNO C, ENAME D,
TO_CHAR(HIREDATE,'MM/YY') E, SAL F,
COMM G, SAL*12+NVL(COMM,0) H FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO ORDER BY DNAME,JOB / CLEAR
COLUMNS TTITLE OFF BTITLE OFF SET FEDBACK ON SET
PAGES 24 CLEAR BREAKS8F+'0)
CAPITOLUL 11
"!A6E!SA!EA A!O!#LO!
Acest capitol detaliaza recuperarea datelor bazate pe o relatie ierarhi% ca naturala intre
doua linii ale tabelei.
"raversarea ar%orilor
(abela 24P are o structura arborescenta reprezentand linia de raport a conducerii.
Parcur)erea ar%orelui
KING EMPNOI7>3<
|
---------------------------------
| | | MGRI7>3<
CLARK JONES BLAKE
| | |
| ------ -------------------------
| | | | | | | |
MILLER SCOTT .ORD ALLEN WARD MARTIN TURNER JAMES
| |
| |
ADAMS SMITH
O baza de date relationala nu contine inregistrarile intr%un mod ierarhic. Oricum, unde
e&ista o legatura ierarhica intre liniile unei singure tabele, este un proces numit
'parcurgere de arbore' care face posibil ca ierarhia sa fie construita.,erarhia poate fi creata
privind la legatura dintre valorile echivalente in coloanele 24P:O si 47-'Aceasta
legatura a fost de+a e&ploa% tata cu +oin%ul unei tabele cu ea insesi). :umarul 47- al
unui anga+at este 24:O%ul sefului sau.
/and este realizata o parcurgere de arbore, nu va asteptati sa vedeti rezultatul cererii
asemanator cu figura afisata mai sus. :umerele 252 'de nivel) sunt stabilite cand
apare parcurgerea arborelui si reprezinta cat de indepartate sunt nodurile 'liniile) de
radacina 'nodul de start).
Pentru a construi un arbore de traversare din tabela 24P, introduceti:
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL;
C"*$%($ D0-!'/0'0
------- ---------
SELECT C#$,6$ SELECT -1$%($'(8 !, +-0,("-
!"#"$%$ LEHEL
!$'0 $@/-0$6$ !$1 (0 (0+$'10 0-10
@/0!$'0 %"(
(0 %"(,# (0 -1$'17
.ROM P,101/ -$ SELECT .ROM " -/%9,'$ 1$;0#$7
WHERE L/*/10$6$ #/%//#0 !$'0 -,%1 2/6/1$10 /%
1/*+,#
+$'!,'90'//7
CONNECT BY S+0!/@/!$ !"#"$%0#0 ,%(0 0A/-1$ #09$1,'$
/%1'0
#/%//7 A!0$-1$ !#$,6$ 0-10 !0',1$ +0%1',
"
+$'!,'90'0 (0 $';"'07
PRIOR S1$;/#0-10 (/'0!1/$ /% !$'0 0-10 +$'!,'-
$';"-
'0#07 D$!$ PRIOR $+$'0 /%$/%10 (0 MGR8
$1,%!/
2$#"'/#0 /% !"#"$%$ MGR -,%1 2/6/1$10
+'/*0#08
$+"/ -,%1 9$-/10 2$#"'/#0 0!T/2$#0%10 (/%
EMPNO8 !$'0 0-10 /% -,-,# $';"'0#,/7
D$!$ PRIOR
$+$'0 /%$/%10 (0 EMPNO $1,%!/ $';"'0#0
0-10 /%
:"-7
START WITH S+0!/@/!$ ,%(0 -$ /%!0$+$ $';"'0#07 N,
+"$10
/%!0+0 #$ ,% %/20#BLEHELD7 A!0$-1$ !#$,6$
0-10 "+1/"%$#$ !T/$' !$%( 0-10 !0',1$ "
+$'-
!,'90'0 (0 $';"'07
ORDER BY A+$'0 #$ -@$'-/1 (0 ";/!0/7
,n e&emplul de mai sus, structura ierarhica a organizatiei este reflectata in parcurgerea
arborelui. Structura raportata conducere!anga+ati poate fi identificata cu claritate.
Puteti folosi clauza O-*2- 8K pentru a sorta liniile returnate.3rmatoarea comanda este
perfect legitima:
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL
ORDER BY DEPTNO;
Oricum, este recomandat sa nu folositi clauza O-*2- 8K la parcurgerea arbo% relui
pentru ca ordonarea implicita a arborelui poate fi distrusa. ,n e&emplul de mai +os,
ordinea in care liniile lui S/O((, A*A4S, 0O-* si S4,(H sunt afisate s%a schimbat,
si A*A4S pare sa se raporteze la 0O-* cand S/O(( este de fapt seful sau. ,esirea
'rezultatul) nu reflecta ierarhia "adevarata".
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL
ORDER BY DEPTNO;
Parcur)erea ar%orilor
SELECT ENAME, LEVEL, JOB
FROM EMP
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL
EXCLUDERI :
WHERE ENAME!='SCOTT'
JONES
|
----------------------------
| |
SCOTT B-0 -10'90D .ORD
| |
ADAMS SMITH
CONNECT BY PRIOR EMPNOIMGR
AND ENAMEMICSCOTTC
JONES
|
----------------------------
| |
SCOTT B-0 -10'90D .ORD
| |
ADAMS B-0 -10'90D SMITH
"E!M#$OLO<#E
Sunt cativa termeni mai degraba neobisnuiti cand parcurgeti arborele. :u este nevoie sa%i
amintim pe toti, decat pentru informatie:
NODE $!0#$-/ #,!', !, " #/%/0
ROOT ,% %"( !$'0 %, 0-10 /% +'"+'/01$10$ %/*$%,/
PARENT ,% %"( !$'0 $'0 $#10 %"(,'/ #$ ,% %/20#
/%@0'/"'
CHILD ,% %"( !$'0 $'0 ,% PARENT
TERMINAL NODE -$, LEA. ,% %"( @$'$ @//
BRANCH ,% %"( !, @// -/ %0+"1/
CDirur)ia ar%orelui
/lauzele MH2-2 si /O::2/( pot fi folosite pentru a curata arborele, care controleaza
ce noduri sunt afisate. *aca clauza MH2-2 este folosita pentru a elimina un nod, atunci
doar acel nod este eliminat. *aca restrictia apare in clauza /O::2/( 8K atunci
intreaga ramura este eliminata.
,n e&emplul urmator, numai linia S/O(( este eliminata, fiii sai sunt inca procesati.
BREAK ON DEPTNO SKIP 1
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP WHERE ENAME != 'SCOTT'
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL;
,n e&emplul de mai +os, intreaga ramura S/O(( a fost eliminata:
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR AND ENAME != 'SCOTT'
START WITH MGR IS NULL;
:otati ca de aceasta data ambele linii, parinte 'S/O(() si fiu 'A*A4S), au fost e&cluse.
Alte utilizari ale 'arcur)erii ar%orilor
Organizarea tabelelor nu este singura aplicatie a unei cereri structura% te pe arbore.
/lauza /O::2/( 8K poate fi folosita de asemenea in:
nota de plata a aplicatiilor materiale, sa produca e&plozii sau implozii partilor
indentate.
bilantul aplicatiilor pentru scopuri de consolidare.
CAPITOLUL 12
Crearea si De,i&irea de structuri ta%elare
,n acest capitol, discutam aspectele logice ale tabelelor si coloanelor si commenzile
necesare pentru a construi tabele cu /onstrangeri de ,ntegri% tate. Acesta este primul din
doua capitole care acopera subsetul comenzilor S" cunoscut ca imba+ul de *efinire a
*atelor'**).
Structuri de date O!ACLE
,n acest curs vom discuta aspectele logice de creare a tabelelor./onsi% deratiile fizice sunt
acoperite in celelalte cursuri.*esi tabelele pot fi create fara a da informatii de asezare
fizice, ar trebui notat ca un utili% zator O-A/2 trebuie sa fi primit privilegiul de
/-2A(2 (A82 de catre admi% nistratorul bazei de date si sa aiba alocat ceva spatiu de
tabela pentru a crea tabele.
,n general, structurile de date O-A/2 pot fi rezumate dupa cum urmeaza.
(abelele pot fi create oricand, chiar cu utilizatori folosind baza de date.
:u este necesar sa specificati dimensiunea nici unei tabele. Aceasta este definita
ultima prin cat spatiu a fost alocat bazei de date ca un intreg. Oricum, este
important sa estimati cat de mult spatiu va utiliza o tabela.
Structurile pot fi modificate online.
(abelele pot capata automat mai mult spatiu daca dimensiunea i% nitiala este
umpluta.
Li(%aAul de De,i&ire a Datelor (LDD)
** este un subset al comenzilor S" folosit pentru a crea, modifica sau muta
structurile bazei de date O-A/2, si deasemenea sa inregistreze informatii in
*ictionarul de *ate 'acesta este discutat mai tarziu).
Denumirea unei tabele
:umele pe care%l alegeti pentru o tabela trebuie sa urmeze regulile standard
pentru numirea unui obiect al unei baze de date O-A/2.
1. :umele trebuie sa inceapa cu o litera, A%L sau a%z.
#. Poate contine litere, numerale si caracterele speciale underscore 'O).
/aracterele Q si \ sunt deasemenea legale, dar folosirea lor este
descura+ata.
G. :umele este acelasi indiferent daca sunt folosite litere mari sau mici, de
e&emplu, 24P, emp, si e4p sunt toate aceeasi tabela.
6. Poate fi de ma&im G< caractere in lungime.
F. :umele nu trebuie sa duplice numele altui obiect din contul
dumneavoastra.
A. :umele nu trebuie sa fie un cuvant rezervat S".
NUME HALID Z
---- -------
EMP>? ($
>?EMP %,5 %, /%!0+0 !, " #/10'$
.INEDGASSETS ($
.INED ASSETS %,5 !"%1/%0 ,% ;#$%U
UP DATE %,5 !,2$%1 '060'2$1 S&L
Ar trebui sa folositi nume de descriere pentru tabele si alte obiecte ale bazei de date.
0olositi acelasi nume sa descrie aceeasi entitate in doua tabele diferite. *e e&emplu,
coloana cu numarul departamentului este numita *2P(:O in ambele 24P si *2P(.
Crearea unei tabele
/reati o noua tabela folosind comanda /-2A(2 (A82. 3na dintre cele mai simple
forme a acestei comenzi este cand informatia de baza pentru fiecare coloana este definita
impreuna cu tipul ei de data si dimensiunea.
S/%1$A$3 CREATE TABLE %,*0 1$;0#$
B%,*0 !"#"$%$ 1/+B(/*0%-/,%0D8
%,*0 !"#"$%$ 1/+B(/*0%-/,%0D8
777D5
EA0*+#,3 CREATE TABLE DEPT
(DEPTNO NUMBER(2),
DNAME VARCHAR2(12),
LOC VARCHAR2(12));
:umele coloanelor intr%o tabela trebuie sa fie unice.
Tiurile coloanelor
/and creati o tabela trebuie sa specificati fiecare tip de data al co% loanei. (abela de mai
+os arata cele mai importante tipuri de date.
(ipul de data poate fi urmat de unul sau mai multe numere in paranteze care dau
informatii despre latimea coloanei. atimea coloanei determina la% timea ma&ima pe care
valorile in coloana pot s%o aiba. 5A-/HA-# trebuie sa aiba o dimensiune, dar cele
implicite sunt disponibile.
(abela de mai +os arata tipurile de date principale in O-A/27.
T/+ (0 ($10 D0-!'/0'0
----------- ---------
HARCHAR2BSD S/' (0 !$'$!10'0 (0 #,%9/*0 *$A/* S7
L,%9/-
*0$ *$A/*$ 0-10 (0 2000 !$'$!10'07
CHARBSD S/' (0 #,%9/*0 @/A$ S7 L,%9/*0$
/*+#/!/1$
0-10 17 L,%9/*0$ *$A/*$ 0-10 2??7
NUMBER N,*0'0 /% 2/'9,#$ *";/#$ !,
+'0!/6/0 3 3>
(0 !/@'0 -0*%/@/!$1/207
NUMBERBSD N,*0'0 /%1'09/ (0 +'0!/6/0 S7
NUMBERBS8-D N,*0'0 !, +'0!/6/$ S -/ -!$#$ -7
P'0!/6/$
'0+'06/%1$ %,*$',# *$A/* (0 !/@'0
-0*%/@/-
!$1/20 +0'*/-0 !$'0 %, +"1 (0+$-/ 3>7
S!$#$
0-10 %,*$',# (0 +"6/1// 60!/*$#0
/%'09/-1'$-
10 /% ('0$+1$ +,%!1,#,/7
DATE H$#"'/#0 ($10/ (/% 1 I$%,$'/0 4712
/%$/%10
(0 H'/-1"- +$%$ /% 31 D0!0*;'/0 4712
(,+$
H'/-1"-7 I%@"'*$1/$ (0 1/*+ 0-10
(0$-0*0%0$
-1"!$1$7
LONG S/' (0 !$'$!10'0 (0 #,%9/*0 2$'/$;/#$
(0
#,%9/*0 2 G;8 -$, 2 #$ +,10'0$ 31
*/%,- 17
E-10 +0'*/-$ " -/%9,'$ !"#"$%$ (0
1/+,# LONG
+0 1$;0#$7
RAW -/ E!T/2$#0%1 !, HARCHAR2 -/ '0-+0!1/2
LONG8
LONG RAW ($' @"#"-/1 +0%1', $ -1"!$ ($10
;/%$'0 !$
/*$9/%/ 9'$@/!0 -$, -,%010 (/9/1/6$107
$O"E*
(ipul de date 5A-/HA-# al Oracle7 este sinonim cu versiunea A a tipu% rilor de
date '5A-/HA-' si '/HA-'.
O-A/2 foloseste semantica prin comparatie non%padded daca o valoare
5A-/HA-# este folosita intr%o comparatie'vezi /apitolul # pentru de% talii).
*aca o valoare scrisa intr%o coloana depaseste scala coloanei, atunci va apare o
rotun+ire.
(abela de mai +os arata e&emple de specificatii de coloane:
NUMBERB4D P"$10 !"%1/%0 1"$10 %,*0'0#0 +$%$ #$ 4
!/@'07
NUMBERB>83D P"$10 !"%1/%0 +$%$ #$ > !/@'08 (/%1'0
!$'0 3
+"1 @/ /% ('0$+1$ +,%!1,#,/ 60!/*$#7
HARCHAR2B1000D H$#"'/#0 +"1 !"%1/%0 +$%$ #$ 1000
!$'$!10'07
CHARB>0D S/','/ (0 !$'$!10'0 (0 #,%9/*0 @/A$
09$#$ !,
>07 H$#"'/#0 *$/ -!,'10 -,%1 /%#"!,/10 !,
;#$%U-,'/7
Crearea tabelei EM&
(abela noastra demonstrativa, 24P, ar fi putut fi creata de o comanda /-2A(2 (A82
ca mai +os:
CREATE TABLE EMP
(EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(10),
JOB VARCHAR2(10),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER (7,2),
COMM NUMBER (7,2),
DEPTNO NUMBER (2) NOT NULL);
/omanda *2S/-,82 a S".P3S%ului poate fi folosita pentru a lista detal ale
coloanelor create intr%o tabela:
DESCRIBE EMP

Constran'erea NOT NU((
,n e&emplul de mai sus, veti observa ca definitiile pentru coloanele 24P:O si *2P(:O
sunt urmate de :O( :3. Aceasta ne asigura ca valoril nule sunt permise pentru aceste
coloane, de cand aceste coloane servesc ca chei pentru operatii pe aceasta tabela.
/oloanele fara constrangerea :O( :3 permit valori nule.
:O( :3 este una dintre constrangerile de integritate care pot fi defi% nite.
OP"#U$EA DE2AUL"
3nei coloane ii poate fi data o valoare implicita prin optiunea *20A3(. Aceasta
previne aparitia de null%uri 'sau erori, daca :O( :3 este specifi% cata) daca o linie
este inserata fara o valoare din coloana.5alorile implici% te pot fi literali, o e&presie, dar
nu numele altei coloane. 0unctii ca SKS*A(2 si 3S2- sunt valide.
*e e&emplu:
HIREDATE DATE DEFAULT SYSDATE,
SAL NUMBER (7,2) DEFAULT 0
Constran'eri de inte'ritate
Oracle permite constrangerilor de integritate sa fie definite pentru ta% bele si coloanelor sa
forteze reguli sigure, inauntrul unei tabele sau intre tabele.
/onstrangerile sunt folosite:
de serverul Oracle7 sa forteze reguli la nivelul tabelei oricand este inserata o linie,
actualizata sau stearsa din acea tabela. /onstrange% rea trebuie sa fie satisfacuta
pentru ca operatiile sa reuseasca.
pentru a preveni stergerea unei tabele daca sunt posesiuni din alte tabele.
prin unelte sigure Oracle, ca Oracle 0orms, pentru a furniza reguli pentru
utilizarea intr%o aplicatie.
/onstrangerile sunt clasate dupa cum urmeaza:
/onstrangeri de tabela
Acestea pot referi una sau mai multe coloane si sunt definite S2PA-A( de definitiile
coloanelor din tabela.
/onstrangeri de coloana
Acestea refera o singura coloana si sunt definite ,:A3:(-3 specificatiei pentru
coloana posesoare.
/onstrangerile pot fi adaugate unei tabele dupa crearea ei si deasemenea temporar
dezactivate 'vezi comanda A(2- (A82 in capitolul urmator).(oate detaliile despre
constrangeri sunt stocate in *ictionarul de *ate. 0iecarei constrangeri ii este repartizat un
nume. ,ti este mai usor sa suplimentezi una tu singur, astfel ca poate fi mai usor referita
mao tarziu, dar daca nu, atunci un nume este generat automat pe forma:
SYSGC%
unde n este un numar unic. /uvantul cheie /O:S(-A,:( iti permite sa numesti o noua
constrangere tu insuti.
"i'uri de co&stra&)eri
Puteti defini urmatoarele tipuri de constrangeri:
:3!:O( :3
3:,"32
P-,4A-K C2K
0O-2,7: C2K'integritatea de referinta)
/H2/C
Constran'erea UN$)UE
Aceasta desemneaza o coloana sau o combinatie de coloane ca o cheie uni% ca.*oua linii
in aceeasi tabela nu pot avea aceeasi valoare pentru aceasta cheie.:3%urile sunt
permise daca cheia unica este bazata pe o singura co% loana.
Sinta&a constrangerii de tabela :
QCONSTRAINT %,*0 !"%-1'$%90'0R UNI&UE BC"#"$%$8 C"#"$%$8 777D
Sinta&a constrangerii de coloana :
QCONSTRAINT %,*0 !"%-1'$%90'0R UNI&UE
*e e&emplu, pentru a va asigura ca nu sunt # nume de departamente identice la o singura
locatie:
CREATE TABLE DEPT
(DEPTNO NUMBER, DNAME VARCHAR2(9),
LOC VARCHAR2(10),
CONSTRAINT UNQ_DEPT_LOC UNIQUE(DNAME,LOC))
,n e&emplul de mai sus, constrangerea 3:"O*2P(OO/ este o constrangere de ta% bela.
:otati ca virgula precede detaliile. O constrangere unica il face pe O-A/2 sa creeze un
singur inde& pentru a manui regula. ,ndecsii sunt discu% tati mai tarziu.
Constran'ere de c*eie rimara
/a si la cheile unice, o cheie primara forteaza unicitatea unei coloane sau combinatii de
coloane implicate si un inde& unic este creat pentru a con% duce aceasta. (otusi poate fi o
singura cheie primara pe o tabela, si aceasta este cunoscuta ca fiind cheia definitiva prin
care liniile in tabela sunt i% dentificate individul. :3%urile nu sunt permise in
coloanele de chei prima% re.
Sinta&a constrangerii de tabela :
QCONSTRAINT %,*0 !"%-1'$%90'0R PRIMARY KEY BC"#"$%$8
C"#"$%$8 777D
Sinta&a constrangerii de coloana :
QCONSTRAINT %,*0 !"%-1'$%90'0R PRIMARY KEY
:otati ca aceeasi combinatie de coloane nu poate fi folosita si pentru o cheie primara si
pentru una unica. 3rmatorul e&empludefineste *2P(:O ca o cheie primara folosind o
constrangere de coloana:
CREATE TABLE DEPT
(DEPTNO NUMBER(2) CONSTRAINT DEPT_PRIM PRIMARY KEY, ...)
Constran'ere de c*eie externa
/heile e&terne furnizeaza reguli de integritate de referinta inauntrul unei tabele sau intre
tabele. O cheie e&eterna este folosita intr%o relatie cu fiecare cheie primara sau unica
oriunde si poate fi folosita, de e&emplu, pentru a preveni stergerea unui departament in
*2P( daca anga+atii e&ista cu acelasi numar de departament in 24P.
Sinta&a constrangerii de tabela :
QCONSTRAINT %,*0 !"%-1'$%90'0R .OREIGN KEY BC"#"$%$8
C"#"$%$8 777D
RE.ERENCES 1$;0#$ BC"#"$%$8 C"#"$%$8 777D
Sinta&a constrangerii de coloana :
QCONSTRAINT %,*0 !"%-1'$%90'0R RE.ERENCES 1$;0#$ BC"#"$%$D
:otati ca, cuvintele '0O-2,7: C2K' nu sunt folosite versiunea constrangerii de coloana
a sinta&ei.
------------
EA0*+#,# 1 | DEPT | B+$'/%10D
------------
|
|
F|[ DEPTNO
------------
| EMP | B@/,D
------------
Pentru a stabili relatia dintre 24P si *2P( astfel incat 24P.*2P(:O este che% ia
e&terna, si fiecare anga+at trebuie sa aiba un numar valid de departament care este
cunoscut in *2P(:
CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO)
REFERENCES DEPT(DEPTNO)
O'tiu&ea O$ DELE"E CASCADE
/a rezultat al constrangerii de tabela de mai sus, 'care ar fi putut la fel de bine sa fie
definita ca o constrangere de coloana), un departament in *2P( nu ar fi putut fi sters
daca liniile e&ista in 24P cu aceeasi valoare *2P(:O. Alternativ, puteti cere ca
anga+atii corespunzatori sa fie stersi a% utomat daca departamentul parinte in *2P( este
sters. Aceasta este realizata adaugand clauza O: *22(2 /AS/A*2.
CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO)
REFERENCES DEPT(DEPTNO) ON DELETE CASCADE
EA0*+#,# 2 -------------- EMPNO
| EMP | 7 7
-------------- 7
[|F 7
7 7
7 7
MGR 7 7
7 7
P0%1', $ 2$ $-/9,'$ !$ @/0!$'0/ #/%// (0 $%9$:$1 /% EMP // 0-10 ($1 ,%
%,*$'
(0 *$%$90' BMGRD +0%1', ,% $%9$:$1 0A/-10%1 2$#/(3
CREATE TABLE EMP
(EMPNO NUMBER(4) PRIMARY KEY, ...
MGR NUMBER(4) CONSTRAINT EMP_MGR
REFERENCES EMP(EMPNO), ...
Constrangerea de verificare (CHECK)
C"%-1'$%90'0$ CHECK (0@/%0-10 0A+#/!/1 " !"%(/1/0 +0 !$'0 @/0!$'0
#/%/0
1'0;,/0 -$ " -$1/-@$!$B-$, -$ " @$!$ %0!,%"-!,1$ ($1"'/1$ ,%,/ NULLD7
C"%(/-
1/$ +"$10 @"#"-/ $!0#0$-/ !"%-1',!1// !$ $!0#0$ /%1'-" '0-1'/!1/0 (0
!0'0'08
!, ,'*$1"$'0#0 0A!0+1//3


-,;!0'0'/#0 %, -,%1 +0'*/-0


'0@0'/'/#0 #$ +-0,("-!"#"$%0 !$ SYSDATE %, -,%1 +0'*/-0


S/%1$A$3
QCONSTRAINT %,*0 !"%-1'$%90'0R CHECK B!"%(/1/0D
Alte optiuni ale constrangerilor
DISABLE A($,9$%( DISABLE ,%0/ (0@/%/1// (0 !"%-1'$%90'0
/%-0$*%$ !$ ORACLE %, " @"'10$6$7
C"%-1'$%90'0$ +"$10
@/ /%!$ !/1/1$ (0 ,%0#10#0 ORACLE +0%1', $
!"%-1',/
'09,#/ /%1'-" $+#/!$1/0 -/ +,101/ @$!0
+"-/;/#$ !"%-
-1'$%90'0$ *$/ 1$'6/, +'/% !"*$%($ ALTER TABLE7

CREATE TABLE EMP
( . . . . . ,
ENAME VARCHAR2(10) CONSTRAINT CHK_UPP_NAM CHECK(ENAME-
UPPER(ENAME))
DISABLE,
. . . . . . . ) ;

ENCEPTIONS I(0%1/@/!$ " 1$;0#$ 0A/-10%1$ ,%(0 0-10 +#$-$1$
INTO %,*0 1$;0#$ /%@"'*$1/$ (0-+'0 #/%//#0 !$'0 /%!$#!$
!"%-1'$%90'0$7

CREATE TABLE EMP
( . . . . . ,
ENAME VARCHAR2(10) CONSTRAINT CHK_UPP_NAM CHECK(ENAME-
UPPER(ENAME))
EXCEPTIONS INTO CON_VIOLATE,
. . . . . . . ) ;

I% @/%$#8 %"1$1/ !$ 1$;0#0#0 '0@0'/10 /%1'-" !"%-1'$%90'0 1'0;,/0 -$
0A/-10
/% $!00$-/ ;$6$ (0 ($107 D$!$ 0#0 $+$'1/% ,%,/ ,1/#/6$1"' (/@0'/1
$1,%!/ +"-
-0-"',# 1'0;,/0 -+0!/@/!$1 !$ ,% +'0@/A7
I$1$ ,% 0A0*+#, !"*+#01 $# !"%-1',!1/0/ 1$;0#0/ EMP !, !"%-1'$%90'/ 3
CREATE TABLE EMP
(EMPNO NUMBER(4) CONSTRAINT EMP_PRIM PRIMARY KEY,
ENAME VARCHAR2(10) CONSTRAINT ENAME_CONS
CHECK(ENAME=UPPER(ENAME)),
JOB VARCHAR2(10),
MGR NUMBER(4) CONSTRAINT EMP_MGR
REFERENCES EMP(EMPNO),
HIREDATE DATE DEFAULT SYSDATE,
SAL NUMBER(7,2) CONSTRAINT SAL_CONS
NOT NULL,
COMM NUMBER(7,2),
DEPTNO NUMBER(2) CONSTRAINT DEPTNO_CONS
NOT NULL,
CONSTRAINT EMP_DEPT FOREIGN KEY (DEPTNO)
REFERENCES DEPT(DEPTNO))
4rearea unei tabele cu linii din alta tabela
EA/-1$ " $ (",$ @"'*$ $ (0!#$'$1/0/ CREATE TABLE /% !$'0 1$;0#$
0-10
!'0$1$ !, #/%// +"1'/2/108 (0'/2$10 (/% $#1$ 1$;0#$3
CREATE TABLE DEPT
QB%,*0-!"#"$%$ 87 7 7 7DR
AS SELECT (0!#$'$1/0

T$;0#$ 2$ @/ !'0$1$ !, !"#"$%0 -+0!/@/!$10 -/ #/%// '0!,+0'$10
(/% (0-

!#$'$1/$ SELECT /%-0'$1$7


N,*$/ !"%-1'$%90'/#0 NULLFNOT NULL -,%1 *"-10%/10 (/% 1$;0#$
-0#0!1$-

1$7


D$!$ 1"$1$ !"#"$%0#0 /% (0!#$'$1/$ SELECT $, %,*0 ;/%0 (0@/%/10
B%,

-,%1 0A+'0-// -7$7*7(7D -+0!/@/!$1//#0 !"#"$%0/ +"1 @/


"*/-07


D$!$ -,%1 ($10 -+0!/@/!$1//#0 !"#"$%0/8 $1,%!/ %,*$',# (0
!"#"$%0 1'0-

;,/0 -$ @/0 09$# !, %,*$',# (0 $'1/!"#0 /% #/-1$ SELECT7

P0%1', $ !'0$ " 1$;0#$ DEPT30 !$'0 1/%0 %,*0'0#0 $%9$:$1/#"'8 %,*08
:";-,'/
-/ -$#$'//#0 $%9$:$1/#"' (/% (0+$'1$*0%1,# 308 /%1'"(,!01/3
CREATE TABLE DEPT30
AS
SELECT EMPNO,ENAME,JOB,SAL
FROM EMP
WHERE DEPTNO = 30;
T$;#0 !'0$10(7
P0%1', $ 20(0$ (0-!'/0'0$ #,/ DEPT308 /%1'"(,!01/3
DESC DEPT30
P0%1', $ !'0$ " 1$;0#$ 1/%$%( %,*0#0 $%9$:$1,#,/8 -$#$'/,# -/ (01$#//
(0
9'$(8 /%1'"(,!01/3
CREATE TABLE EMP_SALS
(NAME,SALARY,GRADE)
AS
SELECT ENAME, SAL, GRADE
FROM EMP, SALGRADE
WHERE EMP.SAL BETWEEN LOSAL AND HISAL;
T$;#0 !'0$10(7
DESC EMP_SALS;
P0%1', $ $@/-$ !"%1/%,1,# 1$;0#0/ EMP SALS8 /%1'"(,!01/3
SELECT *
FROM EMP_SALS;
8F+'0)
4AP.(0L8L 12 E1ercitii $ 4rearea de
tabele si de constrangeri
Atelier

17 C'0$1/ " 1$;0#$ %,*/1$ PROJECTS8 !, !"#"$%0#0 -+0!/@/!$10 !$ *$/
:"-7P0
27
37 #$%9$ $!0$-1$ 8 (0@/%/1/ PROJID !$8 !"#"$%$ (0 CHEIE
PRIMARA 8 -/ $-/9,'$-
47
?7 1/-2$ !$ ($10#0 PGENDGDATE %, -,%1 *$/ '0!0%10 (0!$1 ($10#0
PGSTARTGDATE7
=7
77
>7
<7
107
117
127 C'0$1/ " $ (",$ 1$;0#$8 ASSIGNMENTS8 !$ !0$ (0 *$/ :"-7
D0@/%/1/-/ !"#"$%$
137
147 PROJID !$ " !T0/0 0A10'%$ !$'0 '0@0'$ 1$;0#$ PROJECTS7
C"#"$%$ EMPNO $ 1$-
1?7
1=7 ;0#0/ (,*%0$2"$-1'$ 0-10 " 2//1"$'0 !T0/0 0A10'%$ $ #,/ EMP7
A!0-10 (",$
177
1>7 !"#"$%0 %, $' 1'0;,/ -$ +0'*/1$ 2$#"'/ NULL BPROJID -/
EMPNOD7
1<7
207
217
227
237
247 S,%1 $#10 !"%-1'$%90'/ +0 !$'0 $' 1'0;,/ -$ #0 $%9$:$* /%
$!0-10 1$;0#07
2?7
2=7 A!0-10$ 2"' @/ $($,9$10 /%1'-,% 2//1"' $10#/0'7
277
2>7
2<7
307
317 ."#"-/1/ !"*$%($ DESCRIBE +0%1', $ 20'/@/!$ (0@/%/1//#0
!"#"$%0#"'7 BN0
327
337 2"* ,/1$ #$ !"%-1'$%90'/ *$/ 1$'6/,D7
347
3?7
3=7
377
4AP.(0L8L 12 $Solutii
./0!$'0 (/% !"%-1'$%90'/#0 $'$1$10 *$/ :"- $' @/ +,1,1 @/ (0@/%/10 !$
"'/!$-
'0 !"%-1'$%90'0 (0 1$;0#$ -$, !"%-1'$%90'0 (0 !"#"$%$7

17
2.
3.
4. CREATE TABLE PROJECTS
5.
6. ( PROJID NUMBER(4) CONSTRAINT PROJ_PRIM PRIMARY
KEY,
7.
8. P_DESC VARCHAR2(20),
9.
10. P_START_DATE DATE,
11.
12. P_END_DATE DATE,
13.
14. BUDGET_AMOUNT NUMBER(7,2),
15.
16. MAX_NO_STAFF NUMBER(2),
17.
18. CONSTRAINT P_DATE_RULE CHECK(P_START_DATE <= P_END_DATE))
19.


207
21.
22.
23. CREATE TABLE ASSIGNMENTS
24.
25. (PROJID NUMBER(4) NOT NULL REFERENCES PROJECTS
(PROJID),
26.
27. EMPNO NUMBER(4) NOT NULL REFERENCES EMP
(EMPNO),
28.
29. A_START_DATE DATE,
30.
31. A_END_DATE DATE,
32.
33. BILL_RATE NUMBER(4,2),
34.
35. ASSIGN_TYPE VARCHAR2(2))
36.

CAPITOLUL 13
Ma&a)e(e&t+ul de ta%ela si Dictio&arul de Date
,n acest capitol secund al imba+ului de *efinire a *atelor vom vedea comenzile pentru
modificarea si mutarea tabelelor si constrangerilor lor. *easemenea, vom vedea cum
informatii despre baza de date pot fi e&trase din *ictionarul de *ate.
Modi,icarea u&ei ta%ele
0olositi comanda A(2- (A82 pentru a schimba definitia unei tabele.
Sinta&a:
ALTER TABLE %,*0-1$;0#$
Q ADD RB-+0!/@/!$1"' !"#"$%$Q!"%-1'$%90'0 (0 !"#"$%$RDQENABLE
!#$,6$ R
QMODI.Y R QDISABLE
!#$,6$R
QDROP "+1/,%/R
Clauza ADD
0olositi cuvantul cheie A** pentru a adauga o coloana si!sau constran% geri pentru o
tabela e&istenta. Pentru a adauga o coloana tabelei 24P care va tine numele sotului
anga+atului, introduceti:
ALTER TABLE EMP
ADD (SPOUSES_NAME CHAR (10));
(able altered.
Pentru a vedea descrierea tabelei revizuite, introduceti:
DESCRIBE EMP;
Pentru a adauga o constrangere de tabela unei tabele e&istente, care specifi% ca daca
salariul lunar nu trebuie sa depaseasca F<<<Q, introduceti:
ALTER TABLE EMP
ADD(CHECK(SAL <=5000));
8F+'0)
4lau+a M0D.29
."#"-/1/ !,2$%1,# !T0/0 MODI.Y +0%1', $ *"(/@/!$ (0@/%/1/$ ,%0/
!"#"$%0
0A/-10%107
ALTER TABLE nume
MODIFY (tip coloana [NULL])
P0%1', $ -!T/*;$ #,%9/*0$ #,/ ENAME #$ 2? (0 !$'$!10'08
/%1'"(,!01/ 3
ALTER TABLE EMP
MODIFY (ENAME CHAR (25));
T$;#0 $#10'0(7
DESCRIBE EMP;
Sunt 4 schimbari pe care nu le puteti face

17 N, +,101/ -!T/*;$ " !"#"$%$ !"%1/%$%( %,##-,'/ (/% NULL /% NOT
NULL7
27
37 N, +,101/ $($,9$ " %",$ !"#"$%$ !$'0 0-10 NOT NULL7 .$!01/-"
%,##8 ,*-
47 +#01/-" !"*+#01 -/ $+"/ -!T/*;$1/-" /% NOT NULL7
?7
=7 N, +,101/ -$ -!$(01/ (/*0%-/,%0$ ,%0/ !"#"$%0 -$, -$-/ -!T/*;$1/
1/+,# (0
77 ($108 %,*$/ ($!$ %, !"%1/%0 ($107
>7
<7 N, +,101/ @"#"-/ "+1/,%0$ MODI.Y +0%1', $ (0@/%/ !"%-1'$%90'/ +0
" !"#"$%$
107 0A!0+1$%( NULLFNOT NULL7
117
P0%1', $ *"(/@/!$ $#10 !"%-1'$%90'/ 1'0;,/0 -$ #0 0#/*/%$1/ -/ $+"/ -$
#0 $-
($,9$1/ -+0!/@/!$%( *"(/@/!$'/#07
4lau+a DR0P
."#"-/1/ !#$,6$ DROP +0%1', $ *,1$ " !"%-1'$%90'0 (/% $#1$ 1$;0#$7
S/%1$A$3
ALTER TABLE %,*0 1$;0#$
DROP QCONSTRAINT %,*0 !"%-1'$%90'0 R QCASCADER
QPRIMARY KEY R
QUNI&UE B!"#"$%$8 !"#"$%$8 777DR
D0 0A0*+#,3
ALTER TABLE EMP
DROP CONSTRAINT EMP_MGR;
ALTER TABLE EMP
DROP PRIMARY KEY;
Optiunea CASCADE (in claua D!O")
O+1/,%0$ CASCADE $ !#$,60/ DROP @$!0 !$ "'/!0 !"%-1'$%90'0
(0+0%(0%1$
-$ @/0 (0$-0*0%0$ 0#/*/%$1$7
D0 0A0*+#,3
ALTER TABLE DEPT
DROP PRIMARY KEY CASCADE;
$' +,10$ (0$-0*0%0$ -$ @$!$ !$ !"%-1'$%90'0$ !T$// 0A01'%0 (/%
EMP)DEPTNO -$
@/0 0#/*/%$1$7
4lau+a E:A;LE<D.SA;LE
A!0$-1$ !#$,6$ $ !"*0%6// ALTER TABLE +0'*/10 !"%-1'$%90'/#"' -$
@/0 @$-
!,10 +"-/;/#0 -$, (06$!1/2$10 @$'$ $ #0 0#/*/%$ -$, '0!'0$7
S/%1$A$3
QDISABLER Q UNI&UE B!"#"$%$8 !"#"$%$8 777D R QCASCADER
QENABLE R Q PRIMARY KEY R
Q CONSTRAINT %,*0 !"%-1'$%90'0 R
C$ -/ #$ !#$,6$ DROP8 $($,9$'0$ !,2$%1,#,/ !T0/0 CASCADE -0*%/@/!$ !$
!"%-
-1'$%90'/#0 (0+0%(0%10 -,%1 (0$-0*0%0$ $@0!1$107
D0 0A0*+#,3
ALTER TABLE DEPT
DISABLE CONSTRAINT DEPT_PRIM CASCADE;
Alte comen+i LDD
Eliminarea unei tabele
P0%1', $ -10'90 (0@/%/1/$ ,%0/ 1$;0#0 ORACLE8 @"#"-/1/ !"*$%($
DROP
TABLE7
S/%1$A$3
DROP TABLE %,*0 1$;0#$ QCASCADE CONSTRAINTSR
D0 0A0*+#,3
DROP TABLE EMP;
S10'90'0$ ,%0/ 1$;0#0 (,!0 #$ +/0'(0'0$ 1,1,'"' ($10#"' (/% 0$ -/
$ 1,-
1,'"' /%(0!-/#"' $-"!/$1/ 0/7 O+1/,%0$ CASCADE CONSTRAINTS 2$ -10'90
(0$-0*0-
%0$ '0@0'/'/#0 #$ !"%-1'$%90'/#0 (0 /%109'/1$10 (0+0%(0%107
:ote6

T"$10 ($10#0 2"' @/ (0$-0*0%0$ -10'-0 (/% 1$;0#$7

O'/!0 HIEWS -$, SYNONYMS 2"' '$*$%08 ($' 2"' (020%/ /%2$#/(07

O'/!0 1'$%6$!1// %0'06"#2$10 -,%1 '0$#/6$107

N,*$/ !'0$1"',# 1$;0#0/ -$, DBA +"$10 -$ " -10$'9$7

4omanda 40MME:(
."#"-/1/ !"*$%($ COMMENT +0%1', $ /%-0'$ ,% !"*0%1$'/, +$%$ #$
2?? (0
!$'$!10'08 (0-+'0 " 1$;0#$ -$, !"#"$%$8 /% (/!1/"%$',# (0 ($107
P0%1', $ $($,9$ ,% !"*0%1$'/, ,%0/ 1$;0#0 %,*/1$ EMP8 /%1'"(,!01/3
COMMENT ON TABLE EMP IS 'Employee Information';
P0%1', $ $($,9$ ,% !"*0%1$'/, +0 !"#"$%$ EMPNO /% 1$;0#$ EMP8
/%1'"(,!01/3
COMMENT ON COLUMN EMP.EMPNO IS 'Unique employee number';
P0%1', $ -10'90 ,% !"*0%1$'/,8 0*/101/ !"*$%($ COMMENT @$'$ ,%
!"*0%1$'/,3
COMMENT ON COLUMN EMP.EMPNO IS '';
8F+'0)
P0%1', $ 20(0$ !"*0%1$'/,#8 -0#0!1$1/ !"#"$%$ COMMENTS (/% ,%$ (/%
20(0'/#0
(/!1/"%$',#,/3ALLGCOLGCOMMENTS -$, USERGCOLGCOMMENTS7 D/!1/"%$',# (0
D$10
0-10 $!"+0'/1 *$/ 1$'6/, /% $!0-1 !$+/1"#7
4omanda RE:AME
C"*$%($ RENAME 0-10 @"#"-/1$ (0 !'0$1"',# #,/ TABLES8 HIEWS -/
SYNONYMS
+0%1', $ -!/*;$ %,*0#0 ";/0!1,#,/ ;$60/ (0 ($107
P0%1', $ '0(0%,*/ ,% ";/0!1 $# ;$60/ (0 ($10 -/%1$A$ 0-103
RENAME 20!T/ TO %",5
P0%1', $ '0(0%,*/ 1$;0#$ EMP /% EMPLOYEE8 /%1'"(,!01/3
RENAME EMP TO EMPLOYEE5
P0%1', $ '0(0%,*/ 1$;0#$ SALGRADE8 /%1'"(,!01/3
RENAME SALGRADE TO EMPLOYEEGGRADES5
E-10 /*+"'1$%1 (0 %"1$1 !$ "'/!0 $+#/!$1//F+'"9'$*0F'$+"$'10 !$'0 -0
'0@0'$ #$ ";/0!10 !0
$, @"-1 '0(0%,*/108 1'0;,/0 $*0%($107
4omanda (R8:4A(E (A;LE
A!0$-1$ !"*$%($ 2$ +0'*/10 -$ -10'901/ 1"$10 #/%//#0 (/%1'-"
1$;0#$7 N"-
1$1/ !$ !"*$%($ DELETE +"$10 (0$-0*0%0$ '0$#/6$ $!0$-1$ !$ " +$'10 $
1'$%-
6$!1/0/ (0 *$%/+,#$'0 $ ($10#"' B$!"+0'/1$ /% !$+/1"#,# ,'*$1"'D8 ($'
!"*$%($
TRUNCATE TABLE ,*+#0 " 1$;0#$ *$/ 0@/!/0%1 !$ " $!1/,%0 (0 (0@/%/'0 (0
($108
+$%$ !$%( %, 0-10 '01/%,1$ %/!/ " /%@"'*$1/0 (0 '"##;$!U7
S/%1$A$3
TRUNCATE TABLE %,*0 1$;0#$ QREUSE STORAGER
O+1/,%0$ REUSE STORAGE +$-1'0$6$ -+$1/,# (/% #/%//#0 -10'-0 +0%1',
'0,1/#/6$-
'0$ 1$;0#0/7 I*+#/!/18 $!0-1 -+$1/, 0-10 0#/;0'$17
Dictionarul de Date 0racle
D/!1/"%$',# (0 D$10 0-10 ,%$ (/% +$'1/#0 !0#0 *$/ /*+"'1$%10 $#0
#,/
ORACLE RDBMS7 C"%-1$ (/%1'-,% -01 (0 1$;0#0 -/ 20(0'/ !$'0 @,'%/60$6$
,% 9T/(
(0 '0@0'/%1$ $!!0-/;/# ("$' #$ !/1/'08 (0-+'0 ;$6$ (0 ($107
D/!1/"%$',# (0
D$10 2$ 2$ -+,%03

%,*0#0 ,1/#/6$1"'/#"' ORACLE

('0+1,'/#0 -/ +'/2/#09//#0 !$'0 #0-$, @"-1 $!"'($10

%,*0#0 ";/0!10#"' ;$60/ (0 ($10 B1$;0#08 20(0'/8 /%(0!-/8
-/%"%/*08-0!-
20%108777D

!"%-1'$%90'/ $+#/!$10 1$;0#0/

/%@"'*$1// (0 '02/6/08 !$3 !/%0 $ $!!0-$1 -/ $!1,$#/6$1
";/0!10#0 ;$60/
(0 ($10 -+0!/@/!$107

D/!1/"%$',# (0 D$10 0-10 !'0$1 !$%( 0-10 !'0$1$ ;$6$ (0 ($107 O'/!$%(
;$6$ (0
($10 0-10 /% "+0'$1//8 D/!1/"%$',# (0 D$10 0-10 $!1,$#/6$1 (0 ORACLE
RDBMS7
D/!1/"%$',# (0 D$10 0-10 " '0@0'/%1$ +0%1', 1"1/ ,1/#/6$1"'//
;$60/ (0
($107 E-10 " -,'-$ 2$#"'"$-$ (0 /%@"'*$1// +0%1', ,1/#/6$1"'/8
+'"/0!1$%1/ (0
$+#/!$1// -/ DBA7 D/!1/"%$',# (0 D$10 0-10 (0$-0*0%0$ !'/1/! +0%1',
"+0'$1/$
ORACLE RDBMS8 !$'0 /# '0$-0$6$ +0%1', $ /%'09/-1'$ -/ 20'/@/!$
/%@"'*$1//
(0-+'0 ;$6$ (0 ($107
Accesul la Dictionarul de Date
#tiliatori
A!!0-,# #$ ";/0!10#0 D/!1/"%$',#,/ (0 D$10 0-10 +'/% S&L7 D0!#$'$1//#0
SELECT +"1 @/ @"#"-/10 +0%1', $ !0'0 /%@"'*$1// (/% D/!1/"%$',# (0
D$107
!D$%S
N/!/ ,% ,1/#/6$1"' %, $' 1'0;,/ -$ -!T/*;0 2'0"($1$ B/%-0'0608
$!1,$#/6060
-$, -10$'9$D %/!/ " #/%/0 -$, ";/0!1 /% D/!1/"%$',# (0 D$108 0-10
+'";$;/# -$
!"*+'"*/1$ /%109'/1$10$ ($10#"'7 RDBMS $!1,$#/60$6$ $,1"*$1
D/!1/"%$',# (0
D$10 +0%1', $ '0@#0!1$ -!T/*;$'/#0 -1',!1,'// ;$60/ (0 ($108
+0'*/-/,%/8 '0-
2/6// -/ $#10 ($107 I% 1/*+,# "+0'$1/0/ ;$60/ (0 ($108 RDBMS !/10-10
(0$-0-
*0%0$ D/!1/"%$',# (0 D$10 +0%1', $ (0-!"+0'/ ";/0!10#0 !$'0 0A/-1$ -/
!$ ,1/-
#/6$1"'// -$ $/;$ $!!0- #$ 0#07
(abelele si -ederile Dictionarului de
Date
&abele
B$6$ D/!1/"%$',#,/ (0 D$10 -$, @,%($*0%1,# 1$;0#0#"' -,%1 +'/*0#0
"-
;/0!10 !0 1'0;,/0 !'0$10 /% ;$6$ (0 ($108 +0%1', !$ 0#0 1'0;,/0 -$ @/0
+'0-
60%10 +0%1', 1"$10 ";/0!10#0 !0 1'0;,/0 !'0$107 T$;0#0# D/!1/"%$',#,/
(0 D$10
-,%1 !'0$10 $,1"*$1 (0 (0!#$'$1/$ S&L CREATE DATABASE -/ %, -,%1 /%
+"-0-/$
,1/#/6$1"',#,/ SYS7 T$;0#0#0 (0 ;$6$ -,%1 '$'0"'/ $!!0-$10 (/'0!18
(0"$'0!0
/%@"'*$1/$ (/% 0#0 %, 0-10 ,-"' (0 /%10#0-7
'ederi
H0(0'/#0 D/!1/"%$',#,/ (0 D$10 B1$;0#0 2/'1,$#0 - $!"+'/10 /%
!$+/1"#,#
1?D !"%1/% /%@"'*$1// /%1'-" @"'*$ !$'0 0-10 ,-"' (0 /%10#0- +0%1',
,1/#/6$-
1"'7 A!!0-,# +,;#/! #$ D/!1/"%$',# (0 D$10 0-10 ($1 +'/% 20(0'/ *$/
(09'$;$
(0!$1 +'/% 1$;0#0 (0 ;$6$7 SYS +"-0($ (0$-0*0%0$ 20(0'/#0 D/!1/"%$',#,/
(0 D$107
H0(0'/#0 $, @"-1 %,*/10 +0%1', $ '0@#0!1$ 1/+,# (0 ,1/#/6$'0
("'/17 H0-
(0'/#0 -,%1 !#$-/@/!$10 /% 3 9',+0 (/-1/%9$%(,--0 /%1'0 0#0 +'/%
+'0@/A0#0
USER8 ALL -/ DBA7
C0#0 1'0/ !#$-0 (0 20(0'/ -,%13
USERGAAAAA
O;/0!10#0 +"-0($10 (0 ,1/#/6$1"' +"1 @/ $!!0-$107 D0 0-
0A0*+#,8 20(0'/#0 !, $!0-1 +'0@/A +0'*/1
,1/#/6$1"',#,/
-$ $@/-060 /%@"'*$1// (0-+'0 1$;0#0#0 !'0$10 (0
,1/#/6$-
1"' -/ +'/2/#09//#0 $!"'($10 (0 ,1/#/6$1"'7
ALLGAAAAA
U1/#/6$1"'// +"1 $!!0-$ ";/0!10 #$ !$'0 #0-$, @"-1 +0'*/-0
('0+1,'/#0 (0 $!!0-8 /% +#,- @$1$ (0 ";/0!10#0 +0
!$'0 #0
+"-0($7
DBAGAAAAA
P0%1', ,1/#/6$'0 (0 !$1'0 ,1/#/6$1"'/ !, +'/2/#09/, DBA -
+"1 $!!0-$ "'/!0 ";/0!1 /% ;$6$ (0 ($107
U%0#0 (/%1'0 20(0'/#0 D/!1/"%$',#,/ (0 D$10 %, ,1/#/60$6$
+'0@/A0#0 #/--
1$10 *$/ -,-7 A!0-10 20(0'/ /%!#,(3
DICTIONARY
L/-10$6$ 1"$10 1$;0#0#08 20(0'/#08 D/!1/"%$',#,/
(0 D$108 $!!0-/;/#0 ,1/#/6$1"',#,/7
DICTGCOLUMNS
L/-10$6$ !"#"$%0#0 /% (/!1/"%$',# ";/0!10#"' $!-
!0-/;/#0 ,1/#/6$1"',#,/7
CONSTRAINTGDE.S
L/-10$6$ 1"$10 (0@/%/1//#0 (0 !"%-1'$%90'/ /%1'"-
(,-0 +0%1', 1$;0#0#0 $!!0-/;/#0
,1/#/6$1"',#,/7
CONSTRAINTGCOLUMNS
L/-10$6$ 1"$10 !"#"$%0#0 !$'0 -,%1 $!!0-/;/#0 ,-
1/#/6$1"',#,/ !,'0%1 -/ %,*/10 /%
(0@/%/1//#0
!"%-1'$%90'/#"'7
=ederea D.4(.0:AR9
DICTIONARY #/-10$6$ 1"$10 ";/0!10#0 D/!1/"%$',#,/ (0 D$10
$!!0-/;/#0 ,-
1/#/6$1"',#,/ !, " -!,'1$ (0-!'/0'0 $ ";/0!1,#,/7
U'*$1"$'0$ (0!#$'$1/0 S&L $@/-0$6$ !"%1/%,1,# 1$;0#0/ DICTIONARY 3
SELECT 4
.ROM DICTIONARY5
M,#10 (/% 20(0'/#0 D/!1/"%$',#,/ (0 D$10 $, %,*0 #,%97 S/%"%/*0#0
+,;#/!0 $,
@"-1 @,'%/6$108 !$ $;'02/$1//8 +0%1', $!!0-,# !"%20%$;/# #$ ,%0#0 (/%
!0#0
*$/ !"*,%0 20(0'/ $#0 D/!1/"%$',#,/ (0 D$10 ,1/#/6$1"'7
N,*0#0 T$;0#0/ C"*0%1$'//
-------------- ----------
ALLGCATALOG T"$10 1$;0#0#08 20(0'/#08 -/%"%/*0#08
-0!20%-
10#0 $!!0-/;/#0 ,1/#/6$1"',#,/
ALLGCOLGCOMMENTS C"*0%1$'// +0 !"#"$%0#0 1$;0#0#"' -/
20(0'/-
#0 $!!0-/;/#0
ALLGCOLGPRIHS P0'*/-/,%/ +0 !"#"$%0#0 +0%1', !$'0
,1/#/6$-
1"',# 0-10 V9'$%1"'V8 V9'$%100V8
+'"+'/01$'8
-$, ,% '"# +"-/;/# -$, PUBLIC 0-10
V9'$%100V
ALLGCOLGPRIHSGMADE P0'*/-/,%/ +0 !"#"$%0#0 +0%1', !$'0
,1/#/6$-
0 +'"+'/01$' -$, V9'$%1"'V
ALLGCOLGPRIHSGRECD P0'*/-/,%/ +0 !"#"$%0#0 +0%1', !$'0
,1/#/6$-
1"',#8 PUBLIC -$, '"#,# +"-/;/# 0-10
V9'$%-
100V
ALLGCONSTRAINTS D0@/%/1// (0 !"%-1'$%90'/ +0 1$;0#0
$!!0-/-
;/#0
ALLGCONSGCOLUMNS I%@"'*$1// (0-+'0 !"#"$%0#0
$!!0-/;/#0 /%
(0@/%/1//#0 (0 !"%-1'$%90'/
ALLGDBGLINKS L09$1,'/#0 ;$60/ (0 ($10 $!!0-/;/#0
,1/#/6$-
1"',#,/
ALLGDE.GAUDITGOPTS O+1/,%/ (0 '02/6,/'0 +0%1', %"/#0
";/0!10
!'0$10
ALLGDEPENDENCIES D0+0%(0%10 (/%-+'0 -/ /%-+'0
";/0!10#0 $!!0-
-/;/#0 ,1/#/6$1"',#,/
ALLGERROR E'"'/#0 !,'0%10 +0 ";/0!10#0 -1"!$10
#$ !$'0
,1/#/6$1"',# 0-10 +0'*/- -$ !'0060
B+$97 13-13D
ALLGINDENES D0-!'/0'0$ /%(0!-/#"' +0 1$;0#0#0
$!!0-/;/#0
,1/#/6$1"',#,/
ALLGINDGCOLUMNS C"#"$%0#0 !,+'/%6$%( /%(0!-/ +0
1$;0#0 $!!0-
-/;/#0
ALLGOBJECTS O;/0!10#0 $!!0-/;/#0 ,1/#/6$1"',#,/
ALLGSE&UENCES D0-!'/0'0$ SE&UENCE-,'/#"' $!!0-/;/#0
,1/#/-
6$1"',#,/
ALLGSNAPSHOTS I%-1$%1$%00 #$ !$'0 +"$10 +'/2/
,1/#/6$1"',#
ALLGSOURCE S,'-$ !,'0%1$ $ ";/0!10#"' !'0$10 +0
!$'0 ,-
1/#/6$1"',# $'0 +0'*/-/,%0$ -$ #0
!'0060
ALLGSYNONYMS T"$10 -/%"%/*0#0 $!!0-/;/#0
,1/#/6$1"',#,/
ALLGTABLES D0-!'/0'0$ 1$;0#0#"' $!!0-/;/#0
,1/#/6$1"',-
#,/
ALLGTABGCOLUMNS C"#"$%0#0 1,1,'"' 1$;0#0#"'8
20(0'/#"' -/
!#,-10'0#"'
ALLGTABGCOMMENTS C"*0%1$'// +0 1$;0#0 -/ 20(0'/
$!!0-/;/#0 ,-
1/#/6$1"',#,/
ALLGTABGPRIHS P0'*/-/,%/ +0 ";/0!10 +0%1', !$'0
,1/#/6$1"-
',# 0 V9'$%1"'V8 V9'$%100V -$,
+'"+'/01$'8
-$, ,% '"# +"-/;/# -$, PUBLIC 9$'$%1/0
ALLGTABGPRIHSGMADE P0'*/-/,%/#0 ,1/#/6$1"'/#"' -/
+0'*/-/,%/ +0
";/0!10#0 ,1/#/6$1"'/#"'
ALLGTABGPRIHSGRECD P0'*/-/,%/ +0 ";/0!10 +0%1', !$'0
,1/#/6$1"-
',#8 PUBLIC -$, ,% '"# +"-/;/# 0-10
V9'$%-
100V
ALLGTRIGGERS TRIGGER-,'/ $!!0-/;/#0 ,1/#/6$1"',#,/
!,'0%1
ALLGTRIGGERGCOLS U1/#/6$'0$ !"#"$%0#"' /% 1'/990'-,#
,1/#/6$-
1"'/#"' -$, /% 1'/990'-,'/ +0
1$;0#0#0 ,1/-
#/6$1"'/#"'
ALLGUSERS I%@"'*$1// (0-+'0 1"1/ ,1/#/6$1"'//
;$60/ (0
($10
ALLGHIEWS T0A1,# 20(0'/#"' $!!0-/;/#0
,1/#/6$1"'/#"'
AUDITGACTIONS T$;0#$ (0 (0-!'/0'0 +0%1', $!1/,%0$
(0 ,'*$-
'/'0 $ '02/6/0/ 1/+,#,/ (0 !"(,'/
CAT S/%"%/* !, USERGCATALOG
CLU S/%"%/* !, USERGCLUSTERS
COLS S/%"%/* !, USERGTABGCOLUMNS
COLUMNGPRIHILEGES P0'*/-/,%/ +0 !"#"$%0 +0%1', !$'0
,1/#/6$1"-
',# 0 V9'$%1"'V8 V9'$%100V8
+'"+'/01$'8 -$,
,% '"# +"-/;/# -$, PUBLIC 0-10
V9'$%100V
DICT S/%"%/* !, DICTIONARY
DICTIONARY D0-!'/0'0$ 1$;0#0#"' -/ 20(0'/#"'
D/!1/"%$-
',#,/ (0 D$10
GLOBALGNAME N,*0#0 ;$60/ (0 ($10 9#";$#0
IND S/%"%/* +0%1', USERGINDENES
INDENGHISTOGRAM S1$1/-1/!$ +0 !T0/ !, %,*$'$'0
'0+01$1$
INDENGSTATS S1$1/-1/!$ +0 $';"'/-B
OBJ S/%"%/* +0%1', USERGOBJECTS
RESOURCEGCOSTS C"-1,# @/0!$'0/ '0-,'-0
ROLEGROLEGPRIHS R"#,'/ +0'*/-0 '"#,'/#0
ROLEGSYSGPRIHS P'/2/#09//#0 -/-10* +0'*/-0 '"#,'/#"'
ROLEGTABGPRIHS P'/2/#09// (0 1$;0#$ +0'*/-0 '"#,'/#"'
SE& S/%"%/* +0%1', USERGSE&UENCES
SESSIONGPRIHS P'/2/#09// +0 !$'0 ,1/#/6$1"',# #0-$
-01$1
/% *"( !,'0%1
SESSIONGROLES R"#,'/ +0 !$'0 ,1/#/6$1"',# #0-$
@$!,1 +"-/-
;/#0 /% *"( !,'0%1
SYN S/%"%/* +0%1', USERGSYNONYMS
TABLEGPRIHILEGES A#"!$1// +0 ";/0!10 +0 !$'0
,1/#/6$1"',#
0-10 V9'$%1"'V8 V9'$%100V8 +"-0-"'8
-$, ,%
'"# @$!,1 +"-/;/#8 -$, PUBLIC 0-10
V9'$%-
100-,#V
TABS S/%"%/* +0%1', USERGTABLES
USERGAUDITGOBJECTS I%'09/-1'$'0$ ,'*0#"' 0A$*/%$10
+0%1', (0-
!#$'$1// '0@0'/1"$'0 #$ ";/0!108 -/
$%,*03
1$;0#8 !#,-10'8 20(0'08 /%(0A8
-0!20%1$8
#09$1,'$ ;$60/ (0 ($10 Q+,;#/!$R8
-/%"%/*
Q+,;#/!R8 +'"!0(,'$8 1'/990'8 -09*0%1
'"##-
;$!U8 -+$1/, (0 1$;0#$8 '"#8
,1/#/6$1"'
USERGAUDITGSESSION
USERGAUDITGSTATEMENT I%'09/-1'$'0$ ,'*0#"' 0A$*/%$10
'0@0'/1"$'0
#$ $#"!$1/08 $%,#$'08 0A$*/%$'08
%00A$*/%$-
'0 -/ -/-10* *"(/@/!$1
USERGAUDITGTRAIL I%1'$'/ $#0 ,'*0#"' '02/6,/108
'0#02$%10 ,-
1/#/6$1"',#,/
USERGCATALOG T$;0#08 20(0'/8 -/%"%/*0 -/ -0!20%10
+"-0($-
10 (0 ,1/#/6$1"'
USERGCLUSTERS D0-!'/0'/ $#0 !#,-10'0#"'
,1/#/6$1"',#,/
USERGCLUGCOLUMNS M$+$'0$ !"#"$%0#"' 1$;0#0/ +0%1', $
$(,%$
/*+'0,%$ !"#"$%0#0
TABLENAMECOMMENTS
USERGCOLGCOMMENTS C"*0%1$'// (0-+'0 !"#"$%0#0 1$;0#0#"'
-/ 20-
(0'/#0 ,1/#/6$1"',#,/
USERGCOLGPRIHS P0'*/-/,%/ +0 !"#"$%0#0 +0%1', !$'0
,1/#/6$-
1"',# 0-10 +"-0-"',#8 V9'$%1"'V -$,
V9'$%-
100V
USERGCOLGPRIHSGMADE T"$10 +0'*/-/,%/#0 +0 !"#"$%0#0
";/0!10#"'
+"-0($10 (0 ,1/#/6$1"'
USERGCOLGPRIHSGRECD P0'*/-/,%/ +0 !"#"$%0 +0%1', !$'0
,1/#/6$1"-
',# 0-10 V9'$%100V
USERGCONSTRAINTS D0@/%/1//#0 !"%-1'$%90'/#"' +0
1$;0#0#0 ,1/-
#/6$1"',#,/
USERGCONSGCOLUMNS I%@"'*$1// (0-+'0 !"#"$%0#0
$!!0-/;/#0 /%
(0@/%/1//#0 !"%-1'$%90'/#"'
USERGDBGLINKS L09$1,'/#0 ;$60/ (0 ($10 +"-0($10 (0
,1/#/-
6$1"'
USERGDEPENDENCIES D0+0%(0%10 (/%-+'0 -/ /%-+'0
";/0!10#0 ,1/-
#/6$1"'/#"'
USERGERRORS E'"'/ !,'0%10 +0 ";/0!10 -1"!$108
+"-0($10
(0 ,1/#/6$1"'
USERGENTENTS EA10%-// !,+'/%6$%( -09*0%10 $#0
,1/#/6$1"-
',#,/
USERG.REEGSPACE EA10%-// #/;0'0 /% -+$1/,# 1$;0#0#"'
$!!0-/-
;/#0 ,1/#/6$1"',#,/
USERGINDENES D0-!'/0'0$ /%(0!-/#"' ,1/#/6$1"',#,/
USERGINDGCOLUMNS C"#"$%0#0 !,+'/%6$%( /%(0!-/ $/
,1/#/6$1"',-
#,/ -$, +0 1$;0#0 $#0 ,1/#/6$1"',#,/
USERGOBJECTS O;/0!10 +"-0($10 (0 ,1/#/6$1"'
USERGOBJECTGSIYE D/*0%-/,%/8 /% "!101/8 $ (/@0'/10#"'
";/0!10
+#F-\#
USERGOBJGAUDITGOPTS O+1/,%/ (0 '02/6,/'0 +0%1', 1$;0#0#0
-/ 20(0-
'/#0 ,1/#/6$1"',#,/
USERGRESOURCEGLIMITS A@/-0$6$ #/*/1$ '0-,'-0#"'
,1/#/6$1"',#,/
USERGROLEGPRIHS R"#,'/ +0'*/-0 ,1/#/6$1"',#,/ !,'0%1
USERGSEGMENTS S+$1/, (0 -1"!$'0 $#"!$1 +0%1',
-09*0%10#0
;$60/ (0 ($10
USERGSE&UENCES D0-!'/0'0$ SE&UENCE-#"' ,1/#/6$1"',#,/
USERGSNAPSHOTS I%-1$%1$%00 +0 !$'0 ,1/#/6$1"',# #0
+"$10 20-
(0$
USERGSNAPSHOTSGLOGS T"$10 :,'%$#0#0 /%-1$%1$%00 +"-0($10
(0 ,1/-
#/6$1"'
USERGSOURCE S,'-$ ";/0!10#"' -1"!$10 $!!0-/;/#0
,1/#/6$-
1"',#,/
USERGSYNONYMS S/%"%/*0#0 +'/2$10 $#0 ,1/#/6$1"',#,/
USERGSYSGPRIHS P'/2/#09// (0 -/-10* +0'*/-0
,1/#/6$1"',#,/
!,'0%1
USERGTABLES D0-!'/0'0$ 1$;0#0#"' ,1/#/6$1"',#,/
USERGTABLESPACES D0-!'/0'0$ -+$1//#"' 1$;0#0#"'
$!!0-/;/#0
USERGTABGCOLUMNS C"#"$%0 $#0 1$;0#0#"'8 20(0'/#"' -/
!#,-10'0-
#"' ,1/#/6$1"',#,/
USERGTABGCOMMENTS C"*0%1$'// (0-+'0 1$;0#0#0 -/ 20(0'/#0
+"-0-
($10 (0 ,1/#/6$1"'
USERGTABGPRIHS P0'*/-/,%/ +0 ";/0!10 +0%1', !$'0
,1/#/6$1"-
',# 0-10 +"-0-"',#8 V9'$%1"'-,#V8 -$,
V9'$%-
100-,#V
USERGTABGPRIHSGMADE T"$10 +0'*/-/,%/#0 +0 ";/0!10 +"-0($10
(0 ,-
1/#/6$1"'
USERGTABGPRIHSGRECD P0'*/-/,%/ +0 ";/0!10 +0%1', !$'0
,1/#/6$1"-
',# 0-10 V9'$%100-,#V
USERGTRIGGERS T/990'-,'/ +"-0($10 (0 ,1/#/6$1"'
USERGTRIGGERGCOLS ."#"-/'0$ !"#"$%0/ /% 1'/990'-,#
,1/#/6$1"',-
#,/
USERGTSG&UOTAS C"1$ -+$1/,#,/ (0 1$;0#$ +0%1',
,1/#/6$1"'
USERGUSERS I%@"'*$1// (0-+'0 ,1/#/6$1"',# !,'0%1
USERGHIEWS T0A1 (0 20(0'/ +"-0($1 (0 ,1/#/6$1"'
4ate-a -ederi folositoare
U'*$1"$'0#0 20(0'/ -,%1 +'";$;/#0 (0 $ @/ (0 /%10'0- +0%1',
*$:"'/1$10$
,1/#/6$1"'/#"'3
N,*0 20(0'0 S/%"%/* D0-!'/0'0
----------- ------- ----------
DICTIONARY D/!1 L/-1$ 1,1,'"' ";/0!10#"' ;$60/ (0
($10
USERGOBJECTS O;: O;/0!10#0 +"-0($10 (0 ,1/#/6$1"'
USERGCATALOG C$1 T$;0#08 20(0'/8 -/%"%/*08 -0!20%10
$!!0-/-
;/#0 ,1/#/6$1"',#,/
USERGTABLES T$;- D0-!'/0'0$ 1$;0#0#"' ,1/#/6$1"',#,/
USERGTABGCOLUMNS C"#- C"#"$%0#0 (/% 1$;0#0#0 -/ 20(0'/#0
,1/#/-
6$1"',#,/
USERGCOLGCOMMENTS C"*0%1$'// +0 !"#"$%0#0 1$;0#0#"'
-/ 20(0-
'/#"' ,1/#/6$1"',#,/
USERGTABGCOMMENTS C"*0%6/ +0 1$;0#0 -/ 20(0'/
+"-0($10 (0 ,-
1/#/6$1"'
USERGSE&UENCES S0\ D0-!'/0'0$ -0!20%10#"' +"-0($10 (0
,1/#/-
6$1"'
USERGSYNONYM SX% S/%"%/*,# +'/2$1 $# ,1/#/6$1"',#,/
USERGHIEWS T0A1,# 20(0'/#"' +"-0($10 (0
,1/#/6$1"'
USERGINDENES I%( D0-!'/0'0$ /%(0!-/#"' +'"+'//
,1/#/6$1"',-
#,/
ALLGOBJECTS O;/0!10#0 $!!0-/;/#0 ,1/#/6$1"',#,I
ALLGTABGCOLUMNS C"#"$%0#0 +0%1', 1"$10 1$;0#0#0 -/
20(0'/-
#0 $!!0-/;/#0 ,1/#/6$1"',#,/
D$!$ %, -1/1/ (0@/%/1/$ ,%0/ 1$;0#0 -$, 20(0'/ $ D/!1/"%$',#,/ (0
D$108 -$,
($!$ %, 2$ +,101/ $*/%1/ %,*0#0 ,%0/ !"#"$%0 /%1'-" 1$;0#$F20(0'0
-+0!/@/!$8
$1,%!/ @"#"-/1/ !"*$%($ DESCQRIBER +0%1', $ $@/-$ (0@/%/1/$
1$;0#0/F20(0'//7
P0%1', $ 20(0$ -1',!1,'$ #,/ USERGOBJECTS8 /%1'"(,!01/3
SQL>desc user_objects
O (0-!'/0'0 $ 20(0'// DICTIONARY ,'*0$6$3
SQL>desc dict
N"1$1/ !$ -/%"%/*,# $;'02/$1 DICT +"$10 @/ @"#"-/1 !, '0@0'/'0 #$
DICTIONARY7
O($1$ !0 -1/1/ -1',!1,'$ ,%0/ 1$;0#0F20(0'/8 +,101/ -0#0!1$ /%@"'*$1/$
("'/-
1$3
SELECT OBJECT_NAME, OBJECT_TYPE, CREATED
FROM USER_OBJECTS
WHERE OBJECT_NAME = 'EMP'
2olosirea lui S>L "entru a genera S>L
S&L +"$10 @/ " ,%0$#1$ +,10'%/!$ +0%1', $ 90%0'$ $#10 (0!#$'$1//
S&L8
@$!$%( @"#"-/'0$ /%@"'*$1/0/ /% D/!1/"%$',# (0 D$107 P,101/ @"#"-/ S&L
(/%
S&L +0%1',3

$ 02/1$ !"( '0+01/1/2

$ +'/*/ $:,1"' (0 #$ D/!1/"%$',# (0 D$10

$ '0!'0$ 1$;0#08 20(0'/8 /%(0A-,'/

$ 90%0'$ +'0(/!$10 V(/%$*/!0V8 !"%1/%$%( +$'$*01'/ (/% 1/*+,#
0A0-
!,1/0/

A*/%1/1/-2$8 2/'1,$# +,101/ -0#0!1$ "'/!07


D0 0A0*+#,8 +0%1', $ 90%0'$ (0!#$'$1// S&L4PLUS +0%1', $ (0-!'/0
1"$10
1$;0#0#0 2"$-1'08 @"#"-/1/ ,'*$1"',# S&L3
SELECT 'DESC '||OBJECT_NAME
FROM USER_OBJECTS
WHERE OBJECT_TYPE = 'TABLE'
/
OR
SELECT 'DESC '||TABLE_NAME
FROM USER_TABLES;
EA0*+#0#0 (0 *$/ -,- 90%0'0$6$ ,'*$1"$'0$ /0-/'03
DESC DEPT
DESC EMP
DESC SALGRADE
P0%1', $ 0A0!,1$ (0!#$'$1//#0 (0 *$/ -,-8 0-10 %0!0-$'$ !$+1,'$'0$ #"'
/%1'-,% @/-/0' !$'0 +"$10 @/ +"'%/17
SET ECHO OFF
SET PAGES 0
SET FEEEDBACK OFF
SPOOL X
SELECT 'DESC '||TABLE_NAME
FROM USER_TABLES
/
SPOOL OFF
START X.LIS
I% 0A0*+#,# (0 *$/ -,-* PAGEQSIYER 0-10 +,- +0 08 +0%1', $ 0#/*/%$
1/1#,'/#0
(/% 2$'@ -/ (0 :"-8 !$ -/ !0#0 (0 1$;0#7 N"1$1/ (0$-0*0%0$ !$ 0A10%-/$
LIS
0-10 -+0!/@/!$1$ +0 !"*$%($ START8 (0"$'0!0 START /-/ $-,*$ " 0A10%-/0
$ S&L7
EA0*+#0 *$/ -"@/-1/!$10 $#0 $!0-10/ 10T%/!/ -,%1 (01$/#$10 /%
A+0%(/!0#0 G8
,%(0 !0'0'/#0 (/% D/!1/"%$',# (0 D$10 -,%1 @"#"-/10 +0%1', $ +'"(,!0
!"*0%6/
DML -/ DDL -/ /0-/'07
4AP.(0L8L 13 E1ercitii $ Managementul de
tabela si Dictionarul de Date
Atelier

17 A($,9$1/ " !"#"$%$ LONG %,*/1$ COMMENTS 8 PROJECT TABLE-,#,/
(,*%0$2"$--
27 1'$7 D0$-0*0%0$8 $($,9$1/ " !"#"$%$ NUMBER8 %,*/1$ HOURS8
1$;0#,#,/
37 ASSIGNMENTS7
47
?7
=7 ."#"-/1/ 2/6,$#/6$'0$ (/!1/"%$',#,/ USERGOBJECTS +0%1', $ #/-1$
";/0!10#0
77 +"-0($10 (0 !"%1,# (,*%0$2"$-1'$ ORACLE7 C$10 ";/0!10
+"-0($1/Z
>7
<7
107 A!,* (0@/%/1/ " !"%-1'$%90'0 +0 1$;0#$ ASSIGNMENTS +0%1', $
$-/9,'$ !"*;/-
117 %$1// ,%/!0 (0 P'":0!1 ID -/ %,*$' (0 $%9$:$17
127
137 C0'01/ 20(0'0$ USERGOBJECTS5 +"-0($1/ $!,* 2'0,% ";/0!1
2//1"'Z
147
1?7
1=7 P'/2/1/ /% D/!1/"%$',# (0 D$10 +0%1', /%@"'*$1// (0-+'0
!"%-1'$%90'/ +0
177 1$;0#0#0 2"$-1'0 B+,101/ @"#"-/ 20(0'0$ USERGCONSTRAINTSD7
1>7
1<7
D$!$ $201/ 1/*+ 3
207
217
227 ."#"-/1/ 2/6,$#/6$'0$ (/!1/"%$',#,/ ALLGTABLES +0%1', $ 9$-/
+"-0-"'// -/
237 %,*0#0 1$;0#0#"' #$ !$'0 +,101/ $20$ $!!0-8 ,%(0 %,*0#0
1$;0#0/ /%!#,(0
247 !$'$!10'0#0 VEMPV7
2?7
4AP.(0L8L 13 Solutii

1.
2. ALTER TABLE PROJECTS
3. ADD (COMMENTS LONG)
4.
5. ALTER TABLE ASSIGNMENTS
6. ADD (HOURS NUMBER)
7.
>7

9.
10. SELECT OBJECT_NAME, OBJECT_TYPE
11. FROM USER_OBJECTS
12.
137

14.
15. ALTER TABLE ASSIGNMENTS
16. ADD CONSTRAINT UNQ_KEY UNIQUE (PROJID,EMPNO)
17.
1>7
1<7
207
A1/ @/ +,1,1 $#10'%$1/2 -$ $($,9$1/ " !T0/0 +'/*$'$8 +$%$ !0#0
(",$ !"#"$%0
217 %, +0'*/1 %,##-,'/7 I% @/0!$'0 !$68 ,% /%(0A ,%/! $ @"-1
$($,9$1 #/-10/
227 2"$-1'0 (0 ";/0!10 +"-0($107
237

247 O !0'0'0 +"-/;/#$ 0-103
2?7
26.
27. SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
28. SEARCH_CONDITION
29.
30. FROM USER_CONSTRAINTS


P'";$;/# 201/ 2'0$ -$ @"#"-/1/ !"*0%6/#0 COLUMN +0%1', $
@"'*$1$ '06,#1$-
10#0M

31.
32. SELECT OWNER, TABLE_NAME
33. FROM ALL_TABLES
34. WHERE TABLE_NAME LIKE '%EMP%'
35.
3=7
377
3>7
3<7
CAPITOLUL 14
Li(%aAul de (a&i'ulare a datelor
Acest capitol e&plica cum se fac schimbari liniilor intr%o tabela, cum se adauga noi linii
sau cum se sterg. 2ste introdus conceptul de tranzactie. /onsistenta la citire este
deasemenea discutata.
#&serarea de &oi li&ii i&tr+o ta%ela
/omanda ,:S2-( este folosita pentru a adauga linii unei tabele Sinta&a comenzii
,:S2-( este:
INSERT INTO %,*0 1$;0#$ Q B!"#"$%$8!"#"$%$87777DR
HALUES B2$#"$'082$#"$'087777D5
2ste posibila inserarea unei noi linii cu valori in fiecare coloana, in care caz lista de
coloane nu este ceruta. 2ste recomandat ca /O34: ,S( sa fie intotdeauna
specificata. *aca lista nu este specificata, softNare%ul va cere modificari oriunde definitia
tabelei este modificata.
Pentru a insera un nou departament, introduceti:
INSERT INTO DEPT (DEPTNO,DNAME,LOC)
VALUES (50,'MARKETING','SAN JOSE');
:ota aceasta comanda adauga o singura linie unei tabele.
Pentru a intra intr%un departament nou, omitand numele departamentului, lista de coloane
trebuie specificata:
INSERT INTO DEPT (DEPTNO,LOC)
VALUES (50,'SAN JOSE');
Alternativ, daca numele departamentului nu este cunoscut, un :3 ar putea fi
specificat:
INSERT INTO DEPT (DEPTNO,DNAME,LOC)
VALUES (50,NULL,'SAN JOSE');
5alorile /HA-A/(2- si *A(2 trebuie puse in ghilimele simple.
Folosirea +ariabilelor de !ubstitutie entru a insera linii
*upa cum am mentionat anterior, ,:S2-( este o comanda pentru o singura lini% e.
0olosind variabile de substitutie este posibil sa se mareasca viteza de intrare.
INSERT INTO DEPT (DEPTNO,DNAME,LOC)
VALUES (&D_NUMBER, '&D_NAME', '&LOCATION');
/and comanda este rulata, valorile sunt afisate de fiecare data.
#&serarea i&,or(atiilor de data si ti('
/and se insereaza o valoare *A(2, formatul **%4O:%KK este de obicei folo% sit. /u
acest format secolul implicit este secolul #< '1;nn). *ata deasemenea contine informatii
de timp, care daca nu sunt specificate, implicit devin miezul noptii '<<:<<:<<).
*aca o data trebuie introdusa in alt secol si un timp specific este cerut deasemenea,
folositi functia (OO*A(2:
INSERT INTO EMP
(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)
VALUES (7658,
'MASON',
'ANALYST',
7566,
TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'),
3000,
NULL,
20);
Co'ierea de li&ii di& alta ta%ela
INSERT INTO 1$;0#$ QB!"#"$%$8 !"#"$%$8 7777DR
SELECT #/-1$--0#0!1
.ROM 1$;0#$B0D
Aceasta forma a declaratiei ,:S2-( va permite sa inserati cateva linii intr%o tabela unde
valorile sunt derivate din continutul tabelelor e&istente in baza de date.
Pentru a copia toate informatiile din departamentul 1< in tabela *1<H,S(O-K,
introduceti:
INSERT INTO D10HISTORY
(EMPNO,ENAME,SAL,JOB,HIREDATE
FROM EMP
WHERE DEPTNO=10;
:otati ca cuvantul cheie '5A32S' nu este folosit aici.
Actualizarea li&iilor
*eclaratia 3P*A(2 va permite sa schimbati valori in liniile unei tabele.
UPDATE 1$;0#$Q$#/$-R
SET !"#"$%$ Q8 !"#"$%$777R I ]0A+'0-/08 -,;!0'0'0^
QWHERE !"%(/1/0R5
*e e&emplu:
Pentru a actualiza linia lui Scott, introduceti:
UPDATE EMP
SET JOB='SALESMAN',
HIREDATE = SYSDATE,
SAL = SAL*1.1
WHERE ENAME = 'SCOTT';
1 '0!"'( ,+($10(7
*aca clauza MH2-2 este omisa, toate liniile din tabela vor fi actualizate. 2ste posibil sa
folositi subcereri inlantuite si subcereri corelate in decla% ratia 3P*A(2.
Sa presupunem ca ati avut o cifra noua de comisioane pentru anga+ati siguri. *e e&emplu,
tabela /O44,SS,O: de mai +os este folosita pentru a actualiza li% nii sigure ale tabelei
24P:
COMMISSION EMP
EMPNO COMM EMPNO COMM
------ ---- ----- -----
74<< 1100 74<< 300
7=?4 ?00 7=?4 1400
7>44 3?00 7>44 0
7>44 2000
7>44 1?00
Schimbarile listate in tabela /O44,SS,O: pot fi aplicate tabelei 24P, folosind o
subcerere corelata si o subcerere inlantuita, ca mai +os:
2&emplul 1:
UPDATE EMP
SET COMM = (SELECT COMM FROM COMMISSION C
WHERE C.EMPNO = EMP.EMPNO)
WHERE EMPNO IN (SELECT EMPNO FROM COMMISSION);
3 '0!"'(- ,+($10(7
(abela /O44,SS,O: poate contine mai mult decat o intrare pentru fiecare anga+at, ca
in e&emplul de mai +os :
COMISSION
EMPNO COMM
----- ----
74<< 1100
7=?4 ?00
7=?4 100
7>44 2000
7>44 1?00
*aca doriti sa inlocuiti '-2PA/2) valorile din tabela 24P pentru comision cu
comisionul (O(A pentru fiecare anga+at listat in tabela /O4,SS,O:, atunci puteti
utiliza urmatorul S" :
2&emplul #:
UPDATE EMP
SET COMM = ( SELECT SUM(COMM) FROM COMISSION C
WHERE C.EMPNO = EMP.EMPNO)
WHERE EMPNO IN (SELECT EMPNO FROM COMISSION);
3 inregistrari modificate.
Tabela EMP reflecta comisioanele modificate :
EMP
EMPNO COMM
----- ----
7499 1100
7654 600
7844 3500
O alta posibilitate este cea de a adauga 'A**) la valorile comisionului in tabela
/O4,SS,O: la comisioanele e&istente in tabela 24P mai mult decat inlocuirea lor.
2&emplul G realizeaza acest lucru :
2&emplul G:
UPDATE EMP
SET COMM = ( SELECT SUM(COMM) + EMP.COMM
FROM COMISSION C
WHERE C.EMPNO = EMP.EMPNO)
WHERE EMPNO IN (SELECT EMPNO FROM COMISSION);
Tabela EMP reflecta comisioanele schimbate :
EMP
EMPNO COMM
----- ----
7844 3500
7499 1400
7654 2000
Ster)erea Coloa&elor di&tr+o "a%ela
/omanda *22(2 permite stergerea unei sau mai multor linii dintr%o tabela.
DELETE FROM tabela
[WHERE conditie];
Pentru a sterge toate informatiile despre departamentul 1< din tabela 24P, introduceti :
DELETE FROM EMP
WHERE DEPTNO = 10;
*aca clauza MH2-2 este omisa, atunci toate liniile vor fi sterse.
"!A$=AC"##
Procesarea u&ei "ra&zactii
Ce este o tran,actie "
O tranzactie este o operatie asupra unei baze de date care implica una sau mai multe
modificari in una sau mai multe tabele.
2&ista doua clase de tranzactii. (ranzactii *4 care contin un numar oarecare de blocuri
*4 si pe care O-A/2 le trateaza ca o singura entitate sau o singura unitate logica de
lucru, si tranzactii ** care contin un singur bloc **.
:u pot e&ista situatii "+umatate de drum" in timpul e&ecutiei unei tranzactii, asa incat
unele modificari specificate in tranzactie sa fie aplicate bazei de date si altele nu. Pentru
fiecare tranzactie ori toate modificarile sunt aplicate bazei de date, ori nici una din
modificari nu este indeplinita ' sunt toate abandonate % discarded ).
O tranzactie incepe cand prima comanda e&ecutabila *4 sau ** este intalnita si se
termina in una din urmatoarele situatii :
,ntalneste /O44,(!-O8A/C
/omanda ** se termina
Anumite erori '*2A*O/C)
2U,( % iesire din S".Plus
2roare sistem
3n bloc ** este e&ecutat automat si de aceea implicit incheie o tranzactie.
*upa incheierea unei tranzactii, urmatorul bloc e&ecutabil S" va lansa automat
urmatoarea tranzactie.
&ermanenti,area Modi%icarilor
Pentru ca modificarile sa ramana permanente, ele trebiue e&ecutate asupra bazei de date.
comanda /O44,( realizeaza permanentizarea modificari% lor> -O8A/C permite sa
abandonam sau sa anulam modificarile. 4odifiacrea, sau modificarile, e&ecutate asupra
bazei de date intre # comenzi /O44,( reprezinta o tranzactie. Pana cand tranzactia nu
este e&ecutata, nici una din modificari nu este vizibila utilizatorilor.
$nlaturarea Modi%icarilor Nedorite
4odificarile nee&ecutate pot fi abandonate prin comanda -O8A/C. -O8A/C va
atribui datelor valorile care acestea le aveau imediat dupa e&ecutarea ultimului /O44,(
prin anularea tuturor modificarilor facute dupa ultimul /O44,(.
Erorile de !istem
/and o tranzactie este intrerupta de o eroare serioasa, de e&emplu o eroare de sistem,
intreaga tranzactie este anulata. Aceasta previne erorile datorate modificarilor nedorite
asupra datelor, si realizeaza intoarcerea tabelelor la starile de dupa ultimul /O44,(. ,n
acest fel S".Plus prote+ea% za integritatea tabelelor.
Anularea automata este cauzata cel mai des de catre o eroare de sistem, ca de e&emplu o
resetare a sistemului sau o cadere de tensiune. 2rorile de tastare a comenzilor, ca de
e&emplu tastarea gresita a unor nume de coloane sau incercarile de a realiza operatii
neautorizate asupra tabelelor altor utilizatori, nu intrerup tranzactia si nu realizeaza anu%
larea automata. Aceasta se datoreaza faptului ca aceste erori sunt detectate in cursul
compilarii 'de catre PA-S2-) ' cand un bloc S" este scanat si verificat), si nu in timpul
e&ecutiei.
O tranzactie noua este lansata urmand unui /O44,( sau -O8A/C % adica cand
primul bloc e&ecutabil *4 sau ** este intalnit.
Se(&i,icatia "ra&zactiilor
O-A/2 asigura consistenta datelor bazata pe tranzactii. (ranzacti ile dau utilizatorului
mai multa fle&ibilitate si control la lucrul asupra datelor, si asigura consistenta datelor in
cazul unei erori a procesului utilizator sau a unei erori de sistem.
(ranzactiile ar trebui sa contina doar acele comenzi *4 care realizeaza o singura
modificare asupra datelor. *e e&emplu un transfer de fonduri 'sa spunem 1<<<Q) intre #
conturi ar trebui sa implice un debit al unui cont de 1<<<Q si un credit al altui cont de
1<<<Q. Ambele actiuni ar trebui sa se incheie cu succes sau sa dea eroare impreuna.
/reditul nu ar trebui e&ecutat fara debit.
Co&trolul "ra&zactiilor cu #&structiu&i SQL
3rmatoarele instructiuni S" sunt utilizate cand apar e&ecutii 'commit) sau refaceri
'rollbac9) :
/O44,(DMO-CE
SA52PO,:( numeOsavepoint
-O8A/CDMO-CE to DSA52PO,:(E numeOsavepoint
*e notat ca /O44,( si -O8A/C sunt instructiuni 'blocuri) S".
/ele G blocuri S" utilizate pentru controlul tranzactiilor sunt e&plicate mai +os:
COMM#"E/O!1F
Sinta&a : /O44,(DMO-CE>
Permanentizeaza schimbarile in tranzactia curenta
Sterge toate punctele de salvare 'savepoint) din tranzactie
(ermina tranzactia
2libereaza toate blocarile 'oc9) tranzactiei
/uvantul cheie MO-C este optional
3tilizatorul trebuie sa e&pliciteze sfarsitul tranzactiei in programul aplicatie
utilizand /O44,( 'sau -O8A/C). *aca nu se e&ecuta e&plicit tranzactia si
programul se termina anormal, ultima tranzactie e&ecutata va fi anulata.
2&ecutii implicite 'commit) apar in urmatoarele situatii :
" inainte de o comanda **
" dupa o comanda **
" la inchiderea mormala a unei baze de date
8locurile ** cauzeaza mereu e&ecutii 'commit) in timpul e&ecutiei lor. *aca
introduceti un bloc ** dupa cateva blocuri *4, blocul ** cauzeaza aparitia unui
commit inaintea propriei e&ecutii, incheind tranzactia curenta. Astfel daca blocul **
este e&ecutat pana la capat, este si inregistrat.
SA6EPO#$"
Sinta&a : SA52PO,:( numeOsavepoint
Exemplu :
SAVEPOINT terminare_actualizari
Poate fi utilizat pentru a imparti o tranzactie in bucati mai mici
Punctele de salvare 'savepoints) permit utilizatorului sa retina toata munca sa la
orice moment din timp, cu optiunea de a inregistra mai tarziu totul sau a anula
totul sau o parte din ea. Astfel, pentru o tran% zactie lunga, se pot salva parti din
ea, pe masura e&ecutiei, la sfarsit inregistrandu%se sau refacandu%se continutul
initial. a aparitia unei erori nu trebuie e&ecutat din nou fiecare bloc.
a crearea unui nou punct de salvare cu acelasi nume ca al unuia dinainte, primul
punct este sters.
:umarul ma&im de puncte de salvare pentru un proces utilizator este implicit F.
Aceasta limita poate fi schimbata.

ROLLBACKQWORKR 1" QSAHEPOINTR %,*0G+,%!1G-$#2$'0

,nstructiunea -O8A/C este utilizata pentru a reface un lucru.


/uvantul cheie "Nor9" este optional. ,ntoarcerea la un punct de salvare este de
asemenea optionala.
*aca se utilizeaza -O8A/C fara clauza (O SA52PO,:(, atunci :
" se termina tranzactia
" se anuleaza modificarile din tranzactia curenta
" sterge toate punctele de salvare din tranzactie
" elibereaza blocarile tranzactiei
#&toarcerea la $ivel de loc
O parte a unei tranzactii poate fi anulata. *aca un singur bloc *4 da eroare, O-A/2
5A va intoarce inapoi doar acel bloc. Aceasta facilitate este cunoscuta ca S(A(242:(
252 -O8A/C. ,ntoarcerea la nivel de bloc inseamna daca un singur segment
*4 da eroare la e&ecutia unei tranzactii, efectul lui este anulat, dar schimbarile
realizate de precedentul bloc *4 in tranzactie nu vor fi anulate si pot fi inscrise
'/O44,() sau intoarse '-O8A/C) e&plicit de catre utilizator.
*aca blocul este unul de tip **, inscrierea 'commit) care precede imediat acest bloc nu
este anulata 'schimbarile au fost facute de+a permanen% te). O-A/2 realizeaza
intoarcerea la nivel de bloc prin crearea unui punct de salvare implicit inainte de
e&ecutarea fiecarei comenzi *4. 3tilizatorul nu poate referi caest punct de salvare in
mod direct.
Astfel, daca va intoarceti la un punct de salvare, atunci:
anulati o parte din tranzactie
se retine punctul de salvare pentru intoarcere, dar se pierd toate celelalte punct
create dupa punctul de salvare numit.
se elibereaza toate blocarile de tabele si linii.
#&toarceri #('licite
,ntoarcerile implicite apar cand se intalnesc terminari anormale ale e&ecutiei 'de e&emplu
cand se intrerupe un proces utilizator). ,ntoarcerile implicite la nivel de bloc apar la
eroarea de e&ecutie a unui bloc.
2ste recomandat ca tranzactiile sa se termine e&plicit utilizand /O44,(DMO-CE ori
-O8A/CDMO-CE.
3rmatorul e&emplu demonstreaza utilizarea unui punct de salvare, si a instructiunilor
-O8A/C si /O44,(.
INSERT INTO DEPT
VALUES
( 50, 'TESTING', 'LAS VEGAS' );
SAVEPOINT insert_done;
UPDATE DEPT
SET DNAME = 'MARKETING';
ROLLBACK TO insert_done ( modificarile sunt abandonate );
UPDATE DEPT
SET DNAME = 'MARKETING' ( revizuim comanda UPDATE )
WHERE DNAME = 'SALES';
COMMIT;
AUTOCOMMIT
/O44,( sau -O8A/C pot fi date manual sau automat prin utilizarea optiunii
A3(O/O44,( a comenzii S2(. Optiunea A3(O/O44,( controleaza cand
schimbarile intr%o baza de date sunt facute permanente.
2&ista doua setari :
/O4A:*A B *2S/-,2-2A
S2( A3(OD/O44,(E O:
/O44,( este utilizat automat la fiecare ,:S2-(, 3P*A(2 sau *22(2
S2( A3(OD/O44,(E O00
/O44,( poate fi utilizata de utilizator e&plicit. *e asemenea, /O44,( se
e&ecuta cand apare comanda L 'specifica 5AU), cand se e&ecuta comenzile
*-OP, A(2- sau /-2A(2, sau la iesirea din S".Plus. -O8A/C poate fi
e&ecutat e&plicit de catre utilizator pentru refacerea bazei de date.
*e retinut ca S2( este o comanda S".Plus.
Co&siste&ta la Citire
3tilizatorii bazelor de date fac doua tipuri de accesuri asupra bazelor de date:
Operatii de citire ' S22/( )
Operatii de scriere ' ,:S2-(, 3P*A(2, *22(2 )
/ititorului si scriitorului unei baze de date trebuie sa i se garanteze o vedere consistenta
asupra bazei de date. /ititorii nu trebuie sa vizulaizeze o data care este in curs de
modificare. Si scriitorii trebuie sa fie siguri ca schimbarile intr%o baza de date sunt facute
intr%un mod consistent : schimbarile facute de un scriitor sa nu distruga sau sa intre in
confilct cu schimbarile pe care le face un alt scriitor.
Scopul consistentei la citire este acela de a asigura faptul ca fiecare utilizator vede data ca
fiind cea de la ultimul /O44,(, inainte ca o operatie *4 sa inceapa.
/onsistenta la citire este implementata prin tinerea unor copii partiale ale bazei de date in
segmente de intoarcere '-O8A/C).
/and de e&ecuta operatii de scriere intr%o baza de date, O-A/2 va face o copie a
datelor onainte de schimbare si o va scrie intr%un segment de intoarcere.
(oti cititorii, e&ceptandu%i pe cei care au facut schimbarile, inca mai vad baza de date
care e&ista inainte ca schimbarile sa fie facute % ei vad segmentul de intoarcere de fapt.
Oricum, inainte ca schimbarile sa fie facute permanente in baza de date, doar utilizatorul
care modifica datele poate sa vada baza de date cu alteratiile incorporate. (oti ceilalti vad
baza nemodificata ' fereastra din segmentul de intoarcere ). Aceasta garanteaza citirea
unor date consistente care nu fac subiectul unor modificari in curs.
/and un bloc *4 se e&ecuta, schimbarile facute in baza de date devin vizibile oricarui
utilizator care e&ecuta S22/(. 4odificarile sunt facute 'universale' si acum toti
utilizatorii vad baza de date cu modificarile incorporate.
Spatiul ocupat de catre 'vechile' date in segmentul de intoarcere este eliberate pentru a fi
reutilizat.
*aca tranzactia este anulata '-O8A/C), atunci toate schimbarile sunt 'anulate' :
5ersiunea veche ''originala') a bazei de date aflata in segmentul de intoarcere este
scrisa inapoi ''recuperata') in baza de date.
(oti utilizatorii vad baza de date e&istenta inainte de inceperea tranzactiei.
"ra&zactii de Citire
,mplicit, modelul consistent al O-A/2 -*84S garanteaza ca rezultatul
e&ecutiei unui bloc este consistenet. Oricum, in anumite situatii se poate
dori chestionarea unor blocuri multiple asupra datelor din mai multe tabele
si se doreste asigurarea ca datele sunt consistente. Adica, re% zultatele in
orice tabela sunt consistente in timp in raport cu rezultatele din orice alta
tabela.
inia S" : S2( (-A:SA/(,O: -2A* O:K este utilizata pentru a
incepe o tranzactie de citire e&clusiv.
/onsistenta la citire pe care -2A* O:K o furnizeaza este implementa%
ta in acelasi fel cu consistenta la nivel de bloc % utilizand segmente de
intoatcere. 0iecare bloc vede implicit o fereastra consistenta a datelor la
momentul inceperii blocului. Aceasta facilitate este foarte folositoare
pentru rapoarte care ruleaza mai multe chestionari asupra mai multor
tabele in timp ce alti utilizatori actualizeaza aceleasi tabele.
$ote *
S2( (-A:SA/(,O: -2A* O:K este utilizata pentru a incepe
o tran% zactie doar de citire.
*oar cereri ' blocuri S22/( ) sunt permise. /omenzile *4 nu
sunt permise. S22/( 0O- 3P*A(2 va genera o eroare.
O instructiune /O44,(, -O8A/C, sau un bloc ** va
termina tran% zactia de citire ' de retinut ca blocurile **
genereaza implicit suprascrieri % /O44,( ). /u blocuri **, nu
este data nici o indi% catie referitoare la faptul ca tranzactia se
termina implicit.
,n timpul tranzactiei de citire, toate cererile se refera la aceeasi
copie a bazei de date ' schimbarile sunt efectuate inainte ca
tranzactia de citire sa inceapa).
Alti utilizatori pot continua sa citeasca sau sa modifice datele.
3rmatoarele seturi de instructiuni pot fi rulate pentru a e&trage datele din
tabelele 24P si *2P(.
COMMIT;
SET TRANSACTION READ ONLY;
SELECT DEPTNO, ENAME, JOB
FROM EMP;
SELECT DEPTNO, DNAME
FROM DEPT;
COMMIT;
3ltimul /O44,( este necesar pentru a termina e&plicit tranzactia de
citire.
E>E!C#"## + li(%aAul de (a&i'ulare a
datelor
2&ercitiile acopera inserarea si modificarea de coloane in tabelele create
anterior.
1. .nserati in tabela PR0?E4(S urmatoarele
informatii 6
PROJID 1 2
PGDESC WRITE C030 COURSE PROO. READ
NOTES
PGSTARTGDATE 02-JAN->> 01-JAN-><
PGENDGDATE 07-JAN->> 10-JAN-><
BUDGETGAMOUNT ?00 =00
MANGNOGSTA.. 1 1
COMMENTS BE CREATIHE YOUR CHOICE
2. .nserati in tabela ASS.G:ME:(S urmatoarele
coloane6
PROJID 1 1 2
EMPNO 73=< 7<02 7>44
AGSTARTGDATE 01-JAN->> 04-JAN->> 01-JAN-><
AGENDGDATE 03-JAN->> 07-JAN->> 10-JAN-><
BILLGRATE ?0700 ?0700 4?7?0
ASSIGNGTYPE WR WR P.
HOURS 1? 20 30
3. Modificati cam"ul ASS.G:ME:( (9PE astfel incat
sa se citeasca
7@(7 in loc de 7@R7. 8n ti" ca 7P27 trebuie sa ramana
nemodificat.
!. .nserati inca doua "roiecte cu atribuiri la
alagere.
!E=OL6A!#*
1. INSERT INTO PROJECTS
(PROJID, P_DESC, P_START_DATE, P_END_DATE,
BUDGET_AMOUNT, MAX_NO_STAFF)
VALUES
(1,'WRITE C030 COURSE','02-JAN-88','07-JAN-
88',500,2);
INSERT INTO PROJECTS
(PROJID, P_DESC, P_START_DATE, P_END_DATE,
BUDGET_AMOUNT, MAX_NO_STAFF)
VALUES
(2,'PROOF READ NOTES','01-JAN-89','10-JAN-
89',600,1);
2. INSERT INTO ASSIGNMENTS
(PROJID, EMPNO, A_START_DATE, A_END_DATE,BILL_RATE,
ASSIGN_TYPE, HOURS)
VALUES
(1,7369,'01-JAN-88','03-JAN-88',50.00,'WR',15);
INSERT INTO ASSIGNMENTS
(PROJID, EMPNO, A_START_DATE, A_END_DATE,BILL_RATE,
ASSIGN_TYPE, HOURS)
VALUES
(1,7092,'04-JAN-88','07-JAN-88',50.00,'WR',20);
INSERT INTO ASSIGNMENTS
(PROJID, EMPNO, A_START_DATE, A_END_DATE,BILL_RATE,
ASSIGN_TYPE, HOURS)
VALUES
(2,7844,'01-JAN-89','10-JAN-89',45.50,'PF',30);
3. UPDATE ASSIGNMENTS
SET ASSIGN_TYPE='WT'
WHERE ASSIGN_TYPE='WR';
C A P # " O L U L BG
CO$CU!E$"A S# LOCA!EA * O 6EDE!E <E$E!ALA
Scopul acestui capitol este acela de a arata cum O-A/2 gestioneaza blocarea.
Ariile acoperite sunt :
(ipuri si nivele de blocari
8locarea normala
8locari implicite si e&plicite
*2A*O/C
locari
O-A/2 utilizeaza blocarile pentru a controla accesul concurent la date. 8locarile sunt
mecanisme pentru a preveni interactiunea destructiva intre utilizatorii care acceseaza
aceleasi date.
8locarile sunt utilizate pentru a atinge doua scopuri importante:
CO$CU!E$"A DA"ELO!
3tilizatorii care doresc sa citeasca adeleasi date sa nu astepte utilizatorii care scriu
aceleasi blocuri de date.
3tilizatorii care doresc sa scrie datr in baza de date sa nu astepte utilizatorii care
citesc aceleasi date.
3tilizatorii care vor sa scrie date asteapta doar ulilizatorii care modifica aceleasi
linii.
CO$S#S"E$"A LA C#"#!E
0iecare bloc de instructiuni e&ecutat are o vedere consistenta
asupra datelor din baza de date.
0iecare bloc nu este afectat de catre nici o schimbare efectuata de
catre alt utilizator in timpul e&ecutiei acestiua.
Pentru a asigura concurenta datelor, O-A/2 utilizeaza blocari si
tranzactii. 8locarile sunt mecanisme utilizate pentru a preveni
interactiunea destructiva intre utilizatorii care acceseaza aceleasi resurse.
Blocarile in ORAC(E intra in urmatoarele cate'orii -
locari de date ( DML locHs )
Aceste blocari prote+eaza datele. 8locarile de tabele blocheaza intreaga
tebela, in timp ce blocarile de coloane blocheaza doar coloanele selectate.
locari de Dictio&ar ( Dictio&ar9 LocHs )
Aceste blocari prote+eaza structura de obiecte a bazei de date> de e&emplu
ele prote+eaza definitiile tebelelor si vederile 'vieNs). 8locarile de
dictionar sunt de doua tipuri : blocari sintactice 'parser) si blocari **.
In acest curs ne vom concentra doar asupra blocarilor de date.
Ni.ele de Blocare
8locarile pot fi aplicate la nivelul unie tabele sau al unei linii.
:ivel de inie
Afecteaza liniile individual. *oar blocarile e&clusive '&) se aplica la nivel de linie.
:ivel de (abela
Afecteaza utilizarea intregii tabele.
Tiuri de Blocari
M"( ;#"!$'0 A!1/,%/ A!1/,%/
O;1/%,1 +'/%
P'0-!,'1$'0 /%10'6/-0 +0'*/-0
!"*0%6/#0 S&L
-----------------------------------------------------------
---------------
ST$'0 M"(/@/!$'/ B#"!$'0 #/%//8
LOCK TABLE 1$;0#$
-S- RN8SRN8N RS8S8!0'0'/ IN
SHARE MODE
EA!#,-/20 T"$10 0A!0+1$%( C0'0'/
LOCK TABLE 1$;0#$
-N- !0'0'/8RS8RN8S8 IN
ENCLUSIHE MODE
SRN8N -/
*$:"'/1$10$
;#"
!,'/#"' DDL
R"S -T$'0 A!!0- 0A!#,-/28 M"(/@/!$'/8
SELECT777.OR UPDATE8
-RS- N RS8RN8S8SRN8
LOCK TABLE 1$;0#$ IN
!0'0'/ ROW
SHARE MODE
R"S 0A!#,-/20 A!!0- 0A!#,-/2 *"(/@/!$'/
UPDATE8INSERT8
-RN- +0%1', !/1/'0F RN8RS8
DELETE8 LOCK TABLE
-!'/0'08S8SRN8N !0'0'/
1$;0#$ IN ROW
ENC
LUSIHE MODE
ST$'0 '"S C/1/'0$ 1$;0#0/ B#"!$'0 #/%//
LOCK TABLE 1$;0#$
0A!#,-/20 /% /%1'09/*08RN8 RS8!0'0'/ IN
SHARE ROW
-SRN- S8SRN8N
ENCLUSIHE MODE
-----------------------------------------------------------
----------------
Sumarul 8locarilor de (abela '(4)
8locurile care modifica linii e&plicite dintr%o tabela obtin mereu
2U/3S,52 -OM O/CS 'blocari e&clusive de linie) si o blocare de
tabela corespunzatoare.
2U/3S,52 'U)
8locarile e&clusive permit cererile de interogare in resursa blocata dar interzic
orice alta acti% vitate in tabela.
SHA-2 'S)
8locarile de acest tip permit interogarile dar interzic modificarile intr%o tabela.
-OM SHA-2 '-S)
Permite accesul concurent la o tabela. ,nterzice ca alti utilizatori sa blocheze
tabela pentru acces e&clusiv.
-OM 2U/3S,52 '-U))
Sunt asemanatoare cu -OM SHA-2 dar interzic blocarea in mod SHA-2.
Aceste blocari sunt generate la modi% ficare,inserare sau stergere.
SHA-2 -OM
Sunt folosite pentru a vizualiza o tabela pentru a
2U/3S,52 'S-U)
e&ecuta modificari selectiv si pentru a permite altor utilizatori sa vizualizeze
tabela fara a o bloca in modul SHA-2 sau a modifica linii. Acest mod nu prea
este utilizat.
Abreviatiile din paranteze sunt cele utilizate in oc9 4onitor al
S".*8A.
8locarile manuale pot fi cerute de optiunea :OMA,( atunci cand uti%
lizatorul nu doreste sa astepte ca resursa blocata sa fie eliberata.
Durata Blocarilor
(oate blocarile acumulate de%a lungul unei tranzactii sunt elibe%
rate cand tranzactia se termina.
(oate blocarile acumulate de%a lungul unei tranzactii sunt elibe%
rate cand tranzactia se intoarce .
(oate blocarile acumulate dupa un punct de salvare sunt eliberate
cand tranzactia se intoarce la punctul de salvare.
Blocarea imlicita
8locarile care apar in timpul unui *4 normal, fara o cerere specifica de
blocare.
1$;0#$
E--------------E
E----------------------E |
U1/#/6$1"' A |
| | |
E--------------E
| E----------------------E |
| | # ENCLUSIHE | J-------------E
UPDATE8 INSERT
| E----------------------E
-$, DELETE " #/%/0
| | |
ROW | |
ENCLUSIHE | |
| | |
| E----------------------E
| | # ENCLUSIHE | J-------------E
| E----------------------E E------
E-------E
| | | |
U1/#/6$1"' B |
2 E----------------------E
E--------------E
UPDATE8
INSERT -$, DELETE
Blocarile Datelor
8locarea manuala poate fi preferata daca :
O vizualizare consistenta asupra mai multor tabele este ceruta.
:u doriti ca altcineva sa modifice datele saupra carora opereaza
tranzactia dumneavoastra.
3n bloc de instructiuni nu trebuie sa astepte o blocare.
O cerere este de citire repetata dintr%o tabela fara a schimba datele.
8locurile de instructiuni care modifica blocarile implicite sunt :
Selectiile pentru modificari
8locarile de tabele.
8locarile manuale pot fi preferate blocarilor implicite in multe cazuri.
Acestea pot include vizualizarea consistenta a unor tabele. 3n e&emplu
poate fi un master si cateva tabele detaliate.
O tranzactie poate dori schimbarea unor date bazata pe alte inregistrari,
dar inregistrarea respectiva nu trebiue modificata pana cand nu se termina
toata tranzactia.
3n bloc nu trebuie sa astepte dupa nici un alt bloc ca sa se termine
evitandu%se astfel conflictele de blocare.
3n utilizator poate dori sa vada oun set de date in aceeasi stare in
cereri multiple: principiul 'citirii repetate'.
Co(a&da LOC1 "ALE
/omanda O/C (A82 este utilizata pentru a bloca la nivel de tabela
e&plicit :
LOCK TABLE tabela, tabela, ...
IN mod_de_blocare [NOWAIT]
,nstructiunea S22/( 0O- 3P*A(2
4odifica blocarea implicita
8locheaza liniile cand acestea sunt selectate
8locheaza o linie fara a o modifica
S22/( 0O- 3P*A(2 va suprascrie mecanismul implicit de blocare.
2ste utilizata inaintea e&ecutiei unei modificari ' update ). *iferenta dintre
S22/( 0O- 3P*A(2 si 3P*A(2 este aceea ca S22/( 0O-
3P*A(2 blocheaza lini ile mai devreme in tranzactie. 4ai intai se
e&ecuta cererea de identificare a liniilor ce vor fi modificate si dupa aceea
blocheaza setul de linii, per mitand ca schimbarile sa aiba loc mai tarziu.
Sintaxa :
SELECT ...
FOT UPDATE [ OF coloana, coloana, ... ] [NOWAIT]
S22/( 0O- 3P*A(2 este recomandata pentru cazul cand se doreste
blocarea unei linii fara modificare de e&emplu, daca se doreste pornirea
unei modificari a unor valori de+a e&istente in linii, liniile nu trebuie sa
poata fi modificare de catre altcineva inainte de suprascriere.
O cerere S22/( 0O- 3P*A(2 elibereaza blocarile la /O44,( sau
-O8A/C. 2ste indicat sa se utilizeze S22/( 0O- 3P*A(2 pentru
cateva linii decat pentru un numar mare de linii.
E---------------------------E
| | 17 ROW LOCKBND
| |
| | 27 TABLE LOCKBRSD
| 17 SELECT777.OR UPDATE O. |
| |
| | 37 TABLE LOCKBRND
| |
E---------------------------E
Deadloc/
2ste foarte posibil intr%un mediu multi%utilizator, ca utilizatorii isi vor
bloca unii altora resursele. 2ste de asemenea posibil ca doi utilizatori sa
sfarseasca prin a%si bloca unul altuia resurse diferite. Aceasta situatie se
numeste *2A*O/C deoarece fiecare utilizator asteapta sesursele
detinute de celalalt utilizator.
De exemplu :
Tranzactia A Tranzactia B
UPDATE EMP UPDATE EMP
SET SAL=1200 SET SAL=1000
WHERE ENAME = 'SMITH'; WHERE ENAME =
'JONES';
UPDATE EMP UPDATE EMP
SET SAL=2200 SET SAL=1350
WHERE ENAME = 'JONES'; WHERE ENAME =
'SMITH';
/and primul bloc este e&ecutat, nu e&ista nici o problema. Oricum, cand ei
vor incerca sa obtina blocarile pentru al doilea bloc, se va astepta in
spatele celuilalt utilizator. 2ste deadloc9 deoarece nici macar prin
asteptare problema nu va fi rezolvata.
/and O-A/2 detecteaza un deadloc9, genereaza o eroare la unul dintre
participantii tranzactiei, si intoarce blocul curent al tranzactiei respective.
Aceasta rezolva deadloc9%ul, astfel celalalt utilizator poate inca astepta
pana cand resursa este disponibila. 3tilizatorul semnalizat ar trebui sa
e&ecute e&plicit un -O8A/C in tranzactie.
*eadloc9%ul poate fi evitat daca utilizatorii care acceseaza aceleasi tabele
blocheaza tabelele in aceeasi ordine ca ceilalti. Ar trebui predefinita o
ordine de acces pentru toate tabelele in aplicatii si aplicatiile astfel
construite incat sa urmeze ordinea specificata. *aca aceasta ordine este
urmata in toate aplicatiile, probabilitatea de aparitie a dead%loc9 va fi
minima.
8locarile de date sunt eliberate de :
/O44,( ! -O8A/C
O7 O00
Orice bloc explicit DDL.
ROWID (id. de linie) si Blocarea
COL ROWID VALOARE_NOUA IDENTIFICATOR_LINIE NOPRINT
SELECT ENAME, JOB, HIREDATE SAL, ROWID
FROM EMP
WHERE WNAME = 'SCOTT'
FOR UPDATE
+--------------------+
ROWID | 00004C90.0001.0001 |
+--------------------+
UPDATE EMP
SET JOB = 'SALESMAN,
HIREDATE=SYSDATE,
SAL=1.1*SAL
WHERE ROWID='&ROW_IDENT'
2ste important sa se ee&cute /O44,( cat mai cutand posibil pentru ca
blocarile sa fue eliberate devreme.
Procesul /O44,( poate fi accelerat prin folosirea -OM,* pentru a
localiza liniile in tabele. -OM,* este o pseudo%coloana care are cate o
valoare pentru fiecare linie din tabela. -OM,* ne spune adresa unei linii
si prin aceasta este cea mai rapida cale de acces disponibila. ,ntoarce trei
parti de informatie necesare pentru a localiza o linie :
ROWID 00004C90.0001.0001
/are bloc in fisierul bazei de date '<<<<6/;<)
/are linie din bloc '<<<1)
,n care fisier din baza de date este '<<<1)
Ca&d este creat !O/#D I
-OM,* este creat automat de O-A/2 cand o linie este modificata cu
succes intr%o tabela de baze de date> cand o inserare este facuta
permanenta.
De ce sa utiliza( !O/#D I
-OM,* are cateva utilizari importante :
Sunt cele mai rapide mi+loace de accesare a unei linii e&plicite
Sunt identificatori unici pentru linii in tabele.
*e notat ca se poate e&ecuta 3P*A(2 ! *22(2 pe o linie cu -OM,*
doar daca linia respectiva a fost inainte blocata 'adica S22/( 0O-
3P*A(2).
C A P # " O L U L BJ
#MA<#$# (6#E/S)
Ce este o #(a)i&e I
O imagine este ca o fereastra prin intermediul careia datele din tebele pot fi
vizualizate sau schimbate.
O imagine este derivata dintr%o alta imagine sau tabela la care este referita ca
tabela de baza a imaginii % o tabela 'reala' cu date care sunt stocate fizic.
O imagine este stocata doar ca o secventa S22/(. 2ste o tabela virtuala % adica
este o tabela care nu e&ista fizic, dar ii apare utilizatorului ca si cum ar e&ista.
O imagine nu are date proprii. 2a manipuleaza datele din tabela de baza asociata.
#(a)i&ile su&t utile 'e&tru ur(atoarele sco'uri *
,ngradirea accesului la o baza de date. Selectand dintr%o imagine '5,2M) putem
afisa o parte restransa din baza de date.
Permite utilizatorilor sa faca cereri simple pentru obtinerea de rezultate din cereri
complicate. *e e&emplu, imaginile permit utili% zatorilor sa selecteze informatii
din tabele multiple fara cunoas% terea mecanismelor instructiunii =O,:.
0urnizeaza independenta datelor pentru useri ad%hoc si programele aplicatiilor. O
imagine poate fi utilizata pentru a e&trage trans% parent date din mai multe tebele.
*e asemenea imaginile permit ca aceleasi date sa fie vazute de utilizatori diferiti
in feluri dife% rite.
#(a)i&i Si('le vs- #(a)i&i Co('lexe
/lasificarea unei imagini simple :
furnizeaza date dintr%o singura tabela
nu contine functii sau grupuri '7-O3P) de date.
O imagine comple&a poate fi compusa din date care sunt :
furnizate din mai multe tabele
contine functii sau grupuri de date.
Comanda CREATE +$E0
CREATE Q OR REPLACE R Q.ORCER HIEW %,*0-2/0S
QB!"#"$%$18 !"#"$%$28 777DR
AS
SELECT -0!20%1$--0#0!1
QWITH CHECK OPTION QCONSTRAINT %,*0G!"%-1'RR
/oloana1, coloana#, etc. sunt numele date coloanelor in imaginesi trebiue sa corespunda
elementelor din lista selectata.
Pentru a crea o imagine simpla numita *1<24P, care contine unele detalii ale anga+atilor
din *epartamentul 1<, introduceti :
CREATE VIEW D10EMP
AS
SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE DEPTNO = 10;
/and o imagine este creata, un mesa+ este afisat : "5ieN created."
,maginea poate fi utilizata ca orice tabela :
SELECT *
FROM D10EMP
ODRER BY ENAME;
Pentru a crea o imagine comple&a numita *2P(OS344A-K, care contine functii de
grup si date din doua tabele :
CREATE VIEW DEPT_SUMMARY
( NAME, MINSAL, MAXSAL, AVSAL )
AS
SELECT DNAME, MIN(SAL), MAX(SAL), AVG(SAL)
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY DNAME;
*e notat faptul ca numele coloanelor alternative au fost specificate pentru imagine.
Aceasta este o cerinta pentru cazul cand elementele S22/(ate nu sunt conforme cu
conventia denumirilor din tabele ! coloane, sau daca orice coloana din imagine este
derivata dintr%o functie sau e&presie.
*e notat si faptul ca daca o coloana este utilizata intr%o cerere 'A::SA), o imagine a
unui alias al coloanei ' nume alternativ pentru coloana in imagine ) nu e necesar. *e
e&emplu :
CREATE VIEW DEPT20
AS
SELECT ENAME, SAL*12 ANNSAL
FROM EMP
WHERE DEPTNO = 20;
O imagine nu poate contine clauza O-*2- 8K. /lauza O-*2- 8K este specificata
cand se e&ecuta S22/( din imagine.
Otiunea OR RE&(ACE
Aceasta optiune permite ca o imagine sa fie creata chiar daca e&ista una cu acelasi nume,
astfel inlociundu%se vechea varianta a imaginii pentru proprietarul ei. Aceasta inseamna
ca o imagine poate fi alterata fara a fi abandonata, recreandu%se si redand privilegiile
obiectului.
Otiunea FORCE
Aceasta optiune creaza o imagine chiar daca tabela de baza nu e&ista, sau sunt prea putine
drepturi pentru tabela respectiva. Oricum, tabela trebiue sa e&iste inainte ca imaginea sa
poata fi utilizata.
Utilizarea u&ei #(a)i&i cu O'eratii DML
,maginile sunt facilitati puternice deoarece ele ne permit sa e&ecutam verificari de
integritate referentiale asupra datelor modificate prin utilizarea imaginilor.
/lauza M,(H /H2/C OP(,O: specifica faptul ca ,:S2-( si 3P*A(2 e&ecutate pein
intermediul imaginii nu permit crearea de linii noi pe care imaginea nu le poate selecta, si
de aceea mermite constrangerile de integritate si vreificarile validarilor de date sa fie
fortate asupra datelor ce vor fi inserate sau actualizate.
,n urmatorul e&eplu, o imagine numita *1<24P este creata cu M,(H /H2/C OP(,O:.
Aceasta inseamna ca doar linii care au *2P(:O I 1< pot fi inserate, actualizate sau
sterse. Adica nici o secventa *4 nu poate sa adreseze imaginea decat daca conditiile
clauzei imaginii sunt indepli% nite.
CREATE VIEW D10EMP
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMP
WHERE DEPTNO = 10
WITH CHECK OPTION;
*aca e&ista o incercare de a e&ecuta actiuni *4 asupra liniilor pe care imaginea nu le
poate selecta intr%o claiza MH2-2, se afiseaza eroare :
"ORA_01402 VIEW WITH CHECK OPTION
WHERE_Clause voilation."
3rmatorul e&emplu va valida intratea oricarei comenzi ,:S2-(!3P*A(2 astfel incat
numarul SA sa fie intre 1<<< si #<<<, 47- va trebui sa aibe campul 24P:O valid, si
*2P(:O sa e&iste in tabela *2P(.
CREATE VIEW EMP_DATA
AS
SELECT EMPNO, ENAME, JOB, MGR, SAL, DEPTNO
FROM EMP
WHERE SAL BETWEEN 1000 AND 2000
AND MGR IN ( SELECT DISTINCT EMPNO
FROM EMP )
AND DEPTNO IN ( SELECT DEPTNO
FROM DEPT )
WITH CHECK OPTION;
Pentru a crea o imagine care sa restranga accesul la detaliile personale ale unui anga+at
valid in tabela 24P, si timpul de acces la orele de servici, atunci introduceti urmatoarea
comanda :
CREATE VIEW EMP_DETAILS
AS
SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP
WHERE ENAME = USER
AND TO_CHAR(SYSDATE,'HH24') BETWEEN 9 AND 17
AND TO_CHAR(SYSDATE,'D') BETWEEN 2 AND 6
WITH CHECK OPTION;
/and creati o imagine cu M,(H /H2/C OP(,O:, trebiue s%i atribuiti un nume
restrictiei M,(H /H2/C OP(,O:.
CREATE VIEW EMPLOYEES( ID_NUMBER, NAME, DEPARTMENT)
AS
SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP
WHERE DEPTNO IN ( SELECT DISTINCT DEPTNO FROM DEPT)
WITH CHECK OPTION CONSTRAINT DEPT_CHECK;
Aceasta restrictie previne inserarea unei coloane in tabela 24P cu un numar care nu
e&ista in tabela *2P(.
/and comanda /-2A(2 5,2M este e&ecutata in seventa S22/( care urmeaza AS nu
e e&ecutata> in loc este doar depozitata in dictionarul de date.
/and accesati date, via o imagine, O-A/2 e&ecuta urmatoarele operatii :
recupereaza definitia imaginii din dictionarul de date
verifica drepturile de acces
converteste cererea imaginii intr%o operatie echivalenta asupra tabelei sau
tabelelor asociate. /u alte cuvinte, datele sunt recu% perate din, sau o actualizare
este facuta asupra, tabelei'lor) de baza.
Odata ca imaginea a fost creata, trebuie sa se e&ecute o cerere la (abela *ictionarului de
*ate numita 3S2-O5,2MS ca sa se vada conanda vieN.
Acesti parametrii S2(abili vor influienta afisarea imaginii te&t :
4a&data
Arra?size
ong
,maginea te&t este memorata intr%o coloana de tipul de date ong si ar trebui setat
A--AKS,L2 la o valoare mica ' de e&. 1 ) pentru a vizualiza te&tul.
Modi,icarea Datelor 'ri& #(a)i&i
*upa cum am discutat, restrictiile pot fi impuse cu a+utirul clauzei M,(H /H2/C
OP(,O: cand o imagine este creata. 4ai sunt si alte constrangeri de care trebiue sa fiti
atenti.
*22(2 este interzis cand o imagine contine :
1. conditie =oin
#. functii de grup
G. clauza 7-O3P 8K
6. comanda *,S(,:/(
F. -OM:34 'nr de ordine al randului dupa ce acesta a fost adus din baza de date).
3P*A(2 este interzis cand :
1. Oricare de mai sus
#. /oloane definite prin e&presii ' de e&. SA.1# )
,:S2-( este interzis cand :
1. Oricare de mai sus
#. Orice :O( :3 coloane nu sunt selectate de imagine ' e&. 24P:O )
Comanda DRO& +$E0
3tilizati comanda *-OP pentru a sterge o imagine. Aceasta comanda elimina definitia
imaginii din baza de date. /oloanele si liniile nu sunt afectate deoarece sunt stocate in
tabelele de unde a derivat fiecare ima% gine. ,maginile sau alte aplicatii bazate pe o
imagine stearsa devin in% valide.
*e notat ca o imagine poate fi derivata dintr%o tabela sau de fapt dintr%o alta imagine R
Sintaxa DROP este :
DROP VIEW nume_imagine;
Doar creatorul imaginii poate sa o stearga.
Exercitii + CAP BJ + Crearea si Utilizarea #(a)i&ilor
1. *efiniti o imagine care sa produca urmatoarea iesire cand este referita intr%o
cerere. -ulati o cerere pentru a testa imaginea.
27 DEPTNO AHERAGE MANIMUM MINIMUM SUM NOGSALS
NOGCOMMS
37 ------ ---------- ------- ------- ----- --------
--------
47 10 21<=7====7 ?000 1300 >7?0 3
0
?7 20 217? 3000 >00 10>7? ?
0
=7 30 1?==7====7 2>?0 <?0 <400 =
4
7. 3tilizand imaginea de mai sus, e&trageti urmatoarea informatie. :uarul
anga+atului trebuie introdus la rulare.
>7 EMPNO ENAME JOB SAL HIREDATE MINIMUM MANIMUM
AHERAGE
<7 ----- --------- ------- ---- --------- ------- -------
-------
107 7<02 .ORD ANALYST 3000 0?-DEC->3 >00 3000
217?
11. /reati o imagine care sa impuna urmatoarele restrictii la insrearea datelor in
tabela ASS,7:42:(S.
1. Pro+id trebuie sa fie mai mic de #<<<.
#. *ata de sfarsit trebiue sa fie dupa data de inceput.
G. (iputile valide pentru AssignOt?pe sunt P0, M( sau 2*.
6. 8illOrate trebuie sa fie mai mic decat F<.<< pentru AssignOt?pe P0, mai
mic de A<.<< pentru M( si mai mic de 7<.<< pentru 2*.
F. 24P:O trebuie sa fie valid.
A. -etineti clauza M,(H /C2/C OP(,O:.
SO3(,, % /AP 1A
1.
2. CREATE VIEW AGGREGATES
3. ( DEPTNO, AVERAGE, MAXIMUM, MINIMUM, SUM,
4. NO_SALS, NO_COMMS )
5. AS
6. SELECT DEPTNO,
7. AVG(SAL),
8. MAX(SAL),
9. MIN(SAL),
10. COUNT(SAL),
11. COUNT(COMM),
12. FROM EMP
13. GROUP BY DEPTNO;
16.
15.
16. SELECT EMP.DEPTNO,
17. ENAME,
18. JOB,
19. SAL,
20. HIREDATE,
21. MINIMUM,
22. MAXIMUM,
23. AVERAGE
24. FROM EMP, AGGREGATES AGG
25. WHERE EMP.DEPTNO = AGG.DEPTNO
26. AND EMP.EMPNO = & EMPNO;
#7.
28.
29. CREATE VIEW ASG_VAL
30. AS
31. SELECT PROJID,
32. EMPNO,
33. A_START_DATE,
34. A_END_DATE,
35. BILL_RATE,
36. ASSIGN_TYPE,
37. HOURS,
38. FROM ASSIGNMENTS
39. WHERE A_START_DATE < A_END_DATE
40. AND PROJID < 2000
41. AND BILL_RATE <=
DECODE( ASSIGN_TYPE,'PF',50,'WT',60,70)
42. AND EMPNO IN
43. ( SELECT EMPNO FROM EMP )
44. WITH CHECK OPTION;
6F.
C A P # " O L U L B;
Utilizatorii si Securitatea
Sistemul de securitate descentralizata a lui O-A/2 este e&plicat in acest capitol. ,n
special vom e&plica cum sa utilizati comenzile 7-A:( si -25OC2 pentru a controla
accesul la baza de date si sa inregistrati noi utilizatori cu diferite niveluri de drepturi de
acces.
Privile)iile si 2u&ctiile Siste(ului
O-A/2 utilizeaza un sistem de securitate descentralizat, unde utilizatorii sunt ei insisi
responsabili pentru acordarea drepturilor de acces pentru obiectele pe care le detin
celorlalti utilizatori. Oricum, inainte ca ei sa faca aceasta, un utilizator va avea nevoie de
drepturile importante ale sistemului care permit actiuni ca conectarea la o baza de date
sau crearea de obiecte.
/and Administratorul 8azelor de *ate a creat un nou utilizator O-A/2, un numar de
drepturi pot fi atribuite pentru a defini tiputile de activitati ale bazelor de date pentru
fiecare utilizator, este mult mai convenabil pentru Administratorul 8azelor de *ate de a
grupa combinatiile obisnuite de drepturi in roluri 'roles). rolurile corespunzatoare pot
atunci fi asignate utilizatorilor.
Privile)iile Siste(ului
Sunt mai mult de @< tipuri de drepturi ale sistemului disponibile pentru atribuite catre
utilizatori si roluri. 3nele din cele mai importante sunt listate mai +os. Pentru o
specificare completa, vedeti "Oracle7 Server S" reference 4anual".
*rept Sistem
Operatii autorizate
/-2A(2 S2SS,O:
Permite posesorului conectarea la baza de date.
/-2A(2 (A82
Permite posesorului crearea de tabele. 3ti% lizatorul trebuie de asemenea sa aiba o
cota intr%o "tablespace" 'arie a bazei de date).
/-2A(2 5,2M
Permite crearea imaginilor.
/-2A(2 3S2-
Permite posesorului sa creeze alti utiliza% tori O-A/2 'un drept cerut pentru o
functie *8A).
!oluri
3n rol este o colectie de drepturi sistem cu nume. 3n utilizator poate avea acces la mai
multe roluri, si mai multi utilizatori pot fi atribuiti aceluiasi rol, dandu%se fle&ibilitate si
usurinta sistemului de securitate.
Sunt cateva roluri predefinite, ca *8A ' Administrator de 8aze de *ate ) care include
toate privilegiile sistemului, dar un *8A va crea de obicei roluri pentru cerintele
sistemului.
*aca aveti atribuite mai multe roluri, puteti oscila intre ele in timpul unei sesiuni pentru a
activa sau nu drepturile asociate. Aceasta este realizata prin comanda S2( -O2.
*e e&emplu, pentru a activa un rol care are parola "marigold" atasata :
SET ROLE gardener IDENTIFIED BY marigold;
Pentru a activa toate rolurile e&eptand un singur rol pentru un uti% lisator :

SET ROLE ALL EXCEPT manager;

Pentru a deactiva toate rolurile :
SET ROLE NONE;
3n utilizator va avea unele roluri implicite care sunt activate la intrare in sesiune. Acestea
sunt de obicei toate rolurile acordate utilizatorului, dar pot fi schimbate cu comanda
A(2- 3S2-.
!OLU!#
A!"'($'0$ (0 ('0+1,'/
U1/#/6$1"'/
@$'$ '"#,'/ " " "
F|[ F|[ F|[
F[ F[ F[
| | |
E----E--E-------E-------E
| | | | | |
| E-----|-E--E--|-E-----|-E
| | | | | | | | |
| | E---|-|-E---|-|-EE--|-|-E
F[E | F[E | F[E | F[E |
[F--E [F--E [F--E [F--E
DREPTURI
A!"'($'0$ (0 ('0+1,'/
,1/#/6$%( '"#,'/
" " " U1/#/6$1"'/
F|[ F|[ F|[
F[ F[ F[
[ | F
[ | F
[ | F
[ | F
EE---E---EE
| | J------------ ROL
E--E---E--E
| | | |
E-------E | | E-------E
| | | |
F[ F[ F[ F[
[F [F [F [F
P'/2/#09//
S!T/*;$'0$ P$'"#0/ U1/#/6$1"',#,/
*8A atribuie utilizatorului o parola initiala cand utilizatorul este creat ' via /-2A(2
3S2- ). 3tilizatorul poate mai tarziu sa%si schimbe parola utilizand comanda A(2-
3S2-.
Sintaxa :
ALTER USER nume_utilizator IDENTIFIED BY parola
De exemplu :
ALTER USER glenn IDENTIFIED BY swordfish;
*e notat ca de asameni comanda poate fi utilizata pentru a scimba parola proprie, alte
optiuni in A(2- 3S2- pot necesita unele drepturi ale sistemului pentru a se incheia cu
succes.
Co(a&da <!A$"
2ste utilizata pentru a atribui drepturile unui obiect catre
" un utilizator
" un rol

Atribiurea unui utilizator :

GRANT priv1, priv2, ... ON nume_obiect


TO utilizator, utilizator, ... [ WITH GRANT OPTION ]

Atribuirea catre un rol :

GRANT priv1,priv2, ... ON nume_obiect


TO rol, rol, ...

'numeOobiect' poate referi :


" o tabela
" o imagine 'vieN)
" o secventa 'seZuence)
" un sinonim 's?non?m)
" o procedura
" o functie
" un pachet 'pac9age)
Privile)iile u&ui O%iect
*etineti fiecare tabela, imagine, secventa si sinonim pe care il creati. *aca nu doriti sa
impartiti un astfel de obiect cu alti utiliza% tori O-A/2, doar dumneavoastra si orice
*8A il poate accesa.
Pentru a permite accesul altor utilizatori la obiectele bazei de date, utilizati comanda
7-A:( :
GRANT drepturi
ON obiect
TO utilizator;
(abelul de mai +os arata drepturile care pot fi acordate la tabele si imagini.
D'0+1 O;/0!1
----- ------
SELECT ($10 /% 10;0#0 -$, /*$9/%/
INSERT #/%// /% 1$;0#0 -$, /*$9/%/
UPDATE #/%// -$, !"#"$%0 -+0!/@/!$10 /%1'-" 1$;0#$ -$,
/*$9/%0
DELETE #/%// (/%1'-" 1$;0#$ -$, /*$9/%0
ALTER (0@/%/1// (0 !"#"$%0 /% 1$;0#0
INDEN /%(0A$'0 #$ " 1$;0#$
RE.ERENCES -0 '0@0'$ #$ " 1$;0#$ %,*/1$ /% /%10'/"',# ,%0/
'0-1'/!1// (0 1$;0#$ -$, !"#"$%$7
ALL
*e notat ca A(2-, ,:*2U si -202-2:/2S nu sunt valabile ca optiuni cu imagini.
*oar A(2- si S22/( pot fi aplicate unor secvente.
/el mai simplu fel de 7-A:( este unul care acorda un singur drept unui singur
utilizator.
Pentru a acorda lui A*A4S dreptul de S22/( din tabela *2P(, introduceti :
GRANT SELECT
ON DEPT
TO ADAMS;
Grant succeeded.
Mesajul :
Grant succeeded.
confirma acordarea dreptului.
Pentru a acorda dreptul 3P*A(2 pentru anumite coloane lui A*A4S, introduceti :
GRANT UPDATE ( DNAME, LOC )
ON DEPT
TO ADAMS;
Pentru a acorda mai multe drepturi odata, introduceti toate drepturile separate prin
virgule. Similar, pentru a acorda mai multe privilegii mai multor utilizatori, introduceti
numele utilizatorilor separate prin virgule.
Pentru a acorda drepturile ,:S2-( si 3P*A(2 asupra *2P( lui A*A4S si =O:2S,
introduceti :
GRANT INSERT, UPDATE
ON DEPT
TO ADAMS, JONES;
Grant succeeded.
Pentru a acorda toate privilegiile asupra *2P( lui A*A4S, introdu ceti :
GRANT ALL
ON DEPT
TO ADAMS;
Grant succeeded.
Transmiterea de Privilegii care au fost Acordate.
/and s%a acordat un drept de acces, utilizatorul care primeste dreptul, in mod normal nu
primeste si autorizarea de a transmite acest drept si altora. Pentru a da unui utilizator
dreptul de a transmite dreptul mai departe, utilizati clauza M,(H 7-A:( OP(,O:.
Pentru a acorda dreptul S22/( asupra 24P lui A*A4S, cu autorizarea de a acorda
acest drept si altora, introduceti :
GRANT SELECT
ON EMP
TO ADAMS
WITH GRANT OPTION;
Grant succeeded.
Dreptul Public
Permite detinatorului unei tabele sa acorde accesul tuturor utilizatorilor cu o singura
comanda,
Acordarea da drept'uri) asupra unei tabele lui P38,/.
GRANT SELECT
ON EMP
TO PUBLIC;
Secve&ta
Pentru a permite accesul asupra secventei lui 0ord %0OS2"% lui 8AC2, 0O-* va
introduce :
GRANT SELECT ON F_SEQ TO BLAKE;
Alte Obiecte
/omanda 7-A:( pate fi utilizata pentru a permite accesul utiliza torilor asupra
procedurilor stocate, functii si pachete 'Oracle7 Procedural Option).
Puteti sa permiteti accesului unui rol asupra unui obiect. 0iecare utilizator caruia ii este
asignat acel rol poate utiliza obiectul respectiv.
De exemplu :
GRANT SELECT ON EMP TO ROLE_2;
Optiunea 'WITH GRANT OPTION' nu este permisa in acest caz.
Violarea Drepturilor de Acces
*aca incercati sa e&ecutati o operatie neutorizata ' de e&emplu stergerea dintr%o tabela
fara a avea dreptul *22(2 ), O-A/2 nu va permite ca operatia sa aiba loc.
*aca primiti mesa+ul de eroare O-A/2 ' table or vieN does not e&ist', aceasta poate
insemna doua lucruri :
aveti o tabela sau o imagine cu nume care nu e&ista
ati incercat sa e&ecutati o operatie asupra acelei tabele sau imagini pentru care nu
aveti drepturile corespunzatoare.
Co(a&da !E6O1E
Pentru a retrage un drept acordat, utilizati comanda -25OC2. 2ste similara cu 7-A:( :
REHOKE ('0+1,'/
ON 1$;0#$ -$, /*$9/%0
.ROM ,1/#/6$1"'/5
/and utlilzati comanda -25OC2, drepturile specificate sunt anulate utilizatorilor
enumerati, si celorlalti utilizatori carora acestia le%au transmis aceste drepturi.
Pentru a anula toate drepturile asupra *2P( de la A*A4S, introduceti
REVOKE ALL
ON EMP
FROM ADAMS;
Revoke succeeded.
*repturile publice sunt retrase utilizand comanda -25OC2 :
REVOKE SELECT
ON EMP
FROM PUBLIC;
Pentru a afla acre utilizatori au drepturi asupra tabelelor imagi nilor sau secventelor dvs.,
e&ecutati o cerere catre imaginea *ictionarului de *ate 3S2-O(A8O7-A:(S, sau
3S2-O/OO7-A:(S.
Crearea u&ui S.$O$.M 'e&tru o "a%ela, #(a)i&e sau Secve&ta
Pentru a referi o tabela detinuta de un alt utilizator, trebuie sa prefi&ati numele tabelei cu
numele utilizatorului care a creat%o urmat de punct '.).
Pentru a referi tabela 24P detinuta de S/O((, introduceti :
SELECT *
FROM SCOTT.EMP;
Alternativa este de a crea un sinonim ' alt nume ) pentru tabela sau imaginea data.
Pentru a referi tabela 24P a lui S/O(( doar cu numele '24P', introduceti :
CREATE SYNONYM EMP
FOR SCOTT.EMP;
Acum, cand e&ecutati o cerere asupra tabelei 24P a lui Scott, doar introduceti :
SELECT *
FROM EMP;
*oar *8A poate crea sinonime P38,/e la care toti utilizatorii sa aiba acces.
CREATE PUBLIC SYNONYM nume_sinonim
for [proprietar.] nume_obiect;
3n sinonim public poate fi eliminat prin tastarea :
DROP [ PUBLIC ] SYNONYM nume_sinonim;
Sinonimele sunt utilizate din motive de sceuritate si comoditate, incluzand :
pentru a referi o tabela, secventa sau imagine fara a specifica detinatorul
obiectului
pentru a furniza un alt nume pentru tabela.
*in motive de performanta, du e recomandabila utilizarea de sinonime la referirea de
tabele in aplicatii.
CAPITOLUL 18
O*I$CT$ in *A+$L$ de ,AT$ - .$C/$#TIAL$ (i
I#,$0AT$
Acest paragraf descrie cum se poate inde&a o tabela pentru a imbunatati timpul de
raspuns in cazul unei interogari.
/rearea si utilizarea accesului secvential este de asemenea discutata 'aceasta permite
atribuirea automata de numere de secventa unice in cadrul unei aplicatii.)
7eneratorul de numere de secventa
,n server%ul Oracle versiunea A, generatorul de numere de secventa poate fi
utilizat pentru a genera automat numere de secventa pentru rinduri in cadrul
tabelelor. *e e&emplu se poate folosi generatorul pentru a produce cheii primare
unice.
Pentru a genera automat numere de secventa, trebuie sa definiti o secventa
folosind comanda /-2A(2 S2"32:/2. Sinta&a este urmatoarea:

CREATE SEQUENCE [user.] sequence_name
[ increment by n]
[ start with n]
[ maxvalue n | nomaxvalue ]
[ minvalue n | nominvalue ]

(oti parametrii comenzii sunt optionali si au urmatoarea semnificatie:
" user: proprietarul secventei.,mplicit este user%ul care a generat comanda
/-2A(2 S2"32:/2
" seZuenceOname: numele de secventa care respecta conventiile S" de
denumire a obiectelor
" ,:/-242:( 8K: determina intervalul dintre numerele de secventa
generate. *aca valoarea este pozitiva, atunci numerele de secventa vor
creste. *aca valoarea este negativa atunci acestea vor scade. Se poate
folosi orice intreg nenul. ,mplicit aceasta valoare este 1
" S(A-( M,(H: specifica primul numar de secventa care va fi generat.
,mplicit este 1 pentru inde&i crescatori si 4AU5A32 pentru indici
descrescatori
" 4,:5A32J valoarea minima a secventei ce va fi generata.,mplicit este 1
" :O4,:5A32 pentru indici crescatori si 1<2#7%1 pentru indici
descrescatori
" 4AU5A32J valoarea ma&ima ce va poate fi generata.,mplicit este 1
pentru
" :O4AU5A32 secvente descrescatoare, si %1 pentru secvente
crescatoare. Orice incercare de a genera numere de secventa peste aceasta
valoare va esua si se va intoarce un cod de eroare.
3rmatoarea comanda creaza o secventa pentru coloana *2P(:O a tabelei *2P(.
CREATE SEQUENCE dept_sep
INCREMENT BY 10
START WITH 10
MAXVALUE 10000;
*upa ce o secventa a fost creata ea poate fi folosita pentru a genera numere unice
de secventa.
7enerarea de numere de secventa cu :2U(5A
:2U(5A este utilizata pentru a e&trage numere de secventa succesive dintr%o
secventa specificata. /ind se acceseaza :2U(5A on nou numar de secventa
este generat.
SELECT dept_seq.NEXTVAL
FROM SYS.DUAL ;;
NEXTVAL
-------------
10
*aca se ree&ecuta comanda S" anterioara valoarea creste cu 1<.
SELECT dept_seq.NEXTVAL
FROM SYS.DUAL ;;
NEXTVAL
-------------
20
Prima valoare obtinuta este 1< si aceasta se incrementeaza apoi cu pasul 1<.
:ota:
" intodeauna se prefi&eaza :2U(5A cu numele de secventa
" daca se refera :2U(5A de mai multe ori pentru o singura comanda
S" orice referire va intoarce aceasi valoare.
:2U(5A este foarte folositoare in comenzi *4. *e e&emplu cind se
completeaza o tabela se poate folosi o secventa pentru a produce valori unice
pentru coloana cu cheii primare a tabelei. 2&emplul urmator foloseste secventa
deptOseZ pentru a adauga cheii primare unice in tabela *2P(.
INSERT INTO DEPT
VALUES
(dept_seq.NEXTVAL, 'ACCOUNTING', `NEW YORK');
1 record created
SQL> SELECT * FROM DEPT;
DEPTNO DNAME LOC
------------ -------------- ------------------
10 ACCOUNTING NEW YORK
,naintea versiunii A, numere unice de secventa erau generate la nivelul aplicatiilor.
*e e&emplu, o modalitate obisnuita de implementare este de a forta fiecare
tranzactie sa blocheze tabela cu numarul de secventa sa incrementeze secventa si
apoi sa elibereze resursa. ,n aceasta implementare, numai un singur numar de
secventa poate fi generat la un moment dat. 7eneratorul de numere de secventa
O-A/2 permite generarea simultana a multiple numere de secventa de catre
useri diferiti.
/ind un astfel de numar este generat, secventa este incrementata indiferent de
tranzactiile in desfasurare. *aca doi useri acceseaza aceeasi secventa in acelasi
timp, atunci fiecare user poate sa obtina eroare deoarece numere de secventa sunt
de asemenea generate de al doilea user. *oi useri nu vor genera niciodata acelasi
numar de secventa utilizind aceiasi secventa. :umere de secventa pot fi "sarite"
daca un user nu%si termina o tranzactie sau daca aceasta sfirseste in mod anormal.
3tilizarea numerelor de secventa cu /3--5A
Pentru a accesa un numar de secventa care tocmai a fost generat 'numarul de
secventa curent ) se foloseste pseudo%coloana /3--5A. /3--5A reprezinta
ultima valoare intoarsa unui program. /ind se adreseaza :2U(5A pentru o
secventa data, numarul de secventa curent este plasat in /3--5A. :2U(5A
trebuie folosit pentru a genera numere de secventa in sesiunea curenta a unui user,
inainte de a putea adresa /3--5A.
INSERT INTO DEPT_HISTORY
VALUES (dept_seg.CURRVAL, 'ACCOUNTING' , `NEW YORK');
1 record created.
SQL> SELECT * FROM DEPT_HISTORY
DEPTNO DNAME LOC
------------------ ------------ -----------------
10 ACCOUNTING NEW YORK
-eguli de folosire :2U(5A si /3--5A
:2U(5A si /3--5A pot fi folosite in cadrul:
" clauza S22/( dintr%o declaratie S22/( 'e&ceptie la afisari)
" lista 5A32S dintr%o declaratie ,:S2-(
" clauza S2( dintr%o declaratie 3P*A(2
" in afara S22/(
-estrictii de folosire :2U(5A si /3--5A
:2U(5A si /3--5A nu pot fi folosite:
" intr%o lista S22/( din 5,2M
" impreuna cu cuvintul cheie *,S(,:/(
" cu clauzele O-*2- 8K, 7-O3P 8K, /O::2/( 8K, sau HA5,:7
dintr%o declaratie S22/(
" cu operatorii 3:,O:, ,:(2-S2/(, 4,:3S
Secventele sunt tratate in mod similar cu tabelele si pot fi modificate sau
abandonate. Proprietarul unei secvente poate de asemenea atribui privilegii si
altor useri asupra secventei.
4odificarea unei Secvente
Se foloseste comanda A(2- S2"32:/2 pentru a modifica o secventa
e&istenta.
AKTER SEQUENCE [user.]sequence_name
[INCREMENT BY n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
*e e&emplu pentru a seta o noua valoare ma&ima pentru secventa deptOdeZ,
ALTER SEQUENCE dept_seq
maxvalue 100000
Pentru a modifica o secventa este necesar sa fii proprietarul eu sau sa ai dreptul
*8A sau sa fi primit dreptul A(2- pentru secventa din partea proprietarului.
:ota:
" :umai secventele viitoare vor fi influientate de catre comanda A(2-
S2"32:/2
" Sunt facute anumite verificari. *e e&emplu o noua 4AU5A32 nu poate
impune care este mai mica decit numarul de secventa curent
" 5aloarea S(A-( M,(H nu poate fi schimbata folosint comanda A(2-
S2"32:/2
" Secventa trebuie abandonata si recreata pentru a reporni secventa la un
numar diferit.
Atribuirea drepturilor asupra Secventelor
Proprietarul unei secvente poate atribui altor useri drepturi de A(2- sau
S22/( asupra secventei, si M,(H 7-A:( OP(,O: ramine valida.
*etalii in 3:,(%ul 17.
Stergerea unei Secvente
0olositi comanda *-OP S2"32:/2 pentru a sterge o definitie de secventa.
Sinta&a este:
DROP SEQUENCE [user.]sequence_namel
(rebuie sa fii proprietarul secventei sau sa ai dreptul de *8A pentru a o sterge.
Pentru a sterge secventa deptOseZ, tastati:
DROP SEQUENCE sept_seq;
(iparirea Secventelor
(oate definitiile secventelor sunt memorate intr%o tabela de secvente. Pentru a
vedea secventele la care ai access, interogheaza baza de date urmarind
3S2-OS2"32:/2S sau AOS2"32:/2S.
,nde&area
,nde&area in sistemul O-A/2 are doua principale scopuri:
17 Pentru a accelera afisarea liniilor cu o cheie particulara.
27 Pentru a forta unicitatea valorilor din coloane, de obicei valorile cheii
principale.
0olosirea inde&arii este puternic recomandata pentru a obtine performante mai
bune. -etineti ca O-A/2 7 creiaza automat ,:*2U, pentru coloanele care au
setate P-,4A-K C2K sau 3:,"32.
Proprietarul unei tabele poate crea inde&i pentru ea. Orice user O-A/2 care
detine dreptul de access ,:*2U poate creea un inde&.
Odata creat, O-A/2 va folosi inde&%ul ori de cite ori este posibil pentru a
accelera accesul datelor. Acest lucru se face in mod automat si deobicei nu este
necesara interventia userului care poate sa nu stie de e&istenta acestul inde&.
Structura unui ,:*2U O-A/2
O-A/2 foloseste arbori 8 pentru inde&are. (impul de access este independent
de volumul de date inde&at. 0iecare inde& construit de O-A/2 contine un
numar de pagini memorate in arbore. 0iecare pagina contine un numar de cheii.
O-A/2 gestioneaza aceasta structura la fel cum sunt inserate sau sterse linii.
5alorile :3 nu sunt memorate in inde&, si din fericire nu ocupa spatiu. %%%%%%%%
Aici se afla poza de la pagina 1@%; %%%%%%%%
(ipuri de ,:*2U
TYPE DESCRIERE
----------
----------------------------------------------------------
UNI&UE $-/9,'$ !$ 2$#"'/#0 (/% !"#"$%0#0 -+0!/@/!$10
-,%1 ,%/!0
NON UNI&UE $-/9,'$ ";1/%0'0$ !/1 *$/ '0+0(0 $ '06,#1$1,#,/
B/*+#/!/1D
SINGLE COLUMN 0A/-1$ %,*$/ " !"#"$%$ /% /%(0A
CONCATENATED *$/ *,#1 (0 1= !"#"$%0 -+0!/@/!$10 /% /%(0A7
/rearea unui ,nde&
,nde& O-A/2 poate fi creat in linia de comanda cu comanda /-2A(2 ,:*2U.
CREATE [UNIQUE] INDEX index_name
ON table (column [m]...)
/rearea unui ,:*2U pentru a imbunatati timpul de raspuns
Pentru a creea un inde& numit ,O:A42 care va fi folosit pentru a imbunatatii
timpul de interogare , introduceti:
CREATE INDEX I_ENAME
ON EMP (ENAME);
/rearea unui ,:*2U pentru a asigura unicitatea
,ndecsi unici sunt creati automat ca un rezultat al constantelor P-,4A-K C2K
sau 3:,"32 in tabela. Oricum , se mai pot creea folosind comanda /-2A(2
3:,"32 ,:*2U.
Pentru a evita valori duplicate in coloana 24P:O, introduceti:
CREATE UNIQUE INDEX I_EMPNO
ON EMP (EMPNO);
,nde&%ul urmator asigura unicitatea valorii introduse in tabela SH,P42:(S.
Acesta este denumit inde& /O:/A(2:A(2*.
CREATE UNIQUE INDEX ORDER
ON SHIPMENTS (S_Num, P_Num);
Stergerea unui ,:*2U
Pentru a sterge definitia unui inde& din tabela de date , introduceti:
DROP INDEX indexname;
/ind este folosit un ,:*2U W
0olosirea unui ,:*2U depinde in parte de optimizatorul O-A/2 in momentul
e&ecutiei. O-A/2 7 permite ambele metode de optimizare S", functie de un
set de reguli sau functie de cost.
-eguli de folosire al unui inde&
Oracle decide cind este adecvat sa foloseasca inde&i. Oracle tine seama de
coloanele inde&ate si de tipul inde&ului si decide functie de urmatoarele reguli:
17 ,nde&ii de pe coloane trebuie adresati in clauza MH2-2:
3rmatoarea interogare nu foloseste un inde& atita timp cit clauza MH2-2 nu este
prezenta:
2.
3. SELECT ENAME,JOB,SAL,COMM
4. FROM EMP;

3rmatoarea indetogare va folosi un inde& pe coloana 2:A42:
SELECT *
FROM EMP
WHERE ENAME = 'JHONES';

?7 3n inde& nu va fi folosit daca coloana referita in clauza MH2-2
face parte dintr%o e&presie sau functie.
2&emplul urmator nu foloseste inde& deoarece coloana este parte a unei
functii:
6.
7. SELECT *
8. FROM EMP
9. WHERE UPPER(ENAME)= 'JHONES';

,n mod similar daca H,-2*A(2 a fost inde&ata, aceasta interogare nu va
folosi inde& deoarece este o e&presie:
SELECT *
FROM EMP
WHERE HIREDATE+7 = '01-JAN-84';

3tilizarea inde&arii functie de cost
4odulul de optimizare bazat pe costul e&ecutiei decide un plan de e&ecutie pentru
o secventa S" calculind costul cailor alternative folosind informatii statistice
acumulate daca este posibil. *e obicei se va decide cea mai buna cale de utilizare
a unui inde&.
Sugestii pentru ,:*2UA-2
" O tabela cu mai mult de #<< linii va beneficia din inde&are pentru
imbunatatirea performantelor, daca mai putin de 1<P din linii vor fi
intoarse in cazul unei interogari.
" ,nde&ati toate coloanele acolo unde sunt cerute valori unice.
" *aca doua sau mai multe coloane sunt utilizate in mod frecvent impreuna
in clauza MH2-2 sau =O,: atunci creeati un inde& concatenat.
'/O:/A(2:A(2* ,:*2U)
" 2vitati mai mult de trei inde&i pentru o tabela. ,n acest caz va fi o
supraincarcare in cazul unei operatii *4. 'aceasta regula s%ar putea sa nu
fie valabila pentru tabele la care S22/( este operatiunea cea mai
frecventa, de e&emplu tabele de referinte.)
,nde&are si ,mbinare
*aca nu e&ista inde& in cadrul coloanelor ,48,:A(2 atunci se poate obtine o
"sortare%imbinata". Asca inseamna ca fiecare este sortata separat si apoi listele
sortate sunt imbinate . *e obicei coloanele folosite pentru imbinari trebuie sa fie
inde&ate. *aca numai una din tabele are un inde& utilizabil, atunci cealalta tabela
este tabela conducatoare.
*e e&emplu:
SELECT ENAME, DNAME
FROM DEPT, EMP
WHERE EMP.DEPTNO = DEPT.DEPTNO
*aca numai 24P.*2P(:O este inde&ata , atunci *2P( este tabela conducatoare.
Acest lucru este normal deoarece *2P( intoarce mai multe linii decit 24P. *aca
ambele sunt inde&ate, Oracle alege tabela conducatoare cintarind rangurile celor
doua sisteme. *aca rangurile sunt egale atunci Oracle alege tabela care este listata
ultima in clauza 0-O4.
Asa ca trebuie listate tabele mari cu cel mai mic numar de linii la sfirsitul clauzei
0-O4.
SELECT ENAME, DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
3nit 1@ 2&ercitii
17 /reati un indice neunic in coloana Pro+id a tabelei de atribuire.
27 ,nterogati tabela **( 'data dictionar? table) pentru a obtine informatii
despre inde&ii folositi '3S2-O,:*2U2S).
Solutii:
3.
4. CREATE INDEX ASG_PROJID
5. ON ASSIGNMENTS (PROJID);
=7
7.
8. SELECT TABE_NAME, INDEX_NAME
9. FROM USER_INDEXES;
107
CAPITOLUL 19
I#T'O,UC$'$ I# PL1.2L
/2 2S(2 P!S" W
3n limba+ procedural
3n vehicul pentru procesarea tranzactiilor
O tehnologie disponibila in citeva aplicatii O-A/2
O e&tensie S"
/e este P!S" W
P!S" 'Procedural anguage !S") este o e&tensie la S", incorporind multe
facilitati ale limba+alor de programare din ultimii ani. 2l permite ca manipularea
datelor si procedurile de interogare din S" sa fie incluse in blocuri stucturate si
proceduri, P!S" devenind astfel un puternic limba+ de procesare al
tranzactiilor.
Avanta+e ale P!S"
1. Stuctura de bloc
P!S" este un limba+ structurat, adica programele pot fi impartite in
blocuri logice, fiecare continind resursele necesare in acel bloc. variabilele
pot fi declarate local in cadrul unui bloc in care vor fi folosite, iar tratarea
erorilor 'sau 2&ceptiile) se poate face in blocul in care apar.
#. /ontrolul e&ecutiei
*eciziile, buclele si salturile pot fi folosite pentru a controla e&ecutia
programelor, decizind daca si cind S" si alte actiuni sa fie e&ecutate.
Aceste facilitati permit aplicatiilor O-A/2 cum ar fi S".0orms, de a
grupa comenzi si de a controla e&ecutia lor prin P!S".
G. Portabilitatea
*eoarece P!S" deriva din O-A/2, programele pot fo portate pe toate
masinile ce suporta O-A/2 si P!S".
6. ,ntegrarea
P!S" +oaca un rol din ce in ce mai important in -*84S si in aplicatiile
O-A/2. 5ariabilele si tipurile de date din P!S" sunt compatibile cu
cele din S".P!S" acopera golul dintre nevoia de access la tehnologia
bazelor de date si nevoia de facilitati pentru programarea procedurala.
F. Performantele
3tilizarea P!S" poate a+uta la imbunatatirea performantelor aplicatiilor.
Avanta+ele difera , functie de mediul in care P!S" este folosit. Aceste
avanta+e vor fi discutate mai tirziu in acelasi unit.
%%%%%%%%% *esene pag 1;%6 %%%%%%%%%
Structura P!S"
0iecare unit al P!S" contine unul sau mai multe blocuri. Aceste blocuri pot fi
complet separate sau lipite unul de altul. Astfel, un bloc poate fi numai o mica
parte a altui bloc, care la rindul lui poate fi numai o parte din intreegul program.
*e obicei, un bloc poate fi un bloc anonim sau un sub%program.
o 8locuri anonime
3zual sunt blocurile fara un nume. Aceste blocuri sunt declarate in punctul
din aplicatie unde vor fi folosite, si transferate modulului P!S" la
momentul e&ecutiei. 8locurile anonime pot apare in cadrul unui program
precompilat 'sau program O/,) si cu S".Plus sau S".*8A. Partile de
e&ecutie din S".0orms contin asemenea blocuri.
o Sub%programe
Acestea sunt denumite blocuri P!S". Pot fi declarate ca proceduri sau
ca functii. ,n ultimul caz, ele intorc o valoare daca sunt apelate.
S".0orms permite ca procedurile si functiile sa fie declarate ca parte a
0orm%ului, si apelate din orice punct.
,n acest curs ne vom concentra mai mult asupra blocurilor anonime. *efinirea
unui bloc anonim este urmatoarea:
---------------------------------------------------
| DECLARE |
| Definitia obiectelor PL/SQL care vor |
| fi folosite in acest bloc. |
---------------------------------------------------
| BEGIN |
| Actiuni executabile |
---------------------------------------------------
| EXCEPTION |
| Tratarea erorilor (cazuri de exceptie) |
| ce trebuie facut daca o actiune cauzeaza |
| o eroare |
| END; |
---------------------------------------------------
/uvintele cheie 827,: si 2:* sunt obligatorii si delimiteaza corpul actiunii ce
urmeaza a fi e&ecutate. Sectiunea *2/A-2 este optionala si se foloseste pentru
a defini obiecte P!S" cum ar fi variabile folosite in cadrul blocului sau un bloc
inclus in acesta. a sfirsit sectiune 2U/2P(,O: este folosita pentru a minui erori
predefinite, si defineste actiunile ce vor fi intreprinse daca astfel de conditii
apar.*e asemenea, sectiunea 2U/2P(,O: este optionala, si este plasata imediat
inainte de clauza '2:*'.
Sa urmarim un e&emplu de bloc, si sa fim atenti la structura si tipul actiunilor :
DECLARE
qty_on_hand NUMBER(5);
BEGIN
SELECT quontity INTO qty_on_hand FROM inventory
WHERE product = 'TENNIS RACKET';
IF qty_on_hand > 0 THEN
UPDATE inventory SET quantity =
quantity -1
WHERE product = 'TENNIS RACKET';
INSERT INTO purchase record
VALUES ('Tennis Racket
purchased', SYSDATE);
ELSE
INSERT INTO purchased_record
VALUES ('OUT of Tennis Rackets',
SYSDATE);
END IF;
COMMIT;
EXCEPTION
WHEN no_data_found THEN
INSERT INTO error_table
VALUES ('Product Tennis Rackets
not found');
END;
-etineti ca sectiunea de cuvinte cheie *2/A-2, 827,:, 2U/2P(,O: nu sunt
urmare de '>' dar 2:* si toate celelatle instructiuni P!S" au nevoie de '>'. Acest
lucru permite sa scriem mai multe instructiuni pe aceiasi linie daca avem nevoie.
2&emplul anterior daclara o variabila P!S" Zt?OonOhand si apoi foloseste
instructiunea S22/( pentru a completa cu (ennis -ac9ets. (abela 'inventor?'
este apoi actualizata daca valoarea este pozitiva.
*aca instructiunea S22/( esueaza in a gasi o linia cu acest produs, atunci se
genereaza eroarea 'noOdataOfound' si controlul este pasat imediat sectiunii
2U/2P(,O: unde problema este inregistrata in tabela de erori.
4ediul de lucru P!S"
P!S" nu este in sine un produs O-A/2. 2ste o tehnologie folosita de
-*84S si de anumite aplicatii O-A/2. 8locuri ale P!S" sunt pasate de
asemenea si procesate de unitatea de e&ecutie P!S". 3nitatea folosita va
depinde de locul in care P!S" este apelat.
3nitatea de e&ecutie P!S"
Aceasta unitate e&ecuta instructiuni procedurale, dar trimite instructiuni S"
catre Procesorul de ,nstructiuni S" in cadrul O-A/2 -*84S. ,n acest fel
unitatea de e&ecutie filtreaza instructiunile S", si instructiunile procedurale
ramase sunt procesate in 3nitatea de 2&ecutie A ,nstructiunilor Procedurale, care
este in interiorul unitatii de e&ecutie.
P!S" in programe S".Plus si S".*8A
8locurile care sunt transmise din acest mediu sunt procesate de catre unitatea de
e&ecutie in -*84S.S" din cadrul blocului nu este spart in instructiuni separate
pina cind a+unge la unitatea P!S", unde comenzile S" sunt trimise unitatii de
e&ecutie S". Acest lucru inseamna ca un singur transfer este necesar pentru a
trimite blocul de la aplicatie la O-A/2, imbunatatind performantele in mod
special intr%o retea de tipul client%server. %%%%%%%%% Poza de la pag. 1;%7 %%%%%%%%%
0olosirea P!S" in S".Plus este discutata in 3nitul #. 0olosirea P!S" in
alte medii care folosesc unitatea -*84S este subiect pentru viitoare cursuri.
P!S" in S".0orms 5G, S".4enu 5F si Aplicatii /*2 Oracle
4ulte aplicatii O-A/2, incluzind partea din /*2 '4edii de *ezvoltare
/ooperante) au propriile unitati de P!S", care sunt independente de orice alta
unitate prezenta in -*84S. Asa cum unitatile rezida in aplicatii comenzile S"
sunt separate inainte de a fi transferate catre O-A/2.
Procesarea datelor locale aplicatiilor 'care este in interiorul mediului de lucru
client, spre deosebire de baza de date) poate fi procesata de Procesorul de
,nstructiuni P!S", fata de folosirea S", deci reducind munca trimisa catre
-*84S, si numarul de locatii de memorie necesare. %%%%%%%%%%%%% Poza 1;%@
%%%%%%%%%%%%%
-etineti ca Procedurile si 0unctiile declarate ca parte a aplicatiilor /*2 si
S".0orms sunt diferite de acelea care pot fi stocate in baza de date cu optiunea
Procedural, altfel structura generala raminind aceiasi.
0acilitati P!S"
3rmatoarea parte a unit%ului discuta avanta+ele 'facilitatile) ale P!S" comune
fiecarui mediu de lucru unde limba+ul este instalat.
Acesta este un sumar.
o 5ariabile si /onstante
pentru memorarea si manipularea valorilor. (ipurile de date includ
:3482-, /HA- si *A(2.
o S" suport
S22/(, ,:S2-(, 3P*A(2, *22(2, /O44,(, SA52PO,:( si
-O8A/C sunt instructiuni suportate.
o (ipuri de date compuse
-ecordurile permit definirea grupurilor de cimpuri si folosirea in blocuri
P!S". 5ersiunea # suporta de asemenea tabele, la fel ca sirurile.
o /ontrolul 2&ecutiei
,nstructiunea ,0, 8ucle, salturi '7O(O) si etichete ofera actiuni
conditionale, teste comple&e, bucle iterative.
o 0unctii ,nterne
4ulte functii S" sunt disponibile pentru a manipula variabile si valori
P!S".
o (ratarea 2&ceptiilor
Avertismentele si 2rorile sunt definita ca e&ceptii, care pot fi minuite in
fiecare bloc. 2&ceptiile definite de user pot fi declarate si folosite la fel de
bine ca erorile standard O-A/2.
o Stocarea de cod in baza de date
Optiunea Procedural din O-A/2 suporta functii si proceduri care pot fi
memorate in baza de date si facute disponibile pentru toate aplicatiile.
CAPITOLUL 20
'$P'$+$#TA'$A ,AT$LO'
In acest unit vom discuta tipurile de date suportate de PL/SQL, variabile scalare,
si cum pot fi manipulate datele si expresiile. Acest unit introduce de asemenea
modul de utilizare al PL/SQL cu SQL*Plus, care este o cale interactiva
convenabila pentru testarea blocurilor pe care le veti scrie.
Sintaxa de BAA a PL/SQL
!in moment ce PL/SQL este o extensie pentru SQL, re"ulele sintactice de
baza aplicabile la SQL sunt aplicabile de asemenea si la PL/SQL.Iata un
rezumat al acestora#
" instructiunile pot avea mai multe linii daca este necesar dar
cuvintele c$eie nu pot avea mai multe linii.
" %nitatile lexicale &identificatorii, numele de operatori' pot fi separate
de unul sau mai multe spatii, sau alt delimitator care nu poate face
parte din unitati lexicale
" (uvintele rezervate &)ezi apendizul B' nu pot fi folosite ca
identificatori decit marcate in "$ilimele duble& de ex. *S+L+(,*-
" Identificatorii trebuie sa inceapa cu o litera si pot contine pina la ./
de caractere.
" Sirurile trebuie marcate cu "$ilemele simple.
" 0umerele pot fi reprezentate prin valoarea lor &ex. 1.2.34' sau
scrierea stiintifica & ex. 2+4 inseamna 2x5/ la puterea 4 6 2///// '.
" (omentariile pot fi marcate cu simbolurile /* si */, caz in care
comentariile se pot lun"i pe mai multe linii & tip 7(7' sau incepind cu
7117 in care sfirsitul liniei marc$eaza sfirsitul comentariului.
+xemplu#
/* Acesta comentariu se prelungeste pe
mai multe linii. Orice secventa de cod
aflata aici este considerata comentariu. */
COMMIT; --Aici se termina transferul
!elimitatori
!elimitatorii sunt simboluri sau simboluri compuse, care au o semnificatie
speciala pentru PL/SQL. )eti recunoaste multe dintre acestia ca operatori
pentru SQL.
S/*;"#,'/ -/*+#0 - A!0-10$ -,%1 @"'*$10 (/%1'-,% -/%9,' !$'$!10'
------------------------------------------------------------------

E "+0'$1"',# (0 $(,%$'0
- "+0'$1"',# (0 -!$(0'0F%09$'0
4 "+0'$1"',# (0 *,#1/+#0!$'0
F "+0'$1"',# (0 /*+$'1/'0
I "+0'$1"' '0#$1/"%$#
) "+0'$1"' '0#$1/"%$#
J "+0'$1"' '0#$1/"%$#
D (0#/*/1$1"' (0 #/-1$ -$, 0A+'0-//
B -||-
5 (0#/*/1$1"' (0 /%-1',!1/,%/
8 -0+$'$1"' (0 ";/0!1
7 -0#0!1"' (0 !"*+"%0%1$
_ (0#/*/1$1"' (0 $!!0-- #$ (/-1$%1$
C (0#/*/1$1"' (0 -/'
3 (0#/*/1$1"' (0 *$-/%$

S/*;"#,'/ C"*+,-0 - S,%1 @"'*$10 (/% (",$ !$'$!10'0


-----------------------------------------------------------------
----

44 0A+"%0%1/$#
J) '0#$1/"%$#
MI -||-
I -||-
JI -||-
)I -||-
3I $-/9%$'0
I) $-"!/0'0
77 '$%9
|| !"%!$10%$'0
JJ 01/!T01$
)) -||-
-- !"*0%1$'/,
F4 -||-
4F -||-
8etineti ca spatiile nu sunt permise intre cele doua caractere ale
simbolurilor combinate.
Blocurile Incluse
Anumite blocuri pot fi incluse in altele, in orice fel in care instructiunea o
permite& nu se recomanda sa se include blocuri in cadrul unor bucle'.
Partea executabila a unui bloc poate fi sparta in blocuri mai mici, si de
asemenea sectiunea +9(+P,I:0 poate include alte blocuri.
+xemplu#

BEGIN
-- actiuni in bucla principala

DECLARE
-- declaratii de obiecte
BEGIN
-- actiuni ale blocului
EXCEPTION
-- ce'i de facut daca apare o eroare in acest
bloc.
END;

-- alte actiuni in blocul principal

EXCEPTION

WHEN errors_trickle_through THEN


BEGIN
-- minuire a erorilor in blocul propriu
EXCEPTION
-- ce'i de facut daca tratarea unei erori
-- merge gresit !!
END;
END;
8etineti ca sectiunea !+(LA8+ este optionala ; exemplul prezentat
contine citeva blocuri fare sectiunea !+(LA8+.
!omeniul :BI+(,+L:8
*!omeniul* unui obiect este zona unui pro"ram in care acest obiect poate
fi folosit. Scurt zis este 7,impul de viata7. Aceste re"uli se aplica toturor
obiectelor declarate, incluzind variabile, cursor, constante si exceptii
definite de utilizator.
!omeniul unui obiect este blocul complet in care obiectul este declarat,
inclusiv oricare sub1bloc inclus in acest bloc. :biectele declarate in sub1
blocuri sunt valabile pina cind sub1blocul se termina.
+xemplu#
DECLARE
X NUMBER; ----------------|
BEGIN |
|
... |
domeniul
|
lui
DECLARE |
x
Y NUMBER; -----| |
| domeniul lui y |
BEGIN | |
... | |
END; -----| |
|
... |
END; ---------------|
8etineti ca pe timpul 7,impului de viata7 al lui <, suntem tot in domeniul lui
7x7, si putem defini expresii care sa foloseasca ambele variabile.
Sa presupunem ca variabila din sub1bloc nu se numeste 7<7 ci 7x7. (u alte
cuvinte, are acelasi nume ca si variabila din sub1bloc.
DECLARE
x NUMBER; -- variabila x din blocul
principal
BEGIN
...
DECLARE
x NUMBER; -- variabila x din sub-bloc
BEGIN
...
END;
...
END;
!oua obiecte pot avea acelasi nume, dar definite in doua blocuri diferite.
Acolo unde se intilneste aceasta situatie, ca in exemplul anterior, atunci
numai obiectul declarat un sub1bloc & acesta este blocul curent' poate fi
folosit.
8e"uli de )IIBILI,A,+
In exemplul anterior, variabila 7x7 din sub1bloc dezactiveaza folosirea
variabilei 7x7 din blocul principal pina cind variabile intilnesc sfirsitul de
valabilitate. In cadrul sub1blocului, variabila 7x7 din blocul principal exista
dar nu este vizibila.
!eclararea de )ariabile si de constante
PL/SQL permite o varietate de tipuri de date ce pot fi folosite pentru
declararea de variabile si de constante. )ariabile in mod optional pot avea
asi"nate valori la declarare, si pot sa1si sc$imbe valoarea prin asi"nari
ulterioare in cadrul blocului. (onstatele sunt identificatori care pastreaza o
valoare fixa care trebuie asi"nata cind constanta este declarata.
,ipurile de !A,+ S(ALA8+
Aceste sunt tipurile de date care reprezinta o sin"ura valoare.Principalele
tipuri de date sunt acelea ce corespund coloanei de tipuri in tabela
:8A(L+. PL/SQL suporta de asemenea tipurile booleene.
TIPUL NUMERIC
NUMBER H$#"$'0 %,*0'/!$ !, +'0!/6/$ (0 3> (0 !/@'07
H$#"'/#0 -,%1
'"1,%:/10 #$ %,*0'0 /%1'09/ *$/ +,1/% $1,%!/ !/%(
0-10 ($1$
-!$#$7B 0A7 NUMBERB782D /%-0$*%$ 7 !/@'08 !, 2
60!/*$#07
I*+#/!/1 +'0!/6/$ 0-10 (0 3> !/@'07D

TIPUL CARACTER
HARCHAR2 ."#"-/1 +0%1', $ *0*"'$ 2$'/$;/#0 (0 1/+
!$'$!10'7L,%9/*0
/*+#/!/1$ 1 !$'$!10'7 M$A/*$ +0'*/-$ 327=77
0A7 HARCHAR2B30D

CHAR PLFS&L H0'-/,%0$ 13#$ @0# !$ HARCHAR28 ($' !,


#,%9/*0$ *$A/*$
(0 2??

PLFS&L H0'-/,%0$ 23L,%9/*0$ +"$10 @/ *$/ *$'0 (0


327=7
!$'$!10'07

TIPUL BOOLEAN
BOOLEAN P0%1', */%,/'0$ 2$#"'/#"' ;""#00%0 TRUE -/ .ALSE7
R06,#1$1,#
0A+'0-//#"' ;""#00%0 +"$10 @/ $-/9%$1 $!0-1"'
2$'/$;/#0 -/
10-1$1 *$/ 1/'6/, /% /%-1',!1/,%/ !"%(/1/"%$#07

TIPUL DATA
DATE D$10#0 2$#/(0 -,%1 /%1'0 4712 BC -/ 4712AD7
!eclararea )A8IABIL+L:8
)ariabilele PL/SQL pot fi declarate si optional le pot fi asi"nate o valoare
initiala, in sectiunea !+(LA8+ a unui bloc. Alte variabile referite in partea
declarativa trebuie declarate separat in declaratiile anterioare.
Sintaxa#
indentificator tipdata [(precizia,scala)] [NOT NULL] [ := expresie ] ;
%nde 7expresie7 poate fi o alta variabila, sau o expresie cu functii si
operatori. !aca o valoare initiala nu este asi"nata, atunci variabila va
contine o valoare nula pina cind ii va fi asi"nata ulterior o valoare.
(onstanta 0:, 0%LL nu mai este permisa in aceasta situatie.
+xemple#
v_count NUMBER NOT NULL := 0;
v_salary NUMBER(7,2);
v_annsal NUMBER(9,2) := month_sal * 12;
-- mount_sal trebuie sa existe deja
postcode CHAR(7);
surname VARCHAR2(25) := 'Skywalker' ;
v_message VARCHAR2(80) := 'May the course be
woth you!' ;
married BOOLEAN := FALSE;
today DATE := SYSDATE;
+ste indicat sa nu ale"eti acelasi nume &identificator' pentru o variabila ca
nume pentru coloanele din tabela folosite in cadrul blocului. !aca
variabilele PL/SQL apar in instructiuni SQL si au acelasi nume ca coloana,
atunci :8A(L+ considera ce se refera coloana.
!eclararea (:0S,A0,+L:8
(onstantele permit asi"narea unei valori unui identificator, pentru o
viitoare referire in cadrul unui bloc. :rice incercare de a modicica valoarea
unei constante va cauza producerea unei erori PL/SQL.
Sintaxa#

identificator CONSTANT tipdata [(precision,scala)] :=


expresie ;
+xemple#
pi CONSTANT NUMBER(9,5) := 3.14159 ;
vat CONSTANT NUMBER(4,2) := 17.5 ;
A,8IB%I8IL+ si +9P8+SIIL+
Instructiunile de atribuire PL/SQL permit unei valori de a fi atribuite sau
reatribuite unei variabile dupa sectiunea !+(LA8+ din bloc. )ariabila
care va primi noua valoare trebuie explicit numita in partea stin"a a
operatorului de asi"nare. Asta este, nu se poate face referinta indirecta
via o alta variabila.&%nele unitati PL/SQL cum ar fi SQL*=orms includ
unele facilitati pentru adresare indirecta.'
Sintaxa#

identificator := expresie ;
%nde 7identificator7 este numele variabilei tinta, sau cimp, pentru a primi
valoarea 7expresie7.
7+xpresie7 poate fi literal, numele unei alte variabile existente, sau alta
expresie necesara pentru a determina valoarea ce va fi asi"nata. !e
obicei, cele mai multe din expresiile disponibile in indero"arile SQL ,
clauza S+L+(, sunt disponibile aici. =unctiile si expresiile permise in
PL/SQL vor fi discutate mai tirziu in acest %0I,.
+xemple#
v_count := v_count +1;
ann_sal := mount_sal * 12 +NVL(comm,0);
lev := 6;
mess := 'The current level is ' || TO_CHAR(lev) ;
v_ename := 'KING';
)alorile pe care le pot lua variabilele booleene pot fi ,8%+ si =ALS+, ca
rezultat a unei expresii booleene.
+xemple#
overpaid := ann_sal > 35000 ;
male := UPPER(title) == 'MR' ;
salary_ok := NOT overpaid ;
female := NOT male ;
switch1 := TRUE;
switch2 := FALSE;
Accesarea variabilelor 0:0 PL/SQL
)ariabilele declarate in mediul de lucru 7masina7 pot fi referite in
instructiuni PL/SQL. Aceasta include variabilele de lucru ale masinii
declarate in pro"ramele precompilate. Adresarea variabilelor non1PL/SQL
trebuie facuta prin prefixarea cu 7#7 pentru a le distin"e de declararea de
variabile PL/SQL.
+xemple#

:screen_field1 := ann_sal ;
:warp_factor := 9 ;
:global.var1 := 'YES' ;
!etalii despre modul de minuire al variabilelor 0:0 PL/SQL sunt descrise
in cursuri :8A(L+ special destinate acestor variabile.
(onversii de tipuri de date
PL/SQL incearca sa converteaza dipurile de date in mod dinamic daca
sunt mixate in cadrul unei instructiuni. !e exemplu daca un numar este
asi"nat unei variabile (>A8, atunci in mod automat numarul este
translatat astfel incit va putea fi stocat in cariabila de tip (>A8.
+xemple#

sal_message VARCHAR2(12) := 3500;


Situatia inversa se aplica de asemenea,
salary NUMBER(12,2) := sal_message;
:ricum, o eroare va fi "enerata daca valorile sunt incompatibile#
salary := 'King earns $5000'; -- eroare
!ovedind ca sunt compatibile, se pot asi"na caractere in variabile !A,+
si vice1versa#
today VARCHAR2(9) := SYSDATE ;
hired DATE := '21-JAN-1992' ;
In cadrul expresiilor trebuie sa va asi"urati ca tipurile de date sunt
aceleasi. !aca apar tipuri diferite de date in aceiasi expresie, atunci se
foloseste cea mai potrivita functie de conversie#
TO_CHAR
TO_DATE
TO_NUMBER
PL/SQL va incerca sa faca conversia, daca este posibil. !e obicei,
PL/SQL este mai pretentios decit SQL daca tipurile de date sunt mixate in
cadrul unei expresiilor. !eci daca nu sunteti si"ur, folositi cea mai potrivita
functie de conversie.
+xemplu#
v_message VARCHAR2(80) := 'SCOTT earns' || TO_CHAR
(month_sal*12) ;
Precedenta operatorilor
:peratorii lo"ici, aritmetici si de concatenare folositi in PL/SQL sunt
aceeasi ca in SQL. In plus mai exista un operator exponential &**' .
:rdinea in care operatiile sunt realizate poate fi controlata folosind
paranteze, ca in SQL.
8eamintim ordinea naturala a operatiilor in cadrul unei expresii#
O'(/%0$ (0 02$#,$'0 $ "+0'$1"'/#"'
-----------------------------------------------------------------
------------|
| | OPERATOR | OPERATIE
|
|----------------------------------------------------------------
------------|
|P'/*,# | 44 8 NOT | 0A+"%0%1/$#8
%09$1/0 #"9/!$|
| | E 8 - | /(0%1/1$108
%09$1/0 |
| | 4 8 F | /%*,#1/'08
/*+$'1/'0 |
| | E 8 - 8 || | $(,%$'08
-!$(0'08 |
| | | !"%!$10%$'0
|
| | I 8 MI 8 J 8 ) 8 JI 8 )I | !"*+$'$1/0
|
| | IN NULL8 LIKE8 BETWEEN8 IN |
|
| | AND | !"%:,%!1/0
|
|U#1/*,#| OR | /%!#,6/,%0
|
|----------------------------------------------------------------
------------|
=unctii interne
?ulte din functiile disponibile in SQL sunt de asemenea disponibile si in
PL/SQL. Acestea includ#
" =unctii numerice pentru o sin"ura linie
" =unctii caracter pentru o sin"ura linie
" =unctii de conversie de tip de data
" =unctii de timp
" =unctii diverse
In plus PL/SQL ofera doua functii pentru minuirea raportatea erorilor
denumite SQL(:!+ si SQL+88? care vor fi discutate in unitul urmator.
=unctii nedisponibile in instructiuni structurale sunt#
GREATEST and LEAST
AGV, MIN, MAX, COUNT, SUM, STDDEV si VARIANCE
Blocuri PL/SQL in buffere SQL
|----------------------------------------------------------------
-|
| S&L) DECLARE
|
| 2 A NUMBERB782D5
|
| 3 BEGIN
|
| 4 SELECT -$# INTO A .ROM 0*+ WHERE 0*+%"I WW%5
|
| ? I. AJ3000 THEN
|
| = UPDATE 0*+ SET -$#I30005
|
| 7 WHERE 0*+%" I WW%5
|
| > END I.5
|
| < END5
|
| 107
|
| S&L)
|
|----------------------------------------------------------------
-|
" Buffer1ul se inc$ide cu un 7.7
" +xecutia buffer1ului de face cu 8%0 sau 7/7
=olosirea PL/SQL in SQL*Plus
Limba@ul PL/SQL este permis si in SQL*Plus )ersiunea ../ sau mai mare.
!eoarece SQL*PL%S foloseste unitatea de executie PL/SQL in 8!B?S,
este necesar ca :8A(L+ 8!B?S sa foloseasca aceasta facilitate.
Aceasta optiune este#

Procedural Option (Oracle7 Server)


SQL*Plus este un bun instrument pentru testarea blocurilor PL/SQL,de
aceea il vom folosi si noi pentru partea practica a cursului.
Sunt doua cai pentru a prelucra blocuri PL/SQL in SQL*Plus#
" Se defineste un bloc in buffer1ul SQL, si apoi se ruleaza
" Se defineste un bloc ca parte a unui script SQL*Plus, si apoi se
ruleaza scriptul
!eclararea de blocuri PL/SQL in buffere SQL
Acolo unde PL/SQL nu se foloseste, bufferul SQL poate contine numai o
sin"ura instructiune SQL. !aca se plaseaza o alta instructiune in buffer
aceasta o suprascrie pe prima. !e acea un bloc PL/SQL este tratat ca o
instructiune continua iar 7#7 intr1un bloc un inc$id si nici nu ruleaza bufferul.
SQL*Plus detecteaza inceputul unui bloc PL/SQL dupa introducerea
cuvintelor c$eie !+(LA8+ si B+AI0 la promptul 7SQL B7.Bufferul poate fi
inc$is fara a executa blocul sau pro"ramul prin introducerea unui 7.7 la
prompt.
+xemplu#
SQL> DECLARE
2 x NUMBER(7,2);
3 BEGIN
4 SELECT sal INTO x FROM emp WHERE empno = 7788;
5 IF x < 3000 THEN UPDATE emp SET sal = 3000
6 WHERE empno = 7788;
7 END IF;
8 END;
9 .
(ontinutul bufferului poate fi editat in maniera obisnuita sau salvat intr1un
fisier folosind comanda SQL*Plus *SA)+*.
Pentru a rula buffer1ul PL/SQL, tastati comanda 8%0 sau 7/7 la promptul
SQL. !aca executia reuseste fara tratari de eroare atunci sin"urul mesa@
care apare ar trebuie sa fie#
'PL/SQL procedure seccessfully completed'
=olosirea de blocuri PL/SQL in cadrul fisierelor SQL*Plus
=isiere SQL si comenzi SQL*Plus pot include blocuri PL/SQL care se
comporta ca o sin"ura instructiune in cadrul scriptului.=isierul poate fi
editat in maniera obisnuita, folosind comenzi ale sistemului de operare si
editoare, sau cu a@utorul comenzii *SA)+* din buffer1ul SQL cum a fost
mentionat mai inainte.
8etineti ca comenzile SQL*Plus nu pot apare in interiorul blocului PL/SQL
dar pot fi incluse ori unde in alta parte in fisier. )ariabilele de substitutie
din SQL*Plus pot fi referite din cadrul blocului, dar retineti ca ele sunt
inlocuite cu continutul variabilelor I0AI0,+ ca codul sa fie complet
interpretat sau executat.
+xemplu#
SET ECHO OFF
BEGIN
INSERT INTO dept ( deptno, dname ) VALUES ( &1, '
&2 ' );
COMMIT;
EXCEPTION
WHEN dup_val on index THEN
INSERT INTO tav VALUES (' Duplicate
departament No.');
END;
/
SELECT * FROM error tab;
SET ECHO ON
SQL*Plus 1 descoperind ce se intimpla
" dupa rularea unui bloc PL/SQL, veti vedea fiecare mesa@ de tipul
7PL/SQL procedure successfull< completed7
& procedura PL/SQL terminata cu succes '
Parse1time +rror ?+ssa"es
& mesa@e de eroare, aparute dinamic in timpul procesarii.'
An 7%n$andled +xception7 ?essa"e
& ?esa@ de eroare netratata.'
" Instructiunile PL/SQL nu pot scrie pe ecran C
?esa@ele sunt scrise intr1o tabela si dupa acea se parcur"e
tabela
Scrie mesa@ele intr1o variabila de asociere si apoi foloseste
comanda P8I0, dupa ce blocul a rulat.
Se apeleaza o procedura care afiseaza mesa@ele pe ecran
(um se pot afla rezultatele actiunilor PL/SQL
!aca apare vreo eroare netratata in timpul compilarii sau al executiei unui
bloc, atunci sunt afisate mesa@e pentru a informa utilizatorul ce eroare a
aparut, o explicatie a erorii si o interpretare a liniei&lor' care au "enerat
eroarea.
:ricum, continutul variabilelor si al tabelelor bazei de date nu pot fi afisate
pe ecran in timpul executiei blocurilor PL/SQL in sesiuni SQL*PLus &cel
putin pina cind nu sunt folosite procedurile pac$etului !B?S-:%,P%,'.
,rebuie sa scrieti orice rezultat pe care doriti sa1l afisati intr1o tabela in
baza de date si dupa executie sa parcur"eti tabela. Aceasta parcur"ere
poate fi facuta in acelasi fisier care cuprindea si blocul, ca in exemplul
anterior.
Situatia este diferita in aplicatii cum ar fi SQL*=orms, unde blocurile
PL/SQL pot afisa variabile direct pe ecran prin folosirea unor functii
interne.
Apelul =unctiilor si Procedurilor PL/SQL memorate
Atunci cind subpro"rame &functii si proceduri' PL/SQL sunt memorate in
baza de date, ele pot fi apelate ca parte a unui alt bloc PL/SQL, daca cel
care face apelul are drepturi suficiente. Sintaxa "enerala a apelului este#

nume-Procedura [ ( param1, param2, param3, ... ) ];


La apelare, parametrii trebuie pusi in ordinea de definire. Aceasta
inseamna si tipurile de date trebuie sa fie aceleasi cu cele definite. Anumiti
parametrii pot avea valori implicite, dar daca o valoare este data ca
parametru atunci toti parametrii anteriori trebuie folositi.
In exemplul urmator, procedura (L+A8-!+P, are doi parametrii
disponibili. Primul parametru !+PA8,A?+0,-0A?+ & datat<pe
)A8(>A82 ' si al doilea parametru !+L+,+-!+PA8,A?+0, & datat<pe
B::L+A0 cu valoarea implicita =ALS+ '.
CLEAR_DEPT( `ACCOUNTING' ); -- al doilea parametru este
implicit
CLEAR_DEPT ( `ACCOUNTING', TRUE);
Parametrii pot fi folositi alternativ impreuna cu numele formal, prin
folosirea operatorului de asociere. In acest caz pozitia lor nu mai este
importanta#
CLEAR_DEPT ( DELETE_DEPARTAMENT => TRUE,
DEPARTAMENT_NAME => `ACCOUNTING' ) ;
In final, deoarece sub1pro"ramele trebuie apelate din blocuri PL/SQL, se
poate apela din promptul SQL in SQL*Plus prin impac$etarea apelului cu
B+AI0 si +0!. Aceasta poate fi realizata prin comanda +9+(%,+ din
SQL*Plus.
SQL> EXECUTE CLEAR_DEPT( `ACCOUNTING' );
care este identica cu #
BEGIN CLEAR_DEPT( `ACCOUNTING '); END;
%nitul 2/, +9+8(I,II
In fiecare din urmatoarele exercitii puteti crea blocuri PL/SQL in buffere
SQL si puteti salva mai tirziu in fisier, sau puteti alternativ edita fisierul
folosind un editor de texte al masinii. In ambele cazuri, retineti numele pe
care il dati fiecarui fisier.
In multe din exercitii, aveti nevoie de inre"istrarea rezultatelor intr1o
tabela. )om folosi pentru aceasta tabela ?+SSAA+S. !efinirea acesteia
este urmatoarea#
T$;#0 MESSAGES
C"#"$%$ D0-!'/0'0$
------------ -------------------------------------
NUMCOL1 NUMBER B<82D
NUMCOL2 NUMBER B<82D
CHARCOL1 HARCHAR2B=0D
CHARCOL2 HARCHAR2B=0D
DATECOL1 DATE
DATECOL2 DATE
17 (reati un bloc, cu patru variabile#
)-B::L5 Boolean
)-B::L2 Boolean
)-(>A8 ($aracter & lun"ime variabila'
)-0%? 0umber
si apoi atribuiti valori variabilelor dupa cum urmeaza#
H$'/$;/#$ H$#"$'0
-------------
-----------------------------------------
HGCHAR L/10'$' `42 0-10 '$-+,%-,#C
HGNUM P'/*0#0 (",$ !$'$!10'0 (/% HGCHAR
HGBOOL1 TRUE -/ .ALSE @,%!1/0 (0 !,* 0-10
HGNUM
@$1$ (0 100
HGBOOL2 O+,- #,/ HGBOOL1
27 Scrieti si rulati un bloc PL/SQL care accepta soua numere din variabile
PL/SQL. Primul din numere trebuie *ridicat la putere* cu cel de1al doilea numar,
in cadrul blocului, si rezultatul scris intr1o variabila PL/SQL. I0re"istrati rezultatul
in tabela ?+SSAA+S, si alternativ in variabila de asociere SQL*Plus.
&:peratorul exponential in PL/SQL este 7**7 '.
%nit 2/ S:L%,II
1.
2. DECLARE
3. V_BOOL1 BOOLEAN;
4. V_BOOL2 BOOLEAN;
5. V_CHAR VARCHAR2(16); -- cel
putin 16 caractere
6. V_NUM NUMBER(2);
7. BEGIN
8. V_CHAR := '42 este raspunsul';
9. V_NUM := SUNSTR(V_CHAR,1,2); -- conversie
dinamica la mumar
10. V_BOOL1 := V_NUM < 100;
11. V_BOOL2 := NOT V_BOOL1;
12. END;
137
14.
15. DECLARE
16. V_RESULT NUMBER(9,2);
17. BEGIN
18. V_RESULT := &main_var ** &exponent ;
19. -- sau
POWER(&main_var,&exponent);
20. INSERT INTO messages(numcol1) VALUES ( V_RESULT
) ;
21. END;
227
Sau o solutie alternativa folosind SQL*Plus #
23.
24. BIND VARIABILES .............
25. VARIABILE V_RESULT NUMBER
26. BEGIN
27. :V_RESULT := &main_var ** &exponent;
28. END;
29. PRINT V_RESULT
CAPITOLUL 21
I#T$'ACTIU#$A CU O'ACL$
,n acest unit se va trata modalitatea de access la baza de date si de controlarea
tranzactiilor, prin instructiuni S" in P!S". *e asemenea veti vedea cum erorile
cauzate de S" pot fi tratate de catre rutinele de tratare a e&ceptiilor.
/omenzi S" in P!S"
P!S" ofera citeva instructiuni procedurale pentru manipularea si testarea
datelor, de multe ori fara sa avem nevoie sa apelam comenzi S". Aceasta
metoda este preferabila, deoarece S" face access la baza de date.
Oricum, cind vrem sa e&tragem informatii din baza de date, sau sa facem
modificari atunci trebuie sa folosim S". P!S" suporta toate facilitatile *4
si toate comenzile de control al tranzactiilor din S". Si, bineinteles,
instructiunea S22/( poate fi folosita pentru a atribui variabilelor valori din
liniile in tabele.
,ata citeva puncte mai inportante care trebuie amintite:
" 0iecare comanda S" trebuie terminata de '>'
" 3n bloc P!S" nu este o unitate de tranzactie % /O44,( si
-O8A/C sunt implementate independent de blocuri, dar pot face parte
din ele.
" /omenzile ** nu sunt permise in P!S"
" /omanda S22/( care nu intoarce un singur rind cauzeaza o eroare
" /omenzile *4 pot procesa mai multe linii
-eferirile P!S" in comenzi S"
5alorile memorate in variabile si constante P!S" pot fi pasate direct
comenzilor S", unde ele sunt procesate de modulele P!S" pe masura ce
blocul este e&ecutat. Atentie mare ar trebui acordate pentru a nu referi variabile
P!S" in S" unde variabilele au acelasi nume cu coloana in tabela.
2&emplul urmator ilustreaza aceasta problema.
2&emplu:
DECLARE
empno NUMBER(4) := 7788;
BEGIN
UPDATE emp SET sal = 9000;
WHERE empno = empno;
-- unde coloana este egala cu ea insasi
......
END;
,n e&emplul anterior fiecare linie din tabela 'emp' trebuie reactualizata. 0iecare
adresare in instructiunea 3P*A(2 catre 'empno' este tratata ca nume de coloana.
*e aceea, alegeti nume de variabile P!S" care nu intra in conflict cu numele
coloanelor din tabela pe care doriti sa o folositi.
*e asemenea, retineti ca atributele si functiile P!S" care sunt unice P!S" nu
pot fi adresate direct din comenzi S". Acestea includ S"/O*2 si S"2--4,
care vor fi discutate mai tirziu in acest unit.
COME$=# PE$"!U MA$#PULA!EA
DA"ELO!
INSERT
UPDATE
DELETE
[LOCK TABLE]
2&emple:
DECLARE
v_empno NUMBER(4) := 7788 ;
BEGIN
UPDATE emp SET sal = 9000 ;
WHERE empno = v_empno ;
...
END;
:ota) Atentie la numele variabilelor R
/omenzi pentru manipularea datelor ' *4 )
/omenzile *4, ,:S2-( 3P*A(2, *22(2 pot fi folosite fara restrictii in
P!S". (abela sau linia apare ca un rezultat al acestor comenzi si apar la
sfirsitul tranzactiilor *4, in maniera obisnuita:
2&emplu:
DECLARE
v_empno NUMBER (4) := 7788;
BEGIN
UPDATE emp SET val = 9000;
WHERE empno = v_empno;
...
END;
2&emplul de mai sus tinteste liniile pentru 3P*A(2 care au valoarea 'empno' de
77@@. *aca zero sau mai multe linii satisfac conditia, comanda este inca incheiata
cu succes.
/ursorul implicit % (estarea rezultatelor comenzilor S"
Ori de cite ori sunt e&ecutate comenzi S", o zona de memorie este deschisa in
care comanda poate fi interpretata si e&ecutata. 3n cursor este un identificator
pentru aceasta zona.
/omenzile S" ce fac parte din partea e&ecutabila a unui bloc sunt e&ecutate in
'cursorul implicit' care are identificatorul 'S"'. Acest cursor este gestionat
automat pentru utilizatori de catre P!S".
P!S" ofera citeva 'atribute' care ne permit sa determinam ce se intimpla cind
cursorul implicit a fost utilizat ultima data. Acestea sunt:
S&LLROWCOUNT - %,*$',# (0 #/%// +'"!0-$10 (0
/%-1',!1/,%/
S&L B 2$#"$'0 /%1'0$9$D
S&LL.OUND - TRUE ($!$ !0# +,1/% " #/%/0 $ @"-1
+'"!0-$1$8
$#1@0# .ALSE B 2$#"$'0 ;""#0$%$D
S&LLNOT.OUND - TRUE ($!$ %, $ @"-1 +'"!0-$1$ %/!/ "
#/%/0
$#1@0# .ALSE B 2$#"$'0 ;""#0$%$D
Aceste atribute pot fi folosite in aceeasi maniera ca functiile in comenzi P!S",
dar nu in comenzi S".
Atributele pot fi folosite in sectiune 2U/2P(,O: a unui bloc pentru a evalua
rezultatul unei instructiuni S22/( esuate 'cereia i se permite sa intoarca doar o
linie), dar probabil ca este mult mai folositor sa evaluam rezultatul operatiei
*4.
2&emplu:
DECLARE
rows_deleted NUMBER;
BEGIN
DELETE FROM dept WHERE deptno = 50;
rows_deleted := SQL%ROWCOUNT ;
INSERT INTO del_history VALUES ('DEPT',
rows_deleted,SYSDATE);
END;
/ontrolul (ranzactiilor
a fel ca si O-A/2 in general, tranzactiile *4 vor incepe la prima comanda
ce urmeaza lui /O44,( sau -O8A/C, si sfirsitul urmatorului /O44,( sau
-O8A/C terminat cu succes. Aceste actiuni pot avea loc intr%un bloc P!S"
sau ca rezultat al evenimentelor din mediu masinii.
3rmatoarele comenzi de control al (ranzactiilor sunt valide in P!S", dar
variabilele de mediu ale masinii pot impune unele restrictii de utilizare:
COMMIT Q WORK R
ROLLBACK QTO -$20+"/%1R
SAHEPOINT
SET TRANSACTION
/omenzi de blocare, care dureaza pina la sfirsitul tranzactiei pot fi de asemenea
include in bloc. Acestea sunt : O/C (A82, S22/( .. 0O-, 3P*A(2.
2&emple:
,n e&emplul urmator, este prezentat un "rollbac9" din variabilele de mediu ale
masinii ' de e&emplu S".Plus) pentru a anula orice actiune *4 aplicata in
bloc de la punctul salvat'savepoint).
BEGIN
...
SAVEPOINT ok_so_far;
...
END;
ROLLBACK TO ok_so_far;
2&emplul urmator "rools bac9" toate toate tranzactiile, incluzind orice modificare
facute in e&teriorul blocului, faca functia 3P*A(2 nu gaseste nici o linie. Altfel,
se transmit toate schimbarile in tranzactie.
DELETE FROM emp WHERE job = 'CLERK';
BEGIN
UPDATE emp SET sal = 8000 WHERE job = 'CAPTAIN' ;
IF SQL%NOTFOUND
THEN ROLLBACK;
ELSE COMMIT;
END IF;
END;
-etineti ca S".Plus trateaza un bloc P!S" ca o singura instructiune. *aca
optiunea A3(O/O44,( este activa 'O:), actiunile realizate in bloc nu sunt
realizate pina cind nu este procesat si sfirsitul blocului. ,n mod opus, daca o
actiune *4 cauzeaza o e&ceptie netratata atunci blocul se va termina cu esec si
practic se vor anula actiunile *4 din cadrul blocului.
,nstructiunea S22/( in P!S"
S22/( se foloseste ca instructiune e&ecutabila in cadrul blocurilor P!S" si i
se aplica urmatoarea regula:
I%10'"9$'/#0 1'0;,/0 -$ /%1"$'!$ " !"#"$%$ -/ %,*$/ ,%$8
$#1@0#
" 0'"$'0 2$ @/ 90%0'$1$7
*e acea, S22/(%ul care nu intoarce nici o linie, sau mai mult de o linie
cauzeaza una din urmatoarele erori:
ORA-01403 N" D$1$ .",%( BANSI 0''"' 100D
D$1$ %09$-/1$
ORA-01422 EA$!1 @01!T '01,'%- *"'0 1T$% '0\,0-10(
%,*;0' "@ '"S-
P!S" trateaza aceste erori prin tratarea e&ceptiilor, care pot fi trasate in
sectiunea 2U/2P(,O: a blocului. *ar despre aceste tratatea acestor e&ceptii
vom vorbi mai tirziu in cadrul acestui unit. ,n mod normal ar trebui folosit
S22/( pentru a obtine o singura linie. 3rmatoarele clauze sunt permise:
SELECT $'1/!"#8 $'1/!"#8 777
INTO 2$'/$;/#$8 2$'/$;/#$8 777
.ROM 1$;0#$8 1$;0#$8 777
QWHERE !"%(/1/0B//D R
QGROUP BY $'1/!"#8 $'1/!"#8 777 R
QHAHING !"%(/1/0B//DR
Q.OR UPDATER5
Atributele P(KP2
/ind variabile P!S" sunt declarate pentru incarcare ulterioara cu valoarea
coloanei, trebuie sa va asigurati ca variabila este compatibila ca tip de data cu
coloana si ca este suficient de mare pentru a stoca valoarea de pe coloana. *aca
nu este atunci P!S" va genera eroare.
*ecit sa incercati sa ghiciti tipul si precizia pentru o variabila, puteti sa va bazati
pe definitia coloaneo din *ata *ictionar?. Acest lucru se face folosind atributul
P(KP2. Atributul este prefi&at cu numele tabelei si al coloanei, si folosit cind
este nevoie de tipul datei in declaratia variabilei:
/(0%1/@/!$1"' %,*01$;0#$7!"#"$%$LTYPE
0olosind aceasta metoda, tipul de data si dimensiunea sunt determinate atunci
cind blocul este compilat.
2&emplu:
DECLARE
v_deptno dept.deptno%TYPE;
v_loc dept,loc%TYPE;
BEGIN
SELECT deptno, loc
INTO v_deptno, v_loc
FROM dept ...
END;
#$"!ODUCE!E #$ "!A"A!EA E>CEP"##LO!
(E!O!#LO!)
" /e sunt e&ceptiile W
/onditii care vor termina un bloc.
" *oua tipuri principale
Predefinite
*efinite de 3S2-
" (ratarea e&ceptiilor
Previne erorile de a se propaga in afara blocului
*efineste actiunile ce se vor face cind e&ceptia apare
WHEN /(0%1/@/!$1"'G0A!0+1/0 THEN $!1/,%/5
,ntroducere in tratarea e&ceptiilor
Asa cum am vazut pe scurt mai inainte, e&ceptiile sunt identificatori in P!S"
care pot dispare in timpul e&ecutiei unui bloc pentru a termina partea principala a
actiunii. 3n bloc se va termina ,:(O(*2A3:A cind apare o e&ceptie, dar se
poate specifica un mod de tratare pentru a realiza actiunea finala inainte ca blocul
sa se termine. daca e&ceptia este tratata, atunci e&ceptia nu se propaga si in afara
blocului.
Sunt doua clase principale de e&ceptii:
Predefinite
Acestea sunt predefinite de P!S" si au asociate coduri specifice de eroare.
*efinite de utilizator
Sunt declarate in bloc de utilizator. Acestea vor fi folosite numai daca se cere
acest lucru, dar pot fi de asemenea asociate cu coduri de eroare daca se doreste
acest lucru.
,n acest unit ne vom concentra asupra e&ceptiilor interne predefinite. Acestea sunt
urmatoarele:
N,*0#0 0A!0+1/0/ C"(,# (0 0'"$'0 ORACLE
-----------------
------------------------------
DUPGHAGONGINDEN -1
INHALIDGCURSOR -1001
INHALIDGNUMBER -1722
LOGINGDENIED -1017
NOGDATAG.OUND -1403 BANSI E100D
NOTGLOGGEDGON -1012
PROGRAMGERROR -=?01
STORAGEGERROR -=?00
TIMEOUTGINGRESPONSE -?1
TOOGMANYGROWS -1422
HALUEGERROR -=?02
YEROGDEHIDE -147=
CURSORGALREADYGOPEN -=?11
TRANSACTIONGBACKEDGOUT -=1
#de&ti,icatori exce'tie
*aca orice tip de e&ceptie este generat controlul este trecut sectiunii 2U/2P(,O: a
blocului in care e&ceptia apare. *aca e&ceptia nu e minuita aici sau daca nu e&ista nici o
sectiune 2U/2P(,O: atunci blocul se termina cu o e&ceptie ]3nhandled] care poate
avea repercursiuni in mediul de inchidere.
ENEMPLU3
BEGIN
INSERT INTO (0+1 B(0+1%"8 (%$*0D HALUES B?08 `CLEANING`D5
INSERT INTO (0+1 B(0+1%"8 (%$*0D HALUES B?08 `TRAINING`D5
-- EA!0+1/"% DUPGHALGONGINDEN '$/-0( T0'0
777
END5
-- B#"!U 10'*/%$10- ST/!T U%T$%(#0( EA!0+1/"% - ORA -00001
Pentru a prinde asemenea evenimente si a preveni propagarea e&ceptiilor catre mediile de
inchidere sau blocuri se poate defini identificatorul e&ceptie in sectiunea 2U/2P(,O:.
S/%1$A$3
WHEN 0A!0+1/"%-/(0%1/@/0' THEN $!1/"%-5
unde ]actions] poate fi una sau mai multe declaratii P!S" sau S" fiecare terminata cu
':'. Actiunile unui identificator e&ceptie sint delimitate fie de sfirsitul blocului '2:*) fie
de inceputul unui alt identificator e&ceptie 'MH2:).
Principalele e&ceptii care pot apare ca un rezultat al declaratiei S22/( sint
:OO*A(AO0O3:* 'fara linii returnate) si (OOO4A:KO-OMS 'mai mult decit o
linie returnata).
EA0*+#,3
DECLARE
2G0%$*0 0*+70%$*0LTYPE5
2G:"; 0*+7:";LTYPE5
BEGIN
SELECT 0%$*08 :";
INTO 2G0%$*08 2G:";
.ROM 0*+
WHERE T/'0($10 BETWEEN C1-JAN-<2C AND C31-DEC-<2C5
777
ENCEPTION
WHEN %"G($1$G@",%( THEN
INSERT INTO 0''"'G1$;
HALUES BCN";"(X /% <2CD5
WHEN 1""G*$%XG'"S- THEN
INSERT INTO 0''"'G1$;
HALUES BCM"'0 1T0% "%0 +0'-"% /% <2CD5
END5
:otati ca, citiva identificatori e&ceptie pot fi definiti pentru bloc fiecare cu setul propriu
de actiuni. (otusi cind o e&ceptie apare numai un identificator va fi procesat inainte de a
parasi blocul.
#de&ti,icatorii exce'tie K/0E$ O"0E!SK
*esi sectiunea 2U/2P(,O: din e&emplul de sus va prinde cele doua e&ceptii specificate
alte tipuri de e&ceptie se vor strecura in retea mai bine decit definirea unui identificator
separat pentru fiecare tip de e&ceptie se poate folosi identificatorul e&ceptie 'MH2:
O(H2-S' care minuieste toate erorile neminuite inca in bloc. *aca e folosit 'MHM:
O(H2-S' trebuie sa fie codat dupa orice alt identificator e&ceptie din bloc.
EA0*+#,3
BEGIN
SAHEPOINT -"G@$'G-"G9""(5
INSERT INTO -1$1/-1/!-G1$; HALUES B1>8 2?8<1D5
ENCEPTION
WHEN (,+G2$#G"%G/%(0A THEN
INSERT INTO 0''"'G1$; HALUES B`E''"'
(,'/%9 ;#"!U`D5
END5
2u&ctii 'e&tru 'ri&derea erorii
/ind o e&ceptie a aparut, veti dori evaluarea codului erorii asociate sau mesa+ul
eroare.Aceasta poate fi important in minuirea e&ceptiilor folosind ]MH2: O(H2-S],
pina cind veti dori a decide ce actiune sa fie dupa eroare. P!S" furnizeaza # functii in
acest scop :
S"/O*2
intoarce nr. erorii asociata cu e&ceptia care a aparut 'in cazul lui
:OO*A(AO0O3:* acesta va fi codul A:S, B1<<).*aca e folosit un singur
identificator 2U/2P(,O:, functia va intoarce <.
S"2--4
intoarce mesa+ul complet de eroare asociat cu e&ceptia 'incluzind nr. erorii)
S"/O*2 intoarce date numerice, si poate fi asignat unei variabile :3482- cu
precizie implicita.S"2--4 intoarce date caracter.2ste recomandat a trunchia valoarea
la o lungime cnoscuta inainte de a incerca sa o scriem intro variabila.
EA0*+#,3
DECLARE
0''"'-*0--$90 CHAR B100D5
0''"'-!"(0 NUMBER5
BEGIN
777
ENCEPTION
WHEN OTHERS THEN
0''"'G*0--$90 3ISUBSTRBS&LERM818100D5
0''"'G!"(0 3IS&LCODE5
INSERT INTO 0''"'- HALUES B0''"'G*0--$908 0''"'G!"(0D5
END5
S"2--4 are un parametru optional care accepta numarul erorii a carui mesa+ e
returnat.
:O(A: S"2--4 si S"/O*2 nu pot fi folosite direct ca parti ale unei declaratii
,:S2-(> valorile lor trebuie sa fie trecute prima data unei variabile.
Cu( se 'ro'a)a exce'tiileI
/ind un subbloc minuieste o e&ceptie se termina normal si controlul va fi rezumat in
blocul e inchidere imediat dupa 2:*%ul subblocului.
(otusi cind o e&ceptie este generata si blocul curent nu are un identificator pentru el
e&ceptia se propaga. Aceasta inseamna ca e&ceptia se reproduce ea insasi in blocuri de
inchidere succesive pina cind un identificator e gasit. *aca nici unul dintre blocuri nu
minuieste e&ceptia atunci o e&ceptie 3nhandled este produsa in mediul gazda.
Aceasta saritura intre sectiunile 2U/2P(,O: de la blocurile interne catre cele e&terne
produce actiunile e&ecutabile ramase in aceste blocuri sa fie trecute 'actiunile intre 2:*%
ul unui subbloc si 9e?Nord%ul 2U/2P(,O: al blocului de inchidere nu sint procesate).
ENEMPLU3
BEGIN
777
BEGIN
777
--EA!0+1/"% N '$/-0( $1 1T/- +"/%1
ENCEPTION
--N" T$%(#0' 1T$1 (0$#- ST/1T 0A!0+1/"% N
END5
777
ENCEPTION
--H$%(#0' @"' N +'0-0%1 T0'0 B/707 TT0 B,!U -1"+- T0'0MD
END5
3n avanta+ al acestei comportari este ca anumite declaratii care cer minuirea propriilor
erori poate fi inclus in propriul bloc lasind minuirea e&ceptiilor generale blocurilor de
inchidere.
ENEMPLU3
DECLARE
0G*0-- CHARB>0D
BEGIN
DECLARE
21 NUMBERB4D5
BEGIN
SELECT 0*+%" INTO 21 .ROM 0*+ WHERE :"; I CPRESIDENTC5
ENCEPTION
WHEN 1""G*$%XG'"S- THEN
INSERT INTO :";G0''"'- HALUES BCM"'0 1T$% "%0
P'0-/(0%1MCD5
END5
DECLARE
21 NUMBER B4D5
BEGIN
SELECT 0*+%" INTO 21 .ROM 0*+ WHERE :"; I CMANAGERC5
ENCEPTION
WHEN 1""G*$%XG'"S- THEN
INSERT INTO :";G0''"'- HALUES BCM"'0 1T$% "%0
M$%$90'CD5
END5
ENCEPTION
WHEN OTHERS THEN
0G*0-- 3I SUBSTRBS&LERRM8 18 >0D5
INSERT INTO 90%0'$# HALUES B0G*0--D5
END5
Exercitii
Alterati blocul dvs. produs la /ap. #< 2&. #.-edefiniti variabila P!S" ca
:3482-'1)./e se intimpla daca # valori de intrare are valorile 6 si #W
Adaugati un ,dentificator 2&ceptie la blocul care inregistreaza un mesa+ e&plicit in
4essages pentru orice tip de e&ceptie care poate apare. Apoi lansati blocul din nou.
Scrieti un script P!S" care primeste la rulare un singur parammetru, unde este
furnizt un tip de slu+ba.
EA7 _UNI3G.ILE MANAGER
8locul P!S" din fisier trebuie sa S22/(%ezr rinduri din tabela 24P care are tipul
+ob%ului in coloana =O8. '5a referiti la parametru ca 'V1'). (rimiteti un mesa+ in tabela
42SSA72S, in functie de faptul ca se returneaza unul,niciunul sau mai multe rinduri.
EA7
CJ";1X+0 @",%( "%!0C
CJ";1X+0 %"1 @",%(C
CJ";1X+0 @",%( *"'0 1T$% "%!0C
,nregistrati =obt?pe si in tabela 42SSA72S, s e&ecutati tranzactia, indiferent de mesa+ul
produs.
Solutii-
O e&ceptie 5A32O2--O- este lansata daca valoarea este prea mare pt. variabila.
DECLARE
HGRESULT NU MBERB<72D 5
HGMESSAGE CHARB=0D5
BEGIN
HGRESULT 3I W*$/%G2$' 44 W0A+"%0%1 5
-- "' POWER BW*$/%G2$'8 W0A+"%0%1D5
INSERT INTO *0--$90- B%,*!"#1D HALUES BHGRESULTD5
ENCEPTION
WHEN OTHERS THEN HGMESSAGE 3I SUBSTRBS&LERRM818=0D5
INSERT INTO *0--$90- B!T$'!"#1D5
HALUES BHGMESSAGED5
END5

DECLARE
JOBTYPE 0*+7:";LTYPE5
BEGIN
SELECT :"; INTO JOBTYPE
.ROM 0*+ WHERE :"; I CW1C 5
INSERT INTO *0--$90- B!T$'!"#18 !T$'!"#2D
HALUES BCW1C8 CJ";1X+0 @",%( "%!0CD5
COMMIT5
ENCEPTION
WHEN %"G($1$G@",%( THEN
INSERT INTO *0--$90- B!T$'!"#18 !T$'!"#2D
HALUES BCW1C8 CJ";1X+0 %"1 @",%(CD5
COMMIT5
WHEN 1""G*$%XG'"S- THEN
INSERT INTO *0--$90- B!T$'!"#18 !T$'!"#2D
HALUES BCW1C8 CJ";1X+0 @",%( *"'0 1T$% "%!0CD5
COMMIT5
END5
.tru!turi de !ontrol
,n acest capitol se e&plica structurile de control ale unui program P!S". Acestea sint
e&presiile conditionale, salturile si buclele.
#&troducere i& ex'resiile de co&trol ale PL/SQL
P!S" ofera facilitati de control al e&ecutiei conditionat si neconditionat. Aceste sint:
instructiunea#2
Ofera controlul selectiv al actiunilor, bazat pe indeplinirea unor conditii.
instructiunea <O"O
Se foloseste la saltul neconditionat la o eticheta din program.
ciclul simplu
Asigura repetarea unor actiuni fara impunerea de conditii
ciclul 2O!
Pentru control iterativ al actiunilor, bazat pe un contor.
cicluri /0#LE
Pentru control iterativ al actiunilor, bazat pe indeplinrea unei conditii
instructiunea E>#"
Pentru a iesi dintr%un ciclu
Acolo unde aceste facilitati includ o conditie, aceasta poate fi orice e&presie booleana
valida in S", cu e&ceptia Zuer? imbricat. Aceasta include:
Operatori logici ' ,, %, :O(, etc.)
Operatori de compunere ' A:*, O- )
Operatori S" ' ,C2, ,:, 82(M22:, ,S :3 )
2&emple:
2$' JI 2$'2
2$'3 LIKE CLSLC
2$'4 BETWEEN C01-JUN-<2C AND C01-SEP-<2C
2$'2 IS NOT NULL
;""#G2$'
A IN B CYC8 CNC8 CYESC8 CNOC D
B $ I ; OR ! I ? D AND + J 400
#&structiu&ea #2
,nstructiunea #2 are o structura similara cu echivalentul din limba+ele procedurale. 2a
permite e&ecutarea unor actiuni selectiv, bazat pe indeplinirea unor conditii. Structura sa
generala este prezentata mai +os. Sinta&a:
I. !"%(/1/0 THEN $!1/,%/ Q ELSI. !"%(/1/0 THEN $!1/,%/ R
Q ELSE $!1/,%/ R
END I.5
unde "actiuni" pot fi una sau mai multe instructiuni P!S" sau S", fiecare terminata
cu punct%virgula. Aceste "actiuni" pot include alte instructiuni #2 cu aceiasi structura,
ceea ce inseamna ca instruciunea poate contine ,0, 2S2, 2S,0 imbricate.
#&structiu&ea #2 si('la
Sa incepem cu un e&emplu care implica numai o conditie, fara nici una din clauzele
optionale:
I. 2G0%$*0 I CSCOTTYC THEN ;0$*G*0G,+ 3I CYESC5
COMMIT5
END I.5
/ele doua actiuni sind e&ecutate numai daca conditia este adevarata '(-32). *aca
conditia este falsa '0AS2 sau :3) atunci cele doua instructiuni sint e&cluse. ,n
oricare din caz, e&ecutia continua cu urmatoarea instructiune din program de dupa 2:*
,0.
:otati ca daca constructia '2:* ,0' nu este prezenta la sfirsitul instructiunii, atunci
P!S" ca cauta in instructiunile urmatoare cautind '2:* ,0'. /a si in alte limba+e
procedurale aceasta poate provoca afisarea unor mesa+e de eroare confuze.
3rmatorul e&emplu arata cum pot fi e&ecutate instructiuni alternative prin intermediul
clauzei 2S2. Actiunile specificate prin 2S2 sint e&ecutate daca conditiila este 0AS2
sau :3, dupa care programul continua cu instructiunile ce urmeaza dupa 2:* ,0.
I. 0%$*0 I CSCOTTYC THEN ;0$*G*0G,+ I CYESC 5
COMMIT5
ELSE ;0$*G*0G,+ I CNOC 5
ROLLBACK5
END I.5
Oricare set de actiuni poate include instructiuni ,0 inlantuite pentru a e&ecuta teste
ulterioare inainte ca o actiune specifica sa fie e&ecutata. 0iecare instructiune ,0 inlantuita
trebuie sa fie terminata de 2:* ,0%ul corespunzator.
2&emplu:
I. (0+1%" I 10 THEN $!!",%1/%9 3I CYESC5
I. :"; I CMANAGERC THEN
INSERT INTO -1$1,- HALUES B C D0+110
M$%$90'CD5
END I.5
COMMIT5
ELSE $!!",%1/%9 3I CNOC5
I. :"; I CMANAGERC THEN
INSERT INTO -1$1,- HALUES BC A#1 M9'7CD5
END I.5
COMMIT5
END I.5
Adesea, actiunile de e&ecutat in clauza 2S,0 pot contine doar un alt ,0. ,n aceasta
situatie, este mult mai convenabil sa folositi clauza 2S,0, care elimina necesitatea de a
inlantui 2:* ,0 la sfirsitul fiecarui set ulterior de conditii!actiuni:
I. @G1/1#0 I C("$*%$C THEN -1$1,- 3I CMARITATAC5
ELSI. @G1/1#0 I C("*%/-"$'$C THEN
-1$1,- 3I CNEM7C
ELSE -1$1,-3I CNECUNOSCUTAC5
END I.5
*atorita posibilitatii de a imbrica actiuni, clauza 2S,0 poate fi utilizata recursiv, daca
doriti:
I. !T"/-0 I 1 THEN $!1/,%0 3I CR,% P$X'"##C 5
ELSI. !T"/!0 I 2 THEN $!1/,%0 3I CR,% A!!",%1-C5
ELSI. !T"/!0 I 3 THEN $!1/,%0 3I CB$!U,+-C5
ELSI. !T"/!0 I 4 THEN $!1/,%0 3I CR0-1"'0C5
ELSE $!1/,%0 3I CI%2$#/(C5
END I.5
Cicluri de %aza si i&structiu&ea E>#"
Structura*
LOOP
-- $!1/,%/ (0 0A0!,1$1 /%
-- !$(',# !/!#,#,/
END LOOP5
4 ENIT 10'*/%$ !/!#,#
Si&taxa*
ENIT Q01/!T01$-!/!#,R QWHEN !"%(/1/0R5
Cicluri si salturi i& PL/SQL
P!S" ofera un numar de facilitati pentru cicluri si pentru a iesi din cicluri, cind se
doreste, spre alta parte a programului. /el mai simplu caz contine instructiunile ce se
doresc repetate incluse intre delimitatorii OOP si 2:* OOP:
LOOP
-- $!1/,%/ (0 0A0!,1$1
-- /% !$(',# !/!#,#,/
END LOOP5
*e fiecare data cind programul a+unge la constructia 2:* OOP, controlul este redat
e&presiei OOP corespunzatoare. Acest ciclu necontrolat va fi, bineinteles, infinit daca
nu se folosesc instructiuni de control in interiorul ciclului, care sa provoace saltul in afara
ciclului.
#&structiu&ea E>#"
3n ciclu poate fi terminat din interior, daca este utilizata instructiunea 2U,(. 2U,(
permite transferul controlului instructiunii urmatoare de dupa 2:* OOP, permitind
astfel incheierea imediata a ciclului.
Sinta&a:
ENIT Q#""+-#$;0#R QWHEN !"%(/1/0R5
2U,( poate fi e&ecutat fie ca o actiune dintr%un ,0, sau ca o instructiune individuala in
cadrul unui ciclu. ,n acest caz, o clauza MH2: poate fi atasata la instructiunea ,0,
permitind terminarea conditionata a ciclului.
2&emplul 1:
LOOP
!",%10' 3I !",%10' E 15
INSERT INTO %,*;0'0(G'"S- HALUES B!",%10'D5
777
I. !",%10' I 10 THEN COMMIT5
ENIT5
END I.5
END LOOP5
2&emplul #:
LOOP
777
ENIT WHEN 1"1$#G-$#- I =00005
777
END LOOP5
O alta posibilitate de a iesi dintr%un ciclu ar fi sa sariti la o instructiune etichetata in afara
ciclului, folosind instructiunea 7O(O. Aceasta este in general considerata ca o metoda
mai putin structurata. 7O(O si etichetele vor fi discutate mai tirziu, in acest capitol.
Utilizarea ciclurilor 2O! 'e&tru co&trolul iteratiilor
/iclurile 0O- au aceeasi structura generala ca si celee pe care de+a le%ati vazut, dar
adauga instructiuni de control la inceputul ciclului, care vor determina numarul de iteratii
ce vor fi efectuate.
Sinta&a:
.OR 2$'/$;/#$G!"%1'"# IN QREHERSER 2$#"$'0G/%@0'/"$'0 77
2$#"$'0G-,+0'/"$'$
3nde 'variabilaOcontrol' este numele unei variabile intregi ale carei valori vor fi
incrementate!decrementate automat la fiecare iteratie a ciclului. Aceasta variabila este
creata de catre ciclu, si nu poate fi scrisa de nici o instructiune din cadrul ciclului. *urata
de viata se termina la terminarea ciclului.
'valoareOinferioara' si 'valoareOsuperioar' sint e&presii intregi, care determina valorile pe
care le va lua variabila de control.
,mplicit, variabila de control este initializata cu o valoare mica, si este incrementata cu B1
la fiecare iteratie pina cind valoarea superioara este atinsa.
2&emplu:
.OR / IN 1 77 2000
LOOP
INSEERT INTO %,*;0'0(G'"S- HALUES B/D5
+'0-0'20G/ 3I /5
777
END LOOP5
Observati ca daca valoarea lui 'i' este necesara dupa terminarea ciclului, atunci ea trebuie
copiata intr%o variabila declarata inainte de terminarea ciclului.
/iclul 0O- poate si sa decrementeze variabila de control, incepind de la valoarea
superioara in prima iteratie:
.OR % IN REHERSE ?0 77 *X2$'E?0
LOOP
-- % $'0 2$#"$'0$ *X2$'E?0 #$ +'/*$ /10'$1/07
-- -/ 2$#"$'0$ ?0 #$ ,#1/*$
END LOOP5
Utilizarea ciclurilor /0#LE 'e&tru co&trolul iteratiilor
Aceasta este o structura de control alternativa, care permite iteratiilor sa fie e&ecutate
conditionat.
Sinta&a:
WHILE !"%(/1/0
/onditia este evaluata la inceputul fiecarei iteratii, si ciclul este terminat cind conditia
este 0AS2. *aca conditia este 0AS2 atunci cind ciclul incepe, atunci nici o interatie
nu se e&ecuta.
2&emplul 1:
WHILE ;/## J2?0 AND @""( LIKE CL1$!"LC
LOOP
-- $!1/,%/
END LOOP5
2&emplul #:
WHILE ;""#G2$'
LOOP
-- $!1/,%/
END LOOP5
:ormal, daca variabila implicata in conditii nu se schimba in timpul e&ecutiei ciclului,
atunci ciclul nu se va termina niciodata. (otusi instructiunea 2U,( poate fi inclusa atit in
ciclurile 0O- si MH,2.
Co&trolul ciclurilor i(%ricate
/iclurile pot fi imbricate pe nivele multiple. Puteti imbrica cicluri 0O- in cicluri MH,2
si invers. ,n mod normal, terminarea unui ciclu intern nu termina ciclul care il include,
e&ceptind cazul cind este generata o e&ceptie.
2tichetele in P!S" sint definite astfel:
JJ #$;0#-%$*0 ))
:umele etichetei urmeaza aceleasi reguli ca si orice identificatori. O eticheta este plasata
inaintea unei instructiuni, fie pe aceasi linie, fie pe o linie separata.
/iclurile pot fi etichetate prin plasatea unei etichete inainte de cuvintul OOP, si dupa
2:* OOP, conform:
JJ ",10'G#/*/1- )) LOOP
-- $!1/,%/
END LOOP ",10'G#/*/1-5
*aca un ciclu subordonat e&ecuta un 2U,(, atunci el poate specifica care ciclu sa fie
incheiat prin specificarea etichetei.
2&emplu:
JJ *$/% )) LOOP
777
LOOP
777
ENIT *$/% WHEN 1"1$#G("%0 I CYESC5
-- +$'$-0-10 $*;0#0 !/!#,'/
ENIT WHEN /%%0'G("%0 I CYESC5
-- +$'$-0-10 ("$' !/!#,# /%10'/"'
END LOOP *$/%5
2olosirea <O"O si a eticDetelor
*upa cum ati vazut, etichetele pot fi utilizate pentru a identifica cicluri atunci cind apar in
structuri inlantuite. Aceasta este si cazul blocurilor inlantuite. O eticheta poate fi plasata
inaintea inceputului si dupa sfirsitul unui bloc P!S", astfel incit identitatea sa declarate
sa poate fi deosebita de celelalte blocuri din structura inlantuita. Sa luam e&emplul
urmator:
DECLARE
2$'1 NUMBER5
BEGIN
7
DECLARE
2$'1 NUMBER 3I 4005
BEGIN
7
2$'1 3I 2$'1 E 1 5 -- 2$'1 (/% -,;;#"! -0 *$'0-10 !, 1
7
END5
7
END5
5ariabila var1 care a fost declarata in blocul e&terior nu se "vede" in cadrul blocului
interior, deoarece acesta a declarat o variabila cu acelasi nume. (oate referirile la 'var1'
din sub%bloc vor fi deci folosite pentru variabila local declarata.
(otusi, daca blocurile sint etichetate, identificatorii pot fi referiti prefi&ati de numele
blocului dorit. 'Observatie: blocul e&terior nu trebuie neaparat etichetat). 3n e&emplu:
BEGIN
J) DECLARE
2$'1 NUMBER5
7
BEGIN
7
J) DECLARE
2$'1 NUMBER 3I 4005
BEGIN
7
;#"!U172$'1 3I ;#"!U172$' E 15
-- 2$'/$;/#$ (/% ;#"!U 1
-- 0-10 /%!'0*0%1$1$
END ;#"!U25
END ;#"!U15
END5
Asa cum s%a aratat, 2:* poate include numele blocului care trebuie terminat.
#&structiu&ea <O"O
Aceasta instructiune ofera salturi neconditionate la o eticheta in cadrul unui program
P!S". 3tilizarea instructiunii trebuie minimizata, deoarece folosirea e&cesiva poate
duce la programe foarte dezorganizate.
5alabilitatea unei etichete este in intregul bloc in care a fost definita. 7O(O poate, deci,
transmite controlul catre puncte etichetate din blocul curent sau catre un punct etichetat
dintr%un alt bloc care contine blocul curent.
Sinta&a:
GOTO 01/!T01$5
3nde 'eticheta' poate fi orice eticheta care marcheaza o pozitie in cadrul blocului curent
sau al altuia ce il cuprinde. 7O(O nu poate transmite controlul in interiorul unui sub%
bloc.
Exercitii 'e&tru ca'itolul 55
1. Scrieti un bloc P!S" care sa insereze un rind in tabela 42SSA72S cu coloana
:34/O1 continind 1 daca este primul rind, # daca este al #%lea s.a.m.d. :u
inserati rinduri etichetate A sau @ si iesiti din ciclu cind valoarea 1< a fost inserata.
Actualizati baza cind se termina ciclul. 'atentie % /O3:( este cuvint rezervatR)
#. 'daca aveti timp) Selectati coloanele 2:A42, H,-2*A(2 si SA din tabela
24P unde 24P:O este egal cu un numar introdus in timpul e&ecutiei. *upa ce
ati selectat coloanele in variabile, inserai un rind in 42SSA72S bazat pe unul din
urmatoarele criterii: /riteriu ! 4esa+
Salariu mai mare de 1#<<
Salariu mai mare de 1#<<
2:A42 contine '('
:umele contine "("
H,-2*A(2 este *ecembrie
*ecembrie
:ici unul din cazurile precedente
.. :imic ..
(estatti pentru anga+atii cu numerele 7AF6, 7GA;, 7;<<, 7@7A.
G. 3rmatorul cod e&ecuta un ciclu, cu diferite valori pentru 5 la fiecare interatie 'in
domeniul 1 la 1<).
47
?7 UPDATE *0--$90- SET %,*!"#2 I 100
=7
77 WHERE %,*!"#1 I H 5
>7
*aca rularea 3P*A(2 produce altceva decit un singur rind, atunci se va iesi din
ciclu.' Puteti testa atributul S"P-OM/O3:(, asa cum este discutat in
capitolul #G).
Solutii la ca'itolul 55
17
27 BEGIN
37
47 .OR 2G!",%1 IN 17710
?7
=7 LOOP
77
>7 I. 2G!",%1 NOT IN B=8>D THEN
<7
107 INSERT INTO *0--$90- B%,*!"#1D HALUES
B2G!",%1D5
117
127 END I.5
137
147 END LOOP5
1?7
1=7 COMMIT5
177
1>7 END5
1<7
#<.
217
227 DECLARE
237
247 2G0%$*0 0*+70%$*0LTYPE5
2?7
2=7 2GT/'0($10 0*+7T/'0($10LTYPE5
277
2>7 2G-$# 0*+7-$#LTYPE5
2<7
307 2G*0--$90 CHARB30D5
317
327 BEGIN
337
347 SELECT 0%$*08 T/'0($108 -$#
3?7
3=7 INTO 2G0%$*08 2GT/'0($108 2G-$#
377
3>7 .ROM 0*+
3<7
407 WHERE 0*+%" I WEMPLOYEEGNO 5
417
427
437
447 I. 2G-$# ) 1200 THEN
4?7
4=7 2G*0--$90 3I CS$#$'/, *$/ *$'0 (0 1200C5
477
4>7 ELSI. 2G0%$*0 LIKE CLTLC THEN
4<7
?07 2G*0--$90 3I CN,*0#0 !"%1/%0 VTVC5
?17
?27 ELSI. TOGCHARB2GT/'0($108 CMONCD I CDECC THEN
?37
?47 2G*0--$90 3I CD0!0*;'/0C5
??7
?=7 ELSE 2G*0--$90 3I C44 N/*/! 44C5
?77
?>7 END I.5
?<7
=07
=17
=27 INSERT INTO *0--$90- B!T$'!"#1D 2$#,0- B2G*0--$90D5
=37
=47 END5
=?7
AA.
=77
=>7 BEGIN
=<7
707 .OR 2 IN 1 77 10
717
727 LOOP
737
747 UPDATE *0--$90- SET %,*!"#2 I 100
7?7
7=7 WHERE %,*!"#1 I 25
777
7>7 ENIT WHEN S&LLROWCOUNT J) 15
7<7
>07 END LOOP5
>17
>27 END5
>37
@6.
CAPITOLUL 23
Tipuri de date !opu(e
,n acest capitol se arata cum se declara si utilizeaza variabile compuse in P!S". ,n
mod normal, inregistrarile permit aceasta facilitate, permitind reprezentarea unei linii de
la o tabela sau un vieN.
#&re)istrari i& PL/SQL
/2 S3:(W % O variabila care poate tine citeva valori separate % O colectie de cimpuri
adresabile /34 S3:( *2/A-A(2 ,:-27,S(-A-,2W % utlizand P-OM(KP2 se
utlizand atribute declarate Single%roN structura bazata pe o tabela,sau cursor
#&re)istrari i& PL/SQL
O inregistrare P!S" este o variabila care poate contine valori separate,fiecare
adresabila individual. Partile componente ale unei inregistrari se numesc campuri, si au
nume care pot fi referentiate in atribuiri sau e&presii. /ampurile dintr%o inregistare pot
avea tipuri de date si marimi diferite. Aceasta inseamna ca inregistrarile sunt foarte
avaanta+oase cand preluam o linie dintr%un tabel pentru procesare intr%un program
P!S".
Atri%utul L!O/".PE
Atributul -OM(KP2 este folosit pentru declararea unei inregistrari bazata pe o colectie
de coloane in tabela de baze de date. /ampurile cu inregistrarea isi vor obtine numele si
tipul datei lor de la coloanele din tabela sau vieN referit in declararea inregistrarii.
/impurile sint declarate intr%o sectiune bloc *2/A-2 impreuna cu celelalte tipuri de
variabile pe care le%am vazut.
S/%1$A$3
/(0%1/@/0' '0@0'0%!0LROWTYPE 5
3nde 'identifier' este numele ales pentru inregistrare ca un intreg, si reference este numele
unei tabele, vieN sau cursor pe care se bazeaza inregistrarea. Aceasta referinta trebuie sa
vie valida la momentul cind inregistrarea este declarata, adica trebuie sa e&iste.
EA$*+#,3
DECLARE
0*+G'0! 0*+LROWTYPE
BEGIN
SELECT 4 INTO 0*+G'0! .ROM 0*+ WHERE 0*+%" I 77>>5
,n e&emplul de deasupra, inregistrarile 'empOrec'continind cimpuri bazate pe fiecare
coloana in tabla 'emp'. /impul va fi populat cu linia selectata de catre numele inregistrari
din clauza ,:(O a instructiunii S22/(.
Starea inregistrarii empOrec este aratata mai +os:
E*+%" E%$*0 J"; 777
77>> SCOTT ANALYST 777
/impurile dintr%o inregistrare pot fi referite individual, atit in P!S" cit si in
instructiunile S" care apar intr%un bloc.
EA0*+#,3
I. 0*+G'0!7-$# J 2000 AND 0*+G'0!7:"; I CMANAGERC
THEN ,%(0'+$/( 3I TRUE 5
END I.5
'02/0SG($10 3I 0*+G'0!7T/'0($10 E<0 5
INSERT INTO 0*+GT/-1"'XB0*+%"8 :";8 -$#8 ($10G-1$*+D
HALUES B0*+G'0!70*+%"8 0*+G'0!7:";8 0*+G'0!7-$#8 SYSDATED5
O intreaga inregistrare poate fi asignata ca valoare unei alte inregistrari, daca tabelele
folosite pentru definirea lor se potrivesc.
ENEMPLU3
DECLARE
'0!"'(1 -$#9'$(0LROWTYPE5
'0!"'(2 -$#9'$(0LROWTYPE5
BEGIN
7
'0!"'(23I'0!"'(15
O intrega inregistrare :3 poate fi trecuta listei 5A32S al instructiunii
,:S2-(.(rebuie sa parcurgeti fiecare camp separat.
ENEMPLU
INSERT INTO -$#9'$(0 B9'$(08#"-$#8 T/-$#D HALUESB'0!"'(1D5--
I##09$#
INSERT INTO -$#9'$(0B9'$(08 #"-$#8 T/-$#D
HALUESB'0!"'(179'$(08 '0!"'(17#"-$#8 '0!"'(17T/-$#D5--#09$#
Si va vom arata in urmatorul capitol, ca atributul P-OM(KP2 poate fi utilizat pentru a
declara inregistrari bazate pe cursoare e&plicite. Aceste inregistrari pot fi utilizate in
02(/Huri si in cicluri cu cursor 0O- .
#&re)istrari de,i&ite de utilizatori
5ersiunea # P!S" permite deasemenea sa fie definite si crete independent tabela de
structuri. Aceste inregistrari definite de utilizator va permit sa numiti e&plicit campurile si
sa le definiti tipurile.
,n ane&a veti gasi informatii suplimentare.
MA$#PULA!EA L!O/".PE #$!E<#S"!A!# S#
CAMPU!#
2U24P3 1 %copierea intregilor inregistrari
DECLARE
'0!"'( 1 -$#9'$(0LROWTYPE5
'0!"'( 2 -$#9'$(0LROWTYPE5
BEGIN
7
'0!"'(23I'0!"'(15
2U24P3# %% scrierea unei tabele
INSERT INTO 0*+GT/-1"'XB0*+%"8:";8-$#8($10G-1$*+D
HALUESB0*+G'0!70*+%"80*+G'0!7:";80*+G'0!7-$#78SYSDATED5
CAPITOLUL 24
/IATA .$C'$TA A CU'.OA'$LO'
Acest capitol va arata cum sa declarati si sa controlati e&plicit cursoarele, care va permit
sa multiplicati linii de interogare pentru a fi e&ecutate in P!S". :e vom ocupa de felul
in care liniile pot fi aduse de la cursor in interiorul unei bucle prin intermediul cursorului
prin bucla.
Ce este u& CursorI
O-A/2 foloseste arii de lucru private S" ,arii care e&ecuta declaratii S" si sa
memoreaza informatii de procesare. /ursorul este o constructie P!S" ,care iti permite
sa denumeste aceste arii de lucru si care acceseaza informatia.
2&ista doua tipuri de cursor:
cursor implicit
declarand P!S" cursor implicit penru toate declaratiile *4 si penntru toate
interogarile cu un singur rand
cursor e&plicit
declarand cursor e&plicit impreuna cu alti identificatori care sunt folositi in bloc si
manipuland prin declaratii specifice si blocuri e&cutabile de actiune. /ursoarele
e&plicite sunt numai interogari si va permit multiple linii care sa proceseze
interogari.
Asa cum vedem , S22/(%uri care apar ca instructiuni separate in P!S" poat intoarce
o singura linie. Aceasta inseamna ca de fapt P!S" incearca sa e&traga doua linii de la
cursorul implicit :una sa satisfaca interogarea , si a doua care sa vada daca viitoarele linii
au fost returnate .
/ursoarele e&plicite va permit sa evitati aceasta a doua e&tragere , aceasta imbunatatind
eficienta cand o interogare cu un singur rind este ceruta . /ursoarele e&plicite pot fi
utilizate pentru a rezolva multiple e&trageri , si pentru a ree&ecuta cereri trecute din aria
respectiva .
-estul acestui capitol va va e&plica mult mai pe larg aceste probleme , despre cursorul
e&plicit.
Co&trolul ex'licit al cursorului +'asii se'arati-
/ursorul e&plicit poate fi controlat prin 6 tipuri separate de actiuni:
*2/A-2
numeste cursorul,si defineste structura interogarii care sa fie efectuate cu el. a
acest nivel,interogarea este parcursa'coloane,tabele etc) dar nu este e&ecutata.
OP2:
e&ercuta interogarea,legand orice variabila care a fost referentiata. iniile intoarse
de interogare,numita "set%activ" sunt acum disponibile pentru e&tragere.
02(/H
memoreaza valorile din linia curenta in variabile.inia curenta este linia la care
cursorul pointeaza. 0iecare 02(/H produce mutarea cursorului sa indice la linia
ur % matoare in setul activ,si deci fiecare 02(/H va accesa o linie diferita
returnata de interogare.
/OS2
porneste un set de lucru de linii produse de OP2:ul cursorului. 2ste posibil sa
reOP2: 'redeschideti) cursorul, stabilind astfel un set de lucru nou.
#&structiu&ea CU!SO!
2ste folosit pentru a declara un cursor e&plicit.Parametrii pot fi definiti pentru a permite
substitutia valorilor in interogare cand cursorul este OP2:.5ariabilele pot fi deasemeni
referite in interogare ,dar trebuie sa fie declarate inaintea instructiunei /3-SO-.
S/%1$A$3
CURSOR /(0%1/@/!$1"'QB +$'$*010' (01$/#-DR IS \,0'X-0A+'0--/"%5
unde Zuer?%e&pression este o instructiune S22/( care poate include ma+oritatea
clauzelor, dar nu o clauza ,:(O. :u trebuie definit :3 ca un obiect S22/(.
EA0*+#, 3
DECLARE
CURSOR !1 IS
SELECT 0%$*08 -$#8 T/'0($10 .ROM 0*+
WHERE (0+1%"I 20 AND :";I VANALYSTV5
5
5

#&structiu&ea OPE$
2ste utilizata in cadrul actiunilor e&ecutabile dintr%un bloc, ai stabileste un set activ de
rinduri.
Sinta&a:
OPEN !,'-"'-/(0%1/@ QB#/-1$ $'9,*0%10DR 5
2&emplu:
OPEN !15
/ursorul va pointa catre primul rind in setul activ, ca de e&emplu:
) SCOTT 3000 1=-:$%-<0
.ORD 3000 03-(0!->1
*e observat ca e&ceptiile nu sint lansate daca cererea nu intoarce nici un rind cind este
deschis cursorul. Starea cursorului poate, totusi, sa fie testata dupa un 02(/H.
#&structiu&ea 2E"C0
2ste utilizata pentru a e&trage rindul curent intr%o variabila P!S", sau intr%o variabila
host, inclusiv cimpurile ecran din S".forms. (rebuie amintit ca variabilele host
necesita punct%virgula ca prefi&, pentru a fi deosebite de variabilele P!S".
Sinta&a:
.ETCH !,'-"'-/( INTO 2$'82$'8777 5
5ariabilele trebuie sa fie specificate pentru fiecare cimp selectat in cererea de cursor. O
alta posibilitate este definirea unei inregistrari pentru cursor, si transmiterea sa ca o
clauza a 02(/H.
2&emplu:
.ETCH !1 INTO 2G0%$*08 2G-$18 2GT/'0($105
5ariabilele incarcate, care au fost declarate inainte de 02(/H, pot fi manipulate de alte
instructiuni. 02(/H%uri ulterioare vor achizitiona alte rinduri individuale din cerere. *e
notat ca primul 02(/H care nu obtine nimic, adica daca nu mai ramin rinduri, nu va
cauza o eroare. 5Ariabilele vor contine valori nule.
#&structiu&ea CLOSE
,nchide in mod e&plicit un cursor, permitind redeschiderea sa ulterioara. Aceasta
inseamna ca un set activ poate fi restabilit de mai multe ori.
Sinta&a:
CLOSE !,'-"'-/(0%1/@ 5
Atri%ute ex'licite 'e&tru cursoare
/A si la cursoarele implicite, e&ista 6 atribute pentru a obtine informatii de stare despre
cursoare. /ind sint utilizate, numele atributului este precedat de identificatorul cursorului.
P0O3:*
2valuat la (-32 daca ultimul 02(/H din cursor a obtinut un nou rind, altfel
0AS2
P:O(0O3:*
,nvers decit P0O3:*
P-OM/O3:(
:umarul de rinduri preluate de la cursor pina acum
P,SOP2:
(-32 daca cursorul este deschis, 0AS2 daca a fost inchis sau nu a fost inca
deschis.
/iteva e&emple mai +os:
2&emple:
17 I. !1LISOPEN THEN
.ETCH !1 INTO 2G0%$*08 2G-$#8 2GT/'0($10 5
ELSE
OPEN !15
27 LOOP
.ETCH !1 INTO 2G0%$*08 2G-$#8 2GT/'0($10 5
ENIT WHEN !1LROWCOUNT )10 5
7
END LOOP5
Co&trolul extra)erilor (ulti'le di& cursoare ex'licite
,n mod normal, cind mai multe rinduri sint prelucrate dintr%un cursor e&plicit, un ciclu
trebuie definit pentru a e&ecuta 02(/H la fiecare iteratie. *aca acest proces continua, se
for prelucra eventual toate rindurile. active. /ind un 02(/H esueaza, atributul
P:O(0O3:* este (-32, si poate fi testat. (otusi, daca dupa aceasta se efectueaza un
nou 02(/H apare o eroare:
ORA-10023 .01!T ",1 "@ -0\,0%!0
Aceasta eroare va termina blocul, eventual cu o e&ceptia netratata. 2ste deci important sa
se verifice succesul fiecarui 02(/H inainte de alte referiri la cursor. 'fie prin alte 02(/H
sau comenzi S")
2&emplu:
OPEN !,'-"'G1 5
LOOP
.ETCH !,'-"'1 INTO $8;8!8( 5
ENIT WHEN !,'-"'1LNOT.OUND 5
7
7
END LOOP5
Cursoarele si i&re)istrarile
Am vazut de+a ca inregistrarile pot fi definite sa se potriveasca cu structura coloanelor
unei tabele. 2ste de asemenea posibil sa definim inregistrari bazat pe lista de coloane
selectata e&plicit de cursor. Aceasta este convenabil pentru prelucrarea rindurilor din
setul activ, pentru ca se poate e&trage direct in inregistrare, si valorile rindului vor fi
incarcate direct in cimpurile corespunzatoare ale inregistrarii.
2&emplu:
DECLARE
CURSOR !1 IS
SELECT 0*+%"8 -$#8 T/'0($108 '"S/(
.ROM 0*+ WHERE (0+1%" I 20 AND :"; I CANALYSTC
.OR UPDATE O. -$#5
0*+G'0!"'( !1LROWTYPE5
BEGIN
OPEN !15
7
.ETCH !1 INTO 0*+G'0!"'(5
7
I. 0*+G'0!"'(7-$# J2000 THEN 777
*e observat ca pseudo%coloana 'roNid' este valida ca articol selectabil, si deci va avea un
cimp corespunzator in inregistrarea 'empOrecord'.
2&emplul de mai sus arata de asemenea utilizarea 0O- 3P*A(2 intr%o cerere cu cursor.
Aceasta inseamna ca rindurile intoarse de cerere sint blocate e&clusiv cind instructiunea
OP2: este e&ecutata. *eoarece blocarile sint eliberate la sfirsitul unei tranzactii, nu
trebuie sa e&ecutati /O44,( intre e&trageri dintr%un cursor e&plicit daca se foloseste
0O- 3P*A(2.
2olosirea clauzei /0E!E CU!!E$" O2
/ind ne referim la rindul%curent dintr%un cursor e&plicit, comenzile S" pot folosi
MH2-2 /3-SO- O0, cu numele cursorului. Aceasta permite actualizarea sau stergera
in punctul in care ne aflam, fara a fi necesara folosirea e&plicita a -oNid. (rebuie totusi
sa includeti 0O- 3P*A(2 in cererea cursorului, astfel incit rindurile sa fie blocate la
deschidere.
2&emplu:
.ETCH !1 INTO 0*+G'0!"'( 5
I. 0*+G'0!"'(70%$*0 I C KINGC THEN
DELETE .ROM 0*+ WHERE CURRENT O. !15
5
Sa luam un e&emplu comlet. ,n blocul de mai +os se prelucreaza fiecare rind din tabela
'dep', mutind departamentul SA2S in locatia *allas, si celelalte departamente la :eN
Kor9. *e asemenea se tine un contor al departamentelor plasate in fiecare locatie.
DECLARE
CURSOR !1 IS
SELECT (%$*08 #"! .ROM (0+1
.OR UPDATE O. #"! 5
(0+1G'0! !1LROWTYPE5
-$#0-G!",%1 NUMBER3I0 5
%"%G-$#0- NUMBER 3I 05
BEGIN
OPEN !15
LOOP
.ETCH !1 INTO (0+1G'0!5
ENIT WHEN !1LNOT.OUND5
I. (0+1G'0!7(%$*0 I CSALESC AND (0+1G'0!7#"! MI
CDALLASC
THEN
UPDATE (0+1 SET #"! I CDALLASC WHERE
CURRENT O. !15
-$#0-G!",%1 3I -$#0-G!",%1 E 15
ELSI. (0+1G'0!7(%$*0 MI CSALESC AND
(0+1G'0!7#"! MI CNEW YORKC
THEN
UPDATE (0+1 SET #"! I CNEW YORKC WHERE
CURRENT O. !15
%"%G-$#0- 3I %"%G-$#0- E1 5
END I.5
END LOOP5
CLOSE !15
INSERT INTO !",%1- B-$#0-G-018 %"%G-$#0-G-01 D
HALUES B-$#0-G!",%18 %"%G-$#0-D5
COMMIT5
END5
4ursoare cu "arametrii
P$'$*01'// +0'*/1 1'$%-*/10'0$ ,%"' 2$#"'/ ,%,/ !,'-"' !/%( $!0-1$ 0-10
(0-!T/-8 -/ ,1/#/6$'0$ /% !0'0'/#0 !$'0 -0 0A0!,1$7
A!0$-1$ /%-0$*%$ !$ ,% !,'-"' 0A+#/!/1 +"$10 @/ (0-!T/- (0 *$/ *,#10
"'/ /%1'-,% ;#"!8 /%1"'!/%( -01,'/ (0 #,!', (/@0'/10 !, @/0!$'0 "!$6/07
P$'$*01'// -/%1 (0@/%/10 /% /%-1',!1/,%0$ CURSOR $-1@0#3
CURSOR /(0%1/@ B +$'$*-%$*0 ($1$-1X+08
+$'$*-%$*0 ($10-1X+08 777 D IS \,0'X-0A+'0-/"%5
T/+,'/#0 +$'$*01'/#"' -/%1 $!0#0$-/ !, $#0 2$'/$;/#0#"' -!$#$'08 ($' %,
+'/*0-! (/*0%-/,%07
N,*0#0 +$'$*01'/#"' -/%1 +0%1', '0@0'/'0 /% !$(',# 0A+'0-/0/ (0 !0'0'0
(/% !$(',#
!,'-"',#,/8 -/ +"1 @/ 1'$1$10 !$ 2$'/$;/#0 PLFS&L7
U'*$1"',# 0A0*+#, $'$1$ %,*$',# (0+$'1$*0%1,#,/ -/ 1/+,# :";,#,/ !$'0
-/%1 1'$%-*/-0 /%1'-" !#$,6$ WHERE
+'/% +$'$*01'// P$'$*1 -/ P$'$*23
CURSOR !1 B P$'$*1 NUMBER8
P$'$*2 CHAR D IS SELECT 0%$*08 -$#8 T/'0($10
.ROM 0*+
WHERE (0+1%" I P$'$*1
AND
:"; I P$'$*25
C/%( !,'-"',# 0-10 ,#10'/"' (0-!T/-8 2$#"'/#0 -/%1 1'$%-*/-0 +17
@/0!$'0 (/% +$'$*01'// /% *"( +"6/1/"%$#7
HA#"'/#0 (/% PLFS&L -$, 2$'/$;/#0 T"-1 +"1 @/ ,1/#/6$108 -/ (0 $-0*0%0$
#/10'$#/7
EA0*+#,3
OPEN !1 B308 CANALYSTCD5
OPEN !1 B+#G%,*8 CCLERKCD5
OPEN !1 B108 :";G1X+0D5 -- :";G1X+0 0-10 " 2$'/$;/#$ PLFS&L
4icluri L00P cursor
PLFS&L "@0'$ ,% 1/+ -+0!/$# (0 !/!#, .OR +0%1', $ +'0#,!'$ '/%(,'/#0
/%1"$'-0 /% !,'-"',# 0A+#/!/17
I%1'-,% !/!#, .OR !,'-"'8 ,% !,'-"' (0!#$'$1 0-10 (0-!T/-8 -0
0@0!1,0$6$ 0A1'$90'/ -/ 0-10
/%!T/- $,1"*$1 !/%( 1"$10 '/%(,'/#0 $, @"-1 +'0#,!'$107
./0!$'0 /10'$1/0 $ !/!#,#,/ 0A1'$90 ,% '/%( (/% -01,# $!1/2 /%1'-"
/%'09/-1'$'08
!$'0 0-10 (0!#$'$1$ /*+#/!/1 +0%1', ,1/#/6$'0 /% !$(',# !/!#,#,/7
C/!#,# 0-10 10'*/%$1 $,1"*$1 #$ -@/'-/1,# /10'$1/0/ +0%1', ,#1/*,# '/%(
0A1'$-7
C/!#,'/#0 .OR !, !,'-"' -/%1 -1',!1,'$10 $-1@0#3
DECLARE
CURSOR !,'-"'G%$*0 Q B+$'$*010'-DR IS \,0'X-0A+'0-/"%5
BEGIN
.OR '0!"'(-%$*0 IN !,'-"'-%$*0 Q B+$'$*010'-D R
LOOP
--+'"!0-$'0 2$#"'/ (/% '/%(,# !,'0%17
7
END LOOP5
I%'09/-1'$'0$ %,*/1$ /% /%-1',!1/,%0$ .OR 0-10 (0!#$'$1$ /%10'% /%
!/!#, -/ 2$#$;/#/1$10$
0A+/'$ !/%( -0 10'*/%$ !/!#,#7
./0!$'0 /10'$1/0 +'"2"$!$ 0A1'$90'0$ '/%(,#,/ ,'*$1"' (/% /%'09/-1'$'07
D0"$'0!0 !,'-"',# 0-10 (0!#$'$1 0A+#/!/1 /% ;#"!8 $1'/;,10#0 -$#0 -/%1
(/-+"%/;/#0 /% !$(',#
!/!#,#,/ +0%1', 10-1$'08 ($!$ 0-10 %0!0-$'7
EA0*+#,3
DECLARE
CURSOR !1 IS SELECT %18 %28 %3 .ROM ($1$G1$;#05
'0-,#1 NUMBER5
BEGIN
.OR '0! IN !1 LOOP
'0-,#1 3I '0!7%2 F B'0!7%1 E '0!7%3D5
INSERT INTO 10*+G1$; HALUES B'0-,#1D5
END LOOP5
COMMIT5
END5
4icluri 20R cursor cu "arametrii
D$!$ !,'-"',# +0 !$'0 /# +'"!0-$1/ /%1'-,% !/!#, .OR !,'-"' $ @"-1
(0@/%/1 !,
+$'$*01'//8 2$#"'/#0 B+$'$*01'// $!1,$#/D -/%1 ($10 /% +$'$%106$8 (,+$
%,*0#0 !,'-"',#,/ /% /%-1',!1/,%0$ .OR7
CURSOR !1 BP$'$*1 DATE D IS
SELECT 0%$*08 :"; .ROM 0*+
WHERE T/'0($10 J P$'$*1 5
BEGIN
.OR 0*+G'0!"'( IN !1 BC01-JAN-<2CD
LOOP
-- 2"' @/ $!1/2/ $%9$:$1// (0 (,+$ /$%<2
END LOOP5
Sub e1"resii select in ciclurile 20R
A* 2$6,1 !$ !/!#,'/#0 .OR !, !,'-"' -/%1 ,% *"( !"%20%$;/# (0 $
+'0#,!'$ '/%(,'/ (/%1'-,% !,'-"' 0A+#/!/1 (0!#$'$1 /% +'"9'$*7
C/!#,'/#0 .OR +"1 @/ (0 $-*0%0$
,1/#/6$10 +0%1', $ +'0#,!'$ !0'0'/ *,#1/-'/%(8 !$'0 -/%1 (0@/%/10 #$
/%!0+,1,# !/!#,#,/7
S1',!1,'$ 0-10 $'$1$1$ *$/ :"-3
.OR '0!-%$*0 IN B\,0'X-0A+'0-/"%D
LOOP
7
END LOOP5
EA+'0-/$ !0'0'// 0-10 !"%-/(0'$1$ !$ " -,;-0A+'0-/0 -/ 0-10 +'0#,!'$1$
/%1'-,% !,'-"' !$'0 0-10 /%10'% !/!#,#,/ .OR7
D0"$'0!0 !,'-"$'0#0 %, -/%1 (0!#$'$10 !, %,*08 $1'/;,10#0 !,'-"$'0#"'
%, -/%1 (/-+"%/;/#0 +0%1', 10-1$'07
I% $@$'$ !$ 0-10 *$/ -/*+#, (0 -!'/-8 $!0$-1$ *01"($ 0-10 -/ *,#1 *$/
0@/!/0%1$7
EA0*+#,3
.O' '0! IN BSELECT 0%$*0 .ROM 0*+ WHERE (0+1%" I 10 D
LOOP
I. '0!70%$*0 I CJONESC THEN
7
END LOOP5
4.te-a cu-inte des"re eficienta
T"1/ @$!1"'// !$'0 /%@#,0%10$6$ +0'@"'*$%1$ ,%,/ +'"9'$* S&L -0 $+#/!$
-/ #$
PLFS&L7
A!0-1/$ /%!#,(3
I%(0A$'0$ !"#"$%0#"' @"#"-/10 /% WHERE -/ /% :"/%

P'0@/A$'0$ !"#"$%0#"' !, %,*0#0 1$;0#0/

I% :"/%,'/ /%(0A$108 '0@0'/'0$ #$ 1$;0#$ !0$ *$/ */!$ #$ -@/'-/1

I% +#,-8 PLFS&L *$/ "@0'$ @,%!1/"%$#/1$10 !$'0 @$!0 /%-1',!1/,%/ S&L


%0%0!0-$'07
N, $!!0-$1/ ;$6$ (0 ($10 ($!$ %, 0-10 %0!0-$'7

D$!$ 1"$10 ($10#0 (0 +'0#,!'$1 -/%1 -1"!$10 /% 2$'/$;/#08 $1,%!/


@"#"-/1/ !"%-1',!1// PLFS&L !$ $1'/;,/'0$ -$, I.7 N, @"#"-/1/
SELECT77.ROM SYS7DUAL /% *0(/,# PLFS&L8

(0"$'0!0 +'"(,!0 (0-!T/(0'0$ ,%,/ !,'-"' -/ 1'$%-*/10'0$ ,%"'


!0'0'/ !$1'0 RDBMS7

E@0!1,$1/ !$#!,#0 /% SELECT8 ($!$ 0-10 +"-/;/#7

DA!$ $201/ (0 0@0!1,$1 +'0#,!'$'/ 0-10 *,#1 *$/ 0@/!/0%1 -$ #0


0@0!1,$1/

$1,%!/ !/%( SELECT-$1/ ($108 -/ 02/1$1/ /%-1',!1/,%/ ,#10'/"$'0


!$'0 $' @/ %0!0-$'07

C,'-"$'0#0 0A+#/!/10 2$ +0'*/10 02/1$'0$ ,%,/ .ETCH ,#10'/"'7

A1,%!/ !/%( ,% -/%9,' '/%( 0-10 %0!0-$'8 !,'-"$'0#0 /*+#/!/10


0A0!,1$ (",$ 0A1'$90'/7

U% !,'-"' 0A+#/!/1 2$ +0'*/10 -$ 0@0!1,$1/ " -/%9,'$ 0A1'$90'07

E2/1$1/ 1'0!0'/ '0+01$10 +'/% 1$;0#07

P'0#,!'$'0$ +'"!0(,'$#$ +0'*/10 ,% !"%1'"# +,10'%/! -/ @#0A/;/#


$# '/%(,'/#"' ;$60/ (0 ($108

($' 1'0;,/0 -$ 1/%01/ !"%1 !$ @/0!$'0 INSERT -/ UPDATE +'"2"$!$


'0--!$%$'0$ 1$;0#0/5 D$!$ +'0#,!'$1/ *$/ *,#10 '/%(,'/ (/%1'-"
1$;0#$8 /%!0'!$1/ -$ " @$!01/ /%1'-,% -/%9,' +$-7

C"%-/(0'$1/ -/1,$1/$ ,'*$1"$'07 D"'/* -$ *$'/* !"-1,# @/0!$',/


$'1/!"# (/% 1$;0# C/10*-C8 +0 '/%(8 +/%$ !/%( -,*$ (0+$-0-10
?0007 I% +'/*,# 0A0*+#,8 " -!$%$'0 $ 1$;0#0/ 0-10 ,1/#/6$1$ (0
@/0!$'0 ($1$ +0%1', $ '0!$#!,#$ 1"1$#,# !/%( ,% $'1/!"# 0-10
$!1,$#

/6$13

WHILE 1"1$# J ?000

LOOP

.ETCH /10*G!,'-"' INTO "#(G!"-15

UPDATE /10*- SET /10*!"-1 I /10*!"-1 4171

WHERE CURRENT O. /10*G!,'-"'5

SELECT SUMB/10*!"-1D INTO 1"1$# .ROM /10*-5

END LOOP5

O $1'/;,/'0 $' +,10$ 02/1$ CSELECT SUMC #$ @/0!$'0 /10'$1/08


!$#!,#/%( !/1

(0 *,#1 1"1$#,# $' @/ $@0!1$1 (0 ,#1/*$ $!1,$#/6$'03

WHILE 1"1$# J ?000

LOOP

.ETCH /10*G!,'-"' INTO "#(G!"-15

UPDATE /10*- SET /10*!"-1 I /10*!"-1 4171

WHERE CURRENT O. /10*G!,'-"'5

1"11$# 3I 1"1$# E "#(G!"-1 40715

END LOOP5

O (/-!,1/0 *,#1 *$/ (01$#/$1$ (0-+'0 0@/!/0%1$ +"$10 @/ 9$-/1$ /%


!$'10$

CA++#/!$1/"% T,%/%9 @"' ORACLE H0'-/"% =C B!"( AT=D7

E1ercitii

E1ercitiul Demonstratie $ utili+area cursoarelor


e1"licite si a atributelor.
V.$/' D0$#-V -7$7 $ (0!/- -$ '0!"*+0%-060 !/1/2$ $%9$:$1/ !,
+'0*//7
E/ /%10%1/"%0$6$ -$ *$'0$-!$ -$#$'/,# /%(/2/(,$# !, 10 L 8
/%!0+/%( !, !0# *$/ +'"-1 +#$1/1 *,%!/1"' -$, 9',+7
D$!$ #$ "'/!0 *"*0%1 -,*$ 1"1$#$ (0+$-0-10 3?0008 %/!/ ,% $#1
-$#$'/$1 %, 2$ *$/ +'/*// !'0-10'/7
S!'/01/ ,% ;#"! PLFS&L !$'0 -$ 0@0!1,060 $!0-10 "+0'$1// /%
1$;0#$ NEWEMP7
B#"!,# 1'0;,/0 -$ SELECT-060 -,*$ -$#$'//#"' ("$' " -/%9,'$ ($1$8
-/ -$ 0@0!1,060 " -/%9,'$ 1'0!0'0 +'/% 1$;0#$7
S!'/01/ ,% '/%( /% MESSAGES !, %,*$',# (0 $%9$:$1/ $!1,$#/6$1/8
-/ -,*$ -$#$'//#"' #$ -@/'-/1,# ;#"!,#,/7
N"1$3 B#"!,# +"$10 $!1,$#/6$ 1"$10 '/%(,'/#0 /%$/%10 (0 $ $1/%90
1"1$#,# (0 3?0007 E-10 $!!0+1$;/#7 P,101/ ',#$ (/% %", ;#"!,#
+0%1', !'0-10'/ ,#10'/"$'07
8tili+area ciclurilor 20R cu cursor si
inregistrare
S!'/01/ ,% ;#"! ,1/#/60$6$ ,% !/!#, .OR !, !,'-"' !$'0 -$
-0#0!1060 +'/*// ? (/% 1$;0#$ EMP8 -/ -$ -!'/0 '06,#1$1,# /%
1$;0#$ MESSAGES7
RE6,#1$1,# 2$ @/ (0 90%,#3
%,*!"#1 %,*!"#2 !T$'!"#1
------------------------
7>3< ?000 KING
777
Solutii
17
DECLARE
CURSOR !,'1 IS -0#0!1 -$# @'"* %0S0*+
ORDER BY -$#
.OR UPDATE O. -$#5
2G!",%1 NUMBER 3I 0 5
1"1-$# NUMBER B<82D 3I 05
2G-$# 0*+7-$#LTYPE5
BEGIN
SELECT SUMB-$#D INTO 1"1-$# .ROM %0S0*+5
OPEN !,'15
WHILE 1"1-$# JI3?000
LOOP
.ETCH !,'1 INTO 2G-$# 5
ENIT WHEN !,'1LNOT.OUND5
U
27
CAPITOLUL 25
"AI "ULT$ ,$.P'$ $0C$PTII
Am vazut de+a cum e&ceptiile predefinite apar si cum le manuim. Acum vom consolida
aceste caracteristici uitandu%ne peste e&ceptiile definite de utilizator si cum le putem
asocia cu conditii interne.
CA$D SU$" <E$E!A"E E>CEP"##LEI
%%printr%o conditie 'interna'
0A73
E''"'- 1403 +'"(,!0 NOGDATAG.OUND
%%prin generarea lor e&plicita
0A73
RAISE *XG0A!0+1/"%5
<e&erarea exce'tiilor
2&ceptiile in general apar in doua moduri:
O eroare in O-A/2 este asociata intern cu o e&ceptie.Aceasta e&ceptie este
"ridicata" automat ca un rezultat. *e e&emplu daca eroarea O-A%<<<1 apare cand scriem
in baza de date atunci e&ceptia *3PO5AOO:O,:*2U este ridicata de P!S".
O e&ceptie este generata implicit prin declaratia -A,S2 in cadrul unui bloc.
S/%1$A$ 3
RAISE 0A!0+1/0G/(0%1/@/!$1"'5
2&ceptia generata deliberat poate fi fie una definita de utlizator sau o e&ceptie interna
predefinita.
2ste de dorit a genera o e&ceptie in conditii in care acea e&ceptie nu ar aparea normal .
*e e&emplu,sa presupunem ca o interogare particulara are nevoie sa produca o eroare
daca intoarce orice rand. ,n mod normal numai cand mai mult de un rand este intors apare
e&ceptia (OOO4A:KO-OMS:
BEGIN
SELECT C$%X1T/%9C INTO PLHAR .ROM 0*+
WHERE (0+1%" I (0+1G%,*;0'5
I. S&LL.OUND THEN
RAISE TOOGMANYGROWS5
ENDGI.5
ENCEPTION
WHEN NOGDATAG.OUND THEN NULL5
END5
*easemenea observati cat timp ':OO*A(AO0O3:*' este considerat normal pentru
aceasta interogare, declaratia S22/( poate sa primeasca un subObloc9 in care e&ceptia
are un identificator nul. /ealalta e&ceptie (OOO4A:KO-OMS va fi transmisa la blocul
e&terior.
E>CEP"## DE2#$#"E DE U"#L#=A"O!
--%,*0 (0!#$'$10 (0 ,1/#/6$1"'/
--RAISE !$%( 1'0;,/0 -$ 10'*/%/ +'"!0-$'0$
--+0'*/10 (0@/%/'0$ +'"+'//#"' !"%(/1//
SINTANA
/(0%1/@/0' ENCEPTION
ENEMPLU
DECLARE
!'0(/1G0A!00(0( ENCEPTION5
BEGIN
I. -1"!UG"'(0'0()!'0(/1G#/*/1 THEN
RAISE !'0(/1G0A!00(0(5
END I.
Exce'tii de,i&ite de utilizator
2&ceptiile pot fi declarate impreuna cu alti identificatori la inceputul unui bloc. Aceste
e&ceptii userOdefined pot fi generate pentru situatii in care nici o procesare ulterioara a
actiunilor blocului nu trebuie sa apara. 2&ceptiile sunt declarate astfel :
/(0%1/@/!$1"' ENCEPTION5
2&ceptiile userOdefined ne permit sa definim identificatori convenabili pentru propriile
noastre conditii anormale. /and apar aceste conditii e&ceptiile pot fi generate a.i .
controlul este trecut la un identificator e&ceptie la sfarsitul blocului:
DECLARE
!'0(/1G0A!00(0( ENCEPTION5
BEGIN
I. -1"!UG"'(0'0() !'0(/1G#/*/1 THEN
END I.5
ENCEPTION
WHEN !'0(/1G0A!00(0( THEN 777
Declararea &u(elor 'e&tru exce'tii i&ter&e
Sa ne amintim ca P!S" are nume predefinite pentru cateva dintre codurile e&ceptiilor
interne dar nu pentru toate . Se pot prinde e&ceptiile fara nume cu identificatorul MH2:
O(H2-S, dar se poate dori declararea numelor propiilor e&ceptii pentru cateva coduri in
mod specific. P!S" furnizeaza o pragma numita 2U/2P(,O:O,:,( , care ne permite
specificarea unui nume de e&ceptie declarata, si numarul erorii O-A/2 de care este
legat.
S/%1$A$3
PRAGMA ENCEPTIONGINITB 0A!0+1/"%-/(0%1/@/0'8 %,*;0'D 5
]2&ception%identifier] trebuie sa fi fost de+a declarat in partea de declaratie a
blocului.]:umber] se refera la un numar de eroare tip e&ecutie.
EA0*+#,3
DECLARE
@01!TG@$/#0( ENCEPTION5
PRAGMA ENCEPTIONGINIT B@01!TG@$/#0(8 -1002D5
7
BEGIN
7
.ETCH !,'-"'1 INTO '0!"'(15
7
.ETCH !,'-"'1 INTO '0!"'(15 F4 D$!$ 0'"$'0$ -1002
$+$'0 $/!/
$1,%!/ 0A!0+1/$
@01!TG@$/#0(
0-10 '/(/!$1$
$,1"*$1 4F
ENCEPTION
WHEN @01!TG@$/#0( THEN 777
Mai (ulte des're tratarea exce'tiilor
/ind controlul este trecut partii 2U/2P(,O: a unui bloc, numai o e&ceptie va fi intr%o
stare ]generata]. Se poate totusi dori definirea acelorasi actiuni pentru a minui mai mult
de o e&ceptie:
WHEN /%2$#/(G%,*;0' OR 2$#,0G0''"' THEN
INSERT INTO +'";#0*- B777D
,dentificatorul MH2: O(H2-S prinde toate e&ceptiile neincluse de+a. /iteva
instrumente O-A/2 ca S".0orms au e&ceptiile lor predefinite pe care le poti genera
pentru a produce evenimente. MH2: O(H2-S le va prinde si pe acestea R
E>E!C#"##
1. Produceti un fisier S".Plus care accepta trei parametri 'V1, V#, VG) reprezentind
numarul departamentului, numele departamentului si locatia. 8locul P!S" din acest
fisier trebuie sa produca o e&ceptie 3S2-%*20,:2* daca nr. departamentului este GG
inregistrind un mesa+ adecvat in 42SSA72S. *aca nu este GG atunci numarul, numele si
locatia trebuie sa fie inregistrate ca un rind in tabelul :2M*2P( 'care are aceleasi
coloane ca *2P(). 0isierul trebuie sa fie e&ecutabil in urmatorul mod:
_.ILENAME ?0 TRAINING BRACKNELL
*aca aveti timp: #. Produceti un bloc pentru a sterge toate rindurile din tabelul
P-O=2/(S. *efiniti o e&ceptie care sa prinda eroarea interna %##;# ',ntegrit? violation),
si includeti un identificator care trimite un mesa+ tabelului 42SSA72S daca aceasta
e&ceptie apare.
SOLU"##
1.
DECLARE
2G(0+1%" NUMBER 3I W15
(0+1G33 ENCEPTION5
BEGIN
I. 2G(0+1%"I33 THENRAISE (0+1G335
END I.5
INSERT INTO %0S(0+1 B(0+1%"8 (%$*08 #"!D
HALUES BW18 `W2`8 `W3`D5
ENCEPTION
WHWN (0+1G33 THEN
INSERT INTO *0--$90- B!T$'!"##D
HALUES BCA110*+1 1" !'0$10 D0+$'1*0%1 33MCD5
END5
#.
DECLARE
/%109G0''"' ENCEPTION5
PRAGMA ENCEPTIONGINIT B/%109G0''"'8 -22<2D5
BEGIN
DELETE .ROM +'":0!1-5
ENCEPTION
WHEN /%109G0''"' THEN
INSERT INTO *0--$90- B!T$'!"#1D
HALUES B`I%109'/1X E''"'`D5
END5
A P P $ # , I 0 3 3 A
Pseudo+coloa&e SQL
3rmatoarea tabela listeaza pseudo%coloanele S"
/3--5A
intoarce valoarea curenta in secventa specificata
:2U(5A
intoarce urmatoarea valoare in secventa specificata
252
utilizat in comanda S22/(.../O::2/( 8K>intoarce 1 pentru nodul radacina,#
pentru nodul fiu,etc.
-OM,:*
intoarce un sir he&azecimal care reprezinta adresa unui rand.
-OM:34
intoarce un numar ce indica ordinea randului care a fost selectat din tabela.Primul
rand selectat are un -OM:34 de valoare 1,al doilea are #,etc.
SKS*A(2
intoarce data si timpul curent.
3S2-
intoarce numele de user al utilizatorului Oracle curent
3,*
intoarce un intreg unic asignat fiecarui nume de user 'e&ista un 3,* pentru fiecare
nume de user).
A P P $ # , I 0 3 3 *
Cuvi&te rezervate SQL
3rmatoarele cuvinte sunt rezervate S".:u puteti sa le utilizati ca nume de obiecte de tip
baza de date daca nu sunt puse intre ghilimle.
/uvintele urmate de un asteri&'.) sunt de asemenea cuvinte A:S, rezervate.
ACCESS DISTINCT* IS*
ADD DROP
ALL* LEVEL*
ALTER ELSE* LIKE*
AND* EXCLUSIVE LOCK
ANY* EXISTS* LONG
AS*
ASC* FILE MAXEXTENTS
AUDIT FLOAT* MINUS
FOR* MODE
BETWEEN* FROM* MODIFY*
BY* NOAUDIT
GRANT*
CHAR* NOCOMPRESS
CHECK* GROUP NOT
CLUSTER NOWAIT
COLUMN HAVING* NULL*
COMMENT NUMBER
COMPRESS IDENTIFIED
CONNECT OF*
CREATE* IMMEDIATE* OFFLINE
CURRENT* IN* ON*
INCREMENT ONLINE
DATE INDEX OPTION*
DBA INITIAL OR*
DECIMAL* INSERT* ORDER*
DEFAULT* INTEGER*
DELETE* INTERSECT* PCTFREE
DESC* INTO* PRIOR*
PRIVILEGES TABLE*
PUBLIC* THEN*
TO*
RAW TRIGGER*
RENAME
RESOURCE UID
REVOKE* UNION*
ROW* UNIQUE*
ROWID UPDATE*
ROWNUM USER*
ROWS*
ROWLABEL VALIDATE
SELECT* VALUES*
SESSION* VARCHAR*
SET* VARCHAR2
SHARE VIEW*
SIZE
SMALLINT* WHENEVER*
START WHERE*
SUCCESSFUL WITH*
SYNONYM
SYSDATE
Cuvi&te cDeie
3rmatoarele cuvinte cheie au o semnificatie speciala in limba+ul S" suportat de
O-A/2 -*84S dar nu sunt cuvinte rezervate si astfel pot fi folosite ca
identificatori.Aceste cuvinte pot deveni cuvinte rezervate in viitor.
/uvintele rezervate A:S, sunt indicate printr%un .>cuvintele cheie adaugate in versiunea
A.< sunt indicate prin B.
ARCHIVELOG+ END+ MXVALUE+
AUTHORIZATION*+ ESCAPE MINEXTENTS
EVENTS+ MINVALUE
BACKUP+ EXEC*+ MOUNT+
BEGIN*+ MODULE+
FETCH*+
CACHE+ FOREIGN*+ NEXT*+
CHARACTER*+ FORTRAN*+ NOARCHIVELOG+
CLOSE*+ FOUND*+ NOCACHE+
COBOL*+ NOCYCLE+
COMMIT*+ GO*+ NOMAXVALUE+
CONSTRAIN*+ GOTO*+ NOMINVALUE+
CONTENTS+ NOORDER+
CONTINUE*+ INCLUDING+ NORMAL+
CONTROLFILE+ INDICATOR*+ NOSORT+
CRASH INITRANS+ NUMERIC*+
CURSOR*+ INT*+
ONLY*+
CYCLE+ KEY*+ OPEN*+
DATABASE LANGUAGE*+
DATAFILE+ LINK PASCAL*+
DEC*+ LOGFILE+ PCTINCREASE+
DECLARE*+ PCTUSED+
DISMOUNT+ MAXDATAFILE+ PL1*+
DOUBLE*+ MAXINSTANCES+ PRECISION*+
MAXLOGFILES+ PRIMARY*+
MAXTRANS+ PROCEDURE*+
READ*+ SQLCOD*+
REAL*+ SQLERROR*+
REFERENCES*+ STATEMENT+
RELEASE+ STORAGE+
RESETLOGS SWITCH+
REUSE+ SYSTEM+
ROLLBACK+
SAVEPOINT+ TABLES+
SCHEME TABLESPACE+
SECTION*+ TEMPORARY*+
SEGMENT+ TEMPORARY*+
SEQUENCE+
SHARED+ USING*+
SOME*+
SORT+ WRITE*+
SPECIFIED+ WORK*+
SQL*+
PL/SQL Cuvi&te rezervate
3rmatoarele cuvinte sunt rezervate si nu trebuie folosite ca nume pentru obiecte database
sau ca identificatori in P!S".
ABORT
ACCEPT
ACCESSADD
ALL
ALTER
AND
ANY
ARRAY
AS
ASC
ASSERT
ASSIGN
AT
AUTHORIZATION
AVG
BEGIN
BETWEEN
BODY
BOOLEAN
BY
CASE
CHAR
CHAR_BASE
CHECK
CLOSE
CLUSTER
CLUSTERS
COLAUTH
COLUMNS
COMMIT
COMPRESS
CONNECT
CONSTANT
COUNT
CRASH
DATA_BASE
CREATE DATABASE
CURRENT DATE
CURSOR DBA
DEBUGOFF
DEBUGON
DECLARE
DEFAULT
DEFINITION
DELAY
DELETE
DELTA
DESC
DIGITS
DISPOSE
DISTINCT
DO
Document Summary:
DROP
ELSE
ELSIF
END
ENTRY
EXCEPTION_INIT
EXCEPTION
EXISTS
EXIT
FALSE
FETCH
FOR
FORM
FROM
FUNCTION
GENERIC
GOTO
GRANT
GROUP
HAVING
IDENTIFIED
IF
IN
INDEX
INDEXES
INDICATOR
INSERT
INTERSECT
INTO
IS
LEVEL
LIKE
LIMITED
LOOP
MAX
MIN
MINUS
MOD
NEW
NOCOMPRESS
NOT
NULL
NUMBER
NUMBER_BASE
OF
ON
OPEN
OPTION
OR
ORDER
OTHERS
OUT
PACKAGE TABAUTH
PARTITION TABLE
PCTFREE TABLES
PRAGMA TASK
PRIOR TERMINATE
PRIVATE THEN
PROCEDURE TO
PUBLIC TRUE
TIPE
RAISE
RANGE UNION
RECORD UNIQUE
RELEASE UPDATE
REM USE
RENAME
RESOURCE
RETURN VALUES
REVERSE VARCHAR
REVOKE VARCHAR2
ROLLBACK VARIANCE
ROWNUM VIEW
ROWTYPE VIEWS
RUN
WHEN
SAVEPOINT WHERE
SCHEMA WHILE
SELECT WHILE
SEPARATE WITH
SET WITH
SIZE WORK
SPACE
SQL
SQLCODE XOR
SQLERRM
START
STATEMENT
STDDEV
SUBTYPE
SUM
A#$0A C
Aceasta ane&a furnizeaza o vedere generala asupra principalelor dife% rente dintre Oracle
7 si Oracle versiunea A.*iferentele sunt listate in ordinea capitolelor in care apar in acest
manual.
6edere )e&erala asu'ra Oracle 6ersiu&ea J
Oracle 5ersiunea A e disponibil in # forme:Oracle 5ersiunea A cu "Optiuni de procesare a
tranzactiilor"'(ranzaction Processing Options) '(PO) sau fara "Optiuni de procesare a
tranzactiilor" adauga la Oracle 5ersiunea A -*84S furnizind un mecanism de nivel de
inchidere a sirurilor care inchide siruri in modul e&clusiv in mod obisnuit si adaugind un
motor P!S" in database.
Ca'itolul 8
Oracle 6ersiu&ea J SQL+2u&ctii &u(erice
,n Oracle versiunea A , urmatoarele functii numerice nu sint accepta% te:
S,:,/OS,(A:,S,:H,/OSH,(A:H,2UP,:, si O7.
0unctiile de putere nu admit e&ponenti neintegrabili.
Ca'itolul J
Oracle 6ersiu&ea J +2or(atul datelor
/odul 0ormatului -elativ de date '--) nu e admis.
Pentru lucrul cu ani in orice secol altul decit al #<%lea trebuie folosita functia (OO*A(2 .
Ca'itolul M
Oracle 6ersiu&ea J +O'eratori
Operatorul 3:,O: intoarce toate sirurile distincte obtinute dintr%o cerere.Aceasta a fost
marita in Oracle 7 cu operatorul 3:,O: A pentru a include sirurile duplicate.
Sinonimul SO42 nu e acceptat de operatorul A:K.
CAP#"OLUL B5
Oracle J + Li(%aAul de de,i&ire a datelor si a structurilor de date
3nica constringere impusa de Oracle A -*84S este :O( :3>pentru toate celelalte
constringeri, sinta&a este acceptata si definitiile constringerilor sint stocate in dictionarul
de date, dar nu sint impuse pentru operatiile *4.
/lauza /O:S(-A,:( din comanda /-2A(2 (A82 are diferite sinta&e.,n Oracle 7
sinta&a este:
CREATE TABLE emp
(empno numar (4) CONSTRAINT nume_constringere cheie primara ...)
,n Oracle 5ersiunea A sinta&a este:
CREATE TABLE emp
(empno numar (4) cheie primara CONSTRAINT nume_constringere ...)
,n comenzile /-2A(2 sau A(2- clauzele 2:A82 si *,SA82 nu sint valide.
/omanda *-OP nu are optiunea /AS/A*2.
/omanda (-3:/A(2 nu este suportata.
Oracle J + "i'uri de date
Oracle A suporta un tip de date pentru siruri de caractere:
/HA-
5alorile acestui tip de date sint variabile siruri de carac% tere de lungime de
ma&im #FF caractere.Oracle 5ersiunea A, de asemenea suporta urmatoarele
variante pentru tipul de date caracter:
/HA-A/(2-
5A-/HA-
,n Oracle A tipul de date O:7 este de asemenea suportat.Acesta este similar cu /HA-,
dar poate detine valori pina la lungimi de AF,FGF caractere.
CAP#"OLUL BG
Oracle J + locari
4odul in care Oracle A foloseste blocarile depinde de daca e&ista sau nu (PO.
Oracle A cu (PO foloseste blocarile in acelasi mod ca Oracle 7.
Oricum, in absenta (PO, doar un singur utilizator, la un moment dat, este capabil sa ceara
sa actualizeze o tabela din baza de date.O blocare e&clusiva, ascunsa pe linii este plasata
pe tabela cind apare sau o declaratie ,:S2-(, 3P*A(2 sau o declaratie
*22(2.-ezultatul blocarii pe intrarea tabelei inter% zice altor utilizatori de cereri orice
modificare de date pina cind cel ce a blocat tabela nu o va debloca./eilalti utilizatori sint
introdusi intr%o coada de asteptare.
CAP#"OLUL BJ
Oracle J + 6ieNs (vederi)
Pentru a redefini o vedere este necesar sa o micsoram si apoi sa o refacem. *e asemenea
o vedere nu poate fi creata pina cind tabelele pe care le folo% seste nu e&ista de+a.,n
Oracle 7 atit clauza O- -2PA/2 cit si clauza 0O-/2 furnizeaza aceste inlesniri.
CAP#"OLUL B;
Oracle J + Securitatea si ad(i&istrarea
/omanda 7-A:( este folosita pentru a crea noi utilizatori si a le da drep% turi./ele trei
drepturi de sistem disponibile sint:
/O::2/(
capacitatea de a te loga la Oracle si a accesa orice obievte asupra carora ai
drepturi.Pot fi create vederi si sinonime.
-2SO3-/2
capacitatea de a crea tabele si inde&ari.
*8A
capacitatea de a crea alti utilizatori si de a ocoli accesul prote+at.
-O2S, multimea de drepturi, nu este suportata.
CAP#"OLUL BM
Oracle J + #&dexari u&ice
,nde&arile unice nu sint create automat cind sint specificate constringerile de integritate
sau cheia primara./omanda /-2A(2 3:,"32 ,:*2U trebuie sa fie data e&plicit.
CAP#"OLUL BO
Oracle J + <e&eralitati
P!S" 5ersiunea 1 este motorul P!S" folosit de -*84S.Astfel procedurile,
functiile si pac9age%urile stocate si trigger%ele nu sint disponibile in Oracle 5ersiunea A
-*84S.Acestea sint disponibile in P!S" 5ersiunea #.
A#$0A ,
O!D#$EA DE COMPA!A"#E
/aracterele sint comparate conform cu ordinea de comparatie a calculatorului gazda.3n
caracter este mai mare decit altul daca apare dupa el in ordinea de comparatie.
4ulte calculatoare folosesc una din cele doua ordini de comparatie, numite
AS/,,'American Standard /ode *ecimal ,nterchange /ode).Aceste ordini de comparatie
sint prezentate mai +os.
Observatie: Oracle foloseste ordinea de comparatie a calculatorului gazda.
iterele mari si mici nu sint echivalente.,n AS/,,, toate literele mici sint mai mari ca
literele mari.,n 28/*,/, opusul este adevarat.
,n AS/,,, cifrele de la < la ; sint inaintea literlor din alfabet.,n 28/*,/, opusul este
adevarat.
,n continuare sint prezentate ordinele de comparatie atit pentru AS/,, cit si pentru
28/*,/.
Ordi&ea de co('aratie ASC## *
3rmatorul tabel listeaza ordinea de comparatie AS/,, :
H$#"$'0 60!/*$#$ S/*;"# H$#"$'0 60!/*$#$ S/*;"#
32 ;#$%U ?< 5
33 M =0 J
34 V =1 I
3? # =2 )
3= O =3 Z
37 L =4 _
3> W =?-<0 A-Y
3< C <1 Q
40 B <2 [
41 D <3 R
42 4 <4
43 E <? G
44 8 <= C
4? - <7-122 $-6
4= 7 123 ]
47 F 124 |
4>-?7 0-< 12? ^
?> 3 12= P
Ordi&ea de co('aratie ECD#C
3rmatorul tabel listeaza ordinea de comparatie 28/*,/ :
H$#"$'0 60!/*$#$ S/*;"# H$#"$'0 60!/*$#$ S/*;"#
=4 ;#$%U 10> L
74 ! 10< G
7? 7 110 )
7= J 111 Z
77 B 122 3
7> E 123 #
7< | 124 _
>0 W 12? C
<0 M 12= I
<1 O 127 V
<2 4 12<-137 $-/
<3 D 14?-1?3 :-'
<4 5 1=2-1=< --6
<? a 1<3-201 A-I
<= - 20<-217 :-'
<7 F 22=-233 S-Y
107 8 240-24< 0-<
A$E>A E
/rearea Obiectelor unei 8aze de *ate
,nstructiunea /-2A(2 este utilizata pentru crearea tabelelor si a altor obiecte ca de
e&emplu ,:*2U%uri, *O4A,:, 5,2MS. -estrictiile pot fi specificate de asemeni le
createa tabelelor ' restricttile sunt implementate la nivelul bazei de date).
CREATE TABLE EMP
( EMPNO INTEGER (A) NOT NULL,
ENAME CHAR (10),
JOB CHAR (10),
MGR INTEGER (4),
HIREDATE DATE,
SAL INTEGER (7,2),
COMM INTEGER (7,2),
DEPTNO INTEGER (2) NOT NULL );
/and se creaza tabela se poate specifica optional domeniul pentru coloana respectiva. ,n
plus, constrangerile pot fi specificate ca aplicandu%se asupra valorilor unei coloane sau
saupra intregii tabele. -estrictiile pot specifica faptul ca coloanele contin numai anumite
valori, valori unice sau nu pot fi nule. -estrictiile sunt implementate in cadrul bazei de
date.
/omanda pentru tabela A(2- permite eliminarea unor coloane individuale.
ALTER TABLE EMP
DROP MGR;
/omanda *-OP este utilizata pentu a elimina alte obiecte din baza de date.
*e e&emplu :
DROP TABLE DEPT;
DROP VIEW SALARY;
#$<!ES/SQL
,:7-2S!S" este un produs al -elational (echnolog? ,nc. '-(,). S" utilizat de
,:7-2S este acelasi din punct de vedere sintactic ca cel utili zat de alti producatori.
4a+oritatea e&emplelor de comenzi date pana acum se pot rula si sub ,:7-2S.Oricum,
,:7-2S!S" nu are operatorul ,C2.
,:7-2S suporta caractere speciale pentru utilizarea in comparatii ' in special operatorii
de egalitate ) pentru a indica potrivirile partiale intr%un sir de caractere. /aractere care
permit identificari pestiale sunt :
A identifica orice sir de sau mai multe caractere
B identifica orice caracter
C..D identifica oricare din caracterele dintre "arante+ele
"atrate
,:7-2S permite ca oricare din aceste caractere speciale sa poata fi folosite singular sau
in combinatie pentru a specifica criteriul de identi ficare partiala:
enameI'.'
identifica orice valoare in "ename"
enameI'2.'
identifica orice valoare care incepe cu "2"
enameI'.ein'
identifica orice valoare care se termina cu "ein"
enameI'.DaeiouE.'
identifica orice valoare care are cel putin o vocala
enameI'8rWW'
identifica orice sir de F caractere care incepe cu "8r"
Semnificatia speciala a acestor caractere poate fi eliminata in comparatii de predicate prin
caracterul "bac9slash" '^). Astfel "^." se refera la caracterul asterisc. Oricum, atunci cand
se fac atribuiri cu caractere speciale nu trebiue tratate cu specificatiile pentru ndetificarea
partiala:
:1/1#0IC44$!!",%1$%144C
*eoarece fragmentul de mai sus asigneaza "..accountant.." coloanei "+title", stelutele
nu necesita o tratare speciala cu bac9slash. *ar pentru a e&trage o valoare asignata astfel
este necesara sinta&a urmatoare :
:";71/1#0IC[4[4$!!",%1$%1[4[4C
Specificatiile de identificare patriala pot fi utilizate impreuna cu predicatele "betNeen" si
"in".
,:7-2S nu accepta valori :3. *aca nu se completeaza cu o valoare la inserarea unei
coloane atunci ,:7-2S va depozita o valoare implicita in acel camp. ,n functie de tipul
datei dintr%o coloana valoarea impicita poate fi < sau spatii.
(ipurile de date disponibile in ,:7-2S!S" par a fi cea mai mare di ferenta fata de
ma+oritatea variantelor de S".
"i'urile de date su&t *
c1 - c255 character Un sir de 1..255 caractere
vchar(1) - vchar(2000) vchar Un sir de 1..2000 caractere
integer1 intreg de 1 byte -128 .. 127
integer2 (smallint) intreg pe 2 bytes -32,768 .. 32,767
integer4(integer) intreg pe 4 bytes -2,147,483,648 ..
2,147,483,647
float4 real pe 4 bytes -10**78 .. 10**75 precizie
7 zecimale
float8(float) real pe 8 bytes -10**78 .. 10**75 precizie
15 zecimale
date data (12 byte) 1-ian-1582 .. 31-dec-2382
(pentru
date absolute si -800 ani
la 800
ani (ptr. intervale de
timp)
money money8(byte) #-99999999999999.99 ..
#99999999999999.99
*estinatiile smallint, float, integer pot fi utilizate in locul notatiei integer#, float@,
integer6 respectiv.
Astfel pentru a crea tabela 24P:
CREATE TABLE EMP
( EMPNO INTEGER2,
ENAME VCHAR(10),
JOB VCHAR (20),
MGR INTEGER2,
SAL MONEY,
COMM MONEY,
DEPTNO INTEGER1);
Tabelele SALGRADE si DEPT por fi create dupa cum urmeaza :
CREATE TABLE SALGRADE CREATE TABLE DEPT
( GRADE INTEGER1, ( DEPTNO INTEGER1,
LOSAL MONEY, DNAME VCHAR(10),
HISAL MONEY); LOC VCHAR(10));
/omanda pentru utilizarea tabelelor este aceeasi ca cea a altor producatori 'instructiunea
,:S2-(). ,nstructiunea *-OP poate fi utilizata pentru a elimina obiecte din baza de
date.
/edere de an(a)lu
O scurta vedere de ansamblu asupra S" implementat in G -*84S%uri %*8#, -dbs si
,ngres.
S" este limba+ul standard pentru -*84S%uri si toate -*84S%urile ma+ore suporta
cateva forme ale S".
Acest apendice furnizeaza o scurta vedere de ansamblu a S"%ului imple% mentat in
-*84S de catre trei furnizori proeminenti de -*84S %*8# al lui ,84, -db al *2/ si
,ngres al lui -elational (echnolog? . ,nformatia prezentata nu intentioneaza sa fie o
comparatie cuprinzatoare a acestor produse . ,ntentia mea este sa arat ca , de cand toate
-*8S%urile ma+ore suporta S" va puteti transfera priceperea pe care ati capatat%o in
S" de la un -*84S la altul.
,*2
*atabase # ' *8# ) este -*84S%ul ,84%ului pentru mediul 45S.
,mplementarea *8# a S"%ului este identica cu S"%ul O-A/2%ului . ,ntr%adevar
S"%ul folosit pentru *8# 'si S"!*S%-*84S%ul ,84%ului pentru *OS!3S2 si mediul
de operare 54!SP) a format modelul pentru limba+ul S" . -eamintiti%va ca limba+ul
S" a fost dezvoltat de ,84 pentru prototipul lor -*84S%S?stem - , dar O-A/2 a
intodus prima implementare comerciala posibila a S"%ului.
.inta%a de!laratiei .$L$CT
/lauzele de baza ale declaratiei S22/( sunt listate mai +os:
SELECT [ALL/DISTINCT] { [Tabela articol(e)/expr [alias] }
FROM tabela(e) [alias]
[WHERE predicat]
[AND predicat]
[OR predicat]
GROUP BY coloana(e) ]
[HAVING predicat]
[ORDER BY coloana(e)]
/ateva e&emple simple de comenzi S" urmeaza:
2U24P2:
1. SELECT *
2.
3. FROM EMP;
4.
5.
6. SELECT DISTINCT DEPTNO
7.
8. FROM DEPT;
9.
10.
11. SELECT DEPTNO, ENAME
12.
13. FROM EMP
14.
15. WHERE JOB = 'CLERK'
16.
17. ORDER BY JOB DESC;
18.
19.
20. SELECT EMPNO, ENAME, JOB, SAL
21.
22. FROM EMP
23.
24. WHERE ENAME LIKE 'S%';
25.
26.
27. SELECT ENAME, JOB, COMM
28.
29. FROM EMP
30.
31. WHERE COMM IS NULL;
32.
33.
34. SELECT E.EMPNO, E.ENAME, D.DNAME
35.
36. FROM EMP E, DEPT D
37.
38. WHERE E.DEPTNO = D.DEPTNO;
39.
40.
41. SELECT DEPTNO, DNAME
42.
43. FROM EMP
44.
45. WHERE NOT EXISTS
46.
47. (SELECT DEPTNO
48.
49. FROM EMP);
50.
51.
52. SELECT SUM(SAL), DEPTNO
53.
54. FROM EMP
55.
56. GROUP BY DEPTNO
57.
58. HAVING SUM(SAL) 3500;
59.
60.
/eea ce este mai sus , este doar un specimen simplu al comenzilor S" care pot fi scrise
folosind S"%ul lui *8#. 3n rand intins ,de alti operatori este suportat de *8#> operatori
de comparatie, operatori booleeni 'A:*, O-, :O() , operatori speciali '2U,S(S, ,:,
82(M22:, ,C2, ,S), operatorul pe multime 3:,O:, etc...
*8# nu suporta direct =O,:%ul e&tern. *easemenea, operatorii ,:(2-S2/(,O: si
*,002-2:/2 nu sunt suportati direct 'operatorul 3:,:O A poate fi folosit pentru a
construi aceste trasaturi).
*8# furnizeaza un numar de operatori si functii care pot fi folositi in constructia
e&presiilor. 3nele dintre aceste functii si operatori sunt rezu% mate mai +os.
O+0'$1"'F@,%!1/0 D0-!'/0'0
---------------- ---------
E8-848F A(,%$'08 -!$(0'08 /%*,#1/'08
/*+$'1/'07
P"1 @/ @"#"-/1/ !, ($108 1/*+/ -/
1/*0-1$*+-,'/7
|| C"%!$10%$'0-@"#"-/1 +0%1', $
$#$1,'$ 2
-/','/ (0 !$'$!10'0 -$, 2 -/','/
9'$@/-
!07
CHAR C"%20'10-10 " ($1$8 1/*+ -$,
1/*0-1$*+
/% '0+'060%1$'0$ -/',#,/ -$, (0
!$'$!-
10'07
DATE C"%20'10-10 " 2$#"$'0 -!$#$'$
/%1'-"
($1$7
DAYFMONTHFYEAR EA1'$90 +"'1/,%0$ (0 6/8 #,%$ -$,
$%
(/%1'-" ($1$ -$, 1/*0-1$*+7
DAYS C"%20'10-10 " ($1$ -$, ,%
1/*0-1$*+
/%1'-,% %,*$' (0 6/#07
DIGITS C"%20'10-10 ,% %,*$' /%1'-,% -/'
(0
!$'$!10'07
HOURFMINUTEFSECOND EA1'$90 +"'1/,%0$ (0 "'08
*/%,108-0-
!,%(0 (/% 1/*+ -$, 1/*0-1$*+7
LENGTH C$#!,#0$6$ #,%9/*0$ ,%0/ 2$#"'/
/% "!-
101/7
SUBSTR EA1'$90 ,% -,;-/' (/%1'-,% -/'7
HALUE C"%20'10-10 ,% %,## /%1'-"
2$#"$'0 %0-
%,#$7
COUNTFAHGF .,%!1// !"*;/%$10
MANFMINFSUM
*8# nu suporta bogatul set de functii care sunt posibile cu O-A/2. 5ezi capitolele 6, F
si A.
,ntentia de aici, nu este de a furniza o comparatie de unu la unu a diferen% telor si
asemanarilor intre si S"%ul O-A/2%ului. 4ai degraba, telul este de a arata ca,
cunostintele dumneavoastra de S" pot fi transferate de la un -*84S la altul.
Crearea o)ie!telor )a4ei de date
/omanda /-2A(2 (A82 are in esenta aceeasi sinta&a ca si S"%ul O-A/2%ului,
oricum *8# are ceva tipuri de date suplimentare:
,nteger
/uvant intreg binar, G1 biti si semn
Smallint
=umatate de cuvant intreg binar, 1F biti si semn
*ecimal 'n,m)
:umar zecimal impachetat, n cifre si semn '<S:
0loat'n)
/haracter'n)
Sir de caractere de @ biti de lungime fi&a '<S:
5archar'n)
ungimea variabila a celui de mai sus
7raphic'n)
Sir de caractere de 1A biti de lungime fi&a '<S:
5argraphic'n)
ungimea variabila a celui de mai sus
*ate
*ata reprezentata ca o secventa de @ cifre zecimale fara semn impachetate '????mmdd),
ocupand 6 octeti, valorile permise sunt in domeniul 1 ,anuarie A* pana la G1 *ecembrie
;;;; A*.
(ime
(impul, reprezentat ca o secventa de A cifre zecimale fara semn impachetate 'hhmmss),
o% cupand G octeti, valorile permise fiind in domeniul miezul noptii pana la miezul noptii.
*e e&emplu : <<<<<< pana la #6<<<<
(imestap
/ombinatie de data si timp, reprezentata ca o secventa de #< de cifre fara semn impache%
tate'????mmddhhmmssnnnnnn),ocupand 1< octeti, valorile permise fiind in domeniul
<<<1<1<1<<<<<<<<<<<< pana la ;;;;1#G1#6<<<<<<<<<<
Aceste tipuri pot fi abreviate dupa cum urmeaza :
,nt
pentru ,nteger
*ecimal'n)
pentru *ecimal'n,<)
*ecimal
pentru *ecimal'F)
*ec
pentru *ecimal
0loat
pentru 0loat'FG)
-eal
pentru 0loat'#1)
*ouble Precision
pentru 0loat'FG)
/haracter
pentru /haracter'1)
/har
pentru /haracter
ong 5archar
pentru 5archar'n)
7raphic
pentru 7raphic'1)
ong 5argraphic
pentru 5argraphic'n)
/and creati tabele, puteti specifica daca :ull%urile sunt permise sau nu in acelasi mod ca
si O-A/2 S" cu o e&ceptie. *8# permite declaratia :O( :3 M,(H *20A3(.
Aceasta inseamna ca o valoare nu este ceruta pentru aceasta coloana si va fi inlocuita cu o
valoare nula.
Lero pentru campuri numarice
8lan9%uri pentru campuri cu siruri de lungime fi&a
7ol 'siruri de lungime zero) pentru campuri cu siruri de lungime variabila.5aloarea lui
/3--2:( *A(2 sau /3--2:( (,42 sau /3--2:( (,42S(A4P ,cat mai
potrivit.
*eci, pentru a crea o tabela 24P:
CREATE TABLE EMP
( EMPNO INTEGER NOT NULL,
ENAME CHAR(10),
JOB CHAR(10),
MGR INTEGER,
HIREDATE DATE,
SAL DECIMAL(7,2),
COMM DECIMAL(7,2),
DEPTNO INTEGER NOT NULL);
(abela *2P( si tabela SA7-A*2 pot fi create astfel:
CREATE TABLE DEPT CREATE TABLE SALGRADE
( DEPTNO INTEGER NOT NULL, ( GRADE INTEGER NOT NULL,
DNAME CHAR(15), LOSAL INTEGER,
LOC CHAR(15)); HISAL INTEGER);
/omanda A(2- (A82 si comenzile *-OP (A82 sunt la fel ca ale lui O-A/2.
/omanda /-2A(2 ,:*2U este aceeasi deasemenea.
#OTA-
*eclaratia /rate (able S" a lui O-A/2 va accepta tipuri de date din *8# si S"!*S,
si le converteste intern in tipuri de date O-A/2, dupa cum urmeaza:
*8# S"!*S
O-A/2
S4A,:(
:3482-'G@)
,:(272-
:3482-'G@)
*2/,4A'4,:)
:3482-'4,:)
0OA(
:3482-
5A-/HA-':)
/HA-':)
O:7 5A-/HA-
O:7
:u e&ista tipuri de date O-A/2 care sa corespunda pentru 7-APH,/, 5A-7-APH,/
si O:7 5A-7-APH,/.
/A0 'd)1/".
-db este -*84S al lui *2/, care lucreaza in mediul 54S.
3rmeaza sinta&a pentru 5AU S" :
SELECT [DISTINCT]/[Tabela.] coloana/expr [alias]
FROM tabela(e) [alias]
[WHERE conditie]
[AND conditie]
[OR conditie]
[GROUP BY coloana(e)]
[HAVING conditie]
[ORDER BY coloana(e)]
2&emple:
1. SELECT ENAME, SAL*1.1 FROM EMP
2. SELECT EMPNO, ENAME, JOB FROM EMP
3.
4. WHERE EMPNO = 7369;
5.
6.
7. SELECT ENAME, HIREDATE, DEPTNO FROM EMP
8.
9. WHERE JOB = "MANAGER"
10.
11. ORDER BY ENAME;
12.
13.
14. SELECT DEPTNO, JOB FROM EMP
15.
16. WHERE ENAME LIKE "% S%";
17.
18.
*upa cum puteti vedea, sinta&a lui 5AU S" este foarte similara cu *8# si
O-A/2 S". Operatorul 2U,S(S ca si D:O(E :3, D:O(E 82(M22:,
A, opera% tori booleeni, =O,:%uri, subcereri, etc sunt toate suportate.0unctiile
/O3:(, S34, A57, 4,:, 4AU, sunt deasemenea furnizate.
a&exa 2
2ditare simpla :
ED nume_fisier
Acum sunteti in modul ,:S2-(
^,v,<,> mutare cursor
linie noua
/---+
< x | sterge la ztanga cursorului
\---+
HELP -----E
|
E-------E-------E-------E-------E
| | | | |
| P.1 | P.2 | P.3 | P.4 |---) #/%/0 B#$ ('0$+1$
!,'-"',#,/D
| | | | |
E-------E-------E-------E-------E
| | | | |
| 7 | > | < | 7 |---) !,2$%1 B#$ ('0$+1$
!,'-"',#,/D
| | | | |
E-------E-------E-------E-------E
| | | | |
| 4 | ? | = | 8 |---) !$'$!10' B-,; !,'-"'D
| | | | |
E-------E-------E-------E-------E
| | | | |
| 1 | 2 | 3 | |
| | | | |
E-------E-------E-------E ENTER |
| | | |
| 0 | 7 | |
| | | | B*$/ -,- -,%1 $%,#$10 !$%( -,%1
+'0@/A$10
E---------------E-------E-------E (0 P.1 D
P0%1', $ /0-/ 3 CTRL E Y /*+'0,%$
,'*$10 (0 EN B+0%1', $ -$#2$D -$, &UIT B+0%1',
$;$%("%D
A$E>A <
2&portarea /ontinutului unei (abele intr%un 0isier
3neori este util sa avem valorile unei coloane dintr%o tabela intr%un fisier te&t care poate
fi rulat pentru a insera respectivele valori in tabela. *e e&emplu cand se distribuie sau se
instaleaza un sistem se doreste funniza rea unui fisier care sa contina informatiile de start%
up pentru o tabela. Asemenea fisier este furnizat odata cu O-A/2 pentru tabelele de
demonstratie 2mp, *ept si Salgrade.
*esi datele sunt e&istente in tabela, se poate dori e&istenta infor matiei in formatul
",:S2-( ,:(O numeOtabela 5A32S',,,,)>" S" din S" poate fi utilizat pentru a
indeplini aceasta. 3rmatorul cod realizeaza blocul ,:S2-( pentru tabela *2P(.
set feed off
set head off
set pages 0
set lines 75
set verify off
spool insert.sql
select 'insert into dept', ' values (' ||
deptno || ',' ||
''''||dname||''''||','||
''''||loc||''''||');'
from dept;
spool off
set feed on
set head on
set pages 24
set verify on
start insert.sql
Pentru fiecare linie din tabela *2P(, codul de mai sus genereaza blocurile ,:S2-( de
mai +os :
/%-0'1 /%1" (0+1
2$#,0- B108CACCOUNTINGC8CNEW YORKCD5
/%-0'1 /%1" (0+1
2$#,0- B208CRESEARCHC8CDALLASCD5
/%-0'1 /%1" (0+1
2$#,0- B308CSALESC8CCHICAGOCD5
/%-0'1 /%1" (0+1
2$#,0- B408COPERATIONSC8CBOSTONCD5
Aceste blocuri au fost "capturate" in fisierul ",:S2-(.S"".
Poate ca ati observat numarul mare de apostrofuri din ultimul e&emplu. 3n set de 6
apostrofuri genereaza un singur apostrof in blocul final % -2(,:2(, : Sirurile de
caractere trebuie incadrate de apostrofuri R
Astfel :
SELECT '''X''' intoarce 'X'
SELECT '''' intoarce '
SELECT ''''||DNAME||'''' intoarce 'BOSTON'
S" din S" este o tehnica ce poate fi utilizata pentru a mari tabelele cu valori stocate in
fisiere te&t. *e asemeni pot fi folosite utilitarele ,4PO-(!2UPO-(.
7enerarea unor blocuri ,:S2-( pentru o tabela cu multe coloane este costisitor sa
generam coloana cu coloana. ,n loc, putem e&trage informatia din "*ata *ictionar?".
,ntr%adevar, cand se genereaza S" bazat pe date e&istente, "*ata *ictionar?" este locul
de start. Se poate utiliza acest dictionar pentru a furniza parametrii pentru orice bloc S".
3rmatorul e&eplu utilizeaza infor% matia din "*ata *ictionar?" pentru a genera blocuri
/-2A(2 (A82 pentru fiecare tabela a utilizatorului. Acest e&emplu ilustreaza cateva
tehnici necesare pentru generarea unui S" comple&. SA :3 5A ,:7-,=O-A(, /A
5A (-283, SA 3(,,% LA(, A/2S( /O* *2 0,2/A-2 *A(A /A:* *O-,(, SA
2U2/3(A(, 3: 8A/C%3P A (A82% 2O- *34*2A5OAS(-A R O-A/2
03-:,L2ALA A(2 3(,,(A-2 /A-2 2U2/3(A A/2S( 3/-3.
Crearea "a%elelor-
2ste mereu o idee buna sa fiti capabili sa regenerati propriile tabele. Puteti sa lasati S"
sa genereze blocuri /-2A(2 (A82 pentru aceasta. 2cranul "*ata *ictionar?" %
userOtabOcolumns % contine tiate informatiile necesare.
SELECT TABLE_NAME, COLUMN_ID, COLUMN_NAME, DATA_TYPE,
DATA_LENGHT,
DATA_PRECISION, DATA_SCALE, NULLABLE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME IN ('DEPT','EMP','SALGRADE')
ORDER BY TABLE_NAME, COLUMN_ID;
TABLE_NAME COLUMN_ID COLUMN_NAME DATA_T DATA_LEN DATA_PREC DATA_SCALE
NULLABLE
---------- --------- ----------- ------ -------- --------- ----------
--------
DEPT 1 DEPTNO NUMBER 22 2 0
N
DEPT 2 DNAME CHAR 14
Y
DEPT 3 LOC CHAR 13
Y
EMP 1 EMPNO NUMBER 22 4 0
N
EMP 2 ENAME CHAR 10
Y
EMP 3 JOB CHAR 9
Y
EMP 4 MGR NUMBER 22 4 0
Y
EMP 5 HIREDATE DATE 7
Y
EMP 6 SAL NUMBER 22 7 2
Y
EMP 7 COMM NUMBER 22 7 2
Y
EMP 8 DEPTNO NUMBER 22 2 0
N
SALGRADE 1 GRADE NUMBER 22
Y
SALGRADE 2 LOSAL NUMBER 22
Y
SALGRADE 3 HISAL NUMBER 22
Y
5A!ilitati ale PL1.2L6 7er(iunea 2
#&troducere
P!S" adauga in versiunea # un numar de facilitati noi in limba+, multe reflectind
imbunatatiri ale -*84S Oracle, versiunea .7. Acesutea includ:
Salvarea subprogramelor P!S"
(ipuri noi de date
(abele P!S" 'variabile arra?)
*efinirea mai fle&ibila a inregistrarilor
,n plus, versiunea # a P!S" accepta toate noile functii S" din Oracle7, si toti
operatorii S" de comparare si setare '2U,S(, 3:,O:, etc)
Su%'ro)ra(e PL/SQL
,n general versiunea # accepta doua tipuri de blocuri P!S", 'blocul anonim' si
'subprogramele'.
8locul anonim
2ste un bloc fara nume. 8locurile anonime erau singurul tip de bloc in versiunea
1. Aceste blocuri sint declarate in momentul in care sint rulate, si transmise
motorului P!S" pentru compilare inainte de a fi rulate.
Subprogramele
Sint blocuri P!S" cu nume. Pot fi declarate fie ca proceduri fie ca functii. ,n
ultimul caz vor intoarce o valoare atunci cind sint apelate.
/u e&tinderea procedurala a -*4S, subprogramele pot fi stocate in dictionare de
date, de unde pot fi apelate apoi din mai multe aplicatii cind acel cod este necesar.
'Sint diferite de functiile si procedurile din 0orm%urile S")
Declararea varia%ilelor si co&sta&telor
P!S" v# accepta o mare varietate de tipuri de date, care pot fi utilizate pentru a declara
variabile si constante. 5ariabilele pot primii optional o valoare cind sint declarate, si este
permisa schimbarea valorii prin asignari mai tirziu, in cadrul blocului. /onstantele sint
identificatori care pastreaza o valoare fi&a care trebui atribuita cind constanta este
declarata.
"i'uri scalare
Sint tipuri de date care reprezinta o singura valoare. Principalele tipuri sint cele care
corespund coloanelor din bazele de date O-A/2: :3482-, *A(2, /HA-,
5A-/HA-#, -AM, -OM,*. 2&ista totusi un numar de subtipuri pentru o definire mai
specifica a variabilelor. ,n P!S" sint permise variabilele 8ooleene.
Pe&tru varia%ile $UME!
:3482-
5Alori numerice cu precizia ma&ima de G@ digiti. 5alorile sint rotun+ite la un
intreg, e&ceptind cazul cind este data o scala. *e e&emplu :3482-'7,#)
inseamna 7 digiti, cu # zecimale permise. Precizia implicita este G@.
Sinonime pentru :3482- sint: *2/,4A, 0OA(, ,:(272-, -2A si
S4A,:(. Aceste alternative sint pentru infrumusetare. *e e&emplu
,:(272-'6) poate fi considerat mult mai descriptiv decit :3482-'6).
Pe&tru datele #$A!.:#$"E<E!
8,:A-KO,:(272-
2ste stocat ca un numar binar cu semn, este mult mai eficient pentru intregii
folositi in e&presii. Pot avea valori intre %#1676@GA6@ si B#1676@GA67.
:A(3-A
Acest subtip al 8inar?,nteger nu permite numere negative.
positive
a fel ca :A(3-A, dar nu accepta valoarea zero
Pe&tru date C0A!
/HA-
2ste utilizat pentru a stoca date caracter cu lungime fi&a 'la fel cu coloanele
/HA- din Oracle7). ungimea implicita este 1 caracter, ma&imul permis este
G#7A7. *e e&emplu /HA-'#<).
:ota: /ind variabile /HA- sint comparate, sint evaluate folosind blan9uri pentru
umplere.
5A-/HA-#
Se foloseste pentru date cu lungime variabila. ungimea ma&ima este cea de la
/HA-, dar valorile 5A-/HAr sint comparate fara umplere cu spatii.
5A-/HA-
a fel, dar semnificatia comparatiei se poate schimba intr%o versiune ulterioara.
Date oolee&e
8oolean
Pentru a pastra valorile (-32 si 0AS2. -ezultatul e&presiilor 8ooleene pot fi
atribuite acestor variabile, si testate apoi in instructiuni conditionale.
"i'ul DA"E
*A(2
*ate valide, ca si coloanele O-A/2 tip *A(2. *omeniu inter 671#bc si
671#ad.
"i'ul !A/
-AM
Pentru a stoca date binare, ca si coloanele -AM ale bazelor de date. ungimea
ma&ima este G#7A7.
Date !O/#D
-OM,*
Pentru a stoca adrese -OM,* in formatul international -OM,*. 'adica fara
conversia dinamica la date character)
*e notat ca unele din tipurile de date acceptate de P!S" permit lungimi care sint mai
mari decit cele din coloanele corespunzatoare. 5A-/HA-# si -AM, ca coloane, permit
ma&imum #<<< octeti. /oloanele /HA- au ma&imum #FF. *atele caracter din P!S"
pot fi totusi scrise in coloane O:7 ale bazelor de date daca valoarea lor este prea mare.
Cuvi&tul cDeie DE2AUL"
,n P!S" v# cuvintul rezervat *20A3( poate fi optional folosit in atribuiri ':I)
pentru a definii valori initiale pentru variabile si constante. *e e&emplu, e&presia:
1$AGX0$' SMALLINT 3I<25
Poate fi rescrisa:
1$AGX0$' SMALLINT DE.AULT <25
/uvintul *20A3( poate de asemenea sa fie utilizat laparametrii subprogramelor, la
parametrii cursoarelor, si cimpurile inregistrarilor utilizator.
"i'uri &oi de date co('use
,n P!S" v1, atributul P-OM(KP2 permitea crearea de variabile bazate pe coloanele
unei tabele, sau a unor coloane selectate dintr%un cursor e&plicit. ,n versiunea #, sint # noi
tipuri compuse, numite inregistrari definite de utilizator si tabele P!S".
#&re)istrari de,i&ite de utilizator
Spre deosebire de inregistrarile create cu atributul P-OM(KP2, inregistrarile definite de
utilizator permit definirea cimpurilor individual intr%o inregistrare. Aceasta se face in #
etape> intii definiti tipul inregistrare si apoi puteti declara inregistrari bazate pe acest tip.
(ipul inregistrare este definit cu instructiunea (KP2:
TYPE 1X+0-/( IS RECORD
B@/0#(-%$*01 @/0#(-1X+0 QNOT NULLR Q3I2$#"$'0R8
@/0#(-%$*02 @/0#(-1X+0 QNOT NULLR Q3I2$#"$'0R8 777 D5
unde valoare este valoarea initiala a cimpului respectiv.
,nregistrarile pot fi declarate apoi bazat pe aceasta structura:
'0!"'(-/( '0!"'(-1X+0 5
2&emplu:
DECLARE
TYP0 1/*0G1X+0 IS RECORD B-0!"%( INTEGERB2D 3I 0 8
*/%,10 INTEGERB2D 3I 0 8
T",' INTEGERB2D 3I 0 D 5
1/*0G'0! 1/*0G1X+05
,nregistrarea 'timeOrec' va contine acum cimpurile 'second', 'minute', 'hour'. 0iecare va fi
initializat cu <.
,nregistrarile definite de utilizator si cimpurile lor pot primii valori si pot fi foosite in
e&presii in acelasi fel ca si inregistrarile create cu atributul P-OM(KP2. ,n plus, o
inregistrare definita poate fi utilizata ca tip de date pentru parametrii formali ai unui
subprogram.
,nregistrarile pot fi imbricate. Adica, o inregistrare definita anterior poate fi tip de data a
unui cimp dintr%un alt tip de date inregistrare, producind inregistrari in inregistrari.
"a%ele PL/SQL
*aca inregistrarile pot reflecta un rind unic, cu mai multe cimpuri, o tabela P!S"
contine o structura cu un singur cimp, dar cu rinduri multiple. O tabela P!S" este
bazata pe un tip de coloana, dar permite stocarea unui tabel de valori si accesarea lor
printr%o cheie primara 'numarul rindului)
/a si inregistrarile definite, o tabela P!S" este definita in # pasi.4ai intii se defineste
un tip bazat pe un tip de coloana, si apoi se declara o tabela cu acest tip.
Sinta&a:
TYPE 1X+0-/( IS TABLE O. !"#-1X+0 QNOT NULLR
INDEN BY BINARYGINTEGER
3nde tipul coloanei poate fi fie un tip utilizat pentru coloane 'de e&emplu 5A-/HA-#),
sau o referire la o baza de date cu atributul P(KP2.
2&emplu:
DECLARE
TYPE 0%$*0G1X+0 IS TABLE O. CHARB10D
INDEN BY BINARYGINTEGER5
Puteti declara o tabela bazata pe tipul enameOt?pe:
0%$*0G$''$X 0%$*0G1X+05
Atri%uire de valori u&ei ta%lele
:umarul de rinduri dintr%o tabela poate creste si descreste dinamic, in functie de numarul
de valori asignate. Puteti atribui mai mmulte valori de rind intr%o singura atribuire:
0%$*0G$''$X 3I BCJ0$% L,!C 8 CK/'UC 8 CS!"11C D5
sau individual prin indici:
0%$*0G$''$XB4D 3I C1'"XC5
*e notat ca rindurile dintr%o baza de date pot fi e&trase in rindurile unei tabele P!S"
sau invers, dar aceasta trebuie facut pe rind, intr%un ciclu. *aca un rind dintr%o tabela este
referit intr%o variabila acesta trebuie declarat ca 8,:A-KO,:(272-.
2&emplu:
DECLARE
/ BINARYGINTEGER 3I 05
BEGIN
.OR '0!1 IN B-0#0!1 0%$*0 @'"* 0*+D
LOOP
/3I/E15
0%$*0G$''$X 3I '0!170%$*05
END LOOP5
7
7 -- T$;0#$ 0%$*0G$''$X /%!$'!$1$ -/ 9$1$ (0 $!1/,%0
7
END5
Ane%a
Acestia sunt pasii ce trebuie urmati :
1. 7enerati prima parte a comenzii /-2A(2 (A82. -etineti ca de asemenea noi
selectam numele tabelei si o constanta. Aceste doua coloane vor fi folosite numai
pentru a realiza sortarea. 2le nu vor mai fi tiparite la ultimul pas.
27
37 EN7
47
5.
6.
7. set feedback off
8.
9. set echo off
10.
11. set head off
12.
13.
14.
15. select distinct table_name sort1,
16.
17. 0 sort2,
18.
19. 'CREATE TABLE '|| table_name ||' ('
20.
21. from use_tab_columns
22.
23. /
24.
25.
26.
27. DEPT 0 CREATE TABLE DEPT (
28.
29. EMP 0 CREATE TABLE EMP (
30.
31. SALGRADE 0 CREATE TABLE SALGRADE (
32.
337
347
GF. Acum obtinem definitia completa a fiecarei coloane pentru fiecare tabla.
3=7
377 EN7
3>7
39.
40.
41. break on sort1 skip 1
42.
43. select table_name sort1,
44.
45. column_id sort2,
46.
47. ' ' ||
48.
49. column_name ||
50.
51. decode(data_type, 'DATE',' DATE',
52.
53. 'LONG',' LONG'
54.
55. 'CHAR',' CHAR('||data_length||')',
56.
57. 'VARCHAR','VARCHAR('||data_length
58.
59. ||')',
60.
61. 'NUMBER',
62.
63. decode(data_precision,null,' NUMBER',
64.
65. ' NUMBER('||
data_precision||','||
66.
67. data_scale||')
'),
68.
69. '*********** INVALID DATA TYPE
**************')||
70.
71. decode(nulltable ,'N',' NOT NULL',null)||','
72.
73. from user_tab_columns
74.
75. order by table_name,column_id
76.
77. /
78.
7<7
>07
@1. Acum sa urmarim un e&emplu complet. 2l consta din trei S22/(%uri combinate
cu operatorul 3:,O:. Primul genereaza comanda "/-2A(2 (A82" ,al doilea
defineste coloanele pentru fiecare tabela mai putin ultima intrare si ultimul
selecteaza ultima coloana . (iparirea primei si celei de%a doua coloane ''sort1' si
'sort#') a fost eliminata folosind optiunea :OP-,:( a comenzii /O34:.
>27
>37 EN7
>47
85.
86.
87. set feedback off echo off head off
88.
89. set pagesize 9999
90.
91. col sort1 noprint
92.
93. col sort2 noprint
94.
95. break on sort1 skip 1
96.
97.
98.
99. spool sqlcreates.sql
100.
101.
102.
103. select distinct table_name sort1,
104.
105. 0 sort2,
106.
107. 'CREATE TABLE '||table_name||' ('
108.
109. from user_tab_columns
110.
111. union
112.
113. select table_name sort1,
114.
115. column_id sort2,
116.
117. ' '||
118.
119. column_name||
120.
121. decode(data_type,'DATE',' DATE',
122.
123. 'LONG',' LONG',
124.
125. 'CHAR',' CHAR('||data_length||')',
126.
127. 'VARCHAR', 'VARCHAR('||
data_length||')',
128.
129. 'NUMBER',
130.
131. decode(data_precision,null,
'NUMBER',
132.
133. 'NUMBER('||
data_precision||','||
134.
135. data_sca
le||') '),
136.
137. '******** INVALID DATA TYPE ********')||
138.
139. decode(nullable,'N',' NOT NULL',null)||','
140.
141. from user_tab_columns c
142.
143. where column_id <(select max(column_id)
144.
145. from user_tab_columns
146.
147. where table_name = c.table_name)
148.
149.
150.
151. union
152.
153. select table_nae sort1,
154.
155. column_id sort2,
156.
157. ' '|| column_table||
158.
159. decode(data_type,'DATE',' DATE',
160.
161. 'LONG',' LONG',
162.
163. 'CHAR',' CHAR('||data_length||')',
164.
165. 'VARCHAR', 'VARCHAR('||
data_length||')',
166.
167. 'NUMBER',
168.
169. decode(data_precision,null,
'NUMBER',
170.
171. 'NUMBER('||
data_precision||','||
172.
173. data_sca
le||') '),
174.
175. '******** INVALID DATA TYPE ********')||
176.
177. decode(nullable,'N',' NOT NULL',null)||','
178.
179. /'
180.
181. from user_tab_columns c
182.
183. where column_id = (select max(column_id)
184.
185. from user_tab_columns
186.
187. where table_name = c.table_name)
188.
189. order by 1,2
190.
191. /
192.
193. spool off
194.
195. col sort1 clear
196.
197. col sort2 clear
198.
199. set head on feedback on echo on
200.
201. set pagesize 24
202.
203.
204. Acest exemplu, relativ complicat produce urmatorul fisier :
205.
206.
207.
208. CREATE TABLE DEPT (
209.
210. DEPTNO NUMBER (2,0) NOT NULL,
211.
212. DNAME CHAR (14) ,
213.
214. LOC CHAR (13) )
215.
216. /
217.
218.
219.
220. CREATE TABLE EMP (
221.
222. EMPNO NUMBER (4,0) NOT NULL,
223.
224. ENAME CHAR (10) ,
225.
226. JOB CHAR (9),
227.
228. MGR NUMBER (4,0) ,
229.
230. HIREDATE DAATE,
231.
232. SAL NUMBER (7,2),
233.
234. COMM NUMBER (7,2),
235.
236. DEPTNO NUMBER (2,0) NOT NULL)
237.
238. /
239.
240.
241.
242. CREATE TABLE SALGRADE (
243.
244. GRADE NUMBER (1,0) NOT NULL,
245.
246. LOSAL NUMBER (5,0),
247.
248. HISAL NUMBER (5,0) )
249.
250. /
251.
252.
253.
254.
255.
1ENERARE de &redicate 2dinamice2
Este osibil sa caturam clau,a 203ERE2 intr-o
substituire de .ariabila utili,ind otiunea
2NE0_+A(UE2 a comen,ii 2CO(UMN24 Exemlul
ermite utili,atorului sa 'enere,e un raort al
an'a5atilor din cadrul unui deartament si6sau
inceind cu o anumita data4
E()
Contens of d*namic)S+,
accept deptno char prompt -Enter deptno. for all-
accept hiredate char prompt -Enter date . for all-
set termout off
col c/ ne01value 0here1clause
select decode(-2hiredate-3
null3- -3
-0here hiredate 4 ---55-2hiredate-55----
)3
decode(-2hiredate-3
numm3-0here deptno 4 -55-55
- and hiredate 4 ---55-2hiredate-55----
)
) c/
from s*s)dual
6
set verif* on
set termout on
select ename from emp 20here1clause
6
start d*namic)s7l
Enter deptno. for all
Enter hiredate. for all 489un8:4
S+,; select ename
< from emp 20here1clause
=
S+,; 6
old <> from emp 20here1clause
ne0 <> from emp 0here hiredate 4 -489un8:4-
E?A%E
8888888888
&#!?E!
ADA%S
start d*namic)s7l
Enter deptno. for all
Enter hiredate. for all 489un8:4
S+,; select ename
< from emp 20here1clause
=
S+,; 6
old <> from emp 20here1clause
ne0 <> from emp 0here deptno 4 <@
E?A%E
888888888888888888
S%A&H
BO?ES
SCO&&
ADA%S
Aceasta tehnica poate fi utiliata de asemenea pentru a permite unui
utiliator in timpul rularii sa specifice coloana dupa care sa se
ordonee
fisierul de raport)
!etineti ca pentru a selecta un apostrof trebuie sa folositi doua)

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