Sunteți pe pagina 1din 343

Facultatea de Automatic i Calculatoare Iai

Baze de date lucrri practice


CUPRINS
CAPITOLUL 1
1.1
1.2
1.3
1.4
1.5
1.6
1.7

Arhitectura sistemelor de gestiune a bazelor de date ......................... 1-5


Obiectivele i func iile unui sistem de gestiune a bazelor de date ...... 1-6
Evolu ia i clasificarea sistemelor de gestiune a bazelor de date ....... 1-8
Conceptul de baz de date rela ional .............................................. 1-11
Terminologie specific bazelor de date rela ionale ........................... 1-14
Sisteme de gestiune a bazelor de date rela ionale n Oracle............ 1-16
Sisteme de gestiune a bazelor de date rela ionale n FoxPro........... 1-18

CAPITOLUL 2
2.1
2.2
2.3
2.4
2.5
2.6
2.7

SISTEME DE GESTIUNE A BAZELOR DE DATE ........... 1-5

CONCEPTE I ELEMENTE DE BAZA N FOXPRO. ..... 2-22

Descrierea mediului integrat.............................................................. 2-25


Tipuri de date n FoxPro, operatori, func ii ........................................ 2-26
Func ii pentru conversii ntre tipuri de date ....................................... 2-34
Zone de lucru..................................................................................... 2-35
Construirea bazelor de date rela ionale. Componente...................... 2-36
Comenzi pentru vizualizarea i modificarea datelor din tabele ......... 2-40
Exerci ii .............................................................................................. 2-44

CAPITOLUL 3
INDEXAREA I RELA IONAREA TABELELOR,
INTEGRITATEA REFEREN IAL . ............................................................... 3-46
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
3.10
3.11
3.12

Indexarea tabelelor............................................................................ 3-46


Rela ionarea tabelelor ....................................................................... 3-50
Integritatea referen ial ...................................................................... 3-53
Func ii. Variabile de memorie. Macrosubstitu ia ............................... 3-54
Crearea i modificarea programelor.................................................. 3-57
Programare structurat . Proceduri. ................................................... 3-58
Comenzi de intrare/ieire................................................................... 3-60
Controlul fluxului ................................................................................ 3-65
Comenzi SQL .................................................................................... 3-67
Depanarea programelor .................................................................... 3-69
Instrumente WIZARD ........................................................................ 3-71
Exerci ii .............................................................................................. 3-74

CAPITOLUL 4
PROGRAMAREA ORIENTATA PE OBIECT-CLASE I
OBIECTE N VISUAL FOX PRO.................................................................... 4-78
4.1
4.2
4.3
4.4
4.5
4.6
4.7

Crearea claselor ................................................................................ 4-81


Crearea formularelor ......................................................................... 4-85
Utilizarea controalelor predefinite...................................................... 4-87
Generatorul de rapoarte .................................................................... 4-99
Constructorul de meniuri ................................................................. 4-105
Constructorul de proiecte ................................................................ 4-108
Exerci ii: ........................................................................................... 4-110
1-1

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
CAPITOLUL 5
5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9
5.10
5.11
5.12
5.13
5.14
5.15
5.16
5.17
5.18
5.19
5.20
5.21
5.22
5.23
5.24

LIMBAJUL SQL IMPLEMENTAT N ORACLE............. 5-111

Solu ia complet Oracle .................................................................. 5-111


Comenzi SQL*Plus pentru fiiere.................................................... 5-114
Instruc iuni SQL ............................................................................... 5-115
Sintaxa de baz a instruc iunilor SQL ............................................. 5-116
Crearea i gestionarea tabelelor ..................................................... 5-118
Comanda CREATE TABLE ............................................................. 5-120
Tabele din baza de date Oracle ...................................................... 5-121
Interogarea dic ionarului de date..................................................... 5-122
Tipuri de date................................................................................... 5-123
Comanda ALTER TABLE ................................................................ 5-127
tergerea unei tabele ...................................................................... 5-131
Modificarea numelui unui obiect...................................................... 5-132
Trunchierea unei tabele................................................................... 5-132
Includerea constrngerilor ............................................................... 5-133
Constrngerea NOT NULL .............................................................. 5-136
Constrngerea UNIQUE KEY ......................................................... 5-137
Constrngerea PRIMARY KEY ....................................................... 5-139
Constrngerea FOREIGN KEY ....................................................... 5-139
Constrngerea CHECK ................................................................... 5-141
Ad ugarea unei constrngeri .......................................................... 5-142
tergerea unei constrngeri ............................................................ 5-143
Dezactivarea constrngerilor........................................................... 5-143
Activarea constrngerilor................................................................. 5-144
Exerci ii ............................................................................................ 5-147

CAPITOLUL 6
EXPRESII ARITMETICE. OPERATORI.
RESTRIC IONAREA I SORTAREA DATELOR....................................... 6-149
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
6.9
6.10

Expresii aritmetice ........................................................................... 6-149


Definirea alias-urilor pentru coloane................................................ 6-153
Operatorul de concatenare.............................................................. 6-154
Afiarea structurii unei tabele .......................................................... 6-157
Restric ionarea i sortarea datelor .................................................. 6-158
Clauza WHERE ............................................................................... 6-159
Operatori de compara ie.................................................................. 6-161
Operatori logici ................................................................................ 6-165
Clauza ORDER BY.......................................................................... 6-169
Exerci ii ............................................................................................ 6-172

CAPITOLUL 7
7.1
7.2
7.3
7.4
1-2

FUNC II DE UN SINGUR RND .................................. 7-174

Func ii de un singur rnd ................................................................. 7-175


Func ii pentru caractere................................................................... 7-177
Func ii pentru valori numerice ......................................................... 7-181
Utilizarea datelor calendaristice ...................................................... 7-183

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
7.5
7.6
7.7
7.8
7.9

Func ii pentru date calendaristice.................................................... 7-184


Func ii pentru conversia tipului de date........................................... 7-187
Func ii diverse ................................................................................. 7-196
Imbricarea func iilor ......................................................................... 7-203
Exerci ii ............................................................................................ 7-204

CAPITOLUL 8
8.1
8.2
8.3
8.4
8.5
8.6
8.7
8.8

CAPITOLUL 9
9.1
9.2
9.3
9.4
9.5
9.6
9.7
9.8
9.9
9.10
9.11
9.12
9.13
9.14
9.15
9.16
9.17

FOLOSIREA FUNC IILOR DE GRUP.......................... 9-231

Ce sunt func iile de GRUP ? ........................................................... 9-231


Folosirea func iilor AVG, SUM, MIN, MAX ...................................... 9-232
Folosirea func iei COUNT................................................................ 9-233
Func iile de grup i valorile Null....................................................... 9-234
Crearea grupurilor de date .............................................................. 9-235
Gruparea datelor dup mai multe coloane ...................................... 9-238
Interog ri ilegale n folosirea func iilor de grup................................ 9-240
Excluderea rezultatelor ob inute folosind clauza Group.................. 9-242
Imbricarea func iilor de grup ............................................................ 9-244
GROUP BY cu operatorii ROLLUP i CUBE................................... 9-244
Operatorul ROLLUP ........................................................................ 9-245
Operatorul CUBE............................................................................. 9-247
Func ia GROUPING ........................................................................ 9-249
GROUPING SETS........................................................................... 9-250
Composite Columns ........................................................................ 9-254
Concatenated Groupings................................................................. 9-257
Exerci ii ............................................................................................ 9-259

CAPITOLUL 10
10.1
10.2
10.3
10.4
10.5
10.6
10.7
10.8
10.9

AFIAREA DATELOR DIN TABELE MULTIPLE......... 8-205

Definirea JOIN-urilor........................................................................ 8-206


Produsul Cartezian .......................................................................... 8-206
Echi-join ........................................................................................... 8-208
Non-echi-join ................................................................................... 8-212
Outer-join ......................................................................................... 8-214
Self Join ........................................................................................ 8-216
Definirea join-urilor folosind sintaxa SQL 1999 ............................... 8-218
Exerci ii ............................................................................................ 8-226

SUBINTEROGARI ....................................................... 10-265

Folosirea unei subinterog ri pentru a rezolva o problema ............ 10-265


Tipuri de subinterog ri................................................................... 10-267
Subinterogari single-row................................................................ 10-268
Utilizarea func iilor de grup ntr-o subinterogare ........................... 10-269
Erori ce pot apare la folosirea subinterog rilor.............................. 10-270
Subinterogari multiple-row............................................................. 10-272
Utilizarea operatorului ANY n subinterogarile multiple-row.......... 10-273
Utilizarea operatorului ALL n subinterog rile multiple-row........... 10-273
Returnarea valorilor nule n rezultatul subinterog rii..................... 10-274
1-3

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
10.10
10.11
10.12
10.13
10.14
10.15
10.16
10.17
10.18
10.19
10.20

Subinterogari de coloane multiple ................................................. 10-275


Compararea coloanelor (pereche i nepereche)........................... 10-275
Folosirea unei subinterog ri n clauza FROM ............................... 10-276
Expresii scalare returnate de subinterog ri................................... 10-277
Subinterog ri corelate ................................................................... 10-279
Folosirea operatorului EXISTS...................................................... 10-282
Folosirea operatorului NOT EXISTS ............................................. 10-284
Clauza WITH ................................................................................. 10-284
Interog ri ierahice.......................................................................... 10-286
Parcurgerea arborelui punctul de start ....................................... 10-288
Exerci ii ......................................................................................... 10-295

CAPITOLUL 11
302
11.1
11.2
11.3
11.4
11.5
11.6
11.7
11.8
11.9

INSTRUC IUNI PENTRU MANIPULAREA DATELOR.... 11-

Introducerea datelor-comanda INSERT ........................................ 11-303


Modificarea datelor - comanda UPDATE ...................................... 11-308
tergerea datelor - comanda DELETE.......................................... 11-311
Instruc iunea MERGE.................................................................... 11-314
Tranzac ii ....................................................................................... 11-316
Consisten a la citire ....................................................................... 11-321
Correlated UPDATE ...................................................................... 11-323
Correlated DELETE....................................................................... 11-324
Exerci ii .......................................................................................... 11-333

CAPITOLUL 12

ANEXA 1...................................................................... 12-337

STRUCTURA TABELELOR FOLOSITE N CARTE I DATELE STANDARD


CON INUTE DE ACESTEA ...................................................................... 12-337
BIBLIOGRAFIE

1-4

12-343

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Capitolul 1 Sisteme de gestiune a bazelor de date


Sistemele de Gestiune a Bazelor de Date (SGBD) reprezint
componenta software a unui sistem de baze de date care asigur
independen a, rela iile logice ntre date i o redundan minim a acestora. Ele
trebuie s permit dezvoltarea rapid i la un cost avantajos a programelor de
aplica ii pentru exploatarea datelor dintr-o structur complex , precum i
accesul rapid la date i asigurarea securit ii lor. Altfel spus, SGBD-ul este un
ansamblu de programe care permite utilizatorilor s interac ioneze cu o baz de
date, conceput de regul pentru volume mari de date, a c ror gestiune impune
nu numai o riguroas structurare dar i o accesare i prelucrare ra ional .
1.1

Arhitectura sistemelor de gestiune a bazelor de date

Datorit dezvolt rii tot mai accentuate a IT-ului (Information Technology)


n majoritatea domeniilor de activitate i datorit extensiei sferei problemelor
rezolvate cu ajutorul tehnicii de calcul, a ap rut ca o necesitate specializarea
pachetelor de programe n func ie de domeniile abordate: matematic , tehnic ,
economie, proiectare, comunica ie etc.
Sistemele de Gestiune a Bazelor de Date sunt sisteme informatice
software specializate n stocarea i prelucrarea unui volum mare de date. Sunt
implicate dou concepte: baza de date i gestiune. Prin baza de date se
n elege: datele de prelucrat i modul de organizare a acestora pe suportul fizic
de memorare i prin gestiune totalitatea opera iilor ce se vor aplica asupra
datelor. Dintre avantajele organiz rii informa iilor n baza de date fa de
fiierele clasice (de tip ASCII, binare, etc.) putem aminti redundan a minim a
informa iilor, accesul mai uor la date i posibilitatea abord rii domeniului
implementat din punct de vedere sistemic (ca un sistem unitar).
Pia a SGBD-urilor este dominat nc de SGBD-urile rela ionale i
distribuite, dei se observ o dezvoltare a SGBD-urilor orientate obiect.
Lucr rile practice de baze de date din aceast carte vor cuprinde prezentarea
SGBD-ului FoxPro i Oracle.
Teoria i practica SGBD-urilor ofer diferite arhitecturi diferen iate n
func ie de componentele, limbajele utilizate i posibilit ile de prelucrare a
datelor, existnd totui preocup ri de standardizare a acestora.
n general, n arhitectura unui SGBD intr cel pu in 5 clase de module:

Programele de gestiune a bazelor de date. Aceast clas de


module realizeaz accesul fizic la date ca urmare a unei comenzi
primite printr-un program de aplica ii sau interactiv de la tastatur ;
Limbajul de definire a datelor (LDD). Este componenta care permite
1-5

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

traducerea (compilarea sau interpretarea, dup caz) i descrierea


naturii datelor i a leg turilor logice dintre ele, fie la nivel global (sub
forma schemei conceptuale), fie la nivelul specific fiec rei aplica ii
(sub forma schemei externe sau sub-schemei). Aceste defini ii se
memoreaz ntr-un fiier special numit Dicionarul de date.
Limbajul de manipulare a datelor (LMD). Aceast component
permite gestionarea i actualizarea datelor dintr-o baz (scrierea
unor noi date, modificarea valorii unor date, tergerea unor date
perimate sau eronate). Comenzile acestui limbaj depind de SGBDul utilizat (cu limbaj gazd sau SGBD autonome). n SGBD-urile cu
limbaj gazd enun urile trebuie incluse ntr-un program scris cu un
limbaj gazd : PL/1, ASSEMBLER, C etc. n SGBD-urile autonome
se dispune de un limbaj la care se ataeaz un limbaj de
interogare.
Utilitarele de ntreinere a bazei de date. Un SGBD trebuie s ofere
o gam variat de programe utilitare care s permit gestionarea
de c tre operator a bazei de date. Utilitarele variaz de la un sistem
la altul i depind de complexitatea SGBD-ului. Acestea pot efectua
urm toarele opera ii: crearea versiunii ini iale a bazei de date i
nc rcarea acesteia folosindu-se fie o copie creat anterior, fie date
neorganizate; crearea i actualizarea jurnalelor tranzac iilor
realizate asupra bazelor de date: reorganizarea bazei de date
pentru recuperarea spa iului nefolosit; reorganizarea structurii fizice
i logice dup fiecare tranzac ie; restructurarea bazei de date dup
un incident logic sau fizic, cu refacerea st rii anterioare; diverse
statistici ce permit cunoaterea activit ii i utiliz rii bazei de date;
actualizarea schemei i sub-schemei f r rescrierea i compilarea
lor; detectarea sp rg torilor regulilor de integritate definite, f r a
fi necesar intrarea n baza de date; realizarea unei copii
permanente a bazei de date n scopuri de securitate.
Componentele de control ale programelor de aplicaii. Acestea
constituie mijloace de prevenire i corectare a anumitor erori ce pot
s apar n condi ii de exploatare multi-utilizator.

1.2

Obiectivele i funciile unui sistem de gestiune a bazelor


de date

Succesul unui SGBD este sus inut prin realizarea urm toarelor obiective:

1-6

asigurarea independenei datelor. Independen a datelor poate fi


definit drept imunitatea programelor de aplica ii la schimbarea
structurii de memorare i /sau a strategiei de acces. Independen a

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

datelor trebuie urm rit att la nivel fizic ct i la nivel logic.


Independena fizic asigur modificarea datelor i a tehnicilor fizice
de memorare, f r
rescrierea programelor de aplica ii.
Independena logic ofer posibilitatea ad ug rii de noi articole
sau extinderea structurii globale f r a necesita rescrierea
programelor;
asigurarea integritii datelor prin existen a unor proceduri de
validare sau a unor protocoale de control concurent, precum i a
unor proceduri de refacere a bazei de date dup incidente;
asigurarea unei redundane minime i controlate a datelor prin
definirea unui element de structur , cu o cantitate ct mai mic de
date, evitndu-se n acelai timp ambiguitatea;
asigurarea unor faciliti sporite de utilizare a datelor prin:
folosirea datelor de c tre mai mul i utilizatori n diverse aplica ii,
accesul simplu i multicriterial al utilizatorilor la date, f r a fi
necesar cunoaterea structurii ntregii baze de date; existen a
unor limbaje performante de interogare etc.;
asigurarea partajrii datelor, adic asigurarea accesului mai
multor utilizatori la aceleai date pe baza unor criterii de prioritate
i dezvoltarea unor aplica ii f r a se modifica structura bazei de
date;
asigurarea securitii datelor prin intermediul unor canale
corespunz toare i definirea unor restric ii de autorizare la
accesarea datelor.

Plecnd de la aceste obiective, rezult c orice SGBD trebuie s


ndeplineasc urm toarele func ii: de descriere, de manipulare, de utilizare.
Func ia de descriere permite definirea structurii bazei cu ajutorul
limbajului special de descriere a datelor, stabilind criterii de validare a acestora,
metode de acces i de asigurare a confiden ialit ii i integrit ii lor. Toate
aceste elemente se reg sesc n ceea ce se numete schema bazei de date.
Defini iile se stocheaz ntr-un ansamblu de tabele, memorate n dic ionarul de
date.

1-7

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Func ia de manipulare asigur prin intermediul limbajului special
derularea urm toarelor activit i: nc rcarea bazei de date, ad ugarea de noi
nregistr ri, tergerea unor nregistr ri, editarea total sau par ial a unor
nregistr ri, ordonarea nregistr rilor, c utarea logic sau fizic a nregistr rilor
etc.
Func ia de utilizare permite comunicarea ntre utilizatori i baza de date
prin intermediul unor interfe e avantajoase utilizatorilor. n felul acesta se
creeaz un mediu favorabil utilizatorului care la ora actual beneficiaz de
prelucrarea n timp real, de arhitecturile client-server, servicii Internet etc. n
cadrul realiz rii acestei func ii interac ioneaz diveri utilizatori, literatura de
specialitate oferind mai multe clasific ri sau grup ri. Dintre acestea prezent m
n continuare doar cteva astfel de grup ri.
Raportul ANSI/SPARC 1975 prezint trei categorii de utilizatori (roluri
umane) ce definesc schemele dintr-o arhitectur de sistem bazat pe SGBD:
- persoana sau grupul de persoane care definete schema conceptual
a bazei de date. Aceast schem furnizeaz o viziune pe termen
lung i este baza pentru declara iile de securitate-integritate i
standardizare impuse celorlalte tipuri de utilizatori;
- administratorul bazei de date care are responsabilitatea definirii
schemei interne a bazei de date i a ntre inerii acesteia. n acelai
raport sunt prezentate trei categorii de administratori:
administratorul structurii organiza ionale care asigur gestionarea
global
a aplica iilor curente i identificarea celor viitoare;
administratorul aplica iilor care are rolul de a dezvolta schemele
externe (sub-schemele) pentru aplica iile utilizator; administratorul
de date care opereaz la nivelul schemei de date preciznd
necesarul i disponibilitatea datelor;
- programatorii de aplicaii i utilizatorii finali care comunic cu SGBD-ul
prin intermediul limbajului de manipulare sau a limbajului de
interogare.

1.3

Evoluia i clasificarea sistemelor de gestiune a bazelor


de date

Perfec ionarea SGBD-urilor a avut loc n paralel cu evolu ia


echipamentelor de culegere, memorare, transmitere i prelucrare a datelor, pe
de o parte, i cu evolu ia metodelor i tehnicilor de organizare a datelor, pe de
alt parte.
Literatura i practica de specialitate ofer o mare diversitate de sisteme
1-8

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
de gestiune a bazelor de date, care sintetic pot fi prezentate n trei genera ii.
Prima genera ie este situat n timp la sfritul anilor `60 i nceputul
anilor 70 i include modelul ierarhic i modelul re ea de organizare a datelor n
baze de date.
Modelul ierarhic are o structur de tip arborescent, legat puternic de
principiile de descriere a datelor specifice limbajelor din genera ia
corespunz toare. Fiecare nivel de date este constituit din una sau mai multe
grupe de date care se pot i ele descompune la rndul lor.
Modelul reea ncearc s nl ture lipsurile modelului precedent,
propunnd o structur de date mai bogat pe baza leg turilor posibile i
conducnd la construirea unei re ele ntre acestea.
Genera ia a doua, situat n timp la sfritul anilor 80 i nceputul anilor
90 cuprinde n principal modelele rela ionale. Structura datelor este format
dintr-un ansamblu de rela ii sau tabele f r leg turi fizice ntre ele. Apropierea
dintre date este ob inut prin utilizarea unei algebre ntre tabele, considerate
ca operanzi. Din aceast genera ie fac parte: IBM DB2, Oracle, Microsoft SQL
Server, PARADOX, FoxPro etc.
Genera ia a treia ap rut la nceputul anilor 90. Aceste sisteme se
bazeaz pe principii mult mai complexe dect precedentele i permit
gestionarea unor informa ii foarte variate. Se pot ncadra n aceast genera ie 4
subclase de SGBD: orientate obiect, func ionale, deductive i multimedia.
Sistemele orientate obiect permit descrierea elementelor unei baze
utiliznd conceptele abord rii obiectuale care ine seama de
aspectele statice i dinamice ale obiectelor. Aceast abordare se
caracterizeaz , n principal, pe opera ia de ncapsulare, adic pe
reunirea n aceeai unitate a caracteristicilor statice i dinamice ale
obiectelor de gestionat. n plus, este posibil reutilizarea obiectelor
deja definite. Aceast caracteristic reduce considerabil programarea
defensiv datorit descrierii intrinseci f cut obiectelor. Obiectele
definite n baz au capacitatea de a transmite descenden ilor,
ansamblul caracteristicilor lor prin motenire.
Sistemele funcionale au la baz no iunile de entitate i func ie i au fost
introduse n 1979 de Shipman. Pentru fiecare entitate (obiect) de un
anumit tip exist o colec ie de func ii care sunt aplicate acelui obiect,
definind atributele obiectului i exprimnd asocierile dintre entit i.
Modelul func ional devine opera ional prin intermediul SGBD-urilor
func ionale care ofer mecanisme i instrumente de descriere i
manipulare a datelor prin intermediul limbajelor func ionale.
Sistemele deductive utilizeaz reguli de inferen pentru a exprima situa ii
bine sau mai pu in bine definite din mediul unei organiza ii. Ele permit
1-9

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
s se r spund cererilor care comport exprimarea ntr-o logic mai
mult sau mai pu in vag . n general astfel de baze de date sunt
cuplate cu sistemele expert sau cu un nivel din baza regulilor scrise
n PROLOG, LISP, sau ntr-un alt limbaj de inteligen artificial .
Sistemele multimedia permit stocarea i administrarea altor informa ii
dect cele clasice precum: imagini, fotografii, muzic , sunete etc.
Sistemele din aceast categorie, care se comercializeaz deja,
permit organizarea de birouri f r hrtie, propunnd gestiunea
diferitelor documente (imprimate) pe discul optic cu proceduri de
nregistrare prin scanare precum i prin proceduri de consultare i
manipulare.
Preocup rile proiectan ilor de SGBD sunt concentrate spre construirea
bazelor de date pe modele obiectuale, deductive i multimedia, fiind propuse
mai multe solu ii de combinare i extindere a modelelor prezentate: nglobarea
n SGBD-urile rela ionale a elementelor ce definesc tehnologia actual ,
persisten a obiectelor prin extinderea actualelor sisteme obiectuale, integrarea
tehnologiei semantice i obiectuale etc.
Clasificarea SGBD-urilor
Abordarea sistemic a problematicii referitoare la SGBD-uri presupune i
clasificarea acestora, mai cu seam c literatura de specialitate prezint un
num r deosebit de mare de astfel de software-uri. Exist mai multe clase de
SGBD privite din diverse puncte de vedere: modelul de organizare folosit
(ierarhice, re ea, rela ionale, orientate obiect etc.), distribuirea resurselor
(integrate i distribuite teritorial), destina ie (public i privat ) i tehnica de
prelucrare (pe loturi, interactiv , mixt ). Ne oprim, n continuare, doar asupra
ctorva astfel de criterii de clasificare.
Dup sistemul de calcul pe care se implementeaz SGBD-urile pot fi:
pentru mainframe-uri;
pentru minicalculatoare;
pentru microcalculatoare.
La ora actual tendin a este de generalizare i standardizare a SGBDurilor conferindu-li-se atributul de cross platforma pentru a putea fi rulate pe
ct mai multe medii de operare (DOS, WINDOWS, MAC, UNIX, Linux, OS/2
etc.).
n func ie de limbajul utilizat exist dou clase de SGBD-uri:
cu limbaj gazd: asigur crearea, actualizarea i interogarea bazei de
date utiliznd limbaje de nivel nalt propriu sistemului de calcul pe
1-10

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
care se implementeaz baza de date. Prezint avantajul exploat rii
facilit ilor limbajului de nivel nalt i dezavantajul complexit ii
formul rii cererilor de prelucrare;
cu limbaj autonom (propriu): folosesc limbaje speciale care sunt
independente de limbajul gazd i chiar fa de sistemul de calcul
ceea ce asigur un grad ridicat de portabilitate. Avantajul acestor
SGBD-uri concretizat n larga lor utilizare, l reprezint simplitatea
formul rii cerin elor.
n func ie de organizarea i structurarea datelor gestionate SGBDurile sunt:
ierarhice i reea;
relaionale;
obiectuale;
obiectual-relaionale.
Din punct de vedere a modului de localizare a bazelor de date
SGBD-urile sunt:
centralizate, care presupun ca datele s fie concentrate ntr-un
singur loc pe un server, ca surs unic de informare i/sau
raportare (VisualFoxPro, Access, etc.);
distribuite, care presupun ca datele s fie repartizate geografic n
mai multe puncte n func ie de locul lor de producere, cu
posibilitatea acces rii datelor din orice punct definit (Oracle, IBM
DB2, Informix).
La ora actual datorit prolifer rii prelucr rilor n re ea de calculatoare tot
mai multe SGBD-uri dispun de o component de gestiune distribuit a datelor.

1.4

Conceptul de baz de date relaional

Dr. E.F. Codd a propus modelul rela ional pentru baze de date n 1970
baza
(http://www.wikipedia.org/wiki/Edgar_F._Codd), model ce reprezint
pentru sistemele de gestiune a bazelor de date (DBMS).
Principiile modelului rela ional au fost subliniate pentru prima data de Dr.
E.F. Codd n lucrarea numit Un model rela ional de date pentru b nci de date
mari. Cele mai populare modele ale vremii erau cele ierarhice i de re ea sau
chiar fiierele simple de date. Apoi DBMS-urile au devenit foarte populare
pentru uurin a n utilizare i flexibilitatea lor.
Componentele modelului rela ional sunt:
1-11

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Colec ie de obiecte i rela ii care stocheaz date;

Un set de operatori care ac ioneaz


produce alte rela ii;

asupra rela iilor pentru a

Reguli de integritate a datelor pentru consisten

i acurate e.

Definirea unei baze de date rela ionale


O baza de date rela ional folosete rela ii sau tabele bi-dimensionale
pentru stocarea informa iilor. De exemplu, pentru stocarea informa iilor despre
angaja ii unei companii, ntr-o baz de date rela ional ve i g si informa ia
stocat n: tabela angaja i, tabela departamente i tabela salarii.
Modelele de date sunt dezvoltate de proiectan i pentru a explora idei i
pentru a mbun t i n elegerea proiect rii bazei de date. Modelele ajut n
comunicarea conceptelor n min ile oamenilor. Ele pot: comunica, pune pe
categorii, descrie, specifica, investiga, analiza, imita i implica. Scopul este de a
produce un model care s se potriveasc i s r spund tuturor cerin elor i
care s fie n eles de utilizatorul final, care s con in detalii suficiente pentru ca
un programator s construiasc sistemul de baze de date i/sau s dezvolte o
aplica ie care s lucreze cu baze de date.

Modelul
sistemului
asa cum este
vazut de catre
client

Modelul
Entitate-relatie
a ceea ce este dat de
catre client
(modelul logic)

Modelul tabelar
(modelul fizic)
Server

Tabele pe disc

Modelul Entitate Rela ie permite crearea unei diagrame entitate rela ie


pe baza specifica iilor informa ionale ale problemei.
1-12

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

ANGAJAT
#* numr
* nume
o meseria

asignat la
compus din

DEPARTAMENT
#* numr
* nume
o localitate

Scenariu:
se asigneaz unul sau mai mul i angaja i la un departament
cteva departamente nu au nici un angajat
ntr-un sistem real, data este divizat n categorii discrete sau entit i. Un
model entitate rela ie (ER) este o ilustrare a entit ilor dintr-o problem i a
rela iilor dintre ele. Un model ER este derivat din specifica iile informa ionale ale
problemei i este construit n faza de analiza a sistemului. Modelul ER separ
informa iile cerute de problema de activit i. Chiar dac activit ile problemei se
schimb , tipul informa iilor trebuie s r mn constant. De aceea structurile de
date tind s r mn constante.
Avantajele modelului ER:
Documenteaz necesarul de informa ii pentru organiza ie ntr-o
form clar i precis ;
Prezint o imagine clar a scopului cerin elor informa ionale i uor
de n eles pentru proiectarea bazei de date;
Ofer un mediu efectiv de integrare a aplica iilor multiple.
Componente cheie:
Entitatea: Un obiect sau un grup de obiecte de acelai tip (cu aceleai
propriet i), cu o anumit semnifica ie, despre care este necesar a fi cunoscute
informa ii. Exemplu: departamente, angaja i, comenzi.
Atribut: Un aspect care descrie sau calific o entitate. Exemplu: pentru
entitatea Angajat atributele sunt: marca, meseria, data de angajare,
departamentul. Fiecare atribut poate fi obligatoriu sau op ional.
Rela ie: Un nume de asociere dintre entit i care arat op ionalitatea sau
gradul asocierii. Exemplu: angaja i i departamente, comenzi i articole.
Identificator unic (UID Unique IDentifier) este orice combina ie de
atribute sau/i rela ii care servete la distingerea apari iilor unei entit i. Fiecare
apari ie a entit ii trebuie sa fie identificat unic.
1-13

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
1.5

Terminologie specific bazelor de date relaionale

O baza de date relaional con ine una sau mai multe tabele. O tabel
reprezint structura de baz a unui SGBDR (Sistem de Gestiune a Bazelor de
Date Rela ionale). O tabel con ine toate datele necesare despre un aspect al
lumii reale. Se consider exemplul tabelei Angaja i.

No iuni:
Un singur rnd sau o tupl reprezint informa ia necesar pentru un
angajat specificat. Fiecare rnd din tabel trebuie identificat de o cheie
primar, care nu permite rnduri duplicate. Ordinea rndurilor nu este
semnificativ .

O coloan sau un atribut con ine marca angajatului care este i cheie
primar. Marca (cheia primar ) identific n mod unic un angajat n
tabela EMP. O cheie primar trebuie s con in o valoare. Alte tipuri de
coloane reprezint alte informa ii (de ex: func ia). Ordinea coloanelor nu
este important . Coloana care con ine num rul de departament este
numit i cheie extern. Cheia extern con ine coloane care definesc
modul n care sunt n rela ie tabele diferite. O cheie extern refer o
cheie primar sau o cheie unic din alt tabel.

O coloan reprezint un domeniu de date dintr-o tabel . n exemplul


dat meseria este coloana ce con ine toate meseriile pentru to i
angaja ii.

Un cmp poate fi g sit la intersec ia dintre un rnd i o coloan. Poate


con ine o singur valoare.

Cmpurile pot s nu con in valori. Acestea se numesc valori null.

Referirea mai multor tabele - Fiecare tabel con ine date care descriu
exact o entitate. De exemplu tabela Angaja i con ine informa ii despre angaja i.
Deoarece datele despre entit i diferite sunt stocate n tabele diferite, este
necesar combinarea a dou sau mai multe tabele pentru a afla r spunsul la o
interogare. De exemplu dac vre i s afla i localitatea n care este situat
departamentul n care lucreaz un anumit angajat sunt necesare tabelele
Angaja i i Departamente. Un SGBDR permite combinarea tabelelor diferite
folosind chei externe. O cheie extern este o coloan sau o combina ie de
coloane care refer o cheie primar din acelai tabel sau din unul diferit.
Propriet ile bazelor de date rela ionale
O baza de date rela ional :
Poate fi accesat i modificat
specifice;
1-14

prin execu ia instruc iunilor

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Con ine o colec ie de tabele f r pointeri fizici;


Folosete un set de operatori.

ntr-o baz de date rela ional nu trebuie specificat calea de acces la


tabele i nu trebuie cunoscut modul de aranjare fizic.
Obiecte - Un obiect este considerat ca o reprezentare a unui lucru din
lumea real . Cteva defini ii:
Un obiect este un pachet software care con ine o colec ie de
proceduri (metode) nrudite i date (variabile) - David Taylor,
Object-Oriented Technology: A Managers Guide Addison-Wesley
1981
Un obiect este un concept, abstrac ie sau lucru cu margini i
n elesuri fragile pentru problema de rezolvat - James Rumbaugh,
Object-Oriented Modeling and Design Prentice-Hall 1991
Modele obiect:
obiectele modeleaz o problem spre rezolvare;
modelul este definit n termeni de interac iune ntre obiecte;
modelele obiect se aseam n cu lumea real ;
cnd se lucreaz cu modele ne ax m mai mult n termenii aplica iei
i mai pu in la arhitectura sistemului de operare i cerin ele
mediului de dezvoltare.
Caracteristicile sistemelor obiectuale:
Prezint informa ia n forma obiect;
Clasific obiectele n tipuri de obiecte;
Motenete atribute i cod;
Ascunde date, cod i atribute;
Interac ioneaz cu alte obiecte;
Recunoate diferite obiecte f r analiz ;
Interpreteaz aceeai comand n moduri diferite;
Alte caracteristici:
Reprezint informa ia ca lucruri con inute intrinsec;
Clasific obiectele n tipuri de obiecte organizate n ierarhii
arborescente, unde un tip de obiect poate fi alt fel dect alt tip de
obiect (object type metadata);
Obiectele pot moteni tr s turile tipului sau de obiecte
(inheritance);
Pot ascunde date i procese referitoare la obiect n cadrul
obiectului (encapsulation). Aceasta permite schimb ri ale unei
componente specifice f r afectarea altor componente;
Interfa a cu alte obiecte (interface sau messaging);
1-15

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Recunoaterea diferitelor tipuri de lucruri i comportamentul lor f r
analiza lor;
Folosirea aceleai cereri pentru a invoca diferite implement ri ale
aceleai ac iuni pentru dou obiecte diferite (polymorphism);
1.6

Sisteme de gestiune a bazelor de date relaionale n


Oracle

Oracle furnizeaz un SGBDR flexibil - Oracle Database. Tr s turile


acestui SGBDR permit stocarea i gestiunea datelor cu toate avantajele
structurilor rela ionale plus PL/SQL, un motor care permite stocarea i
executarea unit ilor de program. Serverul permite utilizatorilor op iunea de
extragere de date bazat pe tehnici de optimizare. Sunt incluse tr s turi de
control a modului de accesare i folosire a datelor. Alte caracteristici sunt
consisten a i protec ia prin mecanisme de blocare.

Oracle Corporation este la ora actual cea mai mare companie de


software din lume care are produsele axate pe baze de date. Este o suprema ie
ctigat de aproximativ 20 de ani n fa a principalului concurent, IBM firma
care a dezvoltat primul sistem de management al bazelor de date, numit
System R, n anii 1970. Lansarea produsului Oracle a reprezentat startul n
domeniul bazelor de date rela ionale comerciale construite pe principiile
fundamentate matematic de c tre E.F.Codd. Software-ul care constituie baza
de integrare a tuturor celorlalte produse ale companiei este Oracle Server
serverul de baze de date ajuns acum la versiunea 10 (Oracle Database 10g
Release 2 (10.2.0.1.0)), disponibil pe mai multe sisteme de operare i platforme
hardware: Microsoft Windows pe 32 de bi i i 64 de bi i, Linux x86 pe 32 de bi i
1-16

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
i 64 de bi i, Linux Itanium, HP-UX PA-RISC (64 bi i), Solaris SPARC (64 bi i),
AIX 5L pe 64 bi i, etc.
Succesul firmei Oracle s-a bazat n primul rnd pe serverul de baze de
date, pe baza c ruia s-au dezvoltat de-a lungul timpului suita de dezvoltare
Oracle Developer Suite (care cuprinde Oracle Forms, Reports, Designer,
JDeveloper) pentru proiectarea de aplica ii, Warehouse Builder i Discoverer
pentru domeniul numit Business Intelligence, serverul de aplica ii bazat pe
J2EE Oracle Application Server i suita back-office Oracle Collaboration
Suite. n principiu toate aceste aplica ii satelit in pasul, ca denumire de
versiune, cu versiunea bazei de date.
Serverul de baze de date Oracle a c p tat de-a lungul timpului
mbun t iri care au men inut acest produs pe primul loc. Ca istoric, se poate
considera versiunea 2 ca fiind prima versiune complet
bazat
pe
caracteristicile rela ionale introduse de limbajul SQL.
Versiunea 3 se caracterizeaz prin rescrierea n ntregime a versiunii
anterioare n limbajul C pentru asigurarea portabilit ii pe mai multe platforme.
O alt caracteristic a versiunii 3 o reprezint respectarea principiului
atomicit ii frazelor SQL n cadrul tranzac iilor.
Versiunea 4 aduce ca noutate principiul consisten ei datelor la citire,
adic datele supuse prelucr rilor sunt intangibile celorlalte tranzac ii.
Versiunea 5 aduce mbun t iri n partea de client / server, aducnd o
r spndire a produsului bazat pe folosirea bazei de date prin accesarea de pe
terminale sau sta ii PC mai slabe, investi ia major fiind necesar doar pentru
server.
Versiunea 6 mbun t ete mecanismele de blocare care, ncepnd cu
aceast versiune, se face la nivel de linie permi nd ca o tranzac ie s nu
blocheze o tabel ntreag , ci numai liniile din tabel care sunt supuse
prelucr rii. n versiunea 7 se introduc procedurile stocate i declanatoarele
(triggeri n englez ).
Odat cu versiunea 7 a ap rut i varianta pentru calculatoare
personale: ORACLE Personal Edition 7.2, care permite dezvoltarea aplica iilor
f r a fi necesar conectarea la un server n re ea, ceea ce a crescut mult
popularitatea sistemului.
Versiunea 8 a introdus partea obiectual derivat din principiile
program rii orientate pe obiect ca o necesitate a creterii complexit ii structurii
datelor. Practic, ncepnd cu aceast versiune, Oracle a devenit o baz de date
obiectual-rela ional , fiind permis stocarea n baza de date att a structurilor
tabelare ct i a obiectelor folosind metoda map rii. Versiunea Oracle 8i este o
continuare a versiunii 8, la care se adaug un mediu RunTime Java direct n
motorul bazei de date pentru structurarea logicii procedurilor stocate i n
limbajul Java, nu numai n PL/SQL (limbajul procedural Oracle introdus din
versiunea 7). i-ul de la 8i vine de la aplica iile bazate pe noile tehnologii ale
internetului. Tot n acest context s-a introdus suportul pentru limbajul SQLJ care

1-17

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
permite ca instruc iunile SQL de acces la date sa fie incluse n proceduri sau
metode scrise n Java rezidente pe server sau pe sta iile client.
Versiunea 9i a mbun t it mecanismele de securitate a bazelor de date
prin introducerea conceptului de baz de date virtual , s-au ad ugat facilit i de
stocare i accesare a documentelor XML (eXtensible Markup Language),
mbun t ind astfel limbajul SQL, mbun t irea scalabilit ii prin introducerea
arhitecturii RAC (Real Application Cluster). Aceast arhitectur permite rularea
unui singur server de baze de date pe mai multe calculatoare independente
(noduri) care formeaz un complex, permi nd recuperarea transparent a
c derilor oric rui nod din re ea.
Versiunea 10g aduce ca noutate utilizarea tehnologiei grid ( g-ul vine de
la grid). Astfel s-a introdus stocarea dup principiul grid prin tehnologia ASM
(Automatic Storage Management) care elimin necesitatea unui sistem de
fiiere. Datele pot fi stocate pe calculatoare diferite, gestionate de sisteme de
operare diferite, avnd n comun faptul c ele sunt legate ntre ele n re ea i au
puse la dispozi ie capacitatea de stocare i procesare n ASM. Dac un disc
este ad ugat sau scos, ASM redistribuie datele n mod automat. Practic,
conceptul de grid este superior conceptului de cluster, grid-ul bazndu-se
practic pe cluster. Aa cum s-a procedat cu resursele de stocare la fel se
utilizeaz n comun i resursele de procesare, aplicndu-se principiile
echilibr rii nc rc rii (load balancing n englez ).

1.7

Sisteme de gestiune a bazelor de date relaionale n


FoxPro.

Ap rnd ca urma a lui DBASE III i dotat astfel nct sa satisfac


cerin ele unui SGBD modern, cu mediu de dezvoltare integrat, FoxPro are una
din cele mai atractive interfe e utilizator i un compilator foarte puternic.
Versiunea 1.02 ( anul 1989)
sintaxa se bazeaz pe Foxbase (i deci pe dBase III), dar a fost extins
cu multe instruc iuni i func ii utile;
mediu de programare confortabil, cu editoare integrate, operare cu
mouse-ul, prelucrarea simultan a mai multor fiiere;
depanator (debugger) i program de testare (trace) integrate n mediul
de dezvoltare, precum i generatoare de machete, de programe i
program de documentare automat a surselor;
compilatorul nu genereaz cod executabil complet (.EXE) ci se ob ine
un format intermediar care necesit existenta mediului FoxPro sau a
versiunii RunTime (vitez sporit ).

1-18

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Versiunea 2.0 (anul 1991)
compatibilitate sporit cu DBase IV (modul SQL incorporat, indeci
compui);
instrumente specifice de proiectare (generatoare de meniuri, rapoarte,
aplica ii);
utilizarea tehnologiei de optimizare Rushmore;
control superior al programatorului asupra evenimentelor din timpul
rul rii;
help senzitiv la context;
ruleaz pe re ele de calculatoare, n regim multiutilizator;
este furnizat n doua variante: standard (pentru maini cu procesor
8088 i 80286) i extins (pentru maini cu procesor 80386 i mai
puternice).
Versiunea 2.5 pentru DOS (anul 1993, dup preluarea de ctre Micrososft)
versiune mbun t it i mult mai rapid ;
optimizare Rushmore mbun t it ;
import / export date n formate Excel, Paradox;
este furnizat de asemenea n dou variante.
Versiunea 2.5 pentru WINDOWS (anul 1993)
facilit i specifice mediului Windows: Dynamic Data Exchange (DDE),
Object Linking and Embedding (OLE);
mbun t irea interfe ei cu utilizatorul;
facilit i multitasking;
controlul centralizat al perifericelor;
sistem Help performant.
Versiunea 2.6 pentru DOS (anul 1994)
mecanisme de convertire automat a elementelor DBase n elemente
FoxProW;
module de asisten a utilizatorului (Table/Raport/Screen/Query/Label
Wizard);
prezen a unui Catalog Manager;
varianta profesional permite conectivitate client-server.
Visual FoxPro 3.0 (anul 1995)
utilizarea principiilor program rii orientate obiect (POO);
mediu orientat pe evenimente (programarea orientat eveniment);
1-19

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

apropierea de modelul rela ional al bazelor de date (introducerea


dic ionarului de date);
extensii orientate obiect ale limbajului de programare;
extinderea instrumentelor de proiectare i a num rului de asisten i;
dezvoltarea rapid a aplica iilor prin gestionarul de aplica ii Project
Manager;
apropierea FoxPro-Acces.

Visual FoxPro 5.0 (anul 1997)


simplificarea accesului la fiierele de date sub alt format (via Open
DataBase Connectivity - ODBC);
mbun t irea mediului client-server;
facilit i web.
Visual FoxPro 6.0 (anul 2000)
mbun t irea Class Browser-ului pentru eficien a program rii;
noi facilit i n programarea orientat -obiect i web;
ad ugarea de noi metode i propriet i.
Visual FoxPro 7.0 (anul 2002)
editorul Visual FoxPro este mbun t it cu tehnologia IntelliSense
(autocompletare pe m sur ce se scrie cod);
servicii web ca i obiecte (clase);
suport XML;
accesul datelor prin providerul OLE DB.
Visual FoxPro 8.0 (anul 2003)
mbun t iri ale IDE (Interactive Development Environment): Task Pane
Manager, Toolbox, IntelliSense pentru fereastra Watch, etc.;
mbun t iri ale limbajului de programare (clase, comenzi i func ii noi);
introducerea noii clase XMLAdapter i clase XML Web Services;
conectivitate la date aflate la distan folosind clasa CursorAdapter;
introducerea tipului autoincrement;
inserarea rndurilor prin comanda SQL Select.
Visual FoxPro 9.0 SP2 Sedna CTP (anii 2004 - 2008)
ultima versiune anun ndu-se stoparea dezvolt rii produsului de c tre
Microsoft, acesta convergnd de-a lungul ultimilor 8 ani c tre Microsoft
SQL Server;
solu ie compatibil .NET cuprinznd i servicii Web XML;
1-20

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

compatibilitate i interoperabilitate m rit cu SQL Server pentru a


facilita schimbul de date ntre cele dou produse (introducerea noilor
tipuri de date Varchar, Varbinary i Blob);
introducerea func iei CAST( ) pentru conversia ntre tipuri de date;
introducerea func iei inline ICASE( ) similar cu instruc iunea DO
CASE;
mbun t irea raport rii;
mbun t iri la limbajul SQL (eliminarea limit rii la 9 clauze de join i
subinterog ri n comanda SQL Select);
eliminarea limit rilor pentru dimensiunea irurilor (array) i lungimea
procedurilor;
Tolbox-ul este dock-abil c tre Desktop sau alte ferestre IDE (n special
s-a lucrat la dock-abilitate i la clase i func ii).

Avantaje n utilizarea FoxPro:


tehnici de optimizare performante;
limbaj performant de descriere i manipulare a datelor;
ncorporarea unui modul SQL foarte rapid;
mediu favorabil elabor rii programelor puternic modularizate i
structurate, orientate obiect;
mecanisme evoluate de conversie a programelor i a datelor (DBaseFoxPro), suport bine pus la punct pentru XML;
utilizarea n re ele de microcalculatoare, ca i client COM i COM
server ;
instalarea modular n func ie de necesit i i posibilit i;
include instrumente de proiectare de tip 4GL (4-th Generation
Language);

Dezavantajele sistemului FoxPro:


relativa simplitate a mediului (nu se pot elabora aplica ii foarte
complexe);
nu este un sistem rela ional pur (de exemplu, lipsa dic ionarului de date
la versiunile mai mici de 3.0);
nu prezint intrinsec caracteristici client-server, prezint dezavantaje n
rol de server ntr-o arhitectur client-server;
nu este recomandat pentru WAN (Wide Area Network);
nu prezint modalit i avansate de protec ie i securitate a datelor;
compatibilitatea versiunilor nu este asigurat n toate cazurile;
viteza de execu ie este variabil (influen at de mul i factori).
1-21

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Capitolul 2 Concepte i elemente de baza n FoxPro.


Sistemul FoxPro se adreseaz , n principal, c tre dou categorii de
utilizatori :
proiectan ii i programatorii care scriu aplica ii n FoxPro.
utilizatorii finali care i pot administra cu uurin datele, folosind
interfa a utilizator;

FoxPro lucreaz cu urm toarele elemente de baz :


fiier de date: colec ie de informa ii organizate matricial;
fiier index: colec ie de informa ii auxiliare asociate unui fiier de date
cu rolul de a permite parcurgerea acestuia ntr-o anumita ordine,
respectiv pentru reg sirea rapid a informa iilor pe baza unor coduri;
machet (ecran, form): interfa a de afiare i/sau de introducere a
informa iilor ntr-un fiier de date;
raport : forma de afiare a informa iilor dintr-un fiier de date la ecran,
imprimant sau fiier, avnd la baza principiul benzilor;
interogare: fiier de date virtual, ob inut din unul sau mai multe fiiere
de date fizice, interconectate ntre ele pe baza unor rela ii;
program: colec ie de instruc iuni FoxPro ordonate conform unui
algoritm ce urm rete, n general, prelucrarea informa iilor din unul sau
mai multe fiiere;
aplica ie: program special ce integreaz elementele FoxPro care au ca
scop realizarea unui grup de opera ii unitare;
proiect: fiier de date special ce integreaz elementele FoxPro care au
ca scop realizarea unui grup de opera ii unitare i care se folosete
pentru generarea de aplica ii i programe (tip EXE).

n continuare sunt prezentate sumar aceste elemente de baz ale


mediului FoxPro, urmnd ca pe parcursul celorlalte laboratoare s se prezinte
instruc iunile i modalit ile de lucru cu aceste elemente.
Fiier de date - reprezint conceptul central al sistemului FoxPro

Fiierele de date FoxPro au o organizare special ilustrat


urm toare.

2-22

n figura

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
ANTET FIIER zona n care se p streaz informa iile despre
structura fiierului i anume: num rul de cmpuri (coloane) din
fiier, num rul de articole, data i ora ultimei actualiz ri. Pentru
fiecare cmp se re in: numele, tipul, lungimea, informa ii de
index.
COLOAN
ARTICOL
CMP

Se disting dou p r i importante n acest fiier: zona propriu-zis de


informa ii mp r it n rnduri numite articole i coloane de cmpuri i antet fiier
n care se p streaz informa iile de organizare a zonei propriu-zise.

ARTICOL: por iune elementar a fiierului la care utilizatorul


are acces la un moment dat; articolul este format din mai multe
cmpuri.
CMP: unitatea elementar de memorare n fiier ce se
reg sete la intersec ia dintre un articol i o coloan .
COLOANA: toate cmpurile dintr-un fiier ce se
caracterizeaz prin acelai nume, tip, lungime i se afl n
articole diferite.

Fiier index
Unui fiier de date FoxPro i se pot asocia unul sau mai multe fiiere
index cu scopul de a permite reg sirea rapid a articolelor n func ie de cheile
realizate pe baza unor cmpuri sau combina ii de cmpuri.
Organizarea fiierului index este prezentat n figura urm toare:

2-23

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
ANTET INDEX

1
2
i`
n`
Valoare cheie (ordonat )

Num r de ordine articol n fiier

Valoare cheie: valorile cmpurilor sau combina iilor de cmpuri din fiierul de
date ordonate cresc tor sau descresc tor, dup op iune;
Nr. ordine articol n fiier: numerele de ordine ale articolelor din fiier.
Cu alte cuvinte un fiier index reprezint perechi formate din valori i
numere de articol pentru care s-au ob inut aceste valori, prin evaluarea unei
chei ordonate cresc tor sau descresc tor.
Num rul de perechi n` este mai mic sau egal ca num rul de articole din
fiierul de date asociat.
Avantajul c ut rii n fiierul de date printr-un fiier index asociat rezult
tocmai din faptul c valorile sunt ordonate, deci c utarea n index este relativ
simpl i rapid , dup care, prin ob inerea num rului de ordine al articolului
c utat, c utarea n fiierul de date devine de asemenea simpl i uoar .
n sistemul FoxPro, ncepnd cu versiunea 2.0 s-a introdus un nou tip de
fiier index i anume fiierul multiindex compact (CDX). Fiierul multiindex se
aseam n cu cel monoindex numai ca are mai multe perechi de coloane
valoare cheie-nr. ordine articol n fiier. Perechile de coloane valoare cheie i
nr. ordine articol au nume unic relativ la fiier i poarta numele de index (tag).
Macheta Crearea i gestionarea unei machete are la baz un program
special care realizeaz opera ii de afiare i/sau opera ii de ntre inere a
fiierelor de date, realiznd astfel o interfa ntre utilizator i sistemul FoxPro.
Avantajul folosirii machetelor const , n primul rnd, n existen a unui
editor specializat n crearea i modificarea acestor machete ntr-un mod facil.
De asemenea limbajul de programare dispune de instruc iuni de lucru cu
machete.
Raportul reprezint modalitatea prin care se pot realiza opera ii de
afiare sau de tip rire a informa iilor din fiierele de date. Un raport con ine mai
multe benzi pentru o grupare lizibil a informa iilor. Avantajul folosirii rapoartelor
const , n primul rnd, n existen a unui editor specializat n crearea i
2-24

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
modificarea acestora, n care este suficient s definim informa iile (text utilizator
i cmpuri) care se vizualizeaz n fiecare banda pentru ca afiarea/tip rirea
informa iilor s aib loc n forma dorit .
Interogarea (Query) Reprezint un fiier de date virtual ce nglobeaz
date din mai multe fiiere fizice de date prin stabilirea de rela ii ntre cmpurile
de acelai tip. Se permite de asemenea filtrarea informa iilor (cmpuri i/sau
articole) din oricare din fiierele fizice. FoxPro dispune de un editor specializat
n crearea i modificarea lor. Avantajul folosirii interog rilor const n economia
de spa iu necesar memor rii unui fiier virtual fa de unul fizic echivalent,
precum i din ntre inerea uoar a elementelor componente.
Programul reprezint unitatea elementara n care se pot grupa
instruc iunile, conform unui algoritm. La nivelul sistemului, programele se
ntre in printr-un editor de texte ncorporat.
Aplica ia ca program integrator de elemente FoxPro, se poate realiza
i pe c i tradi ionale folosind editorul de programe i scriind efectiv un astfel de
program. Metoda aceasta este specific majorit ii sistemelor de dezvoltare
programe n diferite limbaje de nivel nalt (B. Pascal, B C++ etc.). Fa de
acestea, sistemul FoxPro dispune de un editor specializat n proiectarea de
programe prin integrarea diferitelor elemente FoxPro, bazat pe no iunea de
proiect.
Proiectul este un fiier de date special, integrator de obiecte FoxPro,
care se folosete pentru generarea de aplica ii sau programe executabile.
Sistemul FoxPro este capabil s creeze dou tipuri de formate executabile :
primul numit compact, care necesit existen a unor biblioteci FoxPro, iar al
doilea numit stand-alone, care nu necesit nici un fiier suplimentar pentru a fi
lansat n execu ie.
2.1

Descrierea mediului integrat

FoxPro este un sistem ce dispune de un mediu integrat compus din


modul de execu ie, compilator ncorporat n sens FoxPro, generator (pentru
machete, interog ri, meniuri, aplica ii), interfa utilizator (formata din Meniul
Sistem, Fereastra de Comanda, linia de stare), editoare, depanator simbolic la
nivelul limbajului (Trace-Debug), modul SQL inclus, help, istoric al comenzilor
cu posibilit i de editare ca la un program (fereastra Command), alte utilitare
(sistem de gestiune a fiierelor DOS-System, Filer, calculator, etc. ).

2-25

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
2.2

Tipuri de date n FoxPro, operatori, funcii

Un tip de dat reprezint o caracteristic a datelor prin care se


stabilete ce opera ii se pot executa asupra lor, modul de codificare a datelor n
memoria calculatorului, semnifica ia acestor date.
Tipurile de date acceptate de limbaj sunt: numeric, logic, dat
calendaristic , ir de caractere, memo, general.
Pentru fiecare tip de dat se vor prezenta: modalitatea de specificare a
tipului de dat , operatorii ce se aplic acestor date, comenzile i func iile
referitoare la datele de tipul respectiv.
Pentru mai multe detalii asupra func iilor sau instruc iunile prezentate
se recomand a se consulta Help-ul.
Tipul numeric memoreaz numere pozitive/negative cu punct zecimal fix;
lungimea cmpului numeric este limitata la 20 cifre (semnul i
punctul zecimal ocupa cte o cifra !). Se folosete pentru a stoca
valori numerice n cmpurile unui tabel, valorile numerice returnate
de func ii, variabile de tip numeric, constante numerice. Se pot
eviden ia urm toarele:
Tipul numeric simplu (Numeric sau Float) este tipul numeric clasic.
Zona de memorie alocat pentru acest cmp este dependent de
lungimea declarat de utilizator la crearea tabelului.
Tipul numeric dublu (Double) datele de acest tip reprezint numere
memorate n virgula mobil . Lungimea zonei de memorie ocupate este
fix , de 8 octe i, i se folosete pentru memorarea numerelor foarte
mari.
Tipul numeric ntreg (Integer) este specific numerelor ntregi.
Lungimea zonei de memorie ocupat este fix i este de 4 octe i. Se
prefer folosirea acestui tip de dat atunci cnd folosim valori ntregi,
mai mari de 9999.
Tipul monetar (Currency) se folosete la memorarea valorilor
exprimate n bani. Zona de memorie alocat are 8 octe i. O valoare de
acest tip se declar prin introducerea n fa a valorii numerice a
simbolului monetar ($).Exemplu A=$500.47

(,)
** , ^
*,/,%
+,2-26

Operatori algebrici
Grupeaz expresiile
Ridicare la putere
nmul ire,mp r ire,modulo
Adunare,sc dere

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Operatori rela ionali
Mai mic dect
<
Mai mare dect
>
Egal
=
Diferit de
<> , # , !=
Mai mic sau egal cu
<=
Mai mare sau egal cu
>=
Comanda de control pentru afiarea valorilor cu un anumit num r de zecimale
este : SET DECIMALS TO
Efect: determin num rul minim de cifre zecimale ce sunt afiate n cazul n
care nu se specific un format explicit de afiare. Implicit acest numr este 2.
Exemplu :
? 5/11
SET DECIMALS TO 4;
? 5/11
Funcii aplicabile tipului de dat numeric
Func ii referitoare la semnul datelor numerice:
returneaz valoarea absoluta a unei
expresii numerice
SIGN(<expn >)
returneaz un num r indicnd semnul
matematic al expresiei numerice
transmise ca parametru i anume: +1
pentru numere > 0, -1 pentru cele mai
mici ca zero sau 0
Func ii de aproximare a datelor numerice:
INT(<expn >)
trunchiaz
rezultatul unei expresii
numerice la partea ntreag
ROUND ( < expN1>, <expN2>) returneaz num rul expN1 rotunjit la
num rul de zecimale date de expN2.
Daca expN2 este negativ, se rotunjete
la zero
CEILING(<expn >)
returneaz cel mai apropiat ntreg mai
mare sau egal ca num rul expn
FLOOR(<expn >)
returneaz cel mai apropiat ntreg mai
mic sau egal ca num rul expn
ABS(<expn>)

2-27

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Func ii matematice elementare:


returneaz rezultatul ridic rii constantei
"e" la puterea dat ca parametru
LOG(<expn >)
returneaz logaritmul natural / zecimal
pentru num rul specificat
SQRT(<expn >)
returneaz
valoarea radicalului din
num rul (pozitiv) specificat
MOD ( <expN1>, <expN2>)
returneaz un ntreg, restul mp r irii
<expN1>
la
<expN2>.
Semnul
rezultatului este cel al <expN2>.
EXP(<expn >)

MAX (< exp1>, < exp2>, <


exp3>) sau MIN(< exp1>, <
exp2>, < exp3>)
RAND (< expN>)

returneaz maximul / minimul dintre


dou expresii numerice
returneaz
un num r aleator n
intervalul 0 i 0.999999. F r
parametru sau cu o valoarea negativa
se
folosete
pentru
ini ializarea
ceasului
sistem.
Implicit
este
0.1000001.

Tipul logic are un singur octet lungime i poate memora doua valori:
adev rat (.T.) True i fals (.F.) False; valoarea nul este tratat de
FoxPro ca fiind .F. Se folosete pentru a stoca valori n cmpurile de
tip logic ale tabelelor din baze de date, pentru a stoca valorile
returnate de func ii, variabile de tip logic sau alte expresii logice.

(,)
! , NOT
AND
OR

Operator logic
Grupeaz expresiile
Nega ie logic
I logic
SAU logic

Exemplu :
? NOT (1=3)
.T.
? (1<=4) AND (5>3)
.T.
? 6<3 OR 4*2=9
.F.
2-28

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Tipul dat calendaristic are 8 octe i lungime; datele de acest tip sunt
memorate intern de FoxPro ca cifre ASCII n format AAAALLZZ, ceea ce
permite efectuarea de calcule aritmetice cu ele. Implicit FoxPro nu
permite introducerea de date inexistente n fiierele de date. FoxPro
trateaz datele calendaristice invalide ca date calendaristice vide.
Formatul de afiare a datelor calendaristice este controlat de comanda:
SET DATE [TO] american | ansi | british | french | german | italian | mdy |
dmy | ymd
Tipul de dat calendaristic
AMERICAN
ANSI
BRITISH
FRENCH
GERMAN
ITALIAN
JAPAN
USA
MDY
DMY
YMD

Formatul de afiare
LL/ZZ/AA
AA.LL.ZZ
ZZ/LL/AA
ZZ/LL/AA
ZZ.LL.AA
ZZ-LL-AA
AA/LL/ZZ
LL-ZZ-AA
LL/ZZ/AA
ZZ/LL/AA
AA/LL/ZZ

Exemplu:
store {^2006-06-21} to data
? DATA
06/21/2006
SET DATE BRIT
? DATA
21/06/2006
SET CENTURY ON | OFF
Efect: ON se afieaz anul pe 2 cifre;
OFF se afieaz anul pe 4 cifre
SET MARK TO [<eC>]
Efect: Stabilete caracterul delimitator.

2-29

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Func ii pentru tipul de dat calendaristic


DATE()

ob inerea datei curente a sistemului

DOW(<eD>)

returneaz valoarea numeric a zilei s pt mnii


dintr-o expresie de tip dat calendaristic (ncepe
cu 1 pentru duminic )

CDOW(<eD>)

returneaz un ir de caractere ce reprezint


numele zilei din cadrul s pt mnii pentru dat
specificat

DAY(<eD>)

returneaz num rul zilei din cadrul lunii pentru data


specificat ;

MONTH(<eD>)

returneaz num rul lunii pentru data specificat

CMONTH(<eD>)

returneaz un ir de caractere ce reprezint


numele lunii din cadrul unei expresii de tip dat

YEAR(<eD>)

returneaz valoarea numeric a anului pentru data


specificat

DMY ( <expD>)

convertete o dat de intrare de tip calendaristic n


formatul zi-luna-an (returneaz un ir de caractere)

MDY ( <expC>)

convertete o dat de intrare tip calendaristic n


formatul lun -zi-an (returneaz un ir de caractere)
Func ii pentru controlul timpului

TIME(<eN>)

returneaz un ir de 8 caractere n formatul


HH:MM:SS ce reprezint ora exact a sistemului

Instruc iuni pentru controlul formatului de afiare al ceasului sistem:


SET CLOCK ON | OFF
SET CLOCK TO [<ROW>,<COL>]
SET HOURS TO [12 | 24]
Tipul de dat caracter permite memorarea oric rui caracter ASCII, limita
impus fiind de 254 caractere. irul de caractere este o mul ime
ordonat de caractere ce se trateaz ca un tot unitar. Fiec rui
caracter i se poate asocia un num r reprezentnd pozi ia acestuia
n cadrul irului (primul caracter are pozi ia 1).
2-30

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Se folosete pentru a stoca valori n cmpurile de acest tip ale tabelelor
din baza de date, valorile returnate de func ii pentru date calendaristice,
variabile de tip dat calendaristica, constante de tip dat calendaristic .
Operatori de concatenare
+

concateneaz iruri, eventualele spa ii finale ale fiec rui ir


r mnnd intre iruri

concateneaz iruri, spa iile finale fiind duse la sfritul


irului rezultat
Operatori de comparare

<,>,=

mai mic, mai mare, egal

<>, #

diferit de

<= sau =<

mai mic sau egal

>= sau =>

mai mare sau egal

folosit pentru concatenarea irurilor de caractere

==

identic

Observa ii: Operatorii de comparare returneaz un rezultat adev rat (.T.) sau
fals (.F.) putnd fi utiliza i n compararea a dou expresii de acelai
tip, indiferent de tipul lor. Compararea a 2 iruri de caractere se face
prin compararea codurilor ASCII ale caracterelor de pe pozi iile
echivalente.
Exemplu :
expresia :strada_ +Geroge _Cosbuc dup evaluare devine :
strada_George_Cosbuc
expresia Salut - prieteni ! dup evaluare devine: Salut prieteni!
Funcii pentru tipul de dat caracter
returneaz o valoare numeric ce indic
LEN (<expC>, <memo
num rul de caractere dintr-o expresie de tip
field>)
caracter sau dintr-un cmp memo
AT (<expC>,<expC>/<memo returneaz un num r ce indic pozi ia de la
care ncepe primul ir de caractere ca subir al
field>)
celui de-al doilea. Indicele primului caracter
dintr-un ir este 1.
LEFT (<expC>,/<memo

returneaz un ir de caractere ce indic


primele <expN> caractere din <expC>
2-31

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
ield>, <expN>)

RIGHT (<expC>,/<memo
field>, <expN>)

SUBSTR (<expC>,/<memo
field>, <start
position>,<number of
characters>)
LOWER(<expC>)
UPPER(<expC>)
LTRIM (<expC>)/RTRIM
(<expC>)
TRIM (<expC>)
CHR (<expC>)
MAX (<expC1>,<expC2>)
MIN (<expC1>,<expC2>)
SPACE (<expN>)
LIKE (<pattern>,<expC2>)

- dac <expN> este zero, returneaz irul vid


- dac <expN > este mai mare dect <expC>,
se returneaz <expC> n ntregime
extrage i returneaz un ir de caractere
compus din ultimele <expN> caractere ale
<expC>
- dac <expN> este zero sau mai mic ca zero,
returneaz irul vid
- dac <expN >este mai mare dect < expC>,
se returneaz <expC> n ntregime
extrage i returneaz din expC un subir de
caractere ce ncepe n pozi ia specificat
<start position> de lungimea indicat de
<number of characters>
convertete literele mari n litere mici
convertete literele mici n litere mari
terge spa iile de la stnga/ dreapta unui ir
de caractere i returneaz rezultatul
terge spatiile de la sfritul unui ir de
caractere i returneaz rezultatul
convertete o expresie numeric ntr-una de
tip caracter
returneaz
maximul/minimul dintre dou
expresii de tip caracter
genereaz un ir de caractere compus din
<expN> spa ii
compara cele dou
iruri de caractere
returnnd .T. sau .F.

Exemple :
? LEN ('ACEST ir ARE 26 CARACTERE')
? AT ('P','IN CE POZITIE ESTE LITERA P ? ')
? AT ('AB', 'ABAC,ABACD',2)
? AT ('AB', 'ABAC,ABACD,ABCDE',3)
? LEFT ('CALCULATOR',3)
? RIGHT ('CALCULATOR',3)
? SUBSTR('CALCULATOR',4,3)
? LOWER('AAAAAAAAAAAAAA')
2-32

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
? UPPER('bbbbbbbb')
STORE 'casetofon' TO c1
STORE ' portabil' TO c2
? c1,c2
? c1, LTRIM(c2)
USE AG
? 'SALARIUL D-LUI(D-NEI) '+ RTRIM(nume) + ' ESTE ' +
LTRIM(str(sal_baza))
? CHR(65)
? MAX(54, 39, 40)
? MAX(2^2, 10*12, 2*3 )
? MAX({31/01/2001},DATE())
? MAX('AAA', 'BBB', 'ABC')
? MAX('AAA', 'BBB', 'CCC')
? LIKE ('CARACTER', 'AR')
? LIKE ('RA', 'AR')
? LIKE ('AR', 'AR')
Tipul memo permite memorarea cantit ilor mari de text (f r limitarea la 254
caractere impus pentru datele de tip Caracter). De asemenea
permite memorarea de fiiere executabile, imagini, sunet. Singura
limitare este dat de dimensiunea spa iului liber pe disc.
Utilizarea cmpurilor memo se recomand n situa iile n care apar
diverse comentarii i, evident, nu n toate nregistr rile (ar fi ineficient s se
stabileasc un cmp caracter cu lungimea 70 doar pentru explica iile care apar
n cteva nregistr ri). Informa iile din cmpul memo nu sunt memorate n
acelai fiier cu restul cmpurilor.
O tabel ce con ine un cmp memo are asociat un fiier cu extensia FPT
numai pentru datele memo.
Editarea repetat a datelor memo conduce la fragment ri i se
recomand utilizarea comenzii PACK sau PACK MEMO ce determin
economie de spa iu pe disc i mbun t ete viteza de depozitare a datelor.
Pentru stabilirea dimensiunii blocurilor dintr-un cmp memo se poate
folosi comanda SET BLOCKSIZE. Majoritatea programatorilor folosesc
dimensiunea minima de 33 octe i (valoarea implicit este de 64 octe i) pentru un
2-33

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
bloc, care asigur
fiierului memo.

o eficien

mai mare n ceea ce privete dimensiunea

Tipul de dat general este utilizat pentru legarea i nglobarea obiectelor


(OLE) cum ar fi desene, documente, sunete, grafic .

Observa ie: Prioritatea n cazul folosirii ntr-o expresie a mai multor operatori
este urm toarea :
1. operatori matematici i pe iruri de caractere
2. operatori de comparare
3. operatori logici
4. toate opera iile ce sunt pe acelai nivel se execut de la stnga
la dreapta.
Pentru modificarea ordinii opera iilor se pot folosi parantezele rotunde.
2.3

Funcii pentru conversii ntre tipuri de date

Din num r n ir de caractere


convertete un num r expN ntr-un ir
STR (<expN>[,<lenght>]
de caractere, returnnd un ir de
[,<decimal>])
caractere.
<lenght> indic
num rul total de
caractere al irului creat, iar
<decimal> indic num rul de zecimale
Din ir de caractere n num r
convertete un ir de caractere ntr-un
VAL (<expC>)
num r, returnnd rezultatul. Num rul
de zecimale este cel dat de SET
DECIMALS
Din ir de caractere n dat
convertete o dat de intrare tip ir de
CTOD (<expC>)/{ expC)
caractere (delimitate ca ir de
caractere) ntr-o variabila de tip dat
calendaristic , n formatul setat prin
SET DATE

2-34

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Din dat n ir de caractere
convertete o dat de intrare de tip
DTOC (<expC>)/{ expC)
calendaristic n irul de caractere
corespunz tor mm/dd/yy
Exemple:
? STR(25.6,4,1)
? STR(25.6,4,0)
STORE '12' TO A
STORE '13' TO B
? VAL(A) + VAL(B)
2.4

Zone de lucru

FoxPro folosete aa numitele zone de lucru (n num r de 255) pentru


manipularea fiierelor de date. Identificarea zonelor de lucru se face cu numere
de la 1 la 255 (pentru primele 10 zone se pot folosi literele A..J). Numai o zona
de lucru din cele 255 este curent la un moment dat. Instruc iunile referitoare la
fiierele de date lansate la un moment dat vor ac iona asupra fiierului deschis
n zona curent activ . La deschiderea unui fiier de date ntr-o zona de lucru,
acestuia i se atribuie un nume numit alias (pseudonim).
Comanda pentru selectarea unei zone de lucru are sintaxa:
SELECT <eN>|<eC>
unde :<eN> = num rul zonei de lucru activate;
<eC> = ir de caractere ce reprezint aliasul tabelei.
Observa ii: dac eN=0 se selecteaz prima zon de lucru neocupat .
Deschiderea unui fiier (tabel) de date se face folosind comanda :
USE [<file>|?][IN <expN1>][AGAIN]
[INDEX <index file list>|
[ORDER[<expN2>|<idx index file>|[TAG]<tag name> OF<cdx>]
[ASCENDING|DESCENDING]]]]
[ALIAS <alias>][EXCLUSIVE][SHARED][NOUPDATE]

Clauze:
AGAIN deschiderea aceluiai fiier n mai multe zone de lucru;
NOUPDATE nu permite modificarea datelor (structur i con inut);
SHARE, EXCLUSIVE pentru lucru n re ea;
2-35

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
ALIAS aliasul atribuit de utilizator fiierului de date.
Prin specificarea numelui fiierului de date acesta se deschide n zona
de lucru curent (dac nu se specific zona de lucru).
Dac se deschide un fiier de date ntr-o zona de lucru n care s-a
deschis anterior un alt fiier, atunci fiierul anterior deschis se nchide automat.
nchiderea unui fiier (tabel) de date se face folosind comanda :
USE
Deschiderea unei baze de date se face folosind comanda :
OPEN DATABASE [<file> | ?]
nchiderea unei baze de date se face folosind comanda :
CLOSE DATABASES (nchide toate fiierele de date i index asociate
deschise)
CLOSE ALL (nchide i ferestrele activate anterior)
2.5

Construirea bazelor de date relaionale. Componente.

O baz de date rela ional reprezint o structur folosit la


memorarea i gestionarea datelor, descriind un anumit tip de
obiecte.
Ea are asociat un fiier special numit dicionar de date (cu extensia.dbc)
n care sunt memorate date referitoare la baz n ansamblul sau, cum ar fi:
tabelele componente, rela iile permanente ntre tabele, procedurile stocate, etc.
Un program care prelucreaz o baz de date rela ional citete mai nti
dicionarul de date datele i apoi, cunoscndu-i structura complex , procedeaz
la prelucrarea datelor respective.
n Visual Fox Pro termenii de baza de date i tabela nu sunt sinonimi.
Termenul de baz de date (fisier.dbc) se refer la o baz de date rela ional ,
care este un container cu informa ii despre unul sau mai multe tabele (fiier.dbf)
sau vederi.
Construirea unei tabele simple
CREATE TABLE|DBF dbf_name>
(< fname1><type>[(<precision>[,<scale>])[,<fname2>...]])
Clauze:
<dbf_name> = numele tabelei create (tabelul este deschis ntr-o zona de lucru
nou
2-36

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
<fname1>,<fname2> = numele cmpurilor din noul tabel creat;
<type> - un caracter ce indica tipul datei pentru cmpul respectiv;
<type>
C
D
N
L
M

<precision>
n
n
-

<scale>
d
-

Descriere
ir de caractere de lungime n
Data calendaristic
Numeric, de l ime n cu d zecimale
Logic
Memo

ALTE COMENZI

Modificarea structurii unei tabele de date active se face prin comanda:


MODIFY STRUCTURE
Vizualizarea structurii unei baze de date:
DISPLAY STRUCTURE [IN <expN>|<expC>][TO PRINTER [PROMPT]
LIST STRUCTURE[NOCONSOLE][TO PRINTER |TO FILE<file>]
O alta metod de creare a fiierelor de date din fiiere nrudite o reprezint
comanda:
COPY STRUCTURE TO <file> [FIELDS <field list> [WITH CDX ]
prin care se realizeaz copierea structurii (eventual par iale) a unei tabele de
date n structura alteia.
O alta modalitate o constituie folosirea unui fiier intermediar, folosind
comenzile:
COPY STRUCTURE EXTENDED TO <file> [FIELDS <field list> | FIELDS
LIKE <skel> | FIELDS EXCEPT <skel>]
i respectiv:
CREATE [<file1>] FROM [<file2>]
Pentru detalii urm ri i Help-ul.
Crearea unei baze de date
Pentru a crea o baza de date folosi i comanda:
CREATE database <dbc_name>
sau, din meniul File, alege i op iunea New i Database, dup care ap sa i
butonul New File, ceea ce conduce la afiarea pe ecran a unei ferestre n care
2-37

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
trebuie specificat numele noii baze de date i calea n care aceasta va fi
salvat . Pe ecran este deschis fereastra Constructorului de baze de date
(Database Designer), iar la meniul sistem se ad uga un nou submeniu, numit
Database, care con ine op iunile necesare realiz rii opera iilor specifice, cum ar
fi :
New table _ se creeaz o nou tabel n baza de date
Add Table _ se ad uga la baz o nou tabel existent pe disc
O baz de date rela ional include:

mai multe tabele cu propriet ile descrise anterior;


rela iile permanente dintre tabele, rela ii ce nu vor fi terse odat cu
terminarea programelor de prelucrare n care au fost definite (cum este
cazul rela iilor temporare intre tabelele);
datele referitoare la tabele i rela iile dintre ele sunt memorate n
dic ionarul bazei de date i sunt restabilite automat la deschiderea
acesteia;
vederi, care reprezint tabele virtuale construite pe baza unuia sau mai
multor cmpuri din mai multe tabele;
proceduri i func ii asociate bazei de date, care pot fi apelate n
secven ele de cod asociate tabelelor componente;
conexiuni, care reprezint mecanismul de accesare a datelor din alte
sisteme.

Caracteristicile tabelelor rela ionate


Numele lungi pentru tabele i cmpurile acestora - Unei tabele i se poate ataa
un nume lung de maxim 128 caractere, care conduce la o mai buna lizibilitate.
Aceast regul este valabil i pentru numele cmpurilor dintr-o tabel , cu
urm toarele observa ii:

aceste nume nu trebuie sa con in spa ii libere.


sistemul nu face diferen a ntre litere mari i mici.
daca o tabel a fost creat mai nti ca fiind una simpl i apoi a fost
inclus ntr-o baz de date, odat definite numele lungi pentru
cmpurile acesteia, cele vechi (de maxim 10 caractere) nu mai pot fi
folosite.
Comentarii i observaii referitoare la tabelele legate i la cmpurile
componente
Dei comentarea tabelelor i a cmpurilor acestora ntr-o baz de date nu
este una dintre cele mai puternice facilit i, este bine ca ea sa fie folosit pentru
o mai uoar documentare ulterioar sau pentru o mai bun n elegere a
modului de concepere.

2-38

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Formatul de afiare i citire a cmpurilor tabelelor legate
Pentru fiecare cmp se poate specifica un format de afiare implicit, care
s serveasc la formatarea datelor atunci cnd aceste vor fi afiate (de
exemplu cnd se folosete comanda browse). Formatul de afiare reprezint un
ir de caractere format dintr-o serie de coduri, n func ie de care sistemul
stabilete modul de prezentare a datelor respective. De exemplu, un format de
afiare de tipul 999.99 desemneaz o valoare numerica afiat cu 3 cifre n fa a
punctului zecimal i dou dup acesta (vezi clauza Picture).
Valorile implicite ale cmpurilor
Pentru fiecare cmp al tabelei se poate preciza o valoare implicit care
sa fie nc rcat automat la ad ugarea unei noi nregistr ri. Valoarea respectiv
trebuie de s fie de acelai tip ca i cmpul. Se poate preciza deasemeni i o
expresie a c rei evaluare va conduce la valoarea ce se va nc rca automat.
Validarea la nivel de cmp
Pentru un cmp al unei tabele legate se poate preciza o expresie logic
care se evalueaz n momentul schimb rii valorii cmpului. Dac valoarea
expresiei este adev rat , se consider c valoarea introdus este corect , dac
nu se afieaz un mesaj de eroare, care poate fi cel implicit al sistemului sau
unul personal, definit de utilizator (de exemplu: Regula de validare este
nc lcat ). Observa ii : Evaluarea condi iei are lor doar n momentul n care se
introduc sau modific datele din cmpul respectiv.
Validarea la nivel de nregistrare
Pentru o tabel ce apar ine unei baze de date se pot defini reguli de
validare la nivel de nregistrare, constnd ntr-o expresie logic care va fi
evaluat n cazul n care se adaug noi nregistr ri, se modific cele existente
sau se terg nregistr ri.
Dac expresia returneaz un rezultat adev rat, opera ia se consider
corect , dac nu, opera ia nu este acceptat i se genereaz un mesaj de
eroare care poate fi cel implicit al sistemului sau cel definit de proiectantul bazei
de date.
n expresia de validare se pot ncorpora func ii utilizator sau secven e de
program destul de complexe.
Observa ie: Validarea la nivel de nregistrare se declaneaz dup cea la
nivel de cmp, dar naintea secven elor de cod asociate evenimentelor de
manipulare a tabelei.
Secvene de cod asociate evenimentelor de manipulare a unei tabele legate
Manipularea unei tabele se reflect prin opera iile de ad ugare de noi
nregistr ri, modificarea celor existente sau tergerea unor nregistr ri. Pentru
2-39

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
fiecare dintre aceste evenimente se pot specifica secven e de cod care se
execut la apari ia evenimentului respectiv.
Observa ie : secven ele de cod asociate evenimentelor de manipulare a
tabelei legate se declaneaz dup valid rile la nivel de cmp i la nivel de
nregistrare.
2.6

Comenzi pentru vizualizarea i modificarea datelor din


tabele

EDIT [FIELDS <field list>][<scope>][FOR <expL1>][WHILE


<expL2>] [FONT <expC1> [,<expN1>]][STYLE <expC2>][FREEZE
<field>] [KEY <expr1> [,<expr2>] [NOAPPEND] [NOCLEAR]
[NODELETE] [NOEDIT | NOMODIFY]
EDIT este comanda ce permite afiarea i modificarea con inutului unui articol
al tabelei sau al unui fiier creat cu CREATE QUERY/VIEW

dac nu se indic un interval <scope> sau o condi ie FOR, WHILE se


pot parcurge toate articolele din tabel ;
se trece de la un cmp la altul cu tasta TAB, se trece la precedentul
sau urm torul articol cu s geata sus sau jos;
nchiderea ferestrei de editare se face cu CTRL/END pentru a salva
toate modific rile sau cu ESC pentru abandon;
daca nu s-a specificat NOAPPEND, se pot ad uga articole n tabela
prin CTRL/N. La terminarea comenzii se revine la locul de unde a fost
lansat ;
NOMENU mpiedica accesul la linia menu;

NOEDIT mpiedica modificarea datelor;

NOCLEAR p streaz ultimul articol pe ecran dup ce se iese din EDIT;

NODELETE mpiedica marcarea pentru tergere;


<expN1> indic cu al ctelea articol s se nceap editarea;
BROWSE [FIELDS <field list>][FONT <expC1> [,<expN1>]]
[STYLE <expC2>][FOR <expL1>][FORMAT][FREEZE
<field>][KEY <expr1>[, <expr2>]]|NOINIT][LOCK <expN2>]
[NOAPPEND][NOCLEAR] [NODELETE] [NOEDIT|NOMODIFY]
[NOLINK][NOMENU][TITLE <expC4>][VALID [:F] <expL2>
[ERROR <expC5>]][WHEN <expL3>] [WIDTH <expN5>]
[[WINDOW <window name1>][IN [WINDOW] <window name2>
[COLOR SCHEME <expN6>| COLOR <color pair list>]

2-40

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
BROWSE este comanda ce permite modificarea sau ad ugarea de articole ntro tabel :

dac nu este deschis nici o tabel se solicit numele celei dorite;


cmpurile calculate sunt accesibile doar la citire;
afiarea se face sub forma de tablou, n ordinea cmpurilor din tabel
sau a celor specificate n FIELDS, clauzele Font i Style determinnd
tipul i dimensiunea literelor ;

comanda este asem n toare cu EDIT;

FREEZE permite men inerea cursorului n acelai cmp al tabelei ;

WIDTH limiteaz dimensiunea coloanelor pentru cmpurile caracter;


WINDOW activeaz o fereastra n care se va afia tabelul;
FIELDS permite alegerea cmpurilor i a ordinii de afiare;
APPEND FROM <file> |? [FIELDS <field list> | FIELDS LIKE
<skel> | FIELDS EXCEPT <skel>] [FOR <expL>][[TYPE]
[DELIMITED [WITH TAB | WITH <delimiter>

APPEND permite ad ugarea unuia sau mai multor articole din fiierul surs
specificat la sfritul tabelei active.

se pot adaug date i din fiiere de alt tip, nu doar din DBF. Dac sursa
i destina ia sunt DBF, se copie doar cmpurile comune celor dou
tabele ;
dac SET DELETED este OFF se copie i articolele marcate pentru
tergere (dar nu i marcajul) ;
dac un cmp din surs este mai mare dect omologul sau din
destina ie, datele de tip caracter n exces se pierd iar cele numerice
sunt nlocuite de asteriscuri;
dac structurile celor dou fiiere nu corespund se afieaz mesajul 0
row(s) inserted. Coloanele ce nu apar n tabel sunt ignorate;
dac nu se indica TYPE se presupune ca este un fiier surs tip dbf;
se pot importa date din fiiere de mai multe tipuri;
pentru o mai bun
delimitatorul.

inserare a datelor se specific , unde este cazul,

INSERT [BEFORE][BLANK] sau APPEND [BEFORE][BLANK]


INSERT adaug un nou articol n tabel , n pozi ia de articol curent
f r op iuni se lanseaz introducere datelor n tabel
2-41

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

func ioneaz ca APPEND, permi nd ad ugarea mai multor articole


succesiv;
ncheierea introducerii datelor se face cu CTRL/END;
BEFORE face ca inserarea s se fac naintea articolului curent;
BLANK insereaz un articol gol;
dac SET CARRY este ON se copie n articolul inserat con inutul
articolului precedent;
EXPORT TO <file> [FIELDS <field list> | FIELDS LIKE <skel> |
FIELDS EXCEPT <skel>] [<scope>][FOR <expL1>] [WHILE
<expL2>][NOOPTIMIZE][TYPE]DIF|MOD|SYLK|WK1|WKS|WR1|
WRK|XLS]

EXPORT transfer datele dintr-un fiier n altul, de alt tip (implicit fiierul se
consider a fi de tip.dbf)
DELETE [<scope>] [FOR <expL1>] [WHILE <expL2>]
[NOOPTIMIZE]
DELETE marcheaz pentru tergere articolele specificate din tabel. Implicit se
marcheaz articolul curent.
tergerea este logic , articolele putnd fi readuse cu RECALL
tergerea fizic se face cu comanda PACK
articolele marcate pentru tergere sunt marcate cu o stelu a n prima
pozi ie la folosirea comenzilor DISPLAY, LIST
RECALL [<scope>] [FOR <expL1>] [WHILE <expL2>]
[NOOPTIMIZE]
RECALL anuleaz marcajul pentru tergerea articolelor specificate
din tabel. Dac articolele au fost terse cu ZAP sau PACK, nu mai pot fi
ref cute.
PACK
PACK terge fizic articolele marcate pentru tergere. Toate fiierele
index deschise sunt automat reindexate.
ZAP
ZAP elimin toate articolele din tabel . Toate fiierele index
deschise sunt automat reindexate.
2-42

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SET SAFETY ON / OFF
Dac este ON, implicit se previne pierderea articolelor dac se comanda
crearea unui fiier cu acelai nume cu unul deja existent sau dac se d ZAP.
Se cere un mesaj de confirmare pentru tergere.
SET DELETED ON / OFF
Determin dac articolele marcate pentru tergere sunt sau nu luate n
considerare de c tre alte comenzi. Comenzile INDEX i REINDEX lucreaz cu
toate articolele, indiferent de starea SET DELETED. Dac este ON se lucreaz
n majoritatea comenzilor ca i cum articolele marcate pentru tergere nu ar
exista, iar RECALL ALL nu va g si nici un articol
REPLACE <field1> WITH <expr1> [ADDITIVE] [, <field2> WITH
<expr2> [ADDITIVE]]..[<scope>] [FOR <expL1>] [WHILE
<expL2>]
REPLACE schimb con inutul cmpurilor specificate din tabela activ , implicit
doar articolul curent, cu condi ia ca pointerul de articol s nu fie pe EOF.
ADDITIVE se refer doar la cmpurile memo i nseamn ad ugarea la vechiul
con inut, f r ca acesta s se piard . Dac se dorete nlocuirea n cmpul care
este cheie primar nu trebuie folosite op iunile SCOPE/ FOR /WHILE.
SORT TO <file> ON <field1>[/A|/D][/C][,<field2>[/A|/D][/C]...]
[ASCENDING|DESCENDING][<scope>][FOR <expL1>][WHILE
<expL2>][FIELDS <field list>|FIELDS LIKE <skel>|FIELDS
EXCEPT <skel>][NOOPTIMIZE]
SORT creeaz o nou tabel , n care articolele din tabela activ sunt sortate n
ordinea cmpurilor specificate.
nu se pot face sort ri dup cmpuri logice sau memo;
implicit, sort rile se fac n ordine cresc toare, A indic ordine
cresc toare, D descresc toare;
C impune s nu se diferen ieze literele mari de cele mici i se poate
combina cu A i D;
se poate indica tipul de sortare pentru fiecare cmp n parte;
fiierul rezultat trebuie sa fie diferit ce cel de origine, i s nu fie
deschis;
dac exist deja un fiier cu numele indicat se va scrie peste acesta.

2-43

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

2.7

Exerciii

1. Afia i data curent n diferite formate (prezentate n tabelul din carte).


Afla i cte zile sunt pn n anul 2010.
2. Afla i n ce zi cade 1 ianuarie a anului viitor i a cta zi din s pt mn
este.
3. Utiliza i operatorii (concatenare i rela ionali) defini i pentru irurile de
caractere.
4. Testa i func iile: SUBSTR(), LEFT(), ALLTRIM(), LEN(), LOWER(),
CHR().
5. Testa i func iile de conversie ntre diferite tipuri de date.
6. Crea i tabelul AGENDA cu
CREATE TABLE .
AGENDA
Nr.Crt. Denumire cmp
1
Cod_ID
2
Nume
3
Prenume
4
Adresa
5
Oras_Rez
6
Tara_Rez
7
Data_nast
8
Meserie
9
Loc_Munca
10
Tel_a
11
Tel_s
12
Tel_m
13
Fax
14
Email

structura urm toare, folosind comanda

Tip cmp
Num
Char
Char
Memo
Char
Char
Date
Char
Memo
Num
Num
Num
Num
Char

Lungime cmp
4
25
25
15
15
15
15
15
15
15
25

Folosi i comanda COPY STRUCTURE EXTENDED TO i crea i fiierul


STRU_AGD. Consulta i con inutul noului fiier. terge i logic i apoi
fizic articolele cu numerele 4,8,9,11,12,13,14. Construi i structura unei
baze de date noi, AGENDA1, folosind comanda : CREATE
Agenda1
2-44

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
FROM Stru_Agd.
7. Deschide i simultan doua tabele n doua zone de lucru diferite. nchide i
toate tabelele i iei i din Fox.
8. Crea i tabelele de mai jos, cu indecii specifica i.
Autor.dbf
(CodAutor C3 Index primar, Autor C15 Index normal),
CartiAutor.dbf (CodAutor C3 Index normal, CodCarte C3 Index normal)
Carti.dbf
(CodCarte C3 Index primar, Denumire C50, AnAparitie
C4, Pret N8,
CodEditura (C3 Index normal)
9. Crea i o baz de date numit Biblioteca.dbc care sa con in tabelele
anterior create la care ad uga i urm toarele tabele:
Editura.dbf
(CodEditura C3 Index primar, Editura C30
Index normal)
Domeniu.dbf
(CodDomeniu C3 Index primar, Domeniu C30
Index normal)
10. Activa i pe rnd fiecare index i vizualiza i datele. Ce schimb ri apar?
terge i unul dintre indecii asocia i tabelei. Vizualiza i datele! Care
este efectul?

2-45

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Capitolul 3 Indexarea i rela ionarea tabelelor, integritatea referen ial .


3.1

Indexarea tabelelor

Indexarea reprezint opera ia de ordonare logic a datelor


dintr-o tabela dup diferite criterii, opera ie ce nu afecteaz
ordinea fizica a datelor din tabel , ci doar modul n care
acestea sunt v zute.
Ordonarea unei tabele presupune stabilirea criteriilor n care aceasta va fi
parcurs .
Cheia de ordonare sau Criteriul de ordonare poate fi un cmp al tabelei
sau o expresie rezultat din combinarea mai multor cmpuri.
Pentru stabilirea ordinii nregistr rilor tabelei se evalueaz cheia de
ordonare pentru fiecare nregistrare n parte. Valorile ob inute se compar ntre
ele, iar ordinea nregistr rilor n tabela se stabilete n func ie de rezultatul
ob inut.
Prin indexare se construiete un fiier special, numit fiier de index, ce va
fi folosit n scopul reg sirii datelor n ordinea stabilit de cheia de ordonare. Un
index poate fi considerat ca un filtru ce poate fi aplicat unei tabele pentru ca
datele respective s poate fi privite ntr-o anumit ordine.
Fiierele index ce pot fi asociate unei tabele pot fi:

fiiere index simple (extensia IDX) con in o singura cheie de


indexare;
fiiere index simple compacte (extensia IDX)- care utilizeaz
tehnologia de compresie dinamic de la indecii compui (vezi
mai jos !!) ;
fiiere index compuse (extensia CDX)- care memoreaz chei de
indexare (etichete, tag-uri) ntr-un singur fiier index, la un
moment dat fiind activ una singur .

O tabel poate fi ordonat dup mai multe chei, caz n care se creeaz
mai multe intr ri de indeci pentru aceeai tabela n acelai fiier de index.
La deschiderea unei tabele indexate este necesar doar deschiderea
fiierului de index asociat, care con ine toate informa iile despre to i indecii.
Utilizarea indecilor se poate face prin specificarea indexului care s dea

3-46

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
ordinea dorit . La un moment dat doar unul dintre indeci poate fi activ i acest
index se numete index activ.
To i indecii asocia i unei tabele sunt memora i n acelai fiier, care are
acelai nume ca i tabela dar cu extensia cdx. Fiec rui index dintr-un fiier de
index i se atribuie un nume (eticheta index), nume prin care se face referirea n
comenzile de prelucrare.
Indecii pot fi de mai multe tipuri, i anume :

normali (Regular) care construiesc pentru fiecare nregistrare


din tabela cte o nregistrare n fiierul index respectiv, indiferent
de duplicarea sau multiplicarea valorii cheii de indexare. ntr-o
astfel de tabel sunt accesibile toate nregistr rile, indiferent de
valoarea cheii de indexare;
unici (Unique) care permit doar o valoare unic cheii de
indexare. Dac dou sau mai multe nregistr ri ale tabelei au
aceleai valori ale cheii de indexare, numai prima dintre acestea va
fi disponibil , restul neap rnd n tabel (dei fizic exist ) ;
candidat este un index asem n tor cu cel unic, dar interzice
nc rcarea de nregistr ri ce dubleaz valoarea cheii de indexare,
caz n care se genereaz un mesaj de eroare;
primar (cheie primara) n cadrul unei tabele pot exista mai
multe cmpuri (sau mai multe criterii) care s asigure identificarea
unic a nregistr rilor. Dintre acestea se alege unul care sa fie
folosit drept cheie primar a tabelei atunci cnd se creeaz o
rela ie ntre tabela respectiv i o alt tabela din baza de date.

Crearea indecilor
n fereastra pentru crearea tabelelor, n pagina Fields exist un fanion de
indexare care, prin pozi ionarea n modul s geat n sus sau s geat n jos,
determin crearea unei etichete de index n fiierul de index pentru cmpul
respectiv, cu acelai nume ca i cmpul, criteriul de ordonare fiind cmpul
respectiv. Ordinea cresc toare sau descresc toare este dat de tipul s ge ii.
Comanda de indexare este:
INDEX ON <expr> TO <idx file>|TAG <tag name>[OF <cdx
file>][FOR <expL>][COMPACT] [ASCENDING|DESCENDING]
[UNIQUE] [ADDITIVE]
<expr> - cheia de indexare care con ine cmpuri ale tabelei dar nu i
cmpuri memo.
Clauza FOR permite limitarea nregistr rilor ce vor putea fi accesate prin
fiierul index la cele care ndeplinesc condi ia <expL> .
3-47

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Clauza COMPACT permite crearea fiierelor index simple compacte.
Fiierele index compuse sunt ntotdeauna compacte, deci clauza ar fi
redundant .
Clauzele ASCENDING (implicit ) i DESCENDING stabilesc modul de
ordonare a informa iilor: cresc tor /descresc tor pentru indeci compui.
Clauza UNIQUE permite, n cazul n care sunt mai multe nregistr ri cu
aceeai cheie de indexare, accesarea numai a primei nregistr ri din tabel , la
celelalte neavnd acces.
Clauza ADDITIVE (nu are sens la indecii compui structurali) permite ca
la crearea unui nou index, cel activ sa nu fie nchis, ceea ce se ntmpl
automat n absen a clauzei.
Comanda se folosete astfel pentru crearea celor 2 tipuri de index:
- index simplu:
INDEX ON <expr> TO <idx file> [FOR <expL>][COMPACT][UNIQUE]
[ADDITIVE]
- index compus:
INDEX ON <expr> TAG <tag name> [OF <cdx file>] [ASCENDING |
DESCENDING] [UNIQUE] [FOR <expL>]
Comanda de deschidere a unei tabele mpreun
asociate va ar ta astfel:

cu fiierele INDEX

USE [<file>|?][INDEX <index file list>|?[ORDER [<expN>|


<file.idx> |[TAG]<tag name>[OF <file.cdx>][ASCENDING|
DESCENDING]]]]
n urma acestei comenzi se va deschide tabela <file> mpreun cu lista
de fiiere index (separate prin virgul ) care sunt deja create cu comanda
INDEX. Extensia fiierelor index nu trebuie precizat , dect dac sunt 2 fiiere
cu acelai nume i extensie diferit .
Clauza ORDER permite stabilirea fiierului indexul simplu activ sau
eticheta dintr-un fiier index compus ce va deveni activ . <expN> este num rul
de ordine al fiierului index simplu sau al etichetei din fiierul index compus.
Sunt num rate mai nti fiierele index simple din list , apoi etichetele
apar innd indexului compus structural i, n ultimul rnd, etichetele apar innd
altor indeci compui nestructurali. Daca <expN>=0, nregistr rile vor fi
accesate n ordinea lor fizic (ca i cum nu ar exista un index).
Exemplu: tabela AGENDA care are mai mul i indeci asocia i:

3-48

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
USE agenda INDEX agenda ORDER TAG telefon
eticheta
TELEFON
din
indexul
AGENDA.CDX- va fi indexul activ

compus

structural

USE agenda INDEX agenda_d ORDER TAG data_nast

eticheta DATA_NAST din indexul compus AGENDA_D.CDX- va


fi indexul activ

Dac sunt deschise mai multe fiiere index simple sau compuse, pentru a
schimba indexul (eticheta) activ( ) se folosete comanda:
SET ORDER TO [<expN1>|<file.idx>|[TAG]<tag name>[OF <cdx
file>][IN <expN2>|<expC>][ASCENDING|DESCENDING]]
CDX(<expN1>[,<expN2>|<expC>])
Actualizare indeci
Actualizarea indecilor asocia i unei tabele se face folosind comanda :
REINDEX
Sunt multe situa ii n care un index poate fi desincronizat (c deri de
tensiune, probleme de alocare clusteri dublii sau inexisten i) caz n care acesta
trebuie ref cut. Cei mai pu ini expui unor astfel de probleme sunt indecii
compui structurali, care sunt deschii odat cu tabela asociat . i acetia pot
suferi fragmentari semnificative, n urma ad ug rii sau tergerii de articole. De
asemenea tergerea unei etichete dintr-un index compus nu elibereaz spa iul
pe disc. Din acest motiv este recomandat utilizarea ritmic a comenzii
REINDEX.
tergere indeci
DELETE TAG <tag name1> [OF <file1.cdx>] [,<tag name2> [OF
<file2.CDX>]]... sau
DELETE TAG ALL [OF <cdx file>]
Comanda permite tergerea etichetelor dintr-un index compus fie
structural, fie specificat de clauza OF. Clauza ALL permite tergerea tuturor
etichetelor, caz n care fiierul index compus specificat este ters de pe disc.

3-49

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Reg sirea rapid a datelor
n afara de afiarea datelor ntr-o anumit ordine, indecii prezint i
avantajul major de reg sire rapid a datelor. C utarea rapid se face cu
comanda:
SEEK <expr>
Comanda este urmat de o expresie ce reprezint valoarea c utat
printre valorile cheii de indexare active. Dac este g sit o asemenea
nregistrare, indicatorul de nregistr ri se va pozi iona pe acesta, func ia
FOUND() va returna valoarea adev rat, iar func ia EOF() va returna fals. n caz
contrar, indicatorul de nregistr ri se pozi ioneaz dup ultima nregistrare
FOUND() returneaz fals iar EOF() returneaz True.
3.2

Relaionarea tabelelor

O baz de date rela ional reprezint o baz de date n care tabelele


(fiierele de date -.DBF) sunt organizate i accesate prin intermediul rela iilor. O
rela ie este o leg tur ntre fiiere de date, leg tur care permite accesarea
informa iilor din mai multe fiiere (nu numai cea din zona curent ). Leg tura
reprezint condi ia de asociere ntre fiierele de date, i este materializat printr-un
cmp comun fiierelor de date. Modelul rela ional al bazelor de date implic
organizarea datelor n tabele legate ntre ele prin rela ii. Scopul stabilirii rela iilor
este acela de coordonare, dup diferite criterii, a datelor din tabelele aflate in
leg tur .
Rela iile dintre tabele se pot clasifica n urm toarele patru clase:
Una la una caz n care fiecare nregistrare din tabela p rinte este
pus n coresponden cu o nregistrare din tabela copil;
Una la mai multe unei nregistr ri din tabela p rinte i corespund
mai multe nregistr ri din tabela copil;
Mai multe- la- una- unei nregistr ri din tabela copil i corespund mai
multe nregistr ri din tabela p rinte;
Mai multe- la- mai multe- unei nregistr ri din tabela p rinte n
corespund mai multe nregistr ri din tabela copil i invers, unei
nregistr ri din tabela copil i corespund mai multe nregistr ri din
tabela p rinte.
n Visual Fox Pro sunt implementate doar primele trei tipuri de rela ii, cea de
a patra putnd fi redus la doua rela ii i anume: una de tip mai multe la una
i alta de tip una la mai multe prin intermediul unei tabele suplimentare
intercalat ntre cele dou . Din punct de vedere al momentului definirii rela iilor
dintre tabele, exist :

3-50

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Rela ii temporare sau dinamice, care se creeaz prin comenzi n


timpul rul rii programelor i sunt disponibile numai n timpul rul rii
acestora;
Rela ii permanente, ce se creeaz n faza de proiectare a bazei de
date i sunt deschise automat de c tre sistem odat cu deschiderea
bazei de date;
Pentru crearea rela iilor permanente ntre dou tabele este necesar ca:
Tabela p rinte s fi indexat cu un index candidat sau primar;
Tabela copil s fie indexat cu orice fel de index ;
Indecii corespunz tori trebuie s existe anterior cre rii rela iei.
Observa ii : Tabela p rinte indexat cu un index candidat sau primar determin
stabilirea numai a unor relaii permanente de tip una la una sau una
la mai multe, deoarece n tabela p rinte, dup indexul respectiv,
nu pot exista mai multe nregistr ri cu aceeai valoare a cheii primare.
Presupunnd ca baza de date este deschis i tabelele sunt
corespunz tor indexate, stabilirea unei rela ii permanente se face printr-un click
pe indexul primar sau candidat n tabela p rinte dup care se trage mouse-ul
peste indexul din tabela copil.
De exemplu, avem tabelele AG(enti) i TR(anzac ii). Agen ii care au
intermediat tranzac ii se reg sesc n fiierul TR, prin intermediul cmpului
NR_AGENT i nu prin intermediul cmpurilor NUME i PRENUME. Deci se poate
stabili o rela ie ntre cele dou tabele prin intermediul cmpului NR_AGENT, care
apar ine celor 2 fiiere. Acest lucru se poate efectua prin comanda :
SET RELATION TO [<expr1> INTO <expN1>|<expC1>
[,<expr2> INTO <expN2>|<expC2>...]...[ADDITIVE]]
n acest exemplu exist o tabel p rinte (cea activ n momentul comenzii
i anume Agen i) i una sau mai multe tabele copii (Tranzac ii) specificate prin
num r <expNi> sau alias <expC>, toate aceste tabele fiind deschise n zone de
lucru diferite.
Cheia rela iei este stabilit prin <expri> care corespunde unui cmp (sau la
mai multe cmpuri) din tabela p rinte. Cheia relaiei este i cheia de indexare a
tabelei copil.
Stabilirea unei rela ii ntre 2 tabele presupune c mutarea pointer-lui de
articol n tabela p rinte determin i mutarea pointer-ului n tabela copil.
Binen eles c ini ial se evalueaz <expri> i dac sunt g site nregistr rile
corespunz toare n tabela copil, pointer-ul va fi mutat n consecin , altfel va
ajunge la sfritul tabelei i deci EOF() pentru zona de lucru respectiva va fi .T.
3-51

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Clauza ADDITIVE face ca rela iile deja existente pentru TABELA activ s
nu fie terse.
Aceast comand face ca fiec rei nregistr ri din tabela p rinte s -i
corespund o nregistrare n tabela copil, unde saltul se face automat. Se pune
ntrebarea, ce se ntmpla cnd unei nregistr ri p rinte i corespund mai multe
articole n tabela copil (care nu are activ un index unic). n aceasta situa ie
comanda determin numai g sirea primei nregistr ri, deci exist o rela ie ONE
TO ONE "UNA LA UNA".
Comanda care permite g sirea tuturor nregistr rilor din tabela copil ce
corespund unei singure nregistr ri din tabela p rinte, adic o rela ie tip ONE
TO MANY "UNA LA MAI MULTE" este:
SET SKIP TO [<alias1> [,alias2>]...]
Pentru o folosi, rela iile trebuie s fie deja create cu o comand
SET RELATION TO...
Modul de lucru al comenzii este urm torul: dac se mut pointer-ul n tabela
p rinte n urma unor comenzi GOTO, LOCATE sau SEEK, pointerul se mut pe
articolul corespunz tor i n tabela copil. Urm toarele salturi n tabela p rinte cu
SKIP sau cu o bucl SCAN.. ENDSCAN nu vor determina mutarea pointer-ului, n
schimb n tabela copil vom fi pozi iona i pe urm toarele nregistr ri ce au aceeai
cheie cu nregistrarea din p rinte.

Pentru tergerea rela iilor dintre tabele se va folosi comanda:


SET RELATION OFF INTO <expN>|<expC>
care terge rela ia dintre tabela curent i tabela copil specificat prin
num r -<expN> sau alias -<expC>.
SET RELATION TO folosit f r parametri determina nl turarea tuturor rela iilor
existente pentru tabela curent .
Exemplu: se indexeaz ini ial cele 2 tabele
CLEAR
CLOSE DATABASES
USE AG ORDER tag AG_I n 0 && Tabelul printe
BROW
USE TR ORDER tag AG_I n 0 && Tabelul copil
SELE TR
BROW
SELECT AG
&& Selectare tabel printe
3-52

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SET RELATION TO nr_agent INTO TR && Stabilirea relaiei
SET SKIP TO TR && Tipul relaiei este One-to-many
WAIT WINDOW 'Afiarea TRANZACTIILOR efectuate de fiecare
AGENT' BROWSE FIELDS AG.NR_AGENT :H='Nr.Id.',AG.NUME
:H='Nume', ; AG.PRENUME :H='Prenume', TR.NR_TRANZ

3.3

Integritatea referenial

Integritatea referen ial reprezint un ansamblu de reguli impuse tabelelor


ntre care s-au stabilit rela ii. Aceste reguli sunt necesare deoarece modificarea
datelor dintr-o tabel poate afecta rela ia cu tabela legat . Evenimentele ce duc la
modific ri ale cheii i reprezint evenimente tratate prin integritate referen ial
sunt:
Ad ugarea de noi nregistr ri;
tergerea unor nregistr ri;
Modificarea datelor unei nregistr ri care afecteaz rela ia.
n cazul n care se ad ug o nou nregistrare n tabela copil a unei rela ii
se pot specifica urm toarele op iuni:
X Ignorare se pot introduce valori, indiferent dac exist sau nu nregistr ri
corespunz toare n tabela p rinte ;
X Restric ionare se genereaz un mesaj de eroare atunci cnd se ncearc
ad ugarea unei nregistr ri n tabela copil care nu are
corespondent n tabela p rinte.
n cazul n care se terg nregistr ri din tabela p rinte a unei rela ii se pot
specifica urm toarele op iuni:
X Ignorare se permite tergerea, chiar dac n tabela copil exist sau nu
nregistr ri legate de cea tears ;
X Restric ionare se genereaz un mesaj de eroare atunci exist
corespondent n tabela copil;
X tergere n cascad se terg automat att nregistr rile din tabela copil
ct i cele din tabela p rinte.
n cazul n care se face o modificare care afecteaz rela ia n tabela
p rinte se pot specifica urm toarele op iuni:
X Ignorare se permit modific rile respective, chiar dac n tabela copil
exist sau nu nregistr ri legate de cea modificat ;
X Restric ionare se genereaz un mesaj de eroare atunci exist
corespondent n tabela copil;
X Modificare n cascad se modific automat att nregistr rile din tabela
copil ct i cele din tabela p rinte conform noii valori a
cheii rela iei.
3-53

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Op iunile legate de integritatea referen ial se seteaz prin accesarea
ferestrei Constructorului de baze de date n care se execut dublu click pe
rela ia respectiv (linia frnta care leag tabelele). Se deschide fereastra Edit
Relationship n care se ap sa pe butonul Referen ial Integrity care determin
deschiderea unei alte ferestre de unde se pot alege op iunile dorite.
Cele trei pagini ale ferestrei controleaz fiecare cte un tip de eveniment
astfel :
Rules for Updating pagina cu op iuni referitoarea la modificarea datelor din
tabelele legate;
Rules for Deleting pagina cu op iuni referitoarea la tergerea datelor din
tabelele legate;
Rules for Inserting pagina cu op iuni referitoarea la ad ugarea datelor din
tabelele legate.
3.4

Funcii. Variabile de memorie. Macrosubstituia

Variabile de memorie reprezint zona de memorie c reia i se atribuie un


nume i care poate stoca o valoare de un anumit tip. Deci elementele unei
variabile sunt:

numele folosit pentru identificare i atribuit de programator sau


predefinit de proiectan ii FoxPro. Numele variabilelor este format din
maxim 8 caractere de tip liter , cifr sau caracterul _, cu primul
caracter diferit de cifr ;
con inutul sau valoarea variabilei reprezint data ce este memorat n
zona de memorie a variabilei;

tipul variabilei tipul datei ce se poate memora n zona de memorie


respectiv .
Alocarea memoriei pentru variabile se face asem n tor ca n limbajul
BASIC, adic , pentru variabile simple, n momentul primei atribuiri a valorii se
aloca spa iu pentru variabil . Variabilele tablou (masivele) trebuie declarate n
prealabil i pot avea maxim 2 dimensiuni. Num rul de elemente pe o
dimensiune se poate preciza i prin expresii. n plus, n limbajul FoxPro
caracteristica de tip de dat este asociat elementului tablou i nu tabloului, de
unde rezult ca elementele aceluiai tablou pot fi tipuri diferite.
Crearea unei variabile sau modificarea valorii acesteia se face prin
operatorul de atribuire:
<var> = <e> sau prin comanda
STORE <e> TO <var>

3-54

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

se evalueaz expresia <e>, ob inndu-se o valoare de un anumit tip;


se caut n memorie variabila cu numele <var> i, dac se g sete, se
nlocuiete vechiul con inut al acesteia cu valoarea expresiei;
dac nu se g sete variabila respectiv , FoxPro creeaz una nou cu
numele <var>, n care depune valoarea expresiei;
tipul variabilei este dat de tipul valorii expresiei, indiferent de tipul
anterior al variabilei, n cazul n care aceasta exista i nainte de
execu ia comenzii.
de obicei pentru variabilele de memorie se folosete simbolul M

O tehnic special de lucru cu variabile o reprezint macrosubstitu ia,


prin care con inutul unei variabile de tip ir de caractere este tratat ca
nume al altei variabile sau al altui element FoxPro (cmp al unei baze de
date, denumire fiier). Macrosubstitu ia func ioneaz ca i cum n locul variabilei
respective ar fi pus irul de caractere con inut de aceasta, f r apostrofurile
delimitatoare. Operatorul de macrosubstitu ie este &.
Exemplu :
test = *.dbf
DIR &test
ACCEPT Cu ce fiier dorii sa lucrai ? TO test
USE &test
x=italian
SET DATE TO &x
EDIT
Variabilele de memorie pot fi locale sau globale i se definesc cu comenzile:
PUBLIC <lista variabile> - variabilele din list se declar publice
PRIVATE <lista variabile>- variabilele din list se declar ca fiind locale
tergerea variabilelor de memorie se face cu comanda :
RELESE <memvar list>
RELEASE ALL [LIKE /EXCEPT <skeleton>]

Lista con ine numele variabilelor la care se renun , separate prin virgul .
RELE ALL terge toate variabilele de memorie, mai pu in cele sistem. ntr-un
program, RELE ALL terge doar variabilele locale, create n programul curent
sau n cele de nivel inferior.
Afiarea de informa ii despre con inutul memoriei FOX se face folosind
comanda :

3-55

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
LIST / DISPLAY MEMORY [TO PRINTER / TO FILE <file name>]
care determin afiarea variabilelor de memorie i utilizator
existente, tipul i valoarea lor.
Diferen a ntre LIST i DISPLAY este c la aceasta din urm se ateapt
ap sarea unei taste dup umplerea unui ecran cu informa ii. Se poate face
redirectarea informa iilor c tre imprimant sau c tre un fiier.
Instruc iuni de tip SCATTER/GATHER
SCATTER [FIELDS lista cmpuri] [MEMO]TO <masiv> |
TO <masiv> BLANK | MEMVAR | MEMVAR BLANK
Comanda permite copierea datelor din articolul curent ntr-un masiv
sau un set de variabile de memorie (pe care le creeaz dac nu sunt definite
deja). Clauza FIELDS permite copierea numai pentru datele din cmpurile
specificate n list . Se pot prelua date i din cmpuri tip memo dac este
prev zuta clauza MEMO, altfel aceste cmpuri sunt ignorate. Clauza BLANK
permite crearea unui masiv sau variabile de memorie cu elemente "goale"
(sesizabile cu func ia EMPTY()).Clauza MEMVAR permite crearea unui set de
variabile de memorie care au acelai nume i tip cu cmpurile bazei de date
care ns sunt precedate de calificatorul "m."
GATHER FROM <masiv> | MEMVAR
FIELDS <lista cmpuri>][MEMO]
Comanda permite scrierea valorilor dintr-un masiv sau set de variabile de
memorie n cmpurile nregistr rii curente din tabela activ . Clauzele FIELDS i
MEMO au aceeai semnifica ie ca i la SCATTER. De asemenea numele
variabilelor de memorie respect conven ia de la SCATTER.
Utilizatorii pot s -i defineasc
Function) folosind comanda:

propriile func ii (UFD = User Define

FUNCTION <function name>


Modalitatea de transmitere a parametrilor este aceeai cu cea prezentat
la proceduri.
Scrierea codului se ncheie obligatoriu cu RETURN <exp>. Dup
execu ia func iei, FOX returneaz programului apelant valoarea calculat de
func ie.
3-56

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu: crea i un fiier TEST.prg cu urm torul con inut:
PROCEDURE TEST
PARAMETERS X,Y, suma,produs
suma=adunare(x,y)
produs=nmulire(x,y)
RETURN
FUNCTION ADUNARE
PARAMETERS x, y
RETURN x+y
FUNCTION nmulire
PARAMETERS x,y
RETURN x*y
i testa i-l cu parametrii s=0 p=0
DO TEST WITH 3, 4, s, p
?s
?p
? adunare (5, 6)
SET PROCEDURE TO TEST
? adunare (3, 4)
? nmulire (5, 6)
SET PROCEDURE TO TEST
? nmulire (3, 3)
3.5

Crearea i modificarea programelor

MODIFY COMMAND /FILE <filename> [WINDOW <window


name>]
Comanda apeleaz editorul de texte din FOX. n varianta
COMMAND se caut implicit extensia.PRG. Dac fiierul indicat nu exist ,
acesta se creeaz . Se scriu liniile de comand iar la tastarea CTRL/ END se
ncheie editarea, se salveaz fiierul pe disc i se revine la prompter. Meniul
ofer comenzi similare.
Etapele elabor rii i rul rii unui program sunt urm toarele:

se concepe algoritmul de rezolvare a problemei propuse;


se transpune algoritmul ntr-un ir de instruc iuni ce reprezint
programul;

chiar

se introduce programul ntr-un fiier;


se compileaz programul;
3-57

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

se execut programul.

Exemplu : s consider m urm torul program, numit PRIMUL


MODI COMM PRIMUL
Clear
@ 14,30 say Primul program scris in Visual Fox Pro
Programul va terge ecranul i va afia n mijlocul s u mesajul Primul
program scris in Visual Fox Pro . Pentru compilare se d comanda : COMPILE
PRIMUL (compilarea se face de obicei automat, deci acesta comand nu este
necesar dect pentru cunoaterea modului de func ionare al Fox) iar execu ia
(rularea) se efectueaz cu comanda: DO PRIMUL.
Instruc iunile din cadrul unui program pot fi scrise cu litere mari sau mici.
O instruc iune se poate scrie i pe mai multe rnduri, caz n care linia curent
se ncheie cu caracterul ;.
n cadrul unei linii se pot introduce i comentarii specificate de caracterele: *,
&& sau comanda : NOTE / * <text> [...]

3.6

Programare structurat. Proceduri.

Apelarea, transmiterea parametrilor, revenirea, compilarea


Un program reprezint o succesiune de instruc iuni realizat n
conformitate cu regulile limbajului de programare folosit, care rezolv o anumit
problem . Un program FOX este scris pe disc ntr-un fiier. Cnd se dorete
execu ia lui, fiierul este compilat i apoi rulat.
Execu ia unui program se realizeaz cu comanda DO avnd sintaxa :
DO <nume fiier> [WITH <lista parametri>] [IN <fiier>]
Aceasta comand execut instruc iunile con inute n fiierul <fiier>.
Dac <fiier> nu are prev zut extensia, atunci se vor c uta pe disc
urm toarele fiiere, n aceast ordine:
<fiier>.EXE - program executabil
<fiier>.APP - aplica ie
<fiier>.FXP - forma compilat a programului
<fiier>.PRG - programul surs
Modul de execu ie a unui program poate depinde de parametrii externi
care se transmit programului n momentul execu iei. De exemplu, presupunem
un program de sortare a datelor dintr-un fiier care necesit ca parametri
3-58

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
externi numele fiierului i ordinea sort rii. La execu ia comenzii DO parametrii
sunt transmii c tre program prin lista de parametri a clauzei WITH. Aceast
list poate con ine expresii, constante, cmpuri ale unui tabel de date, separate
prin virgul .

Execu ia unui program se va opri n una din urm toarele situa ii:
la execu ia unei comenzi RETURN, CANCEL, QUIT cnd se ntlnete
sfritul fiierului;
cnd se ntlnete o alta comanda DO ;
prin ap sarea tastei ESC dac SET ESCAPE este ON.
Execu ia unui program din interiorul altui program folosind comanda DO
reprezint un pas important n structurarea aplica iilor de dimensiuni mari. Pe
m sur ce dimensiunea unei aplica ii crete, testarea i depanarea acesteia
devine din ce n ce mai dificil datorit num rului mare de variabile i
instruc iuni folosite.
Utilizatorul poate defini anumite proceduri i func ii ce pot fi executate de
mai multe ori n cadrul unui program, apelndu-le din diverse puncte de
program, cu diverse valori ale parametrilor.
Scrierea unei proceduri ncepe cu :
PROCEDURE <procedure name> i se ncheie obligatoriu cu RETURN.
Procedurile i func iile unui program se introduc, de regul , dup ultima
instruc iune a programului, n acelai fiier cu acesta. Acestea pot fi introduse i
n fiiere separate care vor fi asociate programului apelant prin comanda:
SET PROCEDURE TO [<fiier>]
Aceast comand asociaz programului curent n execu ie, fiierul
<fiier> unde se vor c uta procedurile ce nu se g sesc n programul apelant.
Parametrii sunt variabile de comunicare ntre programe,
definite de utilizator, ce realizeaz interfa a programului cu
exteriorul.
ntr-o procedur se pot defini dou tipuri de variabile :

globale (publice), ce pot fi accesate i modificate n orice procedur n


curs de execu ie PUBLIC <lista variabile>;
locale (private), ce nu pot fi accesate dect n procedura curent i n
cele subordonate acesteia PRIVATE <lista variabile>.
3-59

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu:
SET TALK OFF
CLEAR
PRIVATE a
PUBLIC b
a=1
b=2
DO TEST
NOTE aici se cunosc variabilele a,b,d dar nu i c
?a
?b
?c
?d
WAIT
RETURN
PROCEDURE TEST
PRIVATE c
PUBLIC d
c=3
d=4
NOTE aici se cunosc toate variabilele a,b,c,d
?a
?b
?c
?d
WAIT
RETURN
RETURN [ <expresion > / TO MASTER /TO <procedure name>]
Instruc iunea returneaz controlul programului apelant sau la prompter.
TO MASTER permite revenirea n programul apelant de cel mai nalt nivel.
TO <procedure name> permite revenirea n procedura activ indicat la
sfritul unei func ii i ntoarcerea unui rezultat.
3.7

Comenzi de intrare/ieire
? /?? [<exp1> ][PICTURE <expC1>][FUNCTION <expC2>]
[AT <expN2> ]

Comanda afieaz valoarea pentru una sau mai multe expresii


separate prin virgul .? produce afiarea pe linia urm toare in timp ce ??
afieaz pe linia curent .
3-60

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Dac SET PRINT este ON ieirea comenzii este dirijat c tre imprimant .
PICURE i FUNCTION formateaz afiarea ieirii ( vezi @.....SAY....GET) iar
AT stabilete coloana n care sa se fac afiarea.
ACCEPT <expC> TO <memvar>
Afieaz (eventual) mesajul <expC>, care poate fi o variabil de
memorie de tip caracter sau un ir de caractere ncadrat ntre ghilimele.
R spunsul utilizatorului, terminat cu ENTER, este stocat n variabila de
memorie indicat (dac este cazul, aceasta este creat ). Ap sarea tastei ESC
(dac se lucreaz cu SET ESCAPE ON) duce la terminarea execu iei comenzii.
WAIT [<expC>] [TO <memvar>]
Afieaz un mesaj care implicit este Press any key to continue.... i
care ateapt ap sarea unei taste (op ional memorate n variabila de memorie
specificat ).
Comanda @ SAY... GET creeaz
intrare/ ieire.

formate particulare pentru

@ <row, column> SAY <expr>[FUNCTION <expC1>] [PICTURE <expC2>]


[SIZE <expN1>, <expN2>][FONT <expC3> [, <expN3]] [STYLE
<expC4>] [COLOR SCHEME <expN4>| COLOR <color pair list>]
@ <row, column> GET <memvar> | <field>[FUNCTION <expC1>]
[PICTURE <expC2>] [FONT <expC3> [, <expN1>]] [STYLE <expC4>]
[DEFAULT <expr1>] [ENABLE | DISABLE] [MESSAGE <expC5>]
[[OPEN] WINDOW <window name>] [RANGE [<expr2>] [, <expr3>]]
[SIZE <expN2>, <expN3>] [VALID <expL1> | <expN4> [ERROR
<expC6>]] [WHEN <expL2>] [COLOR SCHEME <expN5> | COLOR
<color pair list>]

SAY afieaz informa ii iar GET permite introducerea sau editarea


valorii datelor;
row i column sunt expresii numerice (se poate folosi i $ pentru
pozi ia curent ) ;
coordonatele sunt totdeauna relative la col ul din stnga sus al
ecranului sau al ferestrei active (0,0) ;
GET permite afiarea i actualizarea datelor con inute n cmpuri sau
atribuite unor variabile de memorie temporare ;
comanda READ activeaz toate GET anterioare ;
3-61

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

dac READ este comun pentru mai multe GET , se trece la urm toarea
citire prin ENTER sau s geata n jos;
dac PICTURE indic mai multe caractere dect cele specificate la
crearea variabilei de memorie sau a cmpului, se accept la citire dar
nu se memoreaz toate;
tergerea unor caractere se face cu BackSpace sau Del;
folosind clauza COLOR din comand se pot stabili culorile de afiare;
clauza WHEN indic o condi ie ce va fi evaluat cnd ncercam s
pozi ionam cursorul pe un cmp GET; dac este fals , se trece la
urm torul cmp;
DEFAULT furnizeaz o valoare implicit pentru GET; expresia trebuie
s corespund tipului de dat din GET, ce nu este evaluat dect la
ad ugarea nregistr rilor n tabel ;
RANGE stabilete intervalul nchis de valori permise. Se poate indica
numai limita inferioar sau numai cea superioar ;
dac
se introduce o valoare incorect , se afieaz
mesajul
corespunz tor i se ateapt ap sarea tastei Space dup care se cere
o nou valoare (pn la satisfacerea restric iilor) ;
VALID stabilete condi ia care trebuie sa fie ndeplinit nainte ca
datele sa fie acceptate de GET ( se poate folosi o func ie utilizator care
s returneze o valoare logic ; nu se face nici un control dac se apas
direct ENTER) ;
ERROR indic un mesaj personal care s
satisf cut validarea;

fie afiat dac

nu s-a

MESSAGE este o expresie caracter afiat la execu ia READ cnd


cursorul este plasat in cmpul GET asociat acestui mesaj;
WINDOW permite deschiderea unei ferestre pentru editarea cmpurilor
MEMO; dac se indic i OPEN fereastra se deschide automat;
PICTURE se folosete pentru a limita tipul datelor ce pot fi nc rcate
(de exemplu doar cifre) i pentru a formata afiarea. Se pot folosi m ti
sau func ii de formatare pentru introducerea datelor, i anume:

M ti

3-62

convertete litere mici in litere mari;

permite doar cifre, spatii i semn;

afieaz
irul de caractere corespunz tor
CURRENCY in locul zerourilor nesemnificative;

afieaz asteriscuri in locul zerourilor nesemnificative;

lui

SET

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
,

afieaz virgula dac exista cifre la stnga ei;

indica pozi ia zecimala;

autorizeaz doar litere;

autorizeaz doar date logice;

autorizeaz doar litere i cifre;

orice caracter;

autorizeaz doar date logice;

Masca trebuie sa aib attea caractere cte sunt specificate n structura


cmpului respectiv. Dac se lucreaz cu numere, n masc trebuie inclus i
punctul zecimal i trebuie l sat loc i pentru semn.
Func ii
!

accept orice litera i convertete litere mici in litere mari;

permite doar cifre, spatii i semne;

afieaz numerele in format monetar;

plaseaz numerele negative in paranteze;

autorizeaz doar litere;

aliniaz la stnga textul din interiorul cmpului;

afieaz data in formatul curent;

centreaz textul in interiorul cmpului;

aliniaz la dreapta textul din interiorul cmpului;

elimina spa iile de la nceputul i de la sfritul cmpului;

afieaz spatii in locul valorilor nule;

Exemplu :
CLEAR
SET TALK OFF
NUME=SPACE(10)
VARSTA=0
DO WHILE VARSTA <> 99
@ 6,5 SAY "NUMELE : " GET NUME PICTURE "AAAAAAAAA"
@ 8,5 SAY "VARSTA : " GET VARSTA PICTURE "99"
MESSAGE "pentru ieire : vrsta este de 99 ani"
READ
@ 10,5 SAY NUME+" ARE "
@ 10, $+1 SAY VARSTA
3-63

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
@ 10, $+1 SAY "ANI"
NUME=SPACE(10)
CLEAR
ENDDO
WAIT 'APASATI ORICE TASTA'
SET TALK ON
CLEAR
SET TALK OFF
ZI=SPACE(8)
DT=DATE()
@ 1,1 SAY "DATA DE ASTAZI ESTE (USA) "
@ 1, $+2 SAY DT PICTURE "@D"
@ 1, $+2 SAY "SAU EUROPA"
@ 1, $+2 SAY DT PICTURE "@E"
@ 3,1 SAY "CE ZI ESTE ASTAZI-SPATIU SAU PRIMA LITERA
PENTRU SELECTARE i APOI ENTER ? " GET ZI;
FUNCTION "M LUNI, MARTI, MIERCURI, JOI, VINERI,
SIMBATA, DUMINICA ";
READ
@ 5,1 SAY "ASTAZI ESTE : "+ZI+ " ! APASATI O TASTA...."
WAIT " "
SET TALK ON
READ [ SAVE ]

Activeaz toate comenzile @... GET executate dup


CLEAR, CLEAR GETS, CLEAR ALL sau READ.

ultima comand

SAVE face sa nu se dezactiveze instruc iunile GET la urm toarea execu ie


pentru READ.
CLEAR GETS
terge toate comenzile @.... GET emise dup ultima comand CLEAR,
CLEAR ALL, CLEAR GETS sau READ dar nu terge variabilele de memorie
sau elementele de tablou.
3-64

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
3.8 Controlul fluxului
DO CASE
CASE <expL1> <statements>
[CASE <expL2> <statements>]
..
[OTHERWISE <statements>]
ENDCASE
Se execut comenzile asociate primei condi ii satisf cute (dac nu este nici
una, se execut , dac clauza OTHERWISE i comenzile asociate acesteia).
Exemplu:
SET TALK OFF
CLEAR
DIMENSION A[4]
A[1]="PRIMAVARA"
A[2]="VARA"
A[3]="TOAMNA"
A[4]="IARNA"
ANOTIMP=A[1]
@ 6,26 GET ANOTIMP FROM A FUNCTION "&"
READ
@ 15,10 SAY "ACEST ANOTIMP CONTINE LUNILE:"
DO CASE
CASE ANOTIMP="PRIMAVARA"
?? "MARTIE,APRILIE,MAI"
CASE ANOTIMP="VARA"
?? "IUNIE,IULIE,AUGUST"
CASE ANOTIMP="TOAMNA"
?? "SEPTEMBRIE,OCTOMBRIE,NOIEMBRIE"
OTHERWISE
?? "DECEMBRIE,IANUARIE,FEBRUARIE"
ENDCASE
DO WHILE <expL> <statements>
[LOOP] [EXIT]

ENDDO

Se execut comenzile atta timp ct condi ia este adev rat .


ENDDO i LOOP redau controlul programului spre comanda DO
WHILE pentru ca acesta s reevalueze condi ia.
EXIT transmite controlul instruc iunii care urmeaz dup ENDDO (
obligatorie pentru o bucla gen DO WHILE.T. );
Sunt autorizate structurile DO WHILE imbricate.
3-65

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
EXEMPLU:
CLEAR
SUMA=0
P=1
DO WHILE P<101
SUMA=SUMA+P
P=P+1
ENDDO
SUMA=SUMA-P
A=P-1
? "S-AU ADUNAT PRIMELE ",A,"NUMERE NATURALE"
? "OBTININDU-SE SUMA DE ",SUMA
IF <expL>
<statements>
[ELSE]
statements>
ENDIF
poate fi executat doar din interiorul unui program, nu i la prompter;
sunt permise IF-uri imbricate;
ELSE se refera la IF-ul imediat anterior;
comanda nu poate fi executat dac IF i ELSE sunt scrise pe aceeai linie;
EXEMPLU:
SET TALK OFF
CLEAR
A=0
B=0
@ 4,10 SAY "PRIMUL NUMAR " GET A PICTURE "9999"
@ 5,10 SAY "AL DOILEA NUMAR " GET B PICTURE "9999"
READ
IF A>B
? "Primul Numr Este Mai Mare "
ELSE
? "Al Doilea Numr Este Mai Mare Sau Numerele Sunt Egale"
ENDIF
IF B<>0
? A,':',B,'=',A/B
ENDIF
IIF( <expL>, <expr1>, <expr2>)
Returneaz rezultatul primei expresii dac este adev rat
condi ia, respectiv rezultatul celei de-a doua condi ii pentru fals.
<exp1> i <exp2> trebuie sa fie de acelai tip.
3-66

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Se poate utiliza de la prompter.


EXEMPLU:
SET TALK OFF
CLEAR
A=0

B=0
@ 4,10 SAY "PRIMUL NUMAR " GET A PICTURE "9999"
@ 5,10 SAY "AL DOILEA NUMAR " GET B PICTURE "9999"
READ
SIR1="Primul Numar Este Mai Mare "
SIR2="Al Doilea Numar Este Mai Mare Sau Numerele Sunt Egale"
? IIF (A>B, SIR1,SIR2)
RETURN
3.9

Comenzi SQL

O interogare SQL nu este neap rat o ntrebare pus bazei de date. Ea


poate fi i o comand pentru executarea uneia dintre ac iunile urm toare:

construirea unei tabele;


inserarea, modificarea sau s tergerea de linii sau cmpuri;
c utarea n cteva tabele o anumitor informa ii i returnarea
rezultatele ntr-o anumit ordine;

Interogare obinuit n SQL poate fi scris cu litere mari sau mici iar
cuvintele cheie sunt:
SELECT.... FROM..... WHERE
Exemplu:
Cre m un tabel numit Personal, cu structura Nume C(20), Salar
N(10) i dorim afiarea tuturor salaria ilor a c ror nume este
Popescu.:
SELECT NUME, SALAR FROM PERSONAL WHERE NUME=POPESCU
Cea mai simpla interogare este : SELECT * FROM PERSONAL
prin care se afieaz ntreg con inutul tabelei. Semnul (*) transmite comanda de
a returna toate coloanele din tabelul descris n clauza FROM.
Dac se dorete afiarea coloanelor n alt ordine putem specifica dup
clauza SELECT numele cmpurilor dorite separate prin virgul i spa iu.
SELECT SALAR, NUME FROM PERSONAL
3-67

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Dac se dorete afiarea unic a anumitor valori se folosete clauza
DISTINCT.
SELECT DISTINCT SALAR FROM PERSONAL
Dac se dorete afiarea doar a anumitor coloane, acestea se vor
specifica n clauza SELECT.
SELECT SALAR FROM PERSONAL
Clauza WHERE
WHERE <condiie>
Compar valoarea condi iei specificate cu datele supuse interog rii i
returneaz doar nregistr rile ce satisfac condi ia.
Exemplu:
Care sunt agen ii ce au salariul mai mare dect 1000 ?
SELECT NUME, NR_AGENT FROM AGENTI WHERE SAL_BAZA 1000
Asocierea tabelelor se realizeaz prin potrivirea valorilor unei coloane
din primul tabel cu valorile unei coloane din cel de-al doilea tabel. Numele de
coloane trebuie s fie unice. Numele ce nu sunt unice trebuie prefixate cu
numele tabelului din care face parte, altfel apare eroare.
Exemplu:
Care sunt agen ii care au realizat vreo tranzac ie ?
SELECT DISTINCT NUME, AGENTI.NR_AGENT
FROM AGENTI, TRANZACT
WHERE AGENTI.NR_AGENT=TRANZACT.NR_AGENT
Clauza ORDER BY
ORDER(<expC1>[,<expC2>]])[ASC/DESC]
Permite ordonarea afi rii liniilor rezultate dup valorile din coloanele
indicate n aceast clauz . Clauza ORDER BY nu poate fi folosit ntr-o
subinterogare.
ASC ( cresc tor-implicit) DESC (descresc tor)

3-68

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu:

Ordonarea agen ilor cresc tor dup nume, prenume i descresc tor
dup salariu.
SELECT NUME, PRENUME, SAL_BAZA
FROM AGENTI
ORDER BY NUME ASC,PRENUME, SAL_BAZA DESC
Exemple de interog ri:

Care sunt numerele de cod ale agen ilor care au contractat tranzac ii
cu dischete ?
SELECT NR_AGENT
FROM TRANZACT
WHERE COD_PRODUS IN
(SELECT COD_PRODUS FROM MARFURI WHERE
DENUMIRE=DISCHETE)
Care sunt numele agen ilor din Iai care lucreaz cu clien i de tip regii
autonome?
SELECT NUME, NR_AGENT, ORAS, DENUMIRE
FROM AGENTI, CLIENTI
WHERE ORAS=IASI AND TIP=RA
Care sunt clien ii din localit ile n care nu domiciliaz nici un agent comercial ?
SELECT DENUMIRE, NR_CLIENT, ORAS, JUDET
FROM CLIENTI
WHERE ORAS NOT IN (SELECT ORAS FROM AGENTI )

3.10

Depanarea programelor

n scrierea unui program deseori apar erori datorate fie neaten iei, fie
unei insuficiente cunoateri a limbajului de programare sau a omiterii unor
cazuri particulare de evolu ie a programului.
Exist dou mari clase de erori de programare :
erori de sintax ;
erori de rulare, cnd programul este corect scris dar nu
func ioneaz aa cum dorim .
La rularea unui program, apari ia unei erori de sintax determin
ntreruperea execu iei i afiarea unui mesaj de eroare, indicnd tipul erorii i
3-69

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
cernd utilizatorului luarea unei decizii astfel :
Cancel - ntreruperea implicit a programului i revenire n prompter;
Suspend - Suspendarea execu iei programului;
Ignore - Continuarea execu iei, ignornd eroarea ap rut .
Detectarea erorilor de rulare presupune tehnici mai avansate cum ar fi:
rularea pas cu pas;
folosirea punctelor de ntrerupere i vizualizarea con inutului
variabilelor n paralel cu execu ia programului.
Toate acestea se pot efectua cu ajutorul a dou ferestre sistem numite
TRACE i Watch, accesibile din meniul Tools, op iunea Debugger din FOX.
Fereastra TRACE
Pentru a depana un program, trebuie mai nti s -l deschidem cu OPEN
din fereastra TRACE. Execu ia programului poate fi f cuta n mai multe
variante:
Pas cu pas-op iunea OVER sau STEP
cu OVER se execut cte o instruc iune, dar cnd aceasta este
un apel c tre o rutin , acesta este executat n ntregime, ntr-un
singur pas;
cu STEP se execut cte o instruc iune, dar cnd aceasta este
un apel ctre o rutin , acesta este executat pas cu pas;
n combina ie cu STEP se poate folosi OUT care determin
executarea continu a restului de instruc iuni din programul
curent pn la un punct de ntrerupere ce va determina
suspendarea programului.
Punctele de ntrerupere pot fi desemnate de utilizator prin deplasarea
cursorului pe linia dorit i tastarea lui SPACE, ENTER sau click pe mouse. O
noua ac ionare a acestor taste, cnd cursorul se afl pe o linie ce con ine un
punct de ntrerupere, va determina anularea acestuia.
tergerea tuturor punctelor de ntrerupere se face cu CLEAR ALL
BREAKPOINTS.
Un punct de ntrerupere nu determina terminarea execu iei programului ci
doar suspendarea acestuia, pn la o nou comand a utilizatorului.
Execu ie continu , la vitez
controlat

maxim

sau execu ie continu , cu viteza

Se ob ine folosind op iunea THROTTLE ce const n executarea


programului pas cu pas, dup executarea fiec rei instruc iuni f cndu-se o
pauz stabilit de utilizator.

3-70

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
n paralel cu executarea unui program n fereastra TRACE, se poate
vizualiza con inutul variabilelor in fereastra WATCH.
Fereastra WATCH are doua p r i : n partea de sus se introduc variabile i
expresii ce se doresc a fi vizualizate n timpul execu iei programului, iar n
partea de jos apar valorile de moment ale variabilelor. Deasemeni, n DEBUG
se pot specifica puncte de ntrerupere a programului, dependente de valorile
variabilelor din fereastra respectiv , spre deosebire de punctele de ntrerupere
stabilite n TRACE ce reprezint puncte fixe ale programului, independente de
valorile variabilelor.
Pentru a pozi iona un astfel de punct, pe bara ce separ cele dou
p r i se va amplasa un marcaj cu mouse-ul sau deplasndu-ne pe bara
separatoare cu TAB , pozi ionndu-ne cu ajutorul s ge ilor i ap snd SPACE.
Exemplu :
Dorim s calcul m suma primelor zece numere naturale.
CLEAR
SET TALK OFF
SUMA=0
FOR I=1 TO 10
SUMA=SUMA+I
ENDFOR
? "SUMA PRIMELOR ZECE NUMERE NATURALE ESTE: ", SUMA
Acest program d rezultatul 55.
Introduce i o greeala in program, de exemplu in loc de SUMA+I scrie i
SUMA*I i depana i programul dup indica iile de mai sus.
3.11 Instrumente WIZARD
Instrumentele wizard au fost introduse pentru a permite utilizatorilor
mai pu in avansa i s profite de avantajele programului. Un wizard este un
instrument soft care ajut la efectuarea rapid i comod a opera iunilor de
prelucrare a bazelor de date, ofer instruc iuni, pune ntreb ri i n func ie de
ceea ce i se r spunde execut procesul dorit. Visual Fox dispune de mai multe
instrumente wizard dintre care: Table, Query, Report, Form, Label, Group/Total,
Mail Merge.
Instrumentele Wizard se lanseaz astfel: din meniul Tools, alegnd
op iunea Wizard apare o fereastr derulant cu lista instrumentelor din care l
alegem pe cel dorit.
La lansarea unui wizard trebuie citite instruc iunile i trebuie date
r spunsurile la ntreb rile puse, apoi se alege butonul Next (sau Back dac se
3-71

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
dorete ntoarcerea la caseta anterioar ) iar la ultima caset se apas butonul
Finish.
Table wizard

v ajut s crea i un tabel. Fereastra Table Wizard con ine o list a


tabelelor tipice cu exemple de cmpuri frecvent utilizate. Selecta i
cmpurile dorite i ele vor fi incluse n noul tabel. Pute i modifica
numele cmpurilor, tipul i lungimea lor precum i ordinea de sortare a
datelor. Caseta de dialog 3 are 4 op iuni i anume:
Save table salveaz tabelul;

Save and browse for data entry salveaz tabela i afieaz


ecranul pentru introducerea datelor ;

Save and create an Autoscreen for data entry salveaz


tabelul i creeaz un ecran standard pentru introducerea
datelor;

Form Wizard

Modify structure of table modifica structura tabelului.

v ajut s crea i un ecran pentru a gestiona informa iile din tabela dvs.
la acest tip de Wizard se afieaz mai nti un ecran din care alegem
tipul de ecran i anume:
Form Wizard-form asociat unui singur tabel;

One to many Form Wizard-forma ce are asociate dou tabele


(p rinte i copil, rela ionate) ;

utiliza i butoanele disponibile pentru a v deplasa prin tabel i a efectua


diverse opera ii. Butoanele pot avea ataate etichete text sau imagini
explicative.
n caseta 2 alege i cmpurile ce dori i s fie incluse n ecran. Un cmp
se alege prin dublu click pe numele sau din lista Avaible Fields sau prin
selectarea sa i ap sarea butonului Add. Butonul Add All include toate
cmpurile din lista. nl turarea unui cmp din lista Selected Fields se
face prin selectarea lui urmat de ap sarea butonului Remove.
n caseta 3 se precizeaz ordinea de sortare a datelor.
Caseta 4 folosete la selectarea stilului ecranului i a butoanelor
declanatoare.
Caseta 5 va permite s stabili i un titlu care va fi plasat n partea
superioar a noului ecran i tipul de salvare:
Save form for later use salveaz
ntrebuin are ulterioar ;

ecranul pentru o

Save and run form salveaz i ruleaz ecranul;


3-72

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Modify form with design tools modific
instrumentele de proiectare .

ecranul cu

Report Wizard

La acest tip de Wizard se afieaz mai nti un ecran din care alegem
tipul de raport i anume:

Group /Total Report Wizard raport cu grupuri i totaluri,


care v ajut s crea i o structur care poate grupa
nregistr rile pn la trei nivele de grupare i op ional
calculeaz totaluri par iale i generale pentru cmpurile
numerice;

Multi Column Report Wizard v


raport cu maxim trei coloane;

asist

la crearea unui

Report Wizard - raport .

Op iunile din casetele ce apar pe ecran sunt asem n toare cu cele


prezentate anterior.

3-73

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

3.12 Exerciii

1.

2.

Folosind tabelele create n lucr rile anterioare, introduce i date n fiecare


tabel, afia i structurile tabelei, testa i pe rnd fiecare comand prezentat
mai sus.
Avnd unul dintre fiierele create la lucr rile anterioare:

crea i o copie (folosind instruc iunea COPY...) ;


crea i un index (CDX) ;
compara i fiierul DBF dup crearea indexului cu copia fiierului
original;
terge i (DEL) fiierul index;
da i comanda USE cu fiierul DBF pentru care a i creat indexul.

3.

Da i comanda PACK (f r s fie marcat pentru tergere vreun articol)


pentru unul din fiierele DBF. Urm ri i lungimea fiierului nainte i dup
executarea comenzii.

4.

Pentru fiierul agen i, crea i urm toarele indexuri i afia i con inutul tabelei
cu fiecare index dintre :
nume+prenume,
nume+num r de identificare (marca) ,
nume+data naterii descresc tor,
nume+data angaj rii +salar (descresc tor)

5.

Scrie i procedurile pentru marcarea la tergere, n tabela cu agen ii firmei,


a urm toarele articole: agen ii avnd acelai nume, agen ii ce au numele
asem n tor cu unul introdus de la tastatura.

6.

Testa i comenzile REINDEX i PACK

7.

Folosind unul dintre fiierele existente, testa i comanda ZAP n ambele


variante, pentru SET SAFETY ON i OFF

8.

Folosind baza de date Biblioteca creat n lucrarea anterioar :

9.

stabili i rela iile dintre tabele.


stabili i regulile de integritate referen ial .
nchide i i redeschide i baza de date. Verifica i dac
stabilite anterior sunt prezente.

rela iile

Crea i o baz de date numit Firma care s cuprind tabelele Agen i,


Clien i, M rfuri, Tranzac ii, Facturi cu structura de mai jos. Studia i tabelele
i crea i pentru fiecare indecii necesari, apoi rela iona i tabelele.
3-74

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

CLIENTI
NR_CLIENT N (8,0)
DENUMIRE C (15)
TIP C (3) (SA, SRL,etc.)
LOCALITATE C (10)
JUDET C (2)
PRIVAT L

TRANZACT
NR_TRANZ N (6,0)
NR_CLIENT N (8,0)
NR_AGENT N (4,0)
COD_PRODUS N (6,0)
CANT
N (4,0)
DATA_TRANZ D
NR_FACT
N (6,0)
TIP C (1) (intr ri, ieiri)
MARFURI
COD_PRODUS N (6,0)
DENUMIRE C (12)
TIP_MODEL C (10)
UN_MAS
C (6)
PRET_UN N (8,0)
CANTITATE N (8,0)

AGENTI
NR_AGENT N (4,0)
NUME C (10)
PRENUME C (10)
ORAS C (10)
JUDET C (2)
ANGAJARE D
NASTERE
D
SEX
C (1)
CAS
L (casatorit,etc.)
SAL_BAZA N (6,0)
FACTURI
NR_FACT N (6,0)
NR_TRANZ N (6,0)
DATA_EM
D
ACH
L (achitata sau nu)
DATA_ACH D
VALOARE
N (10,0)

10. Ad uga i n tabelul AGENTI o coloana numeric PRIME i completa i


valorile dup cum urmeaz : 100000 pentru cei din oraul Iai, 75000
pentru cei din restul jude ului, 60000 pentru ceilal i.
11. terge i din tabelul MARFURI liniile cu cantitatea sub 10, sau pre ul unitar
<1500. Ad uga i n tabelul FACTURI o coloana TVA i completa i valorile
cu 19% din coloana VALOARE.
12. Crea i un fiier numit SALARIAT cu structura: nume, salar, impozit,
rest_plata. Calcula i impozitul pentru persoanele cu un salar mai mare
dect o valoare pe care o introduce i folosind comanda ACCEPT. Pentru
calculul impozitului crea i o func ie numita IMPOZIT. (Exemplu: pentru
salarii intre 500000-1500000 impozitul este 105000 plus 28% din diferen a
dintre salar i baza de 500000).
13. Scrie i un program care sa va permit introducerea datelor ntr-un fiier
creat de dvs. folosind comenzile de intrare/ieire nv ate in aceasta
3-75

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
lucrare. Folosi i instruc iunile de validare a datelor pentru cmpurile unde
acest lucru este necesar.
14. Scrie i un program pentru calcularea mediilor studen ilor unei grupe
format din dou semigrupe. Ca date de intrare ave i fiierul STUD.DBF cu
structura :
NUME
C(15)
PRENUME
C15)
ID
N(3.0)
&& num r matricol
NOT 1
N(3,0)
NOT 2
N(3,0)
NOT 3
N(3,0)
NOT 4
N(3,0)
NOT zero reprezint absenta la examenul respectiv.
Ca rezultat se cere un fiier CLAS.DBF n care apar dou
cmpuri suplimentare nr_crt. i media.
Articolele trebuie sortate n ordine cresc toare a
semigrupelor i a mediilor, apoi n ordine cresc toare pentru
nume, prenume i num r matricol.
Mediile se vor calcula cu o func ie, dup urm toarea regul :
pentru o singur absen , se mparte suma notelor la 3, altfel
la 4.
Aten ie la folosirea literelor mari i mici i la eventualele
spa ii de la nceputul cmpurilor caracter.
15. Scrie i un program de calcul al salariilor agen ilor comerciali pentru luna
precedent celei curente. La salariul de baz se ad uga 3% din tranzac iile
"cump rare" i respectiv 6% din cele de vnzare intermediate.
Impozitul se calculeaz astfel:
se determin suma bruta ca fiind salbaza+sporuri=brut.
pentru brut intre 500000 i 1000000-105000 + 10% din
brut - 500000
pentru brut intre 1000000 i 1500000-275000 + 25%
din brut-1000000
16. Crea i fiierul DATEPERS.DBF cu urm toarele elemente:
NUME
C(10)
PRENUME C(10)
NR_AGENT N(4)
SALBAZA N(6)
SPORURI N(6)
&& procente din baza+comision
IMPOZIT
N(6)
RETINERI N(6)
Ca rezultat se cere un fiier numit SALAR.DBF (tot cu o coloana nr_crt.) n
care s apar liniile sortate cresc tor dup nume, prenume, nr_agent.
3-76

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
17. Scrie i un program care s creeze un fiier pentru facturile neachitate i
num rul de zile de ntrziere acumulate, grupate pe clien i, ncas ri i pla i.
18. Scrie i un program care s
realizeze un joc asem n tor cu
spnzur toarea. Cuvintele ce trebuie ghicite sunt stocate ntr-un fiier
numit BAZA. Num rul de ncerc ri poate fi 5, iar n loc de desenul
cunoscut pute i afia diverse mesaje.

3-77

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Capitolul 4 Programarea orientata pe obiect-clase i obiecte n Visual


Fox Pro
Mediul Visual Fox Pro este compatibil att cu programarea structurat
standard ct i cu Programarea Orientat pe Obiect (POO), programare ce
reprezint o abordare nou , n care n loc s ne gndim la execu ia unui
program de la prima pn la ultima linie de cod, va trebui s analizam obiectele,
care sunt componente de sine st t toare ale aplica iei, mpreun cu
propriet ile i metodele lor.
Un obiect reprezint ansamblul de date i procedurile de prelucrare a
acestora. n acest context, procedurile se numesc metode iar caracteristicile
obiectului sunt propriet i.
POO este o modalitate de a mpacheta codul astfel nct sa poat fi
refolosit i ntre inut mai uor.
Primul nivel de mpachetare se numete clas . Clasa reprezint
defini ia, ntr-un anumit limbaj de programare, a unui tip de obiecte, adic
descrierea propriet ilor i metodelor componente.
Clasele i obiectele sunt nrudite, dar nu sunt similare. Clasa con ine
informa ii despre cum trebuie s arate i s se comporte un obiect, deci
determina caracteristicile acestuia.
Un obiect are propriet i sau atribute determinate de clasa care st la
baza lui, propriet i ce pot fi stabilite n faza de proiectare sau execu ie.
De exemplu, n tabela de mai jos sunt prezentate cteva dintre
propriet ile obiectului numit caset de validare :
Proprietatea
Caption
Enabled
Fore Color
Left
MousePointer
Top
Visible
4-78

Descriere
Textul descriptiv de lng caseta de validare
Specific dac utilizatorul poate selecta sau nu caseta
de validare
Culoarea textului afiat drept titlu
Pozi ia marginii din stnga a casetei de validare
Felul n care arat indicatorul mouse-ului cnd se afla
deasupra casetei de validare
Pozi ia marginii de sus a casetei de validare
Specific dac pentru utilizator caseta de validare este
vizibil sau nu

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Metode i evenimente asociate unui obiect
Fiecare obiect poate recunoate i poate reac iona la unul sau mai
multe evenimente.
Un eveniment este o ac iune specific i predeterminat , ini iat de
utilizator sau de sistem. n Visual Fox Pro ac iunile utilizatorilor ce pot declana
evenimente sunt micarea mouse-ului, ap sarea unei taste, etc. Evenimentele
declanate de sistem sunt ini ializarea unui obiect sau ntlnirea unei linii de cod
ce genereaz o eroare.
Metodele sunt procedurile ataate unui obiect. Metodele difer de
procedurile obinuite deoarece sunt legate indisolubil de obiect i sunt apelate
altfel dect celelalte proceduri.
Evenimentele pot avea metode asociate. De exemplu, dac scrie i cod
pentru metoda asociat evenimentului Click, codul respectiv se execut la
apari ia evenimentului click.
Tabelul de mai jos prezint cteva evenimente asociate unei caseta de
validare:
Eveniment
Click
GotFocus
LostFocus
Refresh
SetFocus

Descriere
Utilizatorul execut click n caseta de validare
Utilizatorul selecteaz caseta de validare printr-un click de
mouse sau prin ap sarea tastei TAB
Utilizatorul selecteaz alt control
Valoarea casetei de validare este actualizat pentru a reflecta
modific rile survenite n cadrul sursei de date asociate
Casetei de validare i se atribuie focusul (devine inta intr rilor)
ca i cum utilizatorul ar fi ap sat tasta TAB

Clasele
Toate propriet ile , metodele i evenimentele asociate unui obiect sunt
specificate n cadrul defini iei clasei. n plus, clasele au o serie de caracteristici
ce permit scrierea de cod care este uor de ntre inut i poate fi reutilizat.

Caracteristicile claselor sunt :


ncapsularea implic mpachetarea codului n cadrul obiectului i
abstractizarea acestuia. De exemplu, propriet ile ce determin
elementele unui casete cu lista i codul ce se execut atunci cnd
selecta i un element din list pot fi ncapsulate ntr-un singur control ce
se adaug la un formular.

4-79

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Subclasele sunt derivate dintr-o clasa existent . Subclasele


motenesc toate func ionalit ile clasei p rinte, dar pot avea i
propriet i noi, pe care programatorul le poate seta, reutiliznd astfel
codul deja existent.
Motenirea este caracteristica ce permite ca o modificare efectuat
asupra unei clase s se reflecte n toate clasele definite pe baza ei,
actualizarea automat ducnd la economisirea timpului i a efortului
dvs.

n Visual Fox Pro clasele pot fi de tip control sau container, dup cum
se arat n lista urm toare:

Controale: Check Box, Combo Box, Command Button, Edit Box,


Header, Hyperlynk, Image, Label , Line, List Box, OLE
Bound Control, OLE Container Control, Shape, Spinner,
Text Box, Timer
Containere: Container, Form Set, Form ,Grid, Column, Page Frame,
Page, Toolbar, Option Button Group, Command Button
Group

Clasele containere pot s con in alte obiecte, permi nd accesul la


acestea. De exemplu, n cazul n care crea i o clas container care cuprinde o
caset list i dou butoane de comand , dup care ad uga i unui formular un
obiect bazat pe aceast clas , fiecare obiect poate fi manipulat individual, att
la proiectare ct i n timpul execu iei.
Toate clasele recunosc urm torul set minimal de evenimente:
Eveniment
Init

Descriere
Apare la crearea unui obiect

Destroy
Error

Apare la desc rcarea unui obiect din memorie


Apare de cte ori se semnaleaz o eroare

Toate clasele recunosc urm torul set minimal de propriet i:


Proprietate
Class
BaseClass
ClassLibrary
ParentClass

4-80

Descriere
Tipul clasei
Clasa de baz din care provine (Form,
CommandButton, etc.)
Biblioteca de clase n care este stocat
Clasa din care a fost derivat (dac deriv dintr-o
clas de baz , ParentClass este aceeai cu
BaseClass)

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu : plecnd de la clasa de baz CommandButton putem crea un buton
care s execute ieirea din formular, cu eticheta Exit, ca o subclas a clasei
butoane de comand . Plasat ntr-un formular, acest buton devine un obiect.
Clasa de baz

Command

Exit

Subclasa

Obiect n formular

4.1

Crearea claselor

Se poate face din cadrul gestionarului de proiecte, selectnd pagina


Classes i apoi New sau din meniul File, op iunea New, Class, New File sau
folosind comanda :
CREATE CLASS ClassName | ? [OF ClassLibraryName1 |
?] [AS cBaseClassName [FROM ClassLibraryName2]] [NOWAIT]
Modificarea unei clase va afecta toate subclasele i obiectele bazate
pe acea clas i se face prin selectarea clasei dorite i alegerea op iunii Modfiy.
Proiectantul de clase
Proiectantul de clase se deschide atunci cnd este indicat clasa pe
care se va baza noua clas creata i biblioteca n care aceasta va fi stocat .
Interfa a proiectantului de clase ne permite vizualizarea i modificarea
propriet ilor clasei n fereastra Properties. Deasemeni se poate introduce sau
modifica codul asociat metodelor necesare.
Daca noua clas se bazeaz pe una de tip container, se pot ad uga
controale (butoane, grile, imagini, etc.).
Unei clase existente i se pot ad uga propriet i noi astfel:
Din meniul Class, selecta i New Property;
n caseta New Property introduce i numele propriet ii;
Specifica i vizibilitatea (Public, Protected, Hidden) ;
Da i click pe Add.
4-81

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
ntr-un mod asem n tor se poate ad uga i o metod nou unei clase.
Atunci cnd ad uga i o proprietate nou , valoarea ei implicit este .F.
Pentru a specifica o alt valoare, n fereastra Properties, n fia Other, da i click
pe proprietatea dorit i introduce i noua valoare.
Atribuirea unei pictograme pentru noua clas n vederea afi rii pe bara
de instrumente se face prin selectarea op iunii Class Info din meniul Class
(trebuie sa fi i n proiectantul de clase). n caseta Class Info introduce i numele
i calea pentru fiierul.bmp din caseta Toolbar Icon.
Ad ugarea claselor la formulare se face astfel :
1. Din meniul Tools, alege i op iunea Options, apoi alege i fia Controls;
2. Selecta i Visual Class Libraries i alege i Add;
3. Din caseta de dialog Open alege i o biblioteca de clase pe care sa o
ad uga i i selecta i Open.
Definirea claselor prin program se face cu comanda :
DEFINE CLASS ClassName1 AS ParentClass [OLEPUBLIC]
[[PROTECTED | HIDDEN PropertyName1, PropertyName2...]
[Object.]PropertyName = eExpression...] [ADD OBJECT
[PROTECTED] ObjectName AS ClassName2
[NOINIT][WITH cPropertylist]]...
[[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Name
[NODEFAULT]cStatements [ENDFUNC | ENDPROC]]...
ENDDEFINE
Exemplu : Crearea unui set de butoane de navigare pentru vizualizarea
nregistr rilor dintr-o tabel .
Butoanele de navigare vor execut urm toarele comenzi:

pozi ionare pe prima nregistrare din tabela navtop;

pozi ionare pe nregistrare urm toare celei curente navnext;

pozi ionare pe nregistrarea anterioara celei curente-navprior;


pozi ionare pe ultima nregistrare din tabela navbottom.

Butoanele vor avea caracteristici comune, de aceea merit s cre m o


clas pentru toate butoanele de navigare. Clasa p rinte este numit Navbutton
i va fi definit ulterior.
Odat
definit
clas
p rinte, subclasele ce urmeaz
definesc
func ionalitatea i aspectul specific fiec rui buton. Va fi creat o clas container,
4-82

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
numit vcr, n care va fi ad ugat fiecare buton. Containerul va fi apoi ad ugat
formularelor pentru a se putea naviga n cadrul tabelei.

Exemplu:
Scrie i un program numit navclass.prg
*Definirea clasei NAVBUTTON
Define class Navbutton as CommandButton
Height=25
Width=25
TableAlias =' '
Procedure click
if not empty(this.TableAlias)
select (this.TableAlias)
endif
endproc
Procedure refreshform
_screen.ActiveForm.Refresh
Endproc
Enddefine

* Definirea butonului Top


Define class Navtop as Navbutton
caption='T'
Procedure click
dodefault()
go top
this.refreshform
endproc
Enddefine

4-83

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
* Definirea butonului Prior
Define class Navprior as Navbutton
caption='P'
Procedure click
dodefault()
skip -1
if bof()
go top
endif
this.refreshform
endproc
Enddefine
* Definirea butonului Next
Define class Navnext as Navbutton
caption='N'
Procedure click
dodefault()
skip 1
if eof()
go bottom
endif
this.RefreshForm
endproc
Enddefine
* Definirea butonului Bottom
Define class Navbottom as Navbutton
caption='B'
Procedure click
dodefault()
go bottom
this.refreshform
endproc
Enddefine

4-84

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
* Definirea clasei vcr
define class vcr as container
height=25
width=100
left=50
top=3
add object cmdtop as navtop with left = 0
add object cmdprior as navprior with left = 25
add object cmdnext as navnext with left = 50
add object cmdbottom as navbottom with left = 75
procedure settable(cTableAlias)
if type("cTableAlias")='C'
this.cmdtop.TableAlias=cTableAlias
this.cmdprior.TableAlias=cTableAlias
this.cmdnext.TableAlias=cTableAlias
this.cmdbottom.TableAlias=cTableAlias
endif
enddefine
*Adugarea controlului vcr la o clasa formular
define class navform as form
add object ovcr as vcr
enddefine
4.2

Crearea formularelor

Formularele (sau formele, machete, ecrane) sunt interfe e grafice ce


ofer utilizatorului posibilitatea de a ac iona asupra tabelelor de date prin
opera ii de ad ugare, modificare, tergere sau consultare a informa iilor stocate.
Formularele sunt compuse din obiecte ce pot r spunde la evenimente generate
de utilizator sau sistem, astfel nct utilizatorul s -i poat ndeplini ct mai
intuitiv i uor sarcinile.
Un formular nou se creeaz cu ajutorul proiectantului de formulare
(Form Designer). Acesta poate fi accesat alegnd din meniul File op iunea New
Form sau folosind comanda CREATE FORM.
Fiecare formular include un mediu de date. Mediul de date este un
obiect ce cuprinde tabelele i vederile cu care interac ioneaz formularul,
precum i rela iile dintre tabele. Mediul de date poate fi salvat mpreun cu
formularul, astfel nct ori de cte ori respectivul formular va fi accesat, mediul
de date va deschide tabelele sau vederile asociate, iar la ieirea din formular
acestea vor fi automat nchise.
Proprietatea ControlSource a controalelor va fi populat , f cndu-se
4-85

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
automat leg tura ntre sursa de date i ceea ce va fi afiat pe ecran.
Pentru a accesa fereastra de proiectare a mediului de date alegem din
meniu op iunea View, Data Environment, apoi click dreapta i Add. n caseta de
dialog Open alege i tabela dorit , repetnd opera ia de ad ugare pn ce lista
de tabele este epuizat .
Cele mai importante propriet i ce trebuie setate pentru mediul de date
sunt:
Proprietate

Descriere

Valoare implicit

AutoCloseTables

Controleaz nchiderea automat a


tabelelor la eliberarea formularului din
memorie

Adev rat(.T.)

AutoOpenTables

Controleaz deschiderea automat a


tabelelor la rularea formularului

Adev rat(.T.)

InitialSelectedAlias

Indic tabela selectat la rularea


formularului

Dac nu se
specific , n
momentul execu iei
este selectat primul
cursor ad ugat n
DataEnvironment

Eliminarea unei tabele din cadrul mediului de date se face prin


selectarea tabelei urmat
de selectarea op iunii Remove din meniul
DataEnvironment.
Dac pentru tabelele ce au fost ad ugate n mediul de date existau
rela ii permanente, acestea se p streaz i sunt vizibile.
Dac nu exist rela ii persistente ntre table, acestea se pot crea prin
tragerea unui cmp din tabela primar peste eticheta de index corespunz toare
din tabela asociat . Atunci cnd se stabilete o rela ie n cadrul mediului de
date, ntre tabele va ap rea o linie care reprezint rela ia, propriet ile acesteia
putnd fi setate din fereastra Properties.
Dup ce am definit mediul de date asociat unui formular va trebui s ii
ad ugam obiectele necesare.
Controalele dintr-un formular pot fi de dou tipuri : controale care sunt
asociate unor surse de date i controale ce nu au date asociate. Atunci cnd
utilizatorul interac ioneaz cu controalele asociate datelor, valorile introduse de
el sunt stocate n sursa de date.
Propriet ile ce determin asocierea cu datele sunt ControlSource
pentru un control gril sau RecordSource pentru celelalte. Daca proprietatea
ControlSource nu este configurat , valoarea introdus de utilizator sau cea pe
care o alege din cadrul controlului este p strat ca valoare a propriet ii i nu va
fi salvat pe disc sau n memorie.
4-86

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
4.3

Utilizarea controalelor predefinite

Butoane de op iune
Grupurile de butoane de op iune sunt containere ce cuprind butoane de
op iune. Ele permit utilizatorilor sa aleag doar una dintre op iunile puse la
dispozi ie n loc s introduc direct datele. De exemplu, aceste butoane pot fi
folosite n cazul n care dorim ca o list sa fie afiat pe ecran sau trimis c tre
o imprimant . Implicit n grupul de butoane de op iune sunt introduse dou
butoane.
Prin modificarea propriet ii ButtonCount se poate specifica num rul
de butoane dorit.
Proprietatea Value indic butonul care a fost selectat. Dac utilizatorul
alege butonul 3, atunci Value va avea valoarea 3.
Dac proprietatea ControlSource a grupului este un cmp de tip
caracter, sau dac propriet ii Value i se atribuie o valoare de tip caracter
nainte de rularea formularului, proprietatea Value este dat de titlul butonului
selectat.
Configurarea propriet ilor se poate face manual pentru tot grupul de
butoane sau pentru fiecare buton n parte din fereastra Properties, sau n
timpul execu iei, indicnd numele butonului i valoarea respectiv pentru
proprietatea dorit .
Exemplu: consider m c avem un grup de dou butoane prin setarea c rora
dorim s stabilim dac un medicament se prezint sub forma de
tablete sau fiole. Va trebui s setam proprietatea Caption a
butonului, n fereastra de propriet i sau s scriem codul asociat.
ThisForm.optgr.Button(1).Caption=Tablete
ThisForm.optgr.Button(2).Caption=Fiole
unde-ThisForm este forma activa in care se lucreaz
-Optgr este numele grupului de butoane
-Button este butonul selectat
Configurarea propriet ilor tuturor butoanelor dintr-un grup se poate
face folosind metoda SetAll a grupului.
Exemplu:
ThisForm.optgr.SetAll(Enabled,.F.,OptionButton)
va dezactiva toate butoanele din grup.
Pentru a determina care dintre butoane este selectat la un moment
dat se folosete proprietatea Value a grupului.
Butoanele de op iune pot fi folosite i pentru p strarea informa iilor ntr4-87

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
o tabel , prin salvarea propriet ii Caption. Pentru aceasta va trebui s :

Atribuim un sir vid propriet ii Value a grupului de butoane;


Atribuim Propriet ii ControlSource a grupului de butoane un
cmp de tip caracter dintr-o tabel .

Casete list i casete cu list derulant


Casetele tip list i casetele tip list derulant (casete combinate,
pentru care proprietatea Style are valoarea 2 DropdownList) ofer
utilizatorului liste cu cuprind informa ii ce pot reprezenta valori dintr-un tabel sau
op iuni predefinite.
ntr-o caseta tip list , n orice moment, sunt vizibile mai multe elemente
ale listei.
ntr-o caseta derulant este vizibil doar un singur element. Utilizatorul
poate executa click pe butonul s geata n jos pentru a afia toate elementele
listei.
Propriet i i metode ale unei liste :
Proprietate
ColumnCount
ControlSource
Multiselect
RowSource
RowSourceType
Metode
AddItem
RemoveItem
Requery

Descriere
Num rul de coloane din caseta list
P streaz valoarea aleas de utilizator din cadrul
listei
Indic dac utilizatorul poate selecta mai multe
elemente la un moment dat
Sursa de provenien a elementelor afiate n list
Indic tipul pentru RowSource (o valoare, o tabela,
o interogare, etc.)
Descriere
Adaug un element la o list pentru care
proprietatea RowSourceType este 0
Elimin un element dintr-o list pentru care
proprietatea RowSourceType este 0
Actualizeaz
lista
dac
valorile
din
RowSourceType s-au modificat

Alegerea tipului de date pentru o caset list sau caset cu list


derulant se face prin setarea propriet ii RowSourceType i prin atribuirea
unei surse de date, completnd valoarea corespunz toare pentru proprietatea
RowSource.
4-88

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
RowSourceType
0
1
2
3
4
5
6
7
8
9

Sursa elementelor listei


Nici una. Elementele listei se adaug prin program
Valoare
Alias
Instruc iune SQL
Interogare (Query)(.qpr)
Matrice
Cmpuri dintr-o tabel
Fiiere
Structur
Lista pop-up (inclus
pentru compatibilitate
versiunile anterioare)

cu

Exemple :
Dac RowSourceType este 0, elementele listei se pot ad uga
folosind metoda AddItem
ThisForm.list1.RowSourceType=0
ThisForm.list1.AddItem(Primul element)
ThisForm.list1.AddItem(Al doilea element)
ThisForm.list1.AddItem(Al treilea element)
Metoda Remove Item permite eliminarea elementelor din list .
ThisForm.list1.RemoveItem(3) pentru eliminarea celui de al treilea element

Dac RowSourceType este 1 se pot indica pentru proprietatea


RowSource mai multe valori care sa fie afiate n cadrul listei.
Elementele trebuiesc separate prin virgul iar dac acestea vor fi
introduse prin program vor trebui ncadrate ntre ghilimele.
ThisForm.list1.RowSourceType=1
ThisForm.list1.RowSource=Primul,Al doilea, Al treilea
Dac RowSourceType este 2 se pot insera valori din cmpurile tabelei
deschise, n func ie de setarea pentru ColumnCount.
Dac ColumnCount este 0 sau 1 se afieaz primul cmp al tabelei,
dac este 3, lista afieaz valorile din primele trei cmpuri. Pentru a
afia cmpurile ntr-o alt ordine dect cea din tabela seta i
RowSourceType pe 3 sau pe 6.
Dac RowSourceType este 3 trebuie sa include i o instruc iune SQL
SELECT n proprietatea RowSource. Dac instruc iunea va fi scris
prin program, ea va trebui inclus ntre ghilimele. Este de preferat ca
rezultatele interog rii s fie plasate ntr-un cursor pentru a nu se afia
4-89

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

rezultatul ntr-o fereastra Browse.


Dac RowSourceType este 4 caseta poate fi populat cu rezultatul
unei interog ri salvate ntr-un fiier cu extensia .qpr, caz n care
propriet ii Row Source i se atribuie fiierul.qpr.
ThisForm.List1.RowSource=numefisier.qpr
Dac RowSourceType este 5 atunci lista este populat cu elementele
unei matrici.
Dac RowSourceType este 6 atunci lista este populat cu cmpurile
din structura fiierului dorit specificate n RowSource i delimitate prin
virgul .
Dac RowSourceType este 7 atunci lista cuprinde fiierele din
directorul curent, cu op iunea c pot fi alese i alte unit i de disc.
Dac
RowSourceType este 8 atunci lista cuprinde cmpurile
specificate n tabela precizat la RowSource.

Se poate oferi utilizatorului posibilitatea de a alege o op iune din list ,


pentru care s fie afiate o serie ntreag de alte informa ii. De exemplu, dac
lista este populat cu numele pacien ilor trata i de un medic i dorim s afi m
toate informa iile legate de pacient, putem proceda astfel, n func ie de sursa de
date a formularului:
RowSourceType

Selectarea nregistr rilor corespunz toare

2-Alias
6-Cimpuri

Cnd utilizatorul selecteaz


o valoare din list ,
indicatorul de nregistr ri este fixat automat pe
nregistrarea
dorit .
Se
lanseaz
comanda
ThisForm.Refresh n evenimentul InteractiveChange
al listei pentru afiarea noilor valori n celelalte
elemente ale formei
n cadrul evenimentului InteractiveChange selecta i
tabela ce con ine nregistrarea cu valoarea dorit , apoi
c uta i valoarea respectiv . De exemplu dac
RowSource con ine numele de identificare pentru
pacien i, se poate folosi codul urm tor
Select pacieni
Locate for This.Value=pacient_id
Thisform.Refresh

0-Nici una
1-Valori
3-Instructiune SQL
4-Interogare (qpr)

4-90

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Casete de validare
Casetele de validare sunt folosite pentru a permite utilizatorului s
specifice o stare de tip logic (True sau False, activat sau dezactivat, etc).
Totui exist cazuri n care nu se poate evalua cu precizie starea dorit ,
motiv pentru care exist patru st ri posibile pentru caseta de validare i anume :
Forma afiat Proprietatea Value
0 sau.F.
1 sau.T.
2
Null

Proprietatea Value a casetei de validate


indic
tipul de date corespunz tor
ultimei atribuiri efectuate. Daca s-a
setat valoarea .T. sau .F. tipul de data
este Logical, i nu se va schimba dect
atunci cnd ve i atribui propriet ii o
valoare numeric .

Dac se asociaz propriet ii ControlSource a unei casete de validare


un cmp de tip logic dintr-o tabel , caseta va fi :

bifata dac valoarea nregistr rii curente este .T. ;


nu va fi bifat dac valoarea nregistr rii curente este .F. ;
va avea un semn pe fond cenuiu dac valoarea nregistr rii curente
este .null.

Caseta tip text


Caseta tip text este controlul de baz n care utilizatorul poate s
introduc sau s modifice datele p strate ntr-un cmp al unei tabele, cmp ce
nu este de tip memo.
Configurarea sau modificarea prin program a textului afiat n caset
se face prin setarea propriet ii Value a acesteia.
Dac proprietatea ControlSource este specificat , valoarea afiat n
caseta text este stocat n proprietatea Value a acesteia i n variabila sau
cmpul specificat n ControlSource.
Validarea datelor dintr-o caseta tip text se face prin scrierea de cod
asociat metodei Valid. Dac metoda Valid ntoarce valoarea .F. va fi afiat
mesajul Invalid Input sau propriul dvs. mesaj specificat n codul evenimentului
Valid (se poate folosi func ia Messagebox() sau comanda Wait Wind mesajul
dvs.).
4-91

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu: dorim s introducem ntr-o caset de tip text un num r mai mare
dect 100. Pentru a valida datele introduse de utilizator inseram codul asociat
metodei Valid astfel:
If val(This.Value) < 100
= Messagebox(Introducei o valoare mai mare dect 100,1)
Return 0
Endif
Pentru a selecta textul atunci cnd caseta text devine inta intr rilor
atribui i valoarea .T. propriet ii SelectOnEntry.
Proprietatea InputMask determin caracteristicile textului introdus n
caset . De exemplu dac InputMask are valoarea 999,999.99 se vor introduce
n caset doar numere mai mici de un milion, cu dou zecimale. Virgula i
punctul vor fi afiate n caset nainte de introducerea datelor.
Pentru cmpuri de tip logic, dac se dorete ca utilizatorul s poat
introduce Y (Da ) i N (Nu) dar nu i T sau F atribui i valoarea Y
propriet ii InputMask.
Dac se dorete acceptarea introducerii unor valori f r ca acestea s
apar n clar (de exemplu la introducerea unor parole), se atribuie propriet ii
PasswordChar valoarea * sau orice alt caracter generic.
Pentru a introduce date calendaristice vor fi setate urm toarele
propriet i:
Proprietate
Century
DateFormat
StrictDdateEntry

Descriere
Indic dac sunt afiate sau nu primele dou cifre ale
anului
Formateaz datele de intrare ntr-unul dintre cele 15
formate de dat predefnite
Dac este 0 permite introducerea datelor ntr-un format
mai flexibil dect cel implicit 99/99/99.

Cele mai importante propriet i pentru casetele tip text sunt :


Proprietate
Alignment

ControlSource

4-92

Descriere
Seteaz tipul de aliniere a valorilor introduse n caseta
(stnga, dreapta, centru, automat). Alinierea depinde
de tipul de dat introdus.
Cmpul tabelei sau variabila a c rei valoare este
afiat

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
InputMask
SelectOnEntry
TabStop

Indic regulile de introducere a datelor


Stabilete dac la primirea focusului con inutul casetei
va fi selectat automat
Indic dac utilizatorul poate ajunge la caseta ap snd
repetat tasta TAB. Dac TabStop este .F. , ea poate fi
totui selectata efectund click pe ea.

Caseta de editare
Casetele de editare permit afiarea i editarea unui text provenit din
cmpuri lungi de caractere sau cmpuri memo. Aceste casete asigur saltul
automat al textului pe rndul urm tor i posibilitatea de deplasare n cadrul
textului folosind s ge ile.
Casetele de editare, ca i casetele text au propriet i ce permit lucrul cu
textul selectat i anume: SelLenght, SelStart i SelText
De exemplu, putem selecta primul cuvnt dintr-o caseta astfel:
Form1.text1.SelStart=0
Form1.text1.SelLenght= AT( ,Form1.Text1.text)-1
Cele mai importante propriet i ce pot fi configurate pentru casetele de
editare sunt :
Proprietate
AllowTabs

HideSelection
ReadOnly
ScrollBars

Descriere
Stabilete dac este permisa utilizarea tastei TAB n
caseta de editare (caz n care trebuie verificat dac se
poate trece la controlul urm tor cu CTRL+TAB)
Stabilete dac textul din caseta de editare este selectat
n mod vizibil atunci cnd caseta nu de ine focusul
Stabilete dac textul din caseta poate fi modificat sau
nu
Indic prezenta sau absenta barelor de defilare

Casetele combinate
Acest tip de caset reunete func ionalit ile casetelor de tip list i a
celor de tip text.
Ele pot fi de dou feluri: casete combinate derulante i liste derulante,
func ie de specifica ia asociata propriet ii Style a controlului.
Cele mai importante propriet i ce pot fi configurate pentru casetele
combinate sunt :
4-93

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Proprietate
ControlSorce
DisplayCount
InputMask
IncrementalSearch

RowSource
RowSourceType
Style

Descriere
Indic cmpul n care va fi p strat valoarea aleas
sau introdus de utilizator
Num rul maxim de elemente afiate n list
Tipul valorilor ce pot fi introduse
Indic dac controlul ncearc s g seasc un
element din list care s corespund cu literele deja
introduse
Sursa datelor din list
Indic tipul sursei casetei combinate. Valorile sunt
similare cu cele de la caseta tip list
Indica dac caseta este o caset combinat derulant
sau list derulant .

Exemplu :
Dorim s ad ugam noi valori la elementele afiate ntr-o caset
combinat cu list derulant . La evenimentul Valid vom scrie
urm toarea secven a de cod care, nainte de ad ugarea
elementului, s verifice dac acesta nu exist deja n list .
Elexista =.F. (presupunem ca valoarea nu exist )
For I=1 to This.ListCount
If This.List(i)= This.Text
Elexista=.T.
Exit
Endif
Endfor
If !Elexista
This.AddItem (This.text)
Endif
Casetele de incrementare/decrementare (Spinner)
Se folosesc pentru a permite utilizatorilor s introduc valori dintr-o
plaj anterior stabilit .
Intervalul de valori se specific
prin setarea propriet ilor
KeyboardHighValue i SpinnerHighValue (valoarea maxim posibil ) i
KeyboardLowValue i SpinnerLowValue (valoarea minim posibil ).
4-94

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Dei controlul Spinner este configurat pentru valori numerice, el poate
fi utilizat n combina ie cu o caset de tip text pentru a permite utilizarea altor
tipuri de date.
Exemplu : Pentru a parcurge un interval de date calendaristice, se va
dimensiona controlul astfel nct s fie vizibile doar butoanele i plasam caseta
text lng el. Atribuim o dat calendaristic propriet ii Value a casetei text iar
n codul evenimentelor UpClick i DownClik ale Spinner-ului increment m sau
decrement m data.
Cele mai importante propriet i ce pot fi configurate pentru Spinner
sunt :
Proprietate
Descriere
Pasul de incrementare/decrementare
Interval
Valoarea maxim ce poate fi introdus n
KeyboardHighValue
caseta text a controlului
Valoarea minim ce poate fi introdus n
KeyboardLowValue
caseta text a controlului
Cea mai mare valoarea ce poate fi afiat de
SpinnerHighValue
control cnd se apas butonul s geata sus
Cea mai mic valoarea ce poate fi afiat de
SpinnerLowValue
control cnd se apas butonul s geata jos

Buton de comanda
Grup de butoane de comanda
Butoanele de comanda permit executarea unor ac iuni. De obicei codul
asociat ac iunii este specificat n evenimentul Click.
Cele mai importante propriet i ce pot fi configurate pentru butoanele de
comanda sunt :
Proprietate
Cancel
Caption
DisablePicture
DownPicture
Enabled
Picture

Descriere
Indic dac se execut sau nu codul asociat
evenimentului Click la ap sarea tastei ESC
Textul afiat pe buton
Fiierul de tip imagine (bmp) afiat la dezactivarea
butonului
Fiierul de tip imagine (bmp) afiat la activarea
butonului
Dac butonul poate fi selectat sau nu
Fiierul de tip imagine (bmp) afiat pe buton
4-95

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Dac se dorete folosirea unui grup de butoane de comand nseamn
ca ele au caracteristici comune i codul asociat se poate scrie ntr-o singur
procedur (de exemplu codul pentru Click). Proprietate Value a grupului indic
pe care dintre butoane s-a dat click.
Dac este scris cod pentru Click special pentru unul dintre butoanele
din grup, atunci la declanarea evenimentului click se va executa acest cod i
nu cel general pentru grup.
Cele mai importante propriet i ce pot fi configurate pentru grupurile de
butoanele de comanda sunt :
Proprietate
ButonCount
BackStyle

Descriere
Num rul de butoane din grup
Tipul de fundal (transparent sau opac)

Controlul imagine
Permite afiarea imaginilor stocate ntr-un fiier de tip bmp pe un
formular.
Propriet ile acestui control pot fi schimbate prin cod n timpul execu iei
astfel nct imaginea poate fi diferit de la un caz la altul.
Cele mai importante propriet i ce pot fi configurate pentru controlul
imagine sunt :
Proprietate
Picture
BorderStyle
Stretch

Descriere
Imaginea (fiierul bitmap) ataat
Exist sau nu chenar vizibil
0-Clip - por iunile imaginii ce dep esc dimensiunile
controlului nu sunt afiate
1-Isometric sunt p strate dimensiunile originale ale imaginii
2- Stretch imaginea este scalat
corespunz tor
dimensiunilor controlului

Controlul etichet
Difer de caseta text prin urm toarele : nu are surs de date, nu poate fi
editat direct din interiorul s u, nu se poate ajunge la el prin ap sarea tastei
TAB. Propriet ile Caption i Visible pot fi modificate prin program.
Cele mai importante propriet i ce pot fi configurate pentru controlul
etichet sunt :
4-96

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Proprietate
Caption
Autosize
Backtyle
WordWrap

Descriere
Textul afiat drept etichet
Dac dimensiunea etichetei este ajustata func ie de cea a
textului din Caption
Dac eticheta este opac sau transparent
Dac textul afiat continu pe mai multe rnduri

Forme geometrice i linia


Aceste controale ajut la gruparea vizual a elementelor formularului i
pentru nfrumuse area lui.
Cele mai importante propriet i ce pot fi configurate pentru forme
geometrice sunt :
Proprietate
Curvature
FillStyle
SpecialEffect

Descriere
Valoare cuprins ntre 0 (unghi de 90 grade) i 99
(cerc sau oval)
Modelul de umplere al formei geometrice
Dac forma este plan sau tridimensional . Are
efect doar pentru Curvature=0

Cele mai importante propriet i ce pot fi configurate pentru controlul linie sunt :
Proprietate
BorderWidth
LineSlant

Descriere
Grosimea liniei n pixeli
Direc ia liniei n cazul n care nu este orizontal sau
vertical (valorile valabile pot fi / sau \)

Controlul de tip gril


Grila este un obiect de tip container, care poate con ine mai multe
coloane, ce pot avea antet i controale, fiecare cu propriul set de propriet i,
evenimente i metode.
Grila permite prezentarea i manipularea liniilor i coloanelor de date
ntr-un formular sau o pagin i de cele mai multe ori este folosit pentru
afiarea datelor din tabele rela ionate de tip una la mai multe.
Cele mai importante propriet i ce pot fi configurate pentru controlul
gril sunt :
4-97

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Proprietate
ChildOrder
ColumnCount

LinkMaster
RecordSource
RecordSourceType

Descriere
Cheia extern a tabelei fiu care este legat de cheia
primar a tabelei p rinte
Num rul de coloane: Dac este -1 grila va avea
attea coloane cte cmpuri exist n sursa de
nregistr ri
Tabela p rinte a nregistr rilor fiu afiate n gril
Datele ce vor fi afiate n gril
Provenien a datelor din gril (tabel , alias, etc)

Cele mai importante propriet i ce pot fi configurate pentru coloanele


dintr-o gril sunt :
Proprietate
ControlSource
Sparse
CurrentControl

Descriere
Datele ce vor fi afiate n coloan (cmp din tabele)
Dac este .T. controalele grilei sunt afiate doar
cnd celula respectivei coloane este selectat
Stabilete care dintre controalele grilei este activ

Cadre de pagina
Un cadru de pagin este un obiect container ce poate con ine mai multe
pagini. La rndul lor, paginile pot con ine controale.
Cele mai importante propriet i ce pot fi configurate pentru cadrele de
pagin sunt :
Proprietate
Tabs
TabStyle

PageCount

4-98

Descriere
Indic dac fiele paginilor sunt vizibile sau nu
Indic dac foile sunt toate de aceeai dimensiune
i dac toate mpreun au l imea cadrului de
pagin
Num rul de pagini din cadrul de pagin

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
4.4

Generatorul de rapoarte

Rapoartele reprezint un ansamblu de informa ii construite pe baza


datelor din unul sau mai multe tabele, informa ii ce urmeaz a fi afiate pe
ecranul monitorului, tip rite la imprimant sau ntr-un fiier de tip text. Un raport
este format dintr-un ansamblu de elemente care conlucreaz la selectarea i
furnizarea c tre utilizator a unui set de date ntr-o form cat mai concis , clar
i pl cut .
Raportul se construiete n mediul VisualFoxPro cu ajutorul
generatorului de rapoarte, folosind una din metodele :
Comanda CREATE REPORT <nume raport>
sau din meniul File alegem op iunea NEW i apoi Report,
preciznd deasemeni numele raportului i calea unde acesta va fi
salvat.
Modificarea unui raport existent se face folosind comanda :
MODIFY REPORT <nume raport>
sau din meniul File alegem op iunea Open i apoi selectam raportul dorit.
Odat lansat generatorul de rapoarte, pe ecran se afieaz fereastra de lucru a
acestuia, iar la meniul sistem este ad ugat submeniul Report.

Banda antet de pagina

Banda detaliu
Banda subsol pagin

Dup cum se vede n figur , ini ial orice raport are n


componen benzile cu semnifica iile men ionate.
Pentru a putea configura elementele raportului, ne este
necesar bara Report Control. Dac acesta nu este vizibil , va
trebui s o activam din meniul View, Toolbars, Report Controls.
Fiecare band din cadrul raportului va genera n timpul
rul rii lui, mai multe instan e, n func ie de semnifica ia pe care o are. O band
dintr-un raport reprezint o forma generic a raportului final.
4-99

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Con inutul benzilor descrise mai sus este urm torul :
Page Header (Antet) se folosete pentru specificarea con inutului p r ii
superioare a fiec rei pagini din raport. Ea va avea attea instan e cate pagini va
avea raportul, i poate con ine, de exemplu, num rul curent al paginii, data
curent , numele firmei care emite documentul, etc.
Detail va genera n raport rndurile de detaliu (con inutul de baz al
raportului), adic cmpurile din tabela / tabele care se doresc a fi eviden iate n
raport.
Page Footer (Subsol) va con ine elementele necesare a fi afiate n
subsolul paginii, cum ar fi, de exemplu, capitolul, ora list rii, etc.
Fiecare band dintr-un raport are asociat o bar , care o delimiteaz i
cu ajutorul c reia poate fi redimensionat . Dimensiunea benzii corespunde
dimensiunii zonei respective din pagina raportului final. Schimbarea dimensiunii
se face prin tragerea, cu ajutorul mouse-ului, a barei delimitatoare asociate.
n l imea minim a unei benzi este zero, caz n care ea va fi lipita de banda
anterioar .
Propriet ile unei benzi pot fi specificate de utilizator. Dnd un dublu click
pe band , se deschide fereastra de propriet i n care putem specifica:
Height - n l imea benzii. Dac se dorete ca n l imea s fie constant
pentru toate instan ele benzii, se activeaz comutatorul Constant band
height
On Entry- expresia ce se verific nainte de afiarea benzii
On exit - expresia ce se verific dup fiecare afiarea benzii
De exemplu, pentru men inerea unui contor intern care s memoreze
num rul de pagini tip rite, se poate executa o instruc iune de incrementare a
controlului nainte sau dup fiecare afiare a benzii de antet de pagin .
Instruc iunea va fi introdus ntr-o func ie definita de utilizator, iar apelul ei va fi
scris n una dintre expresiile On Entry sau On Exit.
Meniul Report con ine urm toarele op iuni:

Title/Summary duce la afiarea unei ferestre de dialog ce permite,


prin selec ie, afiarea n cadrul raportului a dou benzi
suplimentare;
Title (Titlu)- banda ce apare n raport o singura dat , la nceputul
acestuia, pe prima pagin , n care putem afia de exemplu titlul
listei i eventual capul de tabel, dac acesta nu trebuie s fie
repetat pe fiecare pagin ;
Summary (Rezumat) se afieaz
singur dat ;

pe ultima pagin

a raportului, o

Data Grouping- duce la afiarea unei ferestre de dialog ce permite


gruparea datelor din raport n func ie de anumite chei de grupare

4-100

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

ce sunt expresii formate din cmpuri ale tabelelor sau variabile


definite. Pentru fiecare nou grup n raport apar dou benzi i
anume Group Header n (antetul grupului de nivel n ) i Group
Footer n (subsolul grupului de nivel n ) ;
Variables se pot defini variabile necesare rul rii raportului sau afi rii
unor anumite valori ;
Default Font stabilete fontul implicit cu care se lucreaz n raport;
Private Data Session - prin selectarea/deselectarea acestei op iuni se
indica dac mediul de date folosit este privat sau nu;
Quick Report duce la afiarea unei ferestre din care putem selecta :

Field Layout - modul de dispunere a cmpurilor n cadrul


raportului (orizontal sau vertical ) ;
Titles dac dorim sau nu afiarea numelor de cmpuri;

Add Alias dac dorim sau nu prefixarea numelui cmpului


cu cel al tabelei;
Add table to data environment dac
ad ugarea tabelei la mediul de date;

dorim sau nu

Run Report rularea raportului.

Bara Report Controls con ine controalele necesare popularii benzilor


raportului, i anume :
Select

selec ie obiecte

Etichet

folosit la introducerea textului

Cmp

afiarea cmpurilor din tabelele asociate

Elemente
geometrice

pentru desenarea de linii, p trate, cercuri, etc,


folosite pentru cosmetizarea raportului

Imagine

necesar afi rii de imagini grafice

4-101

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Mediul de date al raportului
La construirea raportului este necesar stabilirea datelor surs .
Acestea, mpreuna cu anumite variabile folosite de raport, alc tuiesc mediul de
date.
Mediul de date este un obiect, el are propriet i i metode ce pot fi
manipulate.
n mediul de date al unui raport sunt specificate tabelele surs , ceea ce
are ca efect deschiderea automat a acestora la pornirea raportului, f r a fi
necesare instruc iuni speciale n acest sens. Ad ugarea unei tabele la mediul
de date se face prin selectarea op iunii Add. Dac tabela este legata n cadrul
unei baze de date, n mediul de date al raportului se vor nc rca i leg turile
respective.
n cazul rapoartelor care folosesc dou sau mai multe tabele, este
necesar specificarea n mediul de date i a leg turilor dintre ele, pentru ca
informa iile s fie corect afiate.
Dac se dorete specificarea dinamic a tabelelor surs , se pot folosi
metodele mediului de date, n care se vor introduce instruc iunile
corespunz toare pentru deschiderea tabelelor.
Principalele metode ale mediului de date sunt :
Before Open Tables se stabilete numele i loca ia tabelelor;

Open Tables comenzile pentru deschiderea efectiv a tabelelor;


After Open tables se pot selecta tabela curent
curente;

i nregistr rile

Before Close Tables se pot efectua diverse calcule asupra datelor


nainte de nchiderea tabelelor;
Close Tables se nchid efectiv tabelele;

After Close Tables - codul ce se efectueaz dup nchiderea tabelelor.


Principalele propriet i ale mediului de date sunt :
InitialSelectedAlias desemneaz tabela ce va fi deschisa ini ial;
AutoOpenTables dac este .T. determin
tabelelor specificate;
AutoCloseTables- dac
tabelelor specificate.

deschiderea automat

este .T. determina nchiderea automat

Cmpurile unui raport (Fields)


Cmpurile reprezint elementele variabile ale unui raport. Ele pot avea
ca surs :

un cmp din tabelele folosite;

4-102

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

o expresie format din cmpurile tabelelor din mediul de date caz n


care expresia va fi evaluat de fiecare dat la rularea raportului pentru
fiecare instan a benzii respective;

o variabil a raportului.
Un cmp din raport se caracterizeaz prin :

Sursa de date;

Func ia de calcul (sum , medie, num rare, etc) ;

Formatul de afiare (caracter, numeric, dat calendaristic , aliniere) ;

Condi ii dinamice de afiare .


Cmpurile calculate dintr-un raport se ob in folosind func ii predefinite,
disponibile la ac ionarea butonului Calculation a ferestrei Report Expresion.
Func ia se alege prin intermediul butonului de selec ie.
Valoarea unui cmp calculat poate fi zerorizat la nceperea unei pagini
noi, nceperea unui nou grup, terminarea unui grup, etc, momentul anularii fiind
stabilit cu ajutorul listei derulante Reset a ferestrei Calculated Fields.
Gruparea datelor ntr-un raport
Este una dintre cele mai puternice facilita i oferite de constructorul de
rapoarte. Se pot construi rapoarte cu unul sau mai multe niveluri de grupare sau
totalizare. Fiecare criteriu de grupare este caracterizat printr-o expresie ce va fi
evaluat de fiecare instan a benzii. Toate nregistr rile ce corespund aceleai
valori a expresiei de grupare vor forma un grup, deci ntr-un raport cu niveluri de
grupare vom avea attea grupuri cte valori are cheia de grupare. Dac nu a
fost specificat n prealabil ordonarea datelor dup expresia (expresiile) de
grupare, listarea informa iilor nu va fi concludent .
Specificarea expresiilor de grupare se face n fereastra Data
Grouping.
Lista Group Expresions con ine cte un rnd pentru fiecare nivel de
grupare, n care se poate specifica direct expresia de grupare. Dac se dorete
folosirea constructorului de expresii, se d click pe butonul din dreapta cmpului
de editare.
Pentru fiecare grup se pot specifica urm toarele propriet i:

Start group on new column grupul s nceap n coloan nou (n


cazul unui raport multi - coloan ). Dac un grup se termin la mijlocul
unei coloane, restul spa iului din coloan va fi l sat liber i urm torul
grup ncepe n coloana urm toare.
Start each group on a new page fiecare grup ncepe pe o pagin
nou .
4-103

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Reset page number to 1 on each group - pentru fiecare grup nou,


numerotarea paginilor va ncepe de la 1.
Reprint group header on each page - tip rete antetul grupului pe
fiecare pagin , chiar dac nu ncepe un nou grup, imediat dup antetul
de pagin .

Start group on new page when less than -ncepe grupul pe pagin
nou cnd spa iul r mas pe pagina curent este mai mic dect
valoarea indicat de proiectantul raportului.
Rularea unui raport
Comanda folosit este :
REPO FORM <numeraport>
Pentru previzualizarea raportului
REPO FORM <numeraport> PREVIEW
Pentru trimiterea listei direct la imprimant :
REPO FORM <numeraport> TO PRINT
Pentru salvarea listei direct ntr-un fiier de tip.txt
REPO FORM <numefisier.txt> to <numefisier>
Dac se dorete suprimarea afi rii listei pe ecran se va ad uga clauza
Noconsole. De obicei comanda de rulare a raportului se introduce n metoda
Click a butonului numit de exemplu Rulare Raport din programul de raportare.
Programe de raportare
n general, acelai raport poate fi folosit pentru mai multe tipuri de liste,
datele de raportare diferind n func ie de anumite variabile ce pot fi setate.
De exemplu, dac se dorete raportare unei situa ii a vnz rilor de
medicamente dintr-o farmacie, se pot specifica o serie de parametri cum ar fi :
anul, luna, intervalul (data de nceput i cea de sfrit), categoria de produse,
etc. Etapele ce trebuiesc parcurse pentru realizarea raportului sunt urm toarele:

Se construiete o form cu care se preiau de la utilizator variabilele


necesare ( cele specificate anterior). Forma va trebui s con in n
afar de cmpurile necesare prelu rii datelor i minim dou butoane
pentru rularea raportului i nchiderea formei.
Se efectueaz preluarea datelor din tabele n func ie de parametrii
specifica i, adic se extrag datele, se grupeaz corespunz tor ntr-o
tabel temporar , avnd grija ca numele cmpurilor s fie identice cu
cele folosite n raport.
Se d clic pe butonul de executare a raportului i se afieaz i verific
lista.

4-104

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
4.5

Constructorul de meniuri

Meniul reprezint un ansamblu de op iuni pus la dispozi ia utilizatorului,


op iuni la alegerea c rora sunt declanate diferite opera ii de prelucrare.
Meniul apare n partea superioar a ferestrei unei aplica ii i are o
structur standard, format dintr-o bara orizontal (submeniu orizontal) ce
con ine mai multe op iuni. Fiecare op iune poate con ine un submeniu vertical,
care va fi activat numai la alegerea op iunii respective.
Proiectarea unui meniu const n specificarea elementelor componente
(submeniuri i op iuni) i a caracteristicilor acestora (legate de aspect i
comportament).
Un meniu se construiete cu ajutorul constructorului de meniuri, care va
genera un fiier de tip.mnx. Apoi se va genera meniul, ob inndu-se un fiier de
tip.mnt. Obligatoriu, dup orice modificare efectuat n meniu, acesta va trebui
generat din nou, altfel modificarea efectuat nu este luat n considera ie.
Comanda de creare a unui meniu este :
CREATE MENU <numemeniu>
sau alegnd din meniul File op iunea New Meniu, se deschide o fereastr din
care se alege op iunea :

Menu dac se dorete crearea unui meniu cu bar


orizontal i submeniuri verticale;

Shortcut dac se dorete construirea unui submeniu vertical;


Modificarea unui meniu existent se face cu comanda :
MODIFY MENU <numemeniu>
sau alegnd din meniul File op iunea Open.
Propriet ile generale ale unui meniu se stabilesc n fereastra de dialog
General Options, ce se deschide la alegerea op iunii cu acelai nume a
meniului View.
Pozi ia noului meniu relativ la meniul standard al sistemului este
stabilit prin intermediul butoanelor din sec iunea Location. Op iunile sunt :

Replace Noul meniu l nlocuiete pe cel al sistemului;


Append Noul meniu va fi ad ugat la cel al sistemului;
Before Noul meniu va fi pozi ionat naintea op iunii din meniul sistem
aleas din lista derulant ;

After Noul meniu va fi pozi ionat dup op iunea din meniul sistem
aleas din lista derulant .
Pot fi specificate secven e de cod care s fie executate la apari ia unor
evenimente i care vor fi scrise n zona Procedure sau n fereastra deschis
prin ap sarea butonului Edit.
4-105

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Se pot specifica secven e de cod att pentru ini ializarea meniului
Setup ct i pentru tergerea sa Cleanup, n fereastra deschis prin activarea
comutatoarelor Setup sau Cleanup urmat de ac ionarea butonului OK.
Fereastra de lucru a constructorului de meniuri arat ca n figura de mai
jos :

Prima coloan con ine butonul de schimbare a pozi iei op iunii - prin
tragerea cu mouse-ul ea poate fi deplasat n sus sau jos.
n coloana Prompt se introduce textul explicativ al op iunii, text ca va fi
afiat ca bar de meniu (ex : Ad ugare).
Coloana Results cuprinde o list derulant ce con ine op iunile
descrise mai jos, fiec reia dintre ele asociindu-se codul scris n coloana a patra,
i anume :

Command la alegerea acestei bare de meniu se va executa


comanda specificat n coloana patru (de exemplu rularea unei forme
cu comanda: do form ad ugare) ;
Pad Name Se definete numele padului ;
Submenu se va deschide un submeniu care trebuie configurat dup
aceleai reguli;
Procedure- se scrie procedura ce trebuie rulat la accesarea acestei
bare de meniu;
Coloana Options duce la deschiderea unei ferestre n care se pot face
anumite set ri pentru respectiva bara de meniu, i anume :

4-106

Key label : combina ia de taste, echivalent cu click cu


mouse-ul pe op iunea respectiv , ce se determina prin
ap sarea tastelor dorite;
Key text textul suplimentar ce se va afia lng op iune
indicnd combina ia de taste aleas ;

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Skip for se scrie expresia ce va fi evaluat la fiecare


accesare a op iunii de meniu. Dac rezultatul evalu rii
este adev rat, se permite executarea comenzii asociate,
n caz contrar op iunea nu va fi accesibil . Aceasta
facilitate este bine venit n cazul n care, de exemplu,
ntr-o anumit secven a de meniu este permis accesul
doar unor anumi i utilizatori, sau sunt dezactivate, la un
moment dat, anumite sec iuni din meniu, n func ie de
anumite condi ii, pentru a preveni anumite erori de rulare
a programului.
Message se indica textul explicativ asociat op iunii de
meniu.

Comment se pot introduce texte explicative, pentru o


mai buna n elegere a logicii programelor.
Previzualizarea meniului se poate face n orice moment, chiar dac el
nu a fost salvat, pentru verificarea codul scris i se realizeaz prin ap sarea
butonului PREVIEW a submeniului Menu. n starea de previzualizare, meniul
sistem este nlocuit cu cel n curs de editare. Ieirea din previzualizare se face
prin ac ionarea butonului OK.
Butoanele din sec iunea Item sunt folosite pentru ad ugarea de noi
elemente (Insert i Insert Bar) sau pentru tergerea unor op iuni (Delete).
Observa ii:

scrierea caracterelor \< naintea unora dintre caracterele din irul din
coloana Prompt determina ca acel caracter s fie folosit ca o tasta
rapid de accesare a op iunii. Caracterul va ap rea ca fiind subliniat.
scrierea caracteruli \ naintea textului din coloana Prompt determin ca
op iunea respectiv s fie dezactivat , ea ap rnd pe ecran n culori
terse.
scrierea caracterelor \- n locul textului din coloana Prompt determin
ca linia de meniu s fie considerat ca o bar delimitatoare ntre mai
multe grupuri de op iuni ale aceluiai submeniu.

Orice meniu trebuie generat, opera ie ce se realizeaz prin alegerea


op iunii Generate a submeniului Menu. Se precizeaz numele meniului i calea
n care acesta va fi salvat (salvarea se face ntr-un fiier cu extensia.mpr)
Comanda de rulare a unui meniu este DO <numemeniu.mpr> i ea
este inclus de obicei n programul principal al aplica iei.

4-107

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Revenirea la meniul sistem se face cu comanda
SET SYSMENU TO DEFAULT
4.6

Constructorul de proiecte

Proiectele reprezint nglobarea elementelor unui sistem informatic ntrun tot unitar. Proiectul este o facilitate pus la dispozi ia proiectan ilor de
sisteme informatice, cu ajutorul c reia se poate ine cu uurin a evidenta tuturor
componentelor unui sistem, cum ar fi baze de date, tabele, vederi, programe,
forme, meniuri, rapoarte, interog ri, etc.
Se recomand folosirea proiectelor n momentul n care sistemul
informatic ce urmeaz a fi proiectat va con ine un num r mare de elemente. n
acest caz se va crea mai nti proiectul, iar n carul lui se vor defini, pe rnd,
toate elementele necesare. Toate opera iile ce se efectueaz asupra unui
element din cadrul proiectului se vor face din interiorul gestionarului de proiecte
astfel nct proiectul s fie n permanenta actualizat.
Proiectul este un fiier cu extensia.pjx.
Crearea unui proiect se face cu comanda:
MODIFY PROJECT <numeproiect>

Dac
proiectul exist ,
acesta va fi deschis, dac
nu se va crea sau din
meniul File, op iunea New
Project i se ac ioneaz
butonul New File. Tipurile
de elemente ce pot fi
incluse ntr-un proiect
sunt: baze de date, tabele
libere, interog ri, forme,
rapoarte,
etichete,
biblioteci
de
clase,
programe, biblioteci API,
aplica ii, meniuri, fiiere text, alte tipuri de fiiere.
Fereastra ce se deschide la pornirea generatorului de proiecte arat ca
n figura de mai sus i con ine mai multe pagini corespunz toare grup rii logice
a elementelor componente.
Ad ugarea de noi elemente la un proiect se face astfel: se activeaz
pagina proiectului n care va fi inclus respectivul element i se selecteaz din
4-108

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
list tipul elementului de ad ugat. Dac elementul a fost deja creat n afara
proiectului i se dorete ad ugarea lui la proiect, se apas butonul Add. Dac
elementul urmeaz a fi creat se apas butonul New.
Editarea unui element din proiect se face prin selectarea elementului
urmat de ap sarea butonului Modify.
Rularea unui element din proiect se face prin selectarea elementului
urmat de ap sarea butonului Run.
nl turarea unui element din proiect se face prin selectarea elementului
urmat de ap sarea butonului Remove.
Recompilarea elementelor proiectului se face prin ap sarea butonului
Build. n acest caz poate fi aleas una dintre op iunile specificate n sec iunea
Options a ferestrei Build Options, i anume :

Recompile all files recompilarea tuturor fiierelor;


Display errors afiarea erorilor;

Run after build rulare dup recompilare.


n fereastra Build Options exist i sec iunea Action ale c rei op iuni
sunt urm toarele :

Rebuild project recompilarea proiectului;


Build Application se realizeaz o aplica ie. Aplica ia este un tip
special de fiier ce con ine toate elementele unui sistem informatic i
care poate fi rulat n mediu VisualFox. Elementele componente ale
unei aplica ii pot fi mp r ite n dou mari categorii i anume: elementele
ce fac parte integrant din proiect, cum ar fi meniuri, forme, rapoarte,
care nu se modific la rulare, i elemente ce nu fac parte integrant din
aplica ie (baze de date, tablele) ale c ror con inut se actualizeaz
permanent n momentul rul rii. Orice aplica ie se construiete n jurul
unui program principal (acel program care va fi lansat primul la rularea
aplica iei). Stabilirea lui se face prin selectarea lui i alegerea op iunii
Set Main (click buton dreapta din meniul rapid).
Build Executable VisualFoxPro permite rularea programelor n
varianta compilat i a aplica iilor. Programele de acest tip nu pot rula
n afara mediului fox i de aceea ele trebuiesc construite ntr-o form
executabil . Pentru aceasta trebuiesc ndeplinite condi iile expuse la
generarea aplica iilor i alegerea butonului Build executable. Va fi
generat un fiier cu extensia .exe
Rularea unei aplica ii se face cu comanda:
DO <nume aplicatie.app>

4-109

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

4.7

Exerciii:

1. Construi i un raport cu ajutorul c ruia s pute i lista agen ii n ordine


alfabetic . (folosi i fiierul Ag.dbf i afia i cmpurile: nume, prenume,
data naterii, data angaj rii, salariul de baz ).
2. Construi i un raport pentru a lista agen ii ce au efectuat tranzac ii ntr-o
perioad specificat , n ordinea datei la care a fost efectuata tranzac ia
(folosi i fiierele Ag.dbf, Tr.dbf i afia i cmpurile cod agent, nume i
prenume agent, data tranzac iei ).
3. Construi i un raport pentru a lista tranzac iile efectuate ntr-o anumit
luna dintr-un anumit an, specificnd totalul valoric pentru opera iile de
vnzare i cump rare pentru fiecare zi n parte i deasemeni un total
general la sfrit de luna (folosi i fiierele Cl.dbf, Tr.dbf Ma.dbf i afia i
cmpurile nume client, data tranzac iei, valoarea de intrare, valoare de
ieire).
4. Construi i o form care s con in o caset de tip list care s permit
selectarea unui anumit autor din tabela de autori, pentru care s lista i,
n ordine alfabetic , toate c r ile existente n bibliotec , ntr-un fiier de
tip.txt, pe care sa-l afia i apoi pe ecran.
5. Construi i un raport care s va permit afiarea imaginilor grafice. De
exemplu, pute i lista toate m rfurile din fiierul Ma.dbf, grupnd datele
n func ie de codul produsului, iar la fiecare cod produs pute i asocia
elemente grafice diferite, reprezentative.
6. Construi i un meniu n care s folosi i toate op iunile puse la dispozi ie
de constructorul de meniuri i n care s include i rularea unor forme,
rapoarte i programe construite n laboratoarele anterioare.

4-110

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Capitolul 5 Limbajul SQL implementat n Oracle


5.1

Soluia complet Oracle

Oracle SGBDR (Sistem de Gestiune Baze de Date Rela ionale) este


produsul de baz al Oracle. El include Oracle Server i mai multe instrumente
pentru a ajuta utilizatorii n mentenan , monitorizarea i utilizarea datelor.
Dic ionarul de date Oracle este o component foarte important a Serverului. El
con ine un set de tabele i view-uri care prezint o imagine read-only a bazei de
date.
SGBDR gestioneaz sarcini ca:
- managementul stoc rii i definirii datelor;
- controlul i restric ionarea accesului la date i concuren a;
- posibilit i de salvare i restaurare;
- interpreteaz instruc iuni SQL i PL/SQL.
Instruc iunile SQL i PL/SQL sunt folosite de programe i utilizatori
pentru accesul i manipularea datelor n baze de date Oracle. SQL*Plus este
un instrument Oracle care recunoate i trimite c tre server sintaxe SQL i
PL/SQL spre execu ie i con ine propriile comenzi.
Oracle furnizeaz o mare varietate de instrumente GUI pentru
construirea aplica iilor, precum i o gam larg de aplica ii software pentru
afaceri i industrie.
5-111

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SQL i SQL*Plus
SQL este un limbaj de comenzi pentru comunicarea cu Serverul Oracle
din orice instrument sau aplica ie. SQL Oracle con ine multe extensii. Cnd se
introduce o instruc iune SQL, aceasta este stocat ntr-o zon de memorie
numit buffer SQL i este disponibil pn la introducerea unei noi instruc iuni.
SQL*Plus este un instrument Oracle ce con ine propriu limbaj de
comenzi i care recunoate i trimite instruc iuni SQL la server pentru execu ie.
Caracteristicile limbajului SQL
Poate fi folosit de o gam larg de utilizatori, inclusiv de cei care nu
sunt programatori;
Este un limbaj neprocedural;
Reduce timpul necesar pentru crearea i mentenan sistemelor;
Sintaxa limbajului este n limba englez .
Caracteristicile limbajului SQL*Plus
Accepta fiiere cu instruc iuni SQL;
Furnizeaz un editor n mod linie pentru modificarea instruc iunilor SQL;
Controleaz set rile de mediu;
Formateaz rezultatele interog rilor in rapoarte;
Compara ie ntre SQL i SQL*Plus
SQL
Este un limbaj pentru comunicarea cu
serverul Oracle pentru accesarea
datelor
Este bazat pe standardul ANSI SQL
Manipuleaz date i defini ii de tabele
n baze de date
O instruc iune se stocheaz in
bufferul SQL, pe una sau mai multe
linii
Nu are caracter de continuare
Folosete un caracter de terminare
pentru executarea imediat a
comenzii
Nu pot fi abreviate
Folosete func ii pentru anumite
format ri

5-112

SQL*Plus
Recunoate instruc iuni SQL i le trimite la
server
Este o interfa proprietate Oracle pentru
executarea instruc iunilor SQL
Nu permite manipularea valorilor n baze
de date
Este permis o singur comand pe linie
care nu este stocat n bufferul SQL
Are caracterul (-) pentru continuarea unei
comenzi dac aceasta nu ncape pe o
singur linie
Nu are nevoie de caractere de terminare.
Se executa imediat
Pot fi abreviate
Folosete comenzi pentru format ri

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Interac iunea SQL i SQL*Plus

SQL*Plus este un mediu care permite:


Conectarea la SQL*Plus;
Afiarea structurii unei tabele;
Editarea instruc iunilor SQL;
Executarea instruc iunilor SQL din SQL*Plus;
Salvarea instruc iunilor SQL in fiiere;
Executarea fiierelor salvate;
nc rcarea comenzilor din fiier in buffer pentru editare;
Executarea instruc iunilor SQL pentru a extrage, modifica, ad uga i
terge date din baza de date;
Formatarea, calcularea, stocarea i listarea rezultatele interog rilor sub
forma de rapoarte;
Crearea fiierelor de script pentru stocarea instruc iunilor SQL.
Comenzi SQL*Plus
Categorie
Mediu
Formatare
Manipul ri de
fiiere
Execu ie
Editare
Interac iune
Diverse

Scop
Afecteaz comportamentul general al instruc iunilor SQL
pentru sesiunea respectiv
Formateaz rezultatele interog rii
Salveaz , nc rc i ruleaz fiiere de script
Trimite instruc iuni SQL din bufferul SQL la serverul Oracle
Modifica instruc iuni SQL in buffer
Permite crearea i trimiterea variabilelor la instruc iuni SQL,
afiarea variabilelor i listarea mesajelor pe ecran
Are diferite comenzi pentru conectarea la baza de date,
manipularea mediului SQL*Plus i afiarea coloanelor
5-113

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Conectarea la SQL*Plus
SQL*Plus se poate apela in func ie de tipul sistemului de operare sau a
mediului Windows in care se ruleaz . Pentru conectarea ntr-un mediu
Windows:
Start -> Programs -> Oracle for Windows NT -> SQL*Plus sau
Start -> Programs -> Oracle -> Application Development -> SQL*Plus

Se completeaz : username, parola i baza de date


Pentru conectarea ntr-un mediu de tip linie de comand
urm toarea comand :

se lanseaz

Sqlplus [username[/password[@database]]]
unde
username = numele utilizatorului din baza de date
password = parola de conectare la baza de date
@database = irul de conectare la baza de date
NOT : Pentru a nu deconspira parola, se introduce numele
utilizatorului i apoi la prompterul Password se introduce parola i irul
de conectare.
5.2

Comenzi SQL*Plus pentru fiiere

SAVE filename

salveaz con inutul buferului SQL ntr-un fiier.

GET filename

scrie con inutul uni fiier n buffer SQL (extensia


predefinit este.sql)

START filename

ruleaz un fiier script

@ filename

la fel ca START

ED[IT]

lanseaz editorul i salveaz con inutul bufferului ntr-un


fiier afiedt.buf

ED[IT] filename

lanseaz editorul pentru editarea con inutului unui fiier


salvat

5-114

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SPO[OL]
[filename]OFF | OUT

stocheaz rezultatul unei interog ri ntr-un fiier. OFF


nchide fiierul OUT nchide fiierul i l trimite la
imprimanta sistem

EXIT

p r sete mediul SQL*Plus

5.3

Instruciuni SQL

Extragere de date
SELECT
Limbajul de manipulare a datelor (DML Data Manipulation Language)
(introduce rnduri noi, le terge pe cele nedorite i le actualizeaz pe cele
existente deja n tabele)
INSERT
UPDATE
DELETE
Limbajul de definire a datelor (DDL- Data Definition Language) (seteaz ,
schimb sau terge structuri de date din tabele )
CREATE
ALTER
DROP
RENAME
TRUNCATE
Controlul tranzac iilor (gestioneaz schimb rile f cute de instruc iunile DML;
actualiz rile efectuate asupra datelor pot fi grupate mpreuna in tranzac ii
logice)
COMMIT
ROLLBACK
SAVEPOINT
Limbajul de control al datelor (DCL- Data Control Language) (acord sau
retrage drepturi de acces asupra bazelor de date Oracle i a utilizatorilor s i)
GRANT
REVOKE
Oracle SQL este compatibil cu standardele acceptate de industrie.
Comitetele de standardizare acceptate de industrie sunt ANSI (Institutul
American pentru Standarde) i ISO (Organiza ia Interna ionala pentru
Standarde). Att ANSI cat i ISO au acceptat SQL ca limbajul standard pentru
baze de date rela ionale.
5-115

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Tabelele folosite n acest carte sunt:
EMPLOYEES , tabela care con ine detalii despre angaja i;
DEPARTAMENTS, tabela care con ine detalii despre departamente;
JOB_GRADES, tabela care con ine detalii despre salarii i trepte de
salarizare:
5.4

Sintaxa de baz a instruciunilor SQL

Comanda SELECT extrage informa ii din bazele de date. Folosind


comanda SELECT, se pot face urm toarele :
SELECTIE (SELECTION): poate fi folosit pentru a alege liniile
necesare din tabelele de date. Se pot folosi criterii diferite de
selec ie.
PROIECTARE (PROJECTION): poate fi folosit pentru a alege
coloanele din tabele necesare n interogarea rezultat. Se pot
alege oricte coloane de tabele.
COMBINAREA (JOIN): poate fi folosit pentru a uni datele aflate
n tabele diferite prin crearea unei leg turi ntre coloanele
tabelelor de unde provin datele.
Select - Sintaxa de baza
SELECT [ DISTINCT ] {*, column [alias] , ..}
FROM table ;
SELECT pentru identificarea coloanelor
FROM
pentru identificarea tabelelor
ntr-o form simpl , instruc iunea SELECT include urm toarele clauze :

SELECT, care specific ce coloane vor fi afiate;


FROM, care specific tabelele ce con in coloanele scrise
n clauza SELECT.
Din punct de vedere sintactic:
SELECT
este o list de una sau mai multe coloane;
DISTINCT
suprim duplicatele;
*
selecteaz toate coloanele;
column
numele coloanei/coloanelor;
alias
d coloanei selectate un alt nume;
FROM
specific tabela/tabelele care con ine/con in coloanele.

5-116

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
NOT : n aceast carte, cuvintele : cuvnt cheie, clauza ,
instruc iune vor fi folosite astfel:

Un cuvnt cheie se refera la un element SQL individual. De


exemplu, SELECT i FROM sunt cuvinte cheie.
O clauz este o parte dintr-o instruc iune SQL.. De exemplu,
SELECT employee_id, first_name,.. reprezint o clauz .
O instruc iune este o combina ie de dou sau mai multe clauze i
cuvinte cheie. De exemplu, SELECT * FROM employee este o
instruc iune SQL.

Scrierea instruc iunilor SQL


Utiliznd urm toarele reguli se pot construi instruc iuni valide, uor de citit
i de editat:

Instruc iunile SQL pot fi scrise cu litere mari sau mici, n afar
cazurile indicate;

de

Instruc iunile SQL pot fi introduse pe una sau mai multe linii;
Cuvintele cheie nu pot fi abreviate sau desp r ite pe linii diferite;
De obicei clauzele sunt plasate pe linii separate pentru a fi lizibile;
De obicei cuvintele cheie sunt introduse cu majuscule. Toate celelalte
cuvinte, cum ar fi numele de tabele i coloane sunt introduse cu litere
mici. Aceasta este doar o conven ie de NOT re, nu o regula.
n cadrul SQL*Plus, instruc iunile SQL sunt introduse de la prompterul
SQL, iar urm toarele linii sunt numerotate. Acesta este un buffer SQL.
Doar o singura instruc iune poate fi adus la un moment dat din buffer.
Executarea instruc iunilor SQL se face urmnd regulile:

Pozi ionarea caracterului punct i virgul (;) la sfritul ultimei clauze;


Pozi ionarea unui slash (/) la sfritul ultimei linii din buffer;
Scrierea unui slash la prompterul SQL;
Comanda RUN sau @ la prompterul SQL.

5-117

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu : pentru selectarea tuturor coloanelor i liniilor dintr-un tabel scriem
select * from departments;
Se pot afia toate coloanele din tabela folosind cuvntul cheie SELECT
urmat de un asterix (*). n exemplu, tabela departments con ine coloanele:
DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID.
Tabelul con ine linii pentru fiecare departament.
Se pot afia toate coloanele din tabela scriind toate coloanele dup
cuvntul cheie SELECT. Instruc iunea SQL de mai sus afieaz toate coloanele
i toate liniile din tabela DEPARTMENTS.
5.5

Crearea i gestionarea tabelelor

Obiective:

Descrierea obiectelor din baza de date;


Crearea tabelelor;
Descrierea tipurilor de date ce pot fi utilizate n momentul definirii
specifica iilor pentru coloane;
Modificarea structurii unei tabele;
tergerea, redenumirea i trunchierea tabelelor.

Obiectele bazei de date


Obiect

Descriere

Table

Unitatea de baza pentru stocare compus din linii i coloane.

View

Reprezentare logic
tabele.

Sequence

Genereaz valori pentru chei primare.

Index

M rete viteza n cazul interog rilor.

Synonym

Nume alternative date obiectelor.

a unor date dintr-una sau mai multe

O baza de date Oracle poate con ine structuri de date multiple. Fiecare
structur trebuie definit la proiectarea bazei de date, astfel nct sa poat fi
creat n momentul construirii bazei de date.

5-118

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Structura tabelelor in Oracle9i

DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID


-------------------------------------------------------10
Administration 200 1700
20
Marketing 201 1800
30
Purchasing 114 1700
40 Human Resources 203 2400
50
Shipping 121 1500
60
IT 103 1400
70
Public Relations 204 2700
80
Sales 145 2500
90
Executive 100 1700
100 Finance 108 1700
110 Accounting 205 1700
Tabelele pot fi create n orice moment, chiar n momentul cnd utilizatorul
folosete baza de date. Nu este obligatorie specificarea m rimii unei tabele.
Este important de tiut ce spa iu va ocupa tabela dup un timp. Structura unei
tabele poate fi modificat dinamic.
Conven ii pentru denumirea tabelelor

Numele trebuie sa nceap cu o liter ;


Numele poate avea lungimea de 1-30 caractere;
Caracterele permise sunt numai A-Z, a-z, 0-9, $ i #;
Un utilizator nu poate avea n schema sa dou tabele cu nume
identice;
Numele tabelei nu poate fi un nume rezervat (de exemplu: select,
create, define).
Se folosesc nume descriptive pentru tabele sau alte obiecte din
baza de date;
Se folosesc aceleai nume pentru aceleai entit i din tabele
diferite. De exemplu, coloana cu num rul departamentului este
denumita DEPTNO att In tabela EMPLOYEES ct i n tabela
DEPARTMENTS.

5-119

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

5.6

Comanda CREATE TABLE

Pentru a crea o tabel utilizatorul trebuie s de in :


Drepturi pentru crearea unei tabele (drepturi Oracle);
Spa iu de stocare n Oracle (drepturi Oracle).
La crearea unei tabele trebuie specificate:
Numele tabelei;
Numele coloanei, tipul de dat al coloanei i dimensiunea
maxim a acesteia.
CREATE TABLE [schema.] table (column datatype [DEFAULT
expr]);
Sintaxa:
- schema numele posesorului tabelei;
- table numele tabelei;
- DEFAULT specific valoarea implicit ;
- column numele coloanei;
- datatype tipul de dat i lungimea.
Referirea tabelelor aflate n schema unui alt utilizator
Schema este o colec ie de obiecte. Obiectele din schem sunt structuri
logice care se refer direct la datele din baza de date. Obiectele din schem
includ tabele, view-uri, sinonime, secven e, proceduri stocate, indeci, clustere
i leg turile bazei.
Tabelele a c ror proprietar este un alt utilizator nu sunt n schema
utilizatorului curent. Pentru a fi referite trebuie folosit numele proprietarului
tabelei. Acesta trebuie scris naintea numelui tabelei, urmat de punct. (exemplu:
bd03.employees pentru tabela employees a utilizatorului bd03).
Op iunea DEFAULT
Specific valoarea implicit pentru o coloan , ntr-o opera ie de inserare.
Select hiredate DATE DEFAULT SYSDATE from employees;

5-120

Valorile permise sunt valori literale, expresii sau func ii SQL;


Valorile ilegale sunt numele altor coloane sau pseudocoloane;
Valoarea implicit trebuie sa aib acelai tip cu cel al coloanei.

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Unei coloane i se poate asigna o valoare implicit utiliznd op iunea
DEFAULT. Aceast op iune previne atribuirea unor valori de null pentru datele
inserate f r precizarea unei valori explicite. Valoarea poate fi un literal, o
expresie sau o func ie SQL, cum ar fi SYSDATE sau USER, dar valoarea nu
poate fi cea a unei alte coloane sau o pseudocoloane, cum ar fi NEXVAL sau
CURRVAL. Valoarea implicit trebuie s fie de acelai tip cu tipul de data al
coloanei.
Exemplu : crearea tabelei departments

SQL> create table departments


2 (department_id number(4),
3 department_name varchar2(30),
4 manager_id number(6),
5 location_id number(4));
Table created.
Confirmarea cre rii tabelei:
SQL> desc departments;
Name Null? Type
----------------------------------------- -------- -----------DEPARTMENT_ID NUMBER(4)
DEPARTMENT_NAME VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)
Exemplul anterior creeaz
tabela Departments, cu coloanele:
DEPARTAMENT_ID, DEPRTMENT_NAME, MANAGER_ID, LOCATION_ID.
Mai departe se confirma crearea tabelei DEPT ca rezultat al comenzii
DESCRIBE.
Deoarece instruc iunea CREATE TABLE este una de tip DML, la
rularea ei se execut n mod automat i o instruc iune de tip COMMIT.
5.7

Tabele din baza de date Oracle

n baza de date Oracle exista dou tipuri de tabele i anume:


Tabele utilizator ce reprezint o colec ie de tablele create i
administrate de utilizator ce con in informa iile utilizatorilor;
Dic ionarul de date ce reprezint o colec ie de tabele create i
administrate de Oracle Server ce con in informa ii despre baza de date.

5-121

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Toate tabelele din dic ionarul de date sunt proprietatea utilizatorului SYS
i sunt accesate rar de c tre utilizatori pentru c informa iile pe care acestea le
con in sunt greu de n eles. De aceea, n mod obinuit, utilizatorii acceseaz
vederile din dic ionarul de date pentru c informa iile sunt prezentate ntr-o
forma uor de n eles.
Informa iile stocate n dic ionarul de date con in:
numele utilizatorilor bazei Oracle i drepturile acestora ;
obiectele bazei de date numele lor, constrngerile i informa ii
legate de audit.
n dic ionarul de date exist patru categorii de view-uri, fiecare dintre ele
avnd un prefix distinct ce reflect scopul n care poate fi folosit.
USER_View - con in informa ii despre obiectele aflate n
proprietatea userului.
ALL_View - con in informa ii despre toate tipurile de tabel
(obiecte tabel i tabele rela ionale) accesibile utilizatorului.
DBA_ View - Aceste view-uri sunt restric ionate, ele putnd fi
accesate doar de cei care au rolul de DataBase Administrator.
V$ - Aceste view-uri sunt view-uri cu performan e dinamice,
performan e ale serverului de baze de date, memorie i bloc ri.
5.8

Interogarea dicionarului de date

Afiarea numelor tabelelor (coloana table_name) unui utilizator,


precum i alte informa ii legate de aceste tabele:
SQL> select * from user_tables;
Afiarea tipurilor de obiecte ale unui utilizator:
SQL> select distinct object_type from user_objects;
Afiarea tabelelor, view-urilor, sinonimelor i secven elor unui utilizator:
SQL> select * from user_catalog;
Pute i interoga dic ionarul de date pentru a afia informa ii diverse
despre obiectele de tip baza de date ale unui utilizator. Tabelele cele mai des
utilizate din dic ionarul de date sunt USER_TABLES, USER_OBJECTS i
USER_CATALOG. Tabela USER_CATALOG are un sinonim numit CAT.
Pute i folosi acest nume n loc de USER_CATALOG n comenzi.
SQL> select * from cat;
5-122

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
5.9

Tipuri de date

Tipul de data

Descriere

VARCHAR2(size)

Dat de tip caracter, de lungime variabil . (Trebuie


specificat o lungime maxim - size, valoarea implicit
este 1,maxima 4000)

CHAR(size)

Dat de tip caracter de lungime fix . (Valoarea implicit


este cea minim 1, maxima 2000)

NUMBER(p,s)

Num r cu p cifre i s cifre zecimale. (p poate lua valori


ntre 1 i 38, s ntre 84 i 127)

DATE

Dat de tip dat calendaristic cuprins ntre Ianuarie, 1


, 4712 B.C. i Decembrie, 31, 9999 A.D.

LONG

Dat de tip caracter cu lungime variabil , pn


gigabytes.

CLOB

Dat de pn la 4 gigabytes.

RAW(size)

Dat binar cu lungime specificat . Valoarea maxim


este de 2000. Aceasta valoare trebuie specificat .

LONG RAW

Dat binar cu lungime de pn la 2 gigabytes.

BLOB

Dat binar cu lungime de pn la 4 gigabytes.

BFILE

Dat binar stocat ntr-un fiier extern, lungime maxim


de pn la 4 gigabytes.

la 2

NOT

coloana de tip LONG nu este copiat atunci cnd la crearea tabelei se


folosete o subinterogare;
coloana de tip LONG nu poate fi inclus ntr-o clauza ORDER BY sau
GROUP BY;
ntr-o tabela poate s existe doar o coloana de tip LONG;
Nu se pot defini constrngeri asupra unei coloane de tip LONG.

Oracle9i aduce mbun t iri asupra modului de stocare a datei i timpului


prin introducerea de noi tipuri de date pentru dat calendaristic i timp i
corelarea cu zonele geografice TIMESTAMP.
TIMESTAMP stocheaz anul, luna i ziua din tipul de dat DATE plus
valorile pentru or , minut i secund precum i frac iuni de secund i
reprezint o extensie a tipului de dat DATE. Specificarea acestui tip de data se
face cu:
5-123

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
TIMESTAMP[(fractional_seconds_precision)]
unde (fractional_seconds_precision) poate lua valori intre 0 i 9,
implicit fiind 6
Exemplu
CREATE TABLE new_employees
(employee_id NUMBER,
first_name VARCHAR2(15),
last_name VARCHAR2(15), ...
start_date TIMESTAMP(7), ...);
n exemplu de mai sus se creeaz tabela NEW_EMPLOYEES ce are
coloana start_date de tip TIMESTAMP. Valoarea 7 indica precizia frac iunilor
pentru secunde. Presupunem c s-au introdus dou rnduri n tabela
NEW_EMPLOYEES .
Ieirile arata diferen a de afiare dintre o valoare de tip de dat DATE,
care este afiata n formatul DD-MON-YY i una de tip TIMESTAMP.
SELECT start_date FROM new_employees;
17-JUN-87 12.00.00.0000000 AM
21-SEP-89 12.00.00.0000000 AM
TIMESTAMP WITH TIME ZONE este o variant a formei TIMESTAMP care
include i afiarea timpului pentru zona geografica.
Afiarea cu TIME ZONE reprezint diferen a n ore minute i secunde
dintre timpul local i UTC (Coordinated Universal Time, adic Greenwich Mean
Time).
TIMESTAMP[(fractional_seconds_precision)]
WITH TIME ZONE
Dou valori de tip TIMESTAMP WITH TIME ZONE sunt considerate
identice dac ele reprezint acelai moment n UTC din punct de vedere al
decal rii in timp a valorilor TIME ZONE stocate.
De exemplu :
TIMESTAMP '1999-04-15 8:00:00 -8:00' este identic cu
TIMESTAMP '1999-04-15 11:00:00 -5:00'
adic 8:00 a.m. Pacific Standard Time este identic cu 11:00 a.m. Eastern
Standard Time.
Acest lucru poate fi specificat ca :
TIMESTAMP '1999-04-15 8:00:00 US/Pacific'

5-124

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
TIMESTAMP WITH LOCAL TIME ZONE este o alt variant pentru
TIMESTAMP care include afiarea valorii timpului local.
Data stocat n baza este normalizat ntr-o baza ce con ine
timpul local. Timpul local nu este stocat ca parte a unei coloane de tip DATE.
Atunci cnd se ini iaz o sesiune local serverul returneaz data n formatul ce
afieaz timpul local.
TIMESTAMP WITH LOCAL TIME ZONE are urm toarea sintaxa:
TIMESTAMP[(fractional_seconds_precision)]WITH LOCAL TIME ZONE
Spre deosebire de TIMESTAMP WITH TIME ZONE, pute i specifica ca o
coloana de tipul TIMESTAMP WITH LOCAL TIME ZONE ca fiind parte a unei
chei primare sau unice.
Afiarea timpului va preciza diferen a (n ore i minute) dintre timpul local i
timpul UTC.
Exemplu
CREATE TABLE time_example as (order_date TIMESTAMP
WITH LOCAL TIME ZONE);
INSERT INTO time_example VALUES('15-NOV-00 09:34:28 AM');
SELECT * FROM time_example;
order_date
--------------------15-NOV-00 09.34.28 AM
INTERVAL YEAR TO MONTH stocheaz o perioada de timp folosind
cmpurile an i luna din data. Sintaxa este :
INTERVAL YEAR [(year_precision)] TO MONTH
unde year_precision este num rul de cifre in care se va afia anul, implicit 2.
Restric ie
Prima valoare trebuie s fie semnificativ mai mare dect cea de-a
doua. De exemplu: INTERVAL '0-1'MONTH TO YEAR nu este valid .

5-125

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu:
INTERVAL '312' YEAR(3) indic un interval de 312 ani i 0 luni.
INTERVAL '300' MONTH(3) indica un interval de 300 luni.
INTERVAL '312-2' YEAR(3) TO MONTH indica 312 ani i 2 luni.
Crearea unei tabele utiliznd o interogare
Crea i o tabela i insera i linii combinnd comanda CREATE TABLE cu
op iunea AS subquery;
CREATE TABLE table
[column (,column)]
AS subquery ;
Num rul coloanelor tabelei trebuie sa fie egal cu num rul coloanelor din
subinterogare;
Utiliznd op iunea AS subquery se creeaz tabela i insereaz
nregistr rile furnizate de interogare.
Sintaxa:
- table
numele tabelei;
- column
numele coloanei, valoarea implicit i constrngerile de
tip;
- subquery
comanda SELECT care definete un set de nregistr ri
ce trebuie inserate n tabela.

Coloanele tabelei au numele specificate iar rndurile ce sunt inserate


sunt cele rezultate din fraza SELECT din subinterogare.
La definirea coloanelor se poate specifica doar numele coloanei i
valoarea implicit .
Dac se dorete specificarea coloanelor, num rul acestora trebuie sa fie
egal cu num rul de coloane rezultat din subinterogare.
Dac nu se specifica coloanele, numele coloanelor sunt identice cu cele
date de subinterogare.
Regulile de integritate nu sunt preluate de noua tabela.

5-126

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu:
CREATE TABLE dept80
AS
SELECT employee_id, last_name,
salary*12 ANNSAL,
hire_date
FROM employees
WHERE department_id = 80;
Table created.
DESCRIBE dept80

n exemplu se creeaz tabela DEPT80 ce con ine date despre angaja ii


ce lucreaz in departamentul 80. Observa i c datele au fost aduse din tabela
EMPLOYEES.
Pute i verifica existenta tabelei i a defini iei coloanelor folosind comanda
iSQL*Plus DESCRIBE.
Verifica i dac a i redenumit coloanele ce con in expresii.
n exemplul nostru coloana SALARY*12 a fost redenumita ANNSAL.
F r acest alias s-ar fi generat mesajul de eroare
ERROR at line 3:
ORA-00998: must name this expression with a column alias
5.10 Comanda ALTER TABLE
Comanda este utila dac se dorete modificarea structurii unei tabele.
Se pot ad uga noi coloane utiliznd clauza ADD, modifica coloane existente
sau defini valori implicite pentru coloane utiliznd clauza MODIFY, terge
coloane folosind clauza DROP.

5-127

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Ad ugarea unei coloane
ALTER TABLE table
ADD (column datatype [DEFAULT expr]
(, column datatype.]);
ALTER TABLE table
MODIFY (column datatype [DEFAULT expr]
(, column datatype.]);
ALTER TABLE table
DROP COLUMN (column);
Sintaxa:
- table
numele tabelei;
- column
numele noii coloane;
- datatype
tipul datei i lungimea;
- DEFAULT expr
specific valoarea implicit pentru coloan .
EXEMPLU:
ALTER TABLE dept30 ADD (job_id varchar2(10));
Table altered.
Observa ii:
Se pot ad uga, modifica sau terge coloane din tabela. Facilitatea de a
terge o coloana dintr-o tabela a ap rut n versiunea Oracle 9i.
Nu pute i specifica locul de apari ie al noii coloane. Noua coloan devine
automat ultima coloan . Dac tabela con ine nregistr ri n momentul
ad ug rii unei noi coloane, atunci noua coloan se ini ializeaz cu valori
nule pentru toate nregistr rile.

5-128

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
DEPT30
EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY HIRE_DATE
----------- -------------------- ------------------------- ---------- --------------------------114
Den Raphaely 11000 07-DEC-94
115
Alexander Khoo 3100 18-MAY-95
116
Shelli Baida 2900 24-DEC-97
117
Sigal Tobias 2800 24-JUL-97
118
Guy Himuro 2600 15-NOV-98
ad uga o nou coloana n

Noua
coloa
na
JOB_
ID

tabela dept30

DEPT30
EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY HIRE_DATE JOB_ID
----------- -------------------- ------------------------- ---------- ------------------------------------------------------114
Den Raphaely 11000 07-DEC-94 PU_MAN
115
Alexander Khoo 3100 18-MAY-95 PU_CLERK
116
Shelli Baida 2900 24-DEC-97 PU_CLERK
117
Sigal Tobias 2800 24-JUL-97 PU_CLERK
118
Guy Himuro 2600 15-NOV-98 PU_CLERK

Modificarea unei coloane


Se pot modifica specifica iile coloanelor utiliznd comanda ALTER
TABLE, cu clauza MODIFY. Modific rile permise pot fi: schimbarea tipului de
data, a m rimii i a valorii ini iale.
EXEMPLU
ALTER TABLE dept30
MODIFY (first_name varchar2(25));
Table altered.

Observa ii:

Se poate mari l imea sau precizia unei coloane numerice;


Se poate micora l imea unei coloane dac aceasta con ine
numai valori nule sau dac tabela nu are rnduri;
Se poate schimba tipul de dat dac coloana con ine numai
valori null;
5-129

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Se poate converti o coloana de tip CHAR la una de tip


VARCHAR2 sau invers dac aceasta con ine valori null sau dac
nu se schimb l imea ;
Schimbarea valorii predefinite pentru o coloan afecteaz numai
inser rile ulterioare n tabela.

tergerea unei coloane


EXEMPLU
ALTER TABLE dept30
DROP COLUMN job_id;
Table altered.

Observa ii:

Coloana poate sau nu s con in date ;


Folosind aceasta comand se poate terge doar o singur
coloana odat ;
Tabela trebuie sa mai aib cel pu in o coloana n urma tergerii
efectuate ;
Odat ce coloana a fost tearsa, ea nu mai poate fi recuperat ;

Op iunea SET UNUSED

Pute i folosi op iunea SET UNUSED pentru a marca una sau mai multe
coloane ca fiind nefolosite.
Pute i folosi op iunea DROP UNUSED COLUMNS pentru a terge
coloanele marcate ca fiind nefolosite.
ALTER TABLE table SET UNUSED (column);
sau
ALTER TABLE table SET UNUSED COLUMN (column);
ALTER TABLE table DROP UNUSED COLUMNS;

Op iunea SET UNUSED marcheaz una sau mai multe coloane ca fiind
nefolosite astfel nct ele s poat fi terse atunci cnd resursele sistemului
devin critice. Prin specificarea acestei clauze nu se terg efectiv coloanele din
fiecare rnd ci ele sunt tratate ca i cum ar fi terse. Dup ce coloana a fost
marcat ca fiind nefolosit ea nu poate fi accesat , comanda SELECT nu va
returna date din acest tip de coloan iar comanda DESCRIBE nu va afia
5-130

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
numele i tipul de dat pentru coloanele marcate astfel. Pute i ad uga tabelei o
nou coloan cu acelai nume pe care l are o coloan marcat ca fiind
nefolosit .
Informa ia dat de SET UNUSED este stocat n dic ionarul de date n
view-ul USER_UNUSED_COL_TABS.
Op iunea DROP UNUSED terge din tabel coloanele marcate ca fiind
nefolosite. Aceast op iune se poate folosi atunci cnd se dorete eliberarea
spa iului pe disc. Dac tabela nu are coloane marcate, executarea instruc iunii
nu ntoarce eroare.
EXEMPLU
ALTER TABLE dept30
SET UNUSED last_name;
Table altered.
ALTER TABLE dept30
DROP UNUSED COLUMNS;
Table altered.
5.11 tergerea unei tabele
Sintaxa:
DROP TABLE table;

EXEMPLU
SQL> DROP TABLE dept30;
Table dropped.

Comanda DROP TABLE terge defini ia unei tabele din dic ionarul de
date Oracle. Cnd se aplic comanda DROP unei tabele, baza de date pierde
toate nregistr rile din tabel , mpreun cu indecii asocia i acesteia. Comanda
este ireversibil.

5-131

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Observa ii:

Toate datele sunt terse;


Orice view sau sinonim asociat va r mne, dar va fi invalid;
Orice tranzac ie n curs va fi finalizat ;
Numai utilizatorul care a creat tabela sau cel care are privilegiul DROP
ANY TABLE poate terge o tabel .
5.12 Modificarea numelui unui obiect

Pentru a modifica numele unei tabele, view, secven e sau sinonim se


folosete comanda RENAME .
Sintaxa:
RENAME old_name TO new_name;
- old_name
- new_name

numele vechi al obiectului;


numele nou al obiectului;

EXEMPLU
SQL> RENAME departments TO departments_new;
Table renamed.

Observa ie: Numai proprietarul obiectului poate modifica numele


obiectului.

5.13 Trunchierea unei tabele


Comanda terge toate nregistr rile din tabela specificat , elibernd
spa iul folosit de tabel . Operaiunea este ireversibil.
Comanda DELETE terge nregistr rile din tabel , dar nu elibereaz
spa iu de stocare (f cnd astfel posibila readucerea nregistr rilor prin comanda
ROLLBACK).

5-132

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

TRUNCATE TABLE table;

Sintaxa: - table este numele tabelei.


EXEMPLU
SQL>TRUNCATE TABLE department;
Table truncated.

Comanda TRUNCATE este mai rapida dect DELETE din


urm toarele motive:

TRUNCATE este o instruc iune de tip DDL i nu genereaz informa ii


de tip rollback.
Trunchierea unei tabele nu declaneaz triggerii tabelei. Dac tabela
este de tip p rinte ntr-o rela ie de integritate referen ial nu pute i
aplica comanda TRUNCATE. Trebuie mai nti sa dezactiva i
constrngerea i apoi lansa i comanda.

5.14

Includerea constrngerilor

Ce fac constrngerile ?

Constrngerile for eaz regulile la nivel de tabela.


Constrngerile previn tergerea unei tabele sau a datelor din tabela dac
exista dependen e.

Oracle lucreaz cu urm toarele tipuri de constrngeri:


-

NOT NULL

UNIQUE KEY

PRIMARY KEY

FOREIGN KEY

CHECK

5-133

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Constrngerile de integritate a datelor
Constrngere

Descriere

NOT NULL

Specific faptul c aceast coloan nu poate con ine o


valoare nul .

UNIQUE Key

Specific o coloan sau o combina ie de coloane a


c ror valoare trebuie s
fie unic
pentru toate
nregistr rile tabelei.

PRIMARY KEY

Identific unic fiecare nregistrare

FOREIGN KEY

Stabilete i for eaz o rela ie de tip cheie extern ntre


coloan i o coloan dintr-o tabela referit .

CHECK

Specific o condi ie care trebuie s fie adev rat .

Ghid pentru crearea constrngerilor

Constrngerile trebuie sa aib un nume. Daca utilizatorul nu d acest


nume, serverul Oracle va genera automat un nume utiliznd formatul
SYS_Cn, unde n este un num r ntreg unic.
Se poate crea o constrngere:
- n timpul cre rii tabelei sau
- dup ce tabela a fost creat
Vizualizarea constrngerea se face doar n dic ionarul de date.

Toate constrngerile sunt p strate n dic ionarul de date. Constrngerile


sunt simplu de referit dac li se d un nume sugestiv. Constrngerile trebuie s
urmeze regulile standard de denumire a obiectelor. Se pot vizualiza
constrngerile create pentru o tabela dac acces m din dic ionarul view-ul
USER_CONSTRAINTS.
Definirea constrngerilor
CREATE TABLE [schema.] table
(column datatype [DEFAULT expr]
(column_constraint],

[table_constraint] [,]);

5-134

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
n sintaxa :
schema

acelai cu numele proprietarului

table

numele tabelei

DEFAULT expr

specific valoarea implicit

column

numele coloanei

datatype

tipul de dat i lungimea

column_constraint

constrngere de integritate ca parte a defini iei coloanei

table_constraint

constrngere de integritate ca parte a defini iei tabelei

Exemplu:
CREATE TABLE employees(
Employee_id number(6),
First_name varchar2(20),

Job_id varchar2(10) NOT NULL,


CONSTRAINT emp_emp_id_pk
PRIMARY KEY (EMPLOYEE_ID));
De obicei constrngerile sunt create n acelai timp cu tabela dar ele
pot fi ad ugate i dup crearea tabelei.
Constrngerile pot fi definite la unul din urm toarele doua nivele:
Constraint level

Descriere

Column

Refer o singur coloan i poate defini orice tip


de constrngere

Table

Refer una sau mai multe coloane i este


definit separat de defini iile coloanelor n
tabela: poate defini orice tip de constrngere
exceptnd NOT NULL

column ,
[CONSTRAINT constraint_name] constraint_type
(column, ),

5-135

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
n sintax :
constraint_name

este numele constrngerii

constraint_type

este tipul constrngerii

5.15 Constrngerea NOT NULL


Constrngerea NOT NULL ne asigur c nu sunt permise n coloan
valori null. Coloanele f r constrngerea NOT NULL pot con ine implicit valori
null.
EMPLOYEE_ID

FIRST_NAME

COMMIS
SION_P
CT

7839

KING

10

7698

BLAKE

30

7782

CLARK

10

7566

JONES

20

DEPARTMENT_ID

Constrngere
NOT NULL
(nici o nregistrare nu
poate con ine o
valoare NULL pe
aceasta coloana)

Absen a constrngerii
NOT NULL (orice
nregistrare poate
con ine null pentru
aceasta coloan )

Constrngere
NOT NULL

n exemplul de mai sus se aplica constrngerea NOT NULL coloanelor


last_name i hire_date din tabela EMPLOYEES. Deoarece constrngerea
pentru last_name nu are nume, Oracle Server va crea nume pentru ea.
OBSEVATIE:
Constrngerea NOT NULL poate fi specificat numai la nivel de
coloan .

5-136

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
CREATE TABLE employees(
Employee_id number(6),
last_name varchar2(25) NOT NULL,
salary
number (8,2),
commission_pct number(2,2),
hire_date DATE
CONSTRAINT emp_hire_date_nn NOT NULL,

Nume dat de
sistem

Nume dat de
utilizator

Numele constrngerii poate fi specificat n timpul specific rii constrngerilor.


EXEMPLU:
hire_date DATE
CONSTRAINT emp_hire_date_nn NOT NULL

5.16 Constrngerea UNIQUE KEY


Constrngerea UNIQUE key
EMPLOYEES
EMPLOYEE_ID

LAST_NAME

EMAIL

100

King

SKING

101

Kochhar

NKOCHHAR

102

De Haan

LDEHAAN

103

Hunold

AHUNOLD

INSERT INTO
208

Smith

LSMITH

209

Smith

LSMITH

PERMIS
Nu este permis
exista deja

O constrngere de integritate de tip cheie unic cere ca fiecare valoare


din coloana sau din setul de coloane specificat s fie unice dou nregistr ri
ale tabelei nu pot avea valori duplicat n coloana sau setul de coloane care
formeaz constrngerea. Coloana (setul de coloane) inclus n defini ia cheii
unice se numete cheie unic. Dac cheia unic con ine mai multe coloane se
5-137

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
numete cheie unic compus.
Constrngerea cheie unic permite introducerea de valori null dac nu
a fost definit o constrngere NOT NULL pentru acea coloan . De fapt, orice
num r de nregistr ri pot include valori null n coloane f r constrngerea NOT
NULL. O valoare null ntr-o coloan (sau n toate coloanele unei chei unice
compuse) satisface ntotdeauna o constrngere de tip cheie unic .
CREATE TABLE employees(
Employee_id number(6),
last_name varchar2(25) NOT NULL,
email
varchar2(25),
commission_pct number(2,2),
hire_date DATE NOT NULL
.
CONSTRAINT emp email uk UNIQUE (email)
Constrngerea cheie unica (unique key) poate fi definit la nivel
de tabel sau coloan .

n exemplu se aplic constrngerea de tip cheie unica coloanei EMAIL


din tabela EMPLOYEES. Numele constrngerii este EMP_EMAIL_UK.
Not :
O cheie unica compus este creat utiliznd defini ia la nivel de
tabel . Serverul Oracle for eaz implicit constrngerea de cheie
unic crend un index unic dup cheia unic .

5-138

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
5.17 Constrngerea PRIMARY KEY
Pentru fiecare tabel
poate fi creata doar o cheie primar .
Constrngerea de tip cheie primar este format dintr-o coloana sau set de
coloane care identific n mod unic fiecare nregistrare din tabel . Aceasta
constrngere for eaz unicitatea coloanei sau a setului de coloane i asigur c
nici o coloan care este parte a cheii primare nu poate con ine o valoare null.
Un exemplu de constrngere n care cheia primara este format din
dou coloane ar putea fi constrngerea pe coloanele serie i nr_buletin. Mai
multe persoane pot avea aceeai serie de buletin dar nu pot avea acelai
num rul de buletin. Acelai num r de buletin poate sa apar la mai multe
persoane, dar difer seria i n acelai timp serie sau nr_buletin nu pot avea
valori nule.
Not :

Constrngerea de tip cheie primare poate fi definit la


nivel de coloan sau tabel.
O cheie primar compus este creat utiliznd definiia
la nivel de tabel.
Un index unic este automat creat pentru o coloan cheie
primar .

Exemplul definete o cheie primar dup coloana DEPARTMENT_ID a


tabelei DEPTARTMENTS. Numele constrngerii este DEPT_ID_PK.
CREATE TABLE departments
(department_id
NUMBER(4),
department_name VARCHAR2(30)
CONSTRAINT dept_name_nn NOT NULL,
manager_id
NUMBER(6),
location_id
NUMBER(4),
CONSTRAINT dept_id_pk PRIMARY KEY (department_id));

5.18

Constrngerea FOREIGN KEY

Cheia externa sau constrngerea de integritate referenial,


desemneaz o coloan sau o combina ie de coloane n func ie de cheia extern
i stabilete o rela ie cu o cheie primar sau o cheie unic n aceeai tabel sau
o tabela diferit . n exemplu, DEPARTMENT_ID a fost definit cheie extern n
tabela EMPLOYEES (dependent sau tabela copil); ea refer coloana
DEPARTMENT_ID din tabela DEPARTMENTS (referit sau tabela p rinte).
5-139

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Valoarea unei chei externe trebuie sa se potriveasc
existent n tabela p rinte sau sa fie NULL.
Constrngerea FOREIGN key

DEPARTMENT

PRIMARY
KEY

cu o valoare

DEPARTMENT _ID

DEPARTMENT_NAME

MANAGER_ID

10

Administration

200

20

Marketing

201

EMPLOYEES
EMPLOYEE_ID

LAST_NAME

DEPARTMENT _ID

100

King

90

101

Kochhar

90

102

De Haan

90

103

Hunold

60

200

Ford

201

Ford

60

FOREIGN
KEY

Nu este permis
9 nu exista

Observa ii:

Cheile externe sunt bazate pe valorile datelor i sunt pointeri pur


logici, nu fizici.
Constrngerea de tip cheie extern
coloan sau tabel .

poate fi definit

la nivel de

cheie extern compus este creat folosind defini ia la nivel de tabel.

Exemplul de mai sus definete o constrngere de tip cheie externa n


coloana DEPARTMENT_ID din tabela EMPLOYEES. Numele constrngerii
este EMP_DEPT_FK.

5-140

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

CREATE TABLE employees(


Employee_id number(6),
last_name varchar2(25) NOT NULL,
email
varchar2(25),
commission_pct number(2,2),
hire_date DATE NOT NULL
.
Department_id number (4),
CONSTRAINT emp_dept_fk FOREIGN KEY
(department_id)REFERENCES departments
(department_id,CONSTRAINT emp_email_uk UNIQUE (email)

Cuvintele cheie ale constrngerii FOREIGN KEY


Constrngerile externe sunt definite n tabela copil i tabela care
con ine coloana referit este tabela p rinte. Constrngerile externe sunt definite
folosind combina ii ale urm toarelor cuvinte:
FOREIGN KEY- Definete coloana n tabela copil la nivelul constrngerii de
tabel.
REFERENCES- Identific tabela i coloana n tabela p rinte.
ON DELETE CASCADE- Permite tergeri n tabela p rinte precum i tergeri
de linii independente n tabela copil. Cnd rndul din tabela p rinte este
ters, rndurile independente din tabela copil sunt deasemeni terse. F r
op iunea ON DELETE CASCADE, rndul din tabela p rinte nu va putea fi
ters dac este referit n tabela copil.
ON DELETE SET NULL convertete valoarea cheii str ine pe NULL atunci
cnd valoarea corespunz toare din tabela p rinte este tearsa.
5.19

Constrngerea CHECK

Definete o condi ie pe care fiecare rnd trebuie sa o ndeplineasc .


Expresii care nu sunt permise:
-

Referiri la pseudocoloanele CURRVAL, NEXTVAL, LEVEL i


ROWID.

Apeluri la func iile SYSDATE, UID, USER i USERENV .

Interog ri care fac referin e la alte valori din alte rnduri.

5-141

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
5.20 Adugarea unei constrngeri

, salary NUMBER (2)


CONSTRAINT emp_salary_min CHECK (salary>0),
Se poate ad uga o constrngere la tabelele existente folosind
declara ia ALTER TABLE mpreun cu clauza ADD.
n sintax :
table

este numele tabelei


ALTER TABLE table
ADD [CONSTRAINT constraint] type (column);

constraint
type
column

este numele constrngerii


este tipul constrngerii
este numele coloanei afectate de constrngere

Denumirea constrngerii este op ional i totui ea este recomandat .


Daca nu da i nume constrngerilor, sistemul va genera automat un nume.
Se poate ad uga, terge, activa, dezactiva o constrngere, dar nu
se poate modifica structura acesteia.
Se poate ad uga o constrngere de tip NOT NULL la o coloan
existent folosind clauza MODIFY din comanda ALTER TABLE.
Se poate defini o coloan NOT NULL doar dac tabela nu con ine
rnduri, deoarece nu se pot specifica date pentru rndurile existente
n acelai timp n care ad ugam noi coloane.
Exemplul de mai jos creeaz o constrngere de tip extern n tabela
employees. Constrngerea ne asigur de existenta manager-ului ca angajat
activ n tabela employees.
ALTER TABLE employees
ADD CONSTRAINT emp_manager_fk
FOREIGN KEY (manager_id)
REFERENCES employee (employee_id);

5-142

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
5.21 tergerea unei constrngeri
Exemplu : tergerea constrngerii manager din tabela EMPLOYEES.
ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;
Table altered.
tergerea constrngerii de tip cheie primara din tabela EMPLOYEES.
Pentru a terge a constrngerea trebuie identificat numele
constrngerii, pe care l pute i afla accesnd USER_CONSTRAINS i
USER_CONS_COLUMNS. Apoi se folosete func ia ALTER TABLE mpreun
cu clauza DROP. Op iunea CASCADE din clauza DROP are ca efect i
eliminarea tuturor constrngerilor dependente.
ALTER TABLE employees
DROP PRIMARY KEY CASCADE;
Table altered.
Sintaxa:
ALTER TABLE table
DROP PRIMARY KEY | UNIQUE (column)|
CONSTRAINT constraint [CASCADE};

unde:

table

este numele tabelei;

column

este numele coloanei afectate de constrngere;

constraint

este numele constrngerii.

Aten ie:
Cnd se terge o constrngere de integritate, aceasta nu mai este
folosita de c tre Oracle Server i nu mai este disponibila n
dic ionarul de date.
5.22 Dezactivarea constrngerilor
Executarea clauzei DISABLE din func ia ALTER TABLE pentru a
dezactiva o constrngere de integritate.

Aplicarea op iunii CASCADE pentru a dezactiva constrngeri de integritate


dependente.

5-143

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

ALTER TABLE employees


DISABLE CONSTRAINT emp_emp_id_pk CASCADE;
Table altered.
Se poate dezactiva o constrngere f r a fi necesar tergerea
acesteia sau recrearea ei, folosind func ia ALTER TABLE mpreuna cu clauza
DISABLE.
ALTER TABLE table
DISABLE CONSTRAINT constraint [CASCADE];
Unde:

table

este numele tabelei.

constraint

este numele constrngerii.

clauza DISABLE se poate folosi att n func ia CREATE TABLE ct i


n func ia ALTER TABLE.
clauza CASCADE
dependente.

dezactiveaz

constrngerile

de

integritate

5.23 Activarea constrngerilor

Activarea unei constrngeri de integritate care este dezactivat


clauza ENABLE n definirea tabelei.

folosind

Un index de tip unic sau de tip cheie primar este automat creat dac se
activeaz constrngerile UNIQUE sau PRIMARY KEY.

Se poate activa o constrngere f r a o terge sau a o recrea folosind func ia


ALTER TABLE mpreuna cu clauza ENABLE.
Sintaxa:

ALTER TABLE table


ENABLE CONSTRAINT constraint;
Unde:

table

este numele tabelei.

constraint este numele constrngerii.


ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk;
Table altered.

5-144

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Aten ie:
Daca se activeaz o constrngere, constrngerea este aplicat tuturor
datelor din tabel . Toate datele din tabel trebuie sa ndeplineasc
condi iile din constrngere.

Daca se activeaz o constrngere de tip unic sau cheie primar , atunci


este creat n mod automat un index de tip unic.
Clauza ENABLE se poate folosi att n func ia CREATE TABLE ct i n
func ia ALTER TABLE.

Vizualizarea constrngerilor
Vizualizarea constrngerilor se poate face prin interogarea tabelei
USER_CONSTRAINTS pentru a putea afla toate numele i defini iile
constrngerilor.

Dup crearea unei tabele, se poate confirma existen a sa prin folosirea


comenzii DESCRIBE. Singura constrngere care poate fi verificat este
constrngerea NOT NULL. Pentru a vedea toate constrngerile din tabel , este
necesar interogarea tabelei USER_CONSTRAINTS.
SELECT constraint_name, constraint_type,
search_condition
FROM user_cons_columns
WHERE table_name=EMPLOYEES;
Exemplul afieaz toate constrngerile tabelei EMPLOYEES.

5-145

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
NOT :
Constrngerilor care nu primesc un nume de la posesorul tabelei li se
atribuie automat de c tre sistem un nume. La numirea tipului de
constrngere, C provine de la CHECK, P de la PRIMARY KEY, R de la
integritate referen ial , i U de la UNIQUE. De observat faptul c constrngerea
NULL este de fapt o constrngere de tip CHECK.
Vizualizarea coloanelor asociate constrngerilor
Vizualizarea coloanelor asociate cu numele constrngerilor se face
folosind USER_CONS_COLUMNS. Aceasta vizualizare este util mai ales n
cazul constrngerilor asociate de c tre sistem.
SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name = 'EMPLOYEES';

5-146

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

5.24 Exerciii

1. Crea i tabelul DEPT bazat pe structura din tabelul urm tor. Salva i
instruc iunea n scriptul p1.sql , executa i scriptul i verifica i.
Column Name

Id

Name

Datatype

Number

Varchar2

Length

25

2. Introduce i nregistr ri n tabela DEPT din tabela DEPARTMENT. Include i


doar coloanele de care ave i nevoie.
3. Crea i tabela EMP bazata pe tabelul urm tor. Salva i instruc iunea ntr-un
script p3.sql i apoi executa i scriptul. Verifica i existenta tabelei.
Column Name

ID

LAST_NAME

FIRST_NAME

DEPT_ID

Datatype

Number

Varchar2

Varchar2

Number

Length

25

25

4. Modifica i tabela EMP pentru a permite nume mai lungi n coloana


Last_name. Verifica i efectuarea modific rii.
5. Asigura i-v c cele dou tabele create sunt stocate de dic ionarul de date.
6. Crea i tabela EMPLOYEE2 bazat pe structura tabelei EMP, incluznd doar
coloanele EMPNO, ENAME i DEPTNO. Redenumi i coloanele n noua
tabela astfel: ID, LAST_NAME, DEPT_ID.
7. Redenumi i tabela EMPLOYEE2 n EMPLOYEE3.
8. terge i tabela EMPLOYEE3.
9 Ad uga i o constrngere de tip PRIMARY KEY la tabela EMP folosind
coloana ID. Constrngerea trebuie sa fie activata la creare.
10. Crea i o constrngere PRIMARY KEY n tabela DEPT folosind coloana ID.
Constrngerea trebuie sa fie activata la creare.
11. Ad uga i o referin de tip cheie extern la tabela EMP care va asigura ca
angaja ii nu sunt asigna i unui departament inexistent.

5-147

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
12. Confirma i
constrngerile
ad ugate
interognd
tabela
USER_CONSTRAINTS. Observa i numele i tipul constrngerilor. Salva i
textul ntr-un fiier.
CONSTRAINT_NAME
DEPT_ID_PK

C
P

EMP_ID_PK

EMP_DEPT_ID_FK

13. Afia i numele i tipul obiectelor din dic ionarul USER_OBJECTS al


tabelelor EMP i DEPT. Formata i coloanele pentru refolosirea lor.
Observa i c a fost creat un nou tabel precum i un nou index.
OBJECT_NAME

OBJECT_TYPE

DEPT

TABLE

DEPT_ID_PK

INDEX

EMP

TABLE

EMP_ID_PK

INDEX

14. Modifica i tabela EMP. Ad uga i o coloana SALARY de tip NUMBER,


precizie 7.
15. terge i coloana FIRST_NAME din tabela EMP. Confirma i modific rile
efectuate prin verificarea descrierii tabelei.
16. Marca i ca fiind nefolosit coloana DEPT_ID din tabela EMP. Confirma i
modific rile efectuate prin verificarea descrierii tabelei.
17. terge i toate coloanele nefolosite din tabela EMP. Confirma i modific rile
efectuate prin verificarea descrierii tabelei.

5-148

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Capitolul 6 Expresii aritmetice. Operatori. Restric ionarea i sortarea
datelor
Instruc iunea SELECT poate fi folosit pentru a afia anumite coloane din
tabela specificnd numele coloanelor, separate prin virgul . n clauzele
SELECT se specific coloanele dorite, n ordinea de afiare dorit .
Modul implicit de afiare a informaiilor este :
Stnga date calendaristice i caractere (exemplu: coloanele ename
i hiredate)
Dreapta date numerice (exemplu: coloana sal)
Textul este scris cu litere mari (uppercase)
Numele de coloan pentru date calendaristice sau caractere poate fi
trunchiat, dar numele de coloan pentru datele de tip numeric nu poate fi
trunchiat. Nunele coloanelor sunt afiate implicit cu litere mari. Titlul coloanelor
poate fi modificat folosind un alias. Folosirea alias-urilor va fi prezentat ntr-un
capitol ulterior.
6.1 Expresii aritmetice
Crearea expresiilor numerice i de date folosind operatori aritmetici
modific felul n care se afieaz datele prin executarea de calcule. Expresiile
aritmetice pot con ine nume de coloane, constante numerice i operatori
aritmetici.
Operatorii aritmetici disponibili n SQL se pot folosi n orice clauza SQL
exceptnd clauza FROM.
Operator
+
*
/

Descriere
Adunare
Sc dere
nmul ire
mp r ire

Exemplu:
SELECT last_name, salary, salary+300 FROM employees;
n exemplul dat s-a folosit operatorul adunare pentru a m ri salariile cu
300$ pentru to i angaja ii. Se afieaz noua coloan SALARY+300 . n urma
adun rii coloana rezultat (SALARY+300) nu este o coloan nou n tabela
EMPLOYEES; aceasta este vizibil doar la afiarea rezultatelor. Implicit,
6-149

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
denumirea noii coloane provine de la opera ia care a generat-o, n acest caz
SALARY+300.
NOT : SQL*Plus ignor spa iile din fa a i din spatele operatorilor
aritmetici.
Prioritatea operatorilor este * / + nmul irea i mp r irea au prioritate fa de adunare i sc dere.
Operatorii de aceeai prioritate sunt evalua i de la stnga la dreapta.
Parantezele sunt folosite pentru a for a evalu rile prioritare i a clarifica
regulile.
Dac o expresie aritmetic con ine mai mult de un operator, nmul irea
i mp r irea sunt evaluate primele. Dac operatorii folosi i ntr-o
expresie sunt de aceeai prioritate, evaluarea se va face de la stnga la
dreapta. Pute i folosi parantezele pentru a for a expresia din paranteze
sa fie evaluat prima.
Exemplu:
SELECT last_name, salary,12*salary+100 FROM employees;

n exemplul dat sunt afiate cmpurile nume, salariu i compensa ia


anual a angaja ilor. Aceasta este calculat nmul ind salariul lunar cu 12 plus o
prim de 100$. Deci, nmul irea se efectueaz naintea adun rii.
Folosirea parantezelor pentru a nt ri ordinea fireasc a opera iilor va
arata astfel : (12*SALARY)+100, opera ie care nu va schimba rezultatul.
Folosirea parantezelor
6-150

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu:
SELECT last_name, salary,12*(salary+100)FROM employees;
Se pot modifica regulile precedentei operatorilor folosind parantezele

pentru a specifica ordinea n care operatorii sa fie folosi i. n exemplul dat sunt
afiate numele, salariul i compensa ia anual a salaria ilor. Aceasta este
formata din salariul lunar plus o prima, totul nmul it cu 12. Datorit
parantezelor, adunarea are prioritate fa de nmul ire.
Definirea valorii nule (null vallue)
Valoarea null este nedisponibil , neatribuit , necunoscut
inaplicabil .
Valoarea nul nu este aceeai cu zero sau spa iu.

sau

Exemplu:
SELECT last_name, job_id,salary,commission_pct
FROM employees;

6-151

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Dac o linie nu are date pentru o coloan anume, aceasta valoare se


numete nul .
Valoarea null este nedisponibil , neatribuit , necunoscut
sau
inaplicabil . Valoarea null nu este aceeai cu zero sau spa iu. Zero este num r
iar spa iul este un caracter.
Coloanele de orice tip de dat pot con ine valoarea vid , cu excep ia
celor care au fost definite nenule sau chei primare.
Se observ c unii angaja i pot ctiga comision iar al ii nu - coloana
COMMISSION_PCT din tabela EMPLOYEES. Valoarea vid reprezint un fapt
n sine. Trebuie subliniat faptul ca vnz torul are comisionul 0 nu null.
Valoarea nul n expresii aritmetice

Expresiile aritmetice care con in valoarea null sunt evaluate ca


nule.

Exemplu:
SELECT last_name, 12*salary*commission_pct
FROM employees;
Dac o coloan dintr-o expresie aritmetic con ine valoarea null,
rezultatul este null. De exemplu, dac ncerca i s executa i o mp r ire la zero,
ob ine i o eroare. Oricum, dac mp r i i un num r la valoarea null, rezultatul
este null sau necunoscut.

6-152

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

n exemplul de mai sus, angajatul KING nu primete comision. Deoarece


coloana COMMISSION_PCT n expresia aritmetic este nul , rezultatul este
null.
6.2

Definirea alias-urilor pentru coloane

Aliasurile redenumesc numele coloanei.


Aliasurile sunt folositoare acolo unde se folosesc calcule aritmetice.
Aliasurile urmeaz imediat dup numele coloanei; op ional se poate
folosi cuvntul cheie AS intre numele coloanei i alias;
Aliasurile necesita doua ghilimele ( / dac con in spatii, caractere
speciale sau au importanta literele mari (mici).
La afiarea rezultatului unei interog ri SQL* Plus folosete n mod normal
numele coloanei drept cap de tabel. n multe cazuri acest cap de tabel nu este
sugestiv i de aici dificultatea de a n elege con inutul coloanei. Numele
coloanei se poate schimba folosind aliasul.
Aliasul se specific dup numele coloanei n lista SELECT folosind
spa iul ca separator. Implicit capul de tabel ob inut prin alias este scris cu litere
mari. Dac aliasul con ine spatii, caractere speciale (ca $ sau #), sau au
importanta literele mari (mici), aliasul trebuie scris ntre ghilimele ().
Exemplu:
SELECT last_name as name, commission_pct comm
FROM employees;

6-153

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

SELECT last_name as Name, salary*12 Annual Salary


FROM employees;

Primul exemplu afieaz numele i comisionul lunar al tuturor angaja ilor.


Cuvntul cheie AS a fost folosit nainte de alias. Rezultatul interog rii trebuie s
fie acelai indiferent dac cuvntul cheie AS este folosit sau nu. Un alt aspect
ce trebuie remarcat este faptul c name i comm au fost scrise cu litere mici iar
afiarea s-a f cut cu litere mari. Deci, implicit capul de coloana apare cu litere
mari.
n cel de-al doilea exemplu afiam numele i salariul anual al angaja ilor.
Deoarece Annual Salary implic folosirea spa iului, aliasul trebuie scris ntre
ghilimele. Astfel va fi afiat exact ceea ce este scris n expresia SELECT.
6.3

Operatorul de concatenare

Concateneaz coloanele sau irurile de caractere cu alte coloane;


Este reprezentat de dou bare verticale (||);
Rezult o coloan care este o expresie caracter.

Folosind operatorul de concatenare (||) se pot concatena coloane,


expresii aritmetice sau valori constante pentru a crea expresii de tip caracter.
Coloanele situate de o parte i de alta a operatorului sunt combinate pentru a
face o singur coloan de ieire.
6-154

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu:
SELECT last_name ||job_id as Employees FROM employees;

n exemplul de mai sus last_name i job_id sunt concatenate avnd


aliasul Employees. Observa i c func ia angajatului i numele acestuia sunt
combinate pentru a rezulta o singur coloana de ieire. Cuvntul cheie AS,
folosit naintea numelui aliasului, face mai uor de citit instruc iunea SELECT.

iruri de caractere
Un literal este un caracter, o expresie sau un num r inclus n
lista SELECT;
Valorile literale pentru datele calendaristice i caractere trebuie
incluse ntre ghilimele simple;
Fiecare ir de caractere este afiat odat pentru fiecare rnd
ntors.
Exemplu:
SELECT last_name || is a ||job_id as Employee Details
FROM employees;

Exemplul afieaz numele i meseriile tuturor angaja ilor. Coloana poart


titlul Detaliile angajatului. Observa i spatiile dintre ghilimelele simple din
instruc iunea SELECT care mbun t esc lizibilitatea ieirii.

6-155

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

n exemplul urm tor, numele i salariul fiec rui angajat este concatenat
cu un literal pentru a da rndurilor mai mult n eles.
SELECT last_name ||:1 Month salary = ||salary Monthly
FROM employees;

Rnduri duplicate
Implicit, interog rile afieaz
duplicate.

toate rndurile, incluznd rndurile

Exemplu:
SELECT department_id FROM employees;

6-156

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

SQL*Plus va afia rezultatul interog rii f r a elimina rndurile duplicate


dac nu se indic altfel. Exemplul de mai sus afieaz toate numerele de
departamente din tabelul EMP.
Eliminarea rndurilor duplicate se face folosind cuvntul cheie DISITINCT
n clauza SELECT.
Exemplu:

SELECT DISTINCT department_id FROM employees;


Se pot specifica mai multe coloane dup clauza DISTINCT. Aceast
clauz afecteaz toate coloanele selectate i rezultatul reprezint o combina ie
de coloane distincte.
SELECT DISTINCT department_id , job_id FROM employees;

6.4

Afiarea structurii unei tabele

Se folosete comanda SQL*Plus:


DESC[RIBE] tablename

6-157

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
unde tablename este numele unei tabele existente, a unei vizualiz ri sau
a unui sinonim accesibil utilizatorului.

Exemplu:
DESCRIBE EMPLOYEES

Se afieaz informa ii despre structura tabelei EMPLOYEES. Null? indic


dac o coloana trebuie sa con in date; NOT NULL indic faptul ca acea
coloan trebuie s con in date. Type afieaz tipul de dat al coloanei.
Tip de date

Descriere

NUMBER(p,s)

Valori numerice avnd un num r maxim de p cifre, unde s


este num rul de cifre din dreapta virgulei

VARCHAR2(s)

ir de caractere de lungime variabila cu lungime maxima s

DATE

Dat calendaristic ntre 1 ianuarie 4712 i.c. i 31 decembrie


9999 d.c.

CHAR(s)

ir de caractere de lungime fix (s)

6.5

Restric ionarea i sortarea datelor

La citirea datelor dintr-o baza de date s-ar putea sa fie necesar


reducerea num rului de linii afiate sau specificarea ordinii n care acestea s
fie afiate.
n exemplul de mai jos se dorete afiarea tuturor angaja ilor din
departamentul 90. Setul de linii care au valoarea 90 n coloana
DEPARTMENT_ID sunt singurele returnate. Aceast metod de restric ionare
reprezint baza clauzei WHERE n SQL.
6-158

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Limitarea liniilor folosind o selec ie
EMPLOYEES

DEPARTMENT
_ID

EMPLOYEE_ID

LAST_NAME

JOB_ID

100

King

AD_PRES

90

101

Kochhar

AD_VP

90

102

De Haan

AD_VP

90

103

Hunold

IT_PROG

90

returneaz
to i angaja ii
din
departamentul
90

60
EMPLOYEES
EMPLOYEE_ID

DEPARTMENT_ID

LAST_NAME

JOB_ID

100

King

AD_PRES

90

101

Kochhar

AD_VP

90

102

De Haan

AD_VP

90

6.6

Clauza WHERE

SELECT [DISTINCT] {*, column [alias], }


FROM table
[WHERE condition(s)];

n sintaxa:
WHERE
restric ioneaz interogarea la liniile ce ndeplinesc condi ia.
condition
e compus din nume de coloane, expresii, constante i
operatori de compara ie.
Clauza WHERE urmeaz dup clauza FROM
Pute i reduce num rul de linii returnate de o interogare folosind clauza
WHERE.
O clauza WHERE con ine o condi ie ce trebuie ndeplinit i urmeaz
imediat dup o clauza FROM.
Clauza WHERE poate compara valorile din coloane, valori literale,
expresii aritmetice sau func ii. Clauza WHERE e compus din trei elemente ;
Numele coloanei;
Operatorul de compara ie;
Nume de coloana, constant sau list de valori.
6-159

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Exemplu:
SELECT employee_id, last_name, first_name, department_id
FROM employees WHERE department_id=90;

n exemplul de mai sus SELECT-ul returneaz numele i func ia tuturor


angaja ilor din departamentul 90.
iruri de caractere i date

irurile de caractere i datele sunt incluse ntre apostrof;


Valorile de tip caracter sunt case-sensitiv iar valorile de tip dat
calendaristic sunt format-sensitive;
Formatul implicit pentru dat calendaristic este DD-MON-YY
Exemplu:
SELECT last_name, job_id, department_id FROM employees
WHERE last_name=Whalen;

irurile de caractere i datele din clauza WHERE trebuiesc incluse ntre


apostrofuri ( ). Regula nu se aplic constantelor numerice. Toate c ut rile de
tip caracter sunt case-sensitiv. n exemplul urm tor nu este returnat nici o linie
deoarece tabela EMPLOYEES con ine toate datele scrise cu majuscule.
SELECT last_name, job_id, department_id
FROM employees
WHERE last_name=WHALEN;
Oracle retine datele ntr-un format numeric intern, reprezentnd secol,
an, luna, zi, ore, minute i secunde. Afiarea implicit a datei este DD-MON-YY.

6-160

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
NOT : schimbarea formatului implicit va fi explicat n alt capitolul.
6.7 Operatori de compara ie
Operator
=
>
>=
<
<=
<>
!=

Semnifica ie
Egal cu
Mai mare dect
Mai mare sau egal
Mai mic dect
Mai mic sau egal
Diferit de
Diferit de

Operatorii de compara ie sunt folosi i n condi iile care compar


expresii. Acetia sunt folosi i n clauza WHERE n urm torul format:

dou

Sintaxa:
WHERE expresie operator valoare

Exemplu:
WHERE hiredate=01-JAN-95
WHERE sal>=1500
WHERE ename=SMITH
Folosirea operatorilor de compara ie
SELECT last_name, salary
FROM employees
WHERE salary<=3000;
n exemplul de mai sus SELECT-ul returneaz numele i salariul din
tabela EMPLOYEES acolo unde salariul angajatului este mai mic sau egal cu
3000. Cele dou
valori sunt luate din coloanele SALARY respectiv
LAST_NAME ale tabelei EMPLOYEES.

6-161

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Al i operatori de compara ie
Operator

Semnifica ie

BETWEEN AND

ntre dou valori (inclusiv)

IN(lista)
LIKE

Potrivete orice valoare din list


Potrivete un tip de caracter

IS NULL

Este o valoare nul

Operatorul BETWEEN
Operatorul BETWEEN se folosete pentru afiarea valorilor cuprinse ntrun interval.
SELECT last_name, salary
FROM employees
WHERE salary BETWEEN 2500 AND 3500;
Limita
Limita
Inferioar
superioar
Folosind operatorul BETWEEN liniile afiate vor avea valori cuprinse n
intervalul cuprins ntre limita inferioar i limita superioar .
Valorile specificate cu operatorul BETWEEN sunt inclusive. Prima data
trebuie specificat limita inferioar .
SELECT-ul de mai sus returneaz liniile din tabela EMPLOYEES pentru
to i angaja ii cal c ror salariu este cuprins ntre 2500 i 3500.
Folosirea operatorului IN la testarea valorilor dintr-o list .
SELECT employee_id,last_name, salary,manager_id
FROM employees
WHERE manager_id IN (100,101,201);
Exemplul de mai sus afieaz num rul, numele, salariul i num rul
managerului pentru to i angaja ii ai c ror manageri au num rul 100,101 sau
201.

6-162

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Operatorul IN poate fi folosit cu orice tip de dat .


Urm torul exemplu returneaz o linie din tabela EMPLOYEES pentru
fiecare angajat al c rui nume este inclus n lista de nume din clauza WHERE.
SELECT employee_id,manager_id, department_id
FROM employees
WHERE last_name IN (Harstein,Vargas);
Dac n list sunt folosite caractere sau date acestea trebuiesc incluse
ntre apostrof.
Folosirea operatorului LIKE
Operatorul LIKE se folosete pentru a efectua c ut ri folosind
caractere wildcard n irurile valide de c utare.
Condi iile c ut rii pot con ine fie caractere literale, fie numere.
%
nseamn zero sau mai multe caractere
_ nseamn un singur caracter
SELECT first_name
FROM EMPLOYEES
WHERE first_name LIKE S%;
Nu cunoatem ntotdeauna exact valoarea pe care o c ut m. Folosind
operatorul LIKE se pot selecta liniile care se potrivesc cu un anumit ablon de
c tare format dintr-un ir de caractere numit wildcard. Pentru construirea
irurilor de c utare pot fi folosite dou simboluri.

6-163

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Simbol
%

Semnifica ie
Reprezint orice secven a de dou sau mai multe caractere

Reprezint un singur caracter

SELECT-ul de mai sus afieaz


numele angaja ilor din tabela
EMPLOYEES pentru to i angaja ii ai c ror nume ncepe cu S. Numele care
ncep cu s nu vor fi returnate.
Operatorul LIKE poate fi folosit i n compara iile ce folosesc operatorul
BETWEEN. Urm torul exemplu afieaz numele i data angaj rii pentru
salaria ii ce au fost angaja i ntre ianuarie 1981 i decembrie 1981.
SELECT last_name, hire_date FROM EMPLOYEES
WHERE hire_date LIKE %95;
Se pot face diverse combina ii de caractere cum ar fi :
SELECT last_name FROM EMPLOYEES
WHERE last_name LIKE _o%;
Se poate folosi identificatorul ESCAPE pentru a c uta caracterele
% i _.
Combin ri de caractere wildcard:
Simbolurile % i _ pot fi folosite n orice combina ie cu caracterele literale.
Exemplul afieaz numele tuturor angaja ilor care au al doilea caracter A.
Op iunea ESCAPE:
Cnd este nevoie de o potrivire exacta a caracterelor % i _ trebuie
folosita op iunea ESCAPE. Aceasta op iune specific care este caracterul
ESCAPE. Pentru a afia numele tuturor angaja ilor care con ine secven a A_B
se va folosi urm torul SELECT:
SELECT employee_id,last_name,job_id
FROM EMPLOYEES
WHERE job_id LIKE %SA\_% ESCAPE \;

6-164

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Op iunea ESCAPE identific caracterul backslash (\) ca fiind caracter
ESCAPE. n tipar caracterul ESCAPE preceda caracterul underscore (_). Acest
lucru face ca Oracle s interpreteze caracterul underscore drept literal.
Folosirea operatorului IS NULL la testarea valorilor nule
SELECT last_name,manager_id
FROM EMPLOYEES
WHERE manager_id IS NULL;
Operatorul IS NULL c uta valorile nule. O valoare nul este o valoare
nedisponibil , neatribuit , necunoscut sau neaplicabil . Din aceast cauz nu
poate fi testat folosind operatorul (=). O valoare nul nu poate fi egal sau
inegal cu orice valoare. Exemplul de mai sus returneaz numele i managerul
tuturor angaja ilor care nu au manager.
De exemplu pentru a afia numele, func ia i comisionul tuturor
angaja ilor care nu au dreptul la comision se va folosi urm torul SELECT:
SELECT last_name,job_id,commission_pct
FROM EMPLOYEES
WHERE commission_pct IS NULL;

6.8
Operator

Operatori logici
Semnifica ie

AND

Returneaz TRUE dac ambele componente ale condi iei sunt


adev rate

OR

Returneaz TRUE dac una din componentele condi iei este


adev rat

NOT

Returneaz TRUE dac condi ia este fals

6-165

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Un operator logic combin rezultatul a dou componente de tip condi ie
pentru a produce un singur rezultat bazat pe acestea sau pentru a inversa
rezultatul unei singure condi ii.
Folosirea operatorului AND
AND cere ca ambele condi ii sa fie adev rate.
SELECT employee_id, last_name,job_id,salary
FROM EMPLOYEES
WHERE salary>=10000 AND job_id LIKE %MAN%;

n exemplul de mai sus ambele condi ii trebuie sa fie adev rate pentru a fi
selectat vreo nregistrare. De acea va fi selectat doar angajatul pentru care
numele codului func iei ncepe cu MAN i care ctig mai mult de 10000.
Toate c ut rile de tip caracter sunt case-sensitiv. Nu va fi returnat nici o linie
dac MAN nu este scris cu majuscule. irurile tip caracter trebuiesc incluse
ntre apostrof.
Tabela de adev r a operatorului AND
AND
TRUE
FALSE
UNKNOWN

TRUE
TRUE
FALSE
UNKNOWN

FALSE
FALSE
FALSE
FALSE

UNKNOWN
UNKNOWN
FALSE
UNKNOWN

Folosirea operatorului OR
Operatorul OR cere ca doar una din condi ii sa fie adev rat .
SELECT employee_id, last_name,job_id,salary
FROM EMPLOYEES
WHERE salary>=10000 OR job_id LIKE %MAN%;
n exemplul de mai sus oricare din condi ii poate fi adev rat pentru a fi
selectat vreo nregistrare. De acea un angajat pentru care numele codului
func iei ncepe cu MAN sau ctiga mai mult de 10000 va fi selectat.
6-166

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Tabela de adev r a operatorului OR


OR
TRUE
FALSE
UNKNOWN

TRUE
TRUE
TRUE
TRUE

FALSE
TRUE
FALSE
UNKNOWN

UNKNOWN
TRUE
UNKNOWN
UNKNOWN

Folosirea operatorului NOT


SELECT last_name,job_id,salary
FROM EMPLOYEES
WHERE job_id NOT IN (IT_PROG, ST_CLERK, SA_REP);
n exemplul de mai sus sunt afiate numele i func ia tuturor angaja ilor a
c ror func ie nu este IT_PROG, ST_CLERK, SA_REP.

6-167

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Tabela de adev r a operatorului NOT
NOT

TRUE
FALSE

FALSE
TRUE

UNKNOWN
UNKNOWN

Not : operatorul NOT poate fi folosit mpreun cu al i operatori SQL


cum ar fi : BETWEEN, LIKE i NULL.
WHERE job_id NOT n (AC_ACCOUNT,AD_VP)
WHERE salary NOT BETWEEN 10000 AND 15000
WHERE last_name LIKE %A%
WHERE commission_pct IS NOT NULL
Reguli de preceden
Ordinea evalu rii
1
2
3
4
5
6
7
8

Operator
To i operatorii de compara ie
Operatori de concatenare
Condi ii de comparare
IS [NOT] NULL, LIKE, [NOT] IN
[NOT] BETWEEN
NOT
AND
OR

Precedenta regulilor se poate schimba folosind paranteze.


SELECT last_name,job_id,salary FROM EMPLOYEES
WHERE job_id =SA_REP
OR JOB_ID=AD_PRES AND SALARY>15000;

n exemplul de mai sus sunt dou condi ii ce trebuie ndeplinite i anume:


Func ia trebuie s fie AD_PRES i salariul sa fie mai mare de 15000.
Func ia trebuie s fie SA_REP.
6-168

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
De aceea SELECT-ul se citete dup cum urmeaz : Selecteaz linia dac un
angajat este AD_PRES i ctiga mai mult de 15000 sau dac angajatul este
SA_REP.
Folosirea parantezelor pentru a for a prioritatea:
SELECT last_name,job_id,salary FROM EMPLOYEES
WHERE(job_id=SA_REP OR JOB_ID=AD_PRES)AND
SALARY>15000;

n exemplul de mai sus sunt dou condi ii:


Func ia trebuie s fie SA_REP sau AD_PRES ;
Salariul trebuie s fie mai mare de 15000.
De aceea SELECT-ul citete urm toarele: selecteaz linia dac angajatul este
AD_PRES sau SA_REP i dac angajatul ctiga mai mult de 15000.
6.9

Clauza ORDER BY

Ordinea liniilor returnate de o interogare nu este predefinit . Clauza


ORDER BY poate fi folosit pentru a sorta liniile. Dac este folosit clauza
ORDER BY, ea trebuie scris ultima n fraza SELECT. Se poate specifica
sortarea dup o expresie sau dup un alias.
Sintaxa:
SELECT expresie
FROM table
[WHERE condition(s)]
[ORDER BY {coloana, expresie} ASC|DESC];
unde:

ORDER BY
ASC
DESC

specific ordinea n care sunt afiate liniile.


ordoneaz liniile ascendent implicit.
ordoneaz liniile descendent.

Dac nu este folosit clauza ORDER BY ordinea sort rii este nedefinit i este
posibil ca Serverul Oracle s nu afieze liniile n aceeai ordine, pentru aceeai
interogare, de dou ori. Folosi i clauza ORDER BY pentru a afia liniile ntr-o
ordine specific .

6-169

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Sortarea n ordine descendent
SELECT last_name,job_id,department_id, hire_date
FROM EMPLOYEES
ORDER BY hire_date DESC;

La folosirea clauzei ORDER BY valoarea implicit este cea


ascendent .

Valorile numerice sunt afiate ncepnd cu cea mai mica valoare de


exemplu 1- 999.
Datele sunt afiate ncepnd cu cea mai timpurie de exemplu 01JAN-92 naintea lui 01-JAN-95.
Valorile tip caracter sunt afiate n ordine alfabetic de exemplu A
naintea lui Z.
Valorile nule sunt afiate ultimele pentru secven e ascendente i
primele pentru secven e descendente.

Inversarea ordinii implicite n care sunt afiate liniile se face prin


specificarea cuvntului cheie DESC dup numele coloanei n clauza ORDER
BY. n exemplu rezultatele sunt sortate dup cea mai recent dat de angajare
a salaria ilor.

6-170

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Sortarea dup aliasul coloanei
SELECT employee_id, last_name,salary*12 annsal
FROM EMPLOYEES ORDER BY annsal;

Se poate folosi aliasul unei coloane n clauza ORDER BY. n exemplul de


mai sus datele sunt sortate dup salariul anual.

Sortarea dup mai multe coloane

Ordinea listei scrise n clauza ORDER BY este ordinea sort rii.


Se poate face sortare i dup o coloana care nu este n lista SELECT.
Rezultatele interog rii pot fi sortate dup mai multe coloane. Limita
sort rii este dat de num rul de coloane din tabela respectiv .
n clauza ORDER BY trebuiesc specificate coloanele separate prin
virgule. Dac se dorete schimbarea ordinii afi rii unei coloane se
specific DESC dup numele coloanei respective.
Exemplu:
Sa se afieze numele i salariul tuturor angaja ilor. Rezultatele s se
afieze dup num rul departamentului i apoi n ordine
descresc toare dup salariu.
SELECT last_name,department_id,salary
FROM EMPLOYEES ORDER BY department_id,salary DESC ;

6-171

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

6.10 Exerciii

1. Ini ia i o sesiune SQL*Plus.


2. Comenzile SQL*Plus acceseaz o baza de date: adev rat / fals.
3. Instruc iunea SELECT se va executa cu succes : adev rat / fals.
SELECT last_name, job_id, salary SALARY FROM EMPLOYEES;
4. Instruc iunea SELECT se va executa cu succes : adev rat / fals.
SELECT * FROM salgrade;
5. n instruc iunea urm toare sunt cteva erori. Identifica i-le.
SELECT first_name, salary x 12 ANNUAL SALARY FROM EMPLOYEES;
6. Afia i structura tabelei DEPARTMENTS i con inutul ei.
7. Afia i structura tabelei EMPLOYEES. Crea i o interogare care sa afieze
numele angajatului, meseria, data angaj rii i num rul angajatului. Salva i
instruc iunea ntr-un fiier abc.sql.
8. Rula i interogarea din fiierul abc.sql.
9. Afia i meseriile distincte din tabela EMPLOYEES.
10. nc rca i fiierul abc.sql n bufferul SQL. Redenumi i numele coloanelor cu:
EMPLOYEES#, Job, Hire Date i apoi rula i interogarea.
11. Afia i numele concatenat cu meseria, separate de virgula i un spa iu i
numi i coloana EMPLOYEES -JOB and Title.
12. Afia i datele din tabela EMPLOYEES. Separa i fiecare coloan cu o virgul
i numi i coloana THE_OUTPUT.
13. Afia i numele i salariul angaja ilor care ctiga mai mult de 28500$.
Salva i instruc iunea SQL ntr-un fiier p1.sql i apoi rula i-l.
14. Afia i numele angajatului cu marca 201 i num rul departamentului n care
lucreaz .
15. Modifica i p1.sql astfel nct sa afia i numele i salariul tuturor angaja ilor a
c ror salarii nu intr n intervalul 15000$ i 28500$. Salva i instruc iunea
n fiierul p3.sql i apoi rula i-l.
16. Afia i numele, meseria i data de nceput pentru cei care s-au angajat ntre
20.02.1985 i 1.05.1992. Afiarea va fi f cut n ordinea cresc toare a
datei de angajare.
17. Afia i numele angaja ilor i numerele de departament ale celor care
6-172

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
lucreaz n departamentele 10 i 30; ordona i alfabetic dup nume.
18. Modifica i fiierul p3.sql i afia i numele i salariul celor care ctiga mai
mult de 15000$ i sunt n departamentele 10 sau 30. Redenumi i
coloanele Angajat i Salar Lunar. Salva i modific rile n fiierul p6.sql i
apoi rula i-l.
19. Afia i numele i data angaj rii pentru cei care au fost angaja i n anul 1995.
20. Afia i numele i meseria pentru angaja ii care nu au manager.
21. Afia i numele, salariul i comisionul pentru to i angaja ii care au comision.
Sorta i datele n ordine descresc toare dup salariu i comision.
22. Afia i numele angaja ilor care au a treia liter a numelui A.
23. Afia i numele angaja ilor care au 2 de L oriunde n numele lor i sunt din
departamentul 30 mpreuna cu acei angaja i care au managerul cu marca
100.
24. Afia i numele, meseria i salariul pentru to i cei care sunt func ionari sau
analiti iar salariul lor nu este egal cu 10000$ sau 30000$ sau 50000$.
25. Modifica i p6.sql i afia i numele, salariul i comisionul pentru to i angaja ii
care au comisionul mai mare dect salariul m rit cu 10%. Salva i
modific rile n fiierul p13.sql i apoi rula i-l.

6-173

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Capitolul 7 Func ii de un singur rnd
Func iile fac blocul de baza al interog rii mai puternic i sunt folosite
pentru a manipula date. Acesta capitol este primul dintr-un set de dou capitole
ce au ca obiectiv descrierea func iilor. Ea se ocup att de func iile de un singur
rnd pentru caractere, numere i date calendaristice ct i de func iile ce fac
conversii dintr-un tip de data n altul de exemplu: din caracter n num r.

Func iile reprezint o component important a limbajului SQL i pot fi


utilizate pentru :
Calcule matematice asupra datelor;
Modificarea unor articole individuale;
Manipularea ieirii pentru grupuri de rnduri;
Stabilirea unui format pentru date calendaristice i numere atunci cnd
acestea sunt tip rite pe ecran;
Schimbarea tipului de dat a unei coloane.
Func iile SQL accepta argumente i ntorc valori.
NOT : Majoritatea func iilor descrise n acest capitol sunt specifice
versiunii SQL pentru Oracle.
Func ii

Func ii de un
singur rnd
Exista dou tipuri distincte de func ii:
Func ii de un singur rnd
Func ii de mai multe rnduri
7-174

Func ii de mai
multe rnduri

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Func ii de un singur rnd
Aceste func ii ac ioneaz doar asupra unui singur rnd i ntorc un
rezultat pentru fiecare rnd. Exist mai multe tipuri de func ii de un singur
rnd. Acest capitol se ocupa de urm toarele tipuri: Caracter, Num r, Data
calendaristic , Conversie.
Func ii de mai multe rnduri
Aceste func ii ac ioneaz asupra unor grupuri de rnduri i ntorc
un rezultat pentru fiecare grup.
Pentru mai multe detalii consultai lucrarea: Oracle Server SQL
Reference. Release 9i pentru o list complet a funciilor disponibile mpreun
cu sintaxa aferent.
7.1

Func ii de un singur rnd

Func iile de un singur:

unde:

Manipuleaz articole;
Ac ioneaz asupra fiec rui rnd rezultat din interogare ;
ntorc un singur rezultat pentru fiecare rnd;
Pot modifica tipuri de date;
Pot fi imbricate.
nume_funcie (coloana | expresie,
[arg1, arg2, ] )
nume_func ie
coloana
expresie
arg1, arg2,

este numele func iei


este un nume de coloan din baza de date
este orice ir de caractere sau expresie calculabil
sunt argumentele utilizate de func ie

Func iile de un singur rnd sunt utilizate pentru a manipula date. Ele
accept unul sau mai multe argumente i ntorc o singur valoare pentru fiecare
rnd rezultat din interogare. O func ie poate avea ca argument unul din
urm toarele:
o constanta furnizat de utilizator;
o variabil ;
o denumire de coloan ;
o expresie.
Caracteristici ale func iilor de un singur rnd
7-175

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Ac ioneaz asupra fiec rui rd ntors de interogare;


ntorc o valoare pentru fiecare rnd;
Pot ntoarce o dat a c rui tip este diferit de tipul argumentului;
Este posibil sa atepte unul sau mai multe argumente;
Se pot utiliza n SELECT, WHERE i ORDER BY. Se pot imbrica.
Caractere
Generale

Numere
Funcii de un
singur rnd
Data calendaristic

Conversie

Acest capitol prezint urm toarele tipuri de func ii:


Func ii pentru caractere: accept argumente de tip caracter i ntorc
rezultate de tip caracter sau numeric;
Func ii pentru numere: accept argumente de tip numeric i ntorc
rezultate de tip numeric;
Func ii pentru date calendaristice: accept argumente de tip dat
calendaristic i ntorc rezultate de tip dat calendaristic cu excep ia
func iei MONTH_BEETWEEN care ntoarce o valoare numeric ;
Func ii pentru conversie: fac conversia dintr-un tip de data n altul;
Func ii generale: NVL,NVL2,NULLIF,COALSECE,CASE,DECODE.
Func ii pentru
caractere

Func ii de conversie a
caracterelor din litere
mari in litere mici.
LOWER
UPPER
INITCAP

7-176

Func ii de manipulare a
caracterelor.
CONCAT
SUBSTR
LENGTH
INSTR
LPAD,RPAD
TRIM
REPLACE

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
7.2

Func ii pentru caractere

Func iile de un singur rnd pentru caractere accept argumente de tip


caracter i ntorc rezultate de tip caracter sau numeric. Func iile pentru
caractere se pot mp r i n :
Func ii de conversie a caracterelor din litere mari n litere mici.
Func ii de manipulare a caracterelor
Func ie

Scop

LOWER (expresie coloan)

Face conversia caracterelor alfabetice n


litere mici

UPPER (expresie coloan)

Face conversia caracterelor alfabetice n


litere mari

INITCAP (expresie coloan)

Face conversia pentru primul caracter din


fiecare cuvnt n litera mare iar pentru restul
caracterelor conversia se face n litere mici

CONCAT(expresie coloana1,
(expresie coloana2)

Concateneaz prima valoare de tip caracter


cu a doua valoare de tip caracter.
Aceasta func ie este echivalenta cu
operatorul de concatenare ( || ).

SUBSTR(expresie coloana, m/,n/)

ntoarce un sir de caractere din cadrul valorii


de tip caracter ncepnd cu pozi ia m i
avnd lungimea n. Dac m este negativ
atunci pozi ia de nceput a num r rii se
consider a fi ultimul caracter din ir. Dac n
este omis atunci func ia ntoarce toate
caracterele de la pozi ia m pn la sfritul
irului.

LENGTH(expresie coloana)

ntoarce num rul de caractere dintr-o valoare


de tip caracter.

INSTR(expresie coloana,m)

ntoarce pozi ia n cadrul valorii de tip


caracter a caracterului specificat.

LPAD (expresie |coloana, n, sir


caractere)

Aliniaz valoarea de tip caracter la dreapta


pe o lungime de n caractere.

TRIM
LENGTH(leading|trailing|both,
trim_character, trim_source)

Permite eliminarea caracterelor de la


nceputul, sfritul, ambelor. Trim _character
este un literal, trebuie inclusa intre apostrof.

REPLACE (text, search_string,


replacement _string)

Caut n search_string irul de caractere


specificat prin text, i dac l g sete l
nlocuiete cu valoarea din
replacement_string.

7-177

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Func ie

Rezultat

LOWER (SQL Course)

sql course

UPPER (SQL Course)

SQL COURSE

INITCAP (SQL Course)

Sql Course

Func ii de conversie a caracterelor din litere mari n litere mici.


Cele trei func ii de conversie a caracterelor sunt: LOWER, UPPER, INITCAP.
LOWER: Face conversia n litere mici pentru un text scris cu litere mari i mici.
UPPER : Face conversia n litere mari pentru un text scris cu litere mari i mici.
INITCAP : Face conversia pentru prima liter din fiecare cuvnt n liter mare
iar pentru celelalte litere ale cuvntului conversia se face n liter
mic .
SELECT The job id for || UPPER(last_name) || is ||
LOWER(job_id) AS EMPLOYEE DETAILS FROM employees;

Afia i num rul de ordine, numele i departamentul la care lucreaz


pentru angajatul Higgins.
SELECT employee_id, last_name, department_id
FROM employees WHERE last_name=higgins;
No rows selected.
7-178

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SELECT employee_id, last_name, department_id
FROM employees
WHERE LOWER(last_name)=higgins;

Clauza WHERE din prima instruc iune SQL specific numele angajatului
ca fiind higgins. Din moment ce toate informa iile din tabela EMPLOYEES sunt
memorate ca fiind scrise cu capitalizare, numele higgins (scris cu litere mici)
nu poate fi g sit i ca urmare nu se afieaz nimic.
Clauza WHERE din cea de-a doua instruc iune SQL face mai nti
conversia numelui memorat n tabela n litere mici i compar rezultatul ob inut
cu numele higgins. n acest caz ambii termeni din compara ie sunt scrii cu
litere mici i deci, de aceasta dat , se pot selecta informa iile necesare din
tabel . Clauza WHERE mai poate fi scris ca n exemplul de mai jos, efectul
instruc iunii fiind acelai. WHERE (last_name)=Higgins
Numele angajatului din partea dreapta a compara iei este scris cu
capitalizare adic aa cum apare n tabela. Pentru a afia numele cu prima
litera convertit n litera mare iar restul n litere mici utiliza i func ia INITCAP.
Func ii pentru manipulat caractere
FUNCTIE
CONCAT (Good,String)
SUBSTR (String,1,3)
LENGTH (String)
INSTR (String,r)
LPAD (salary,10,*)

REZULTAT
GoodString
Str
6
3
******5000

Func iile pentru manipulat caractere prezentate n cadrul acestei lec ii


sunt: CONCAT, SUBSTR, LENGTH, INSTR i LPAD.
CONCAT Concateneaz cei doi parametri. Func ia limiteaz num rul
parametrilor la 2.
SUBSTR Extrage un sir de caracter de o lungime specificat .
LENGTH ntoarce lungimea irului de caractere (ntoarce o valoare
numeric ).
INSTR
G sete pozi ia caracterului specificat.
7-179

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
LPAD

ntoarce un sir de caractere rezultat prin inserarea valorii specificate


n cel de-al treilea argument la stnga primului argument lungimea
rezultatului avnd lungimea specificat de cel de-al doilea
argument.

RPAD

Are un comportament similar cu func ia LPAD numai c inserarea


celui de-al treilea argument se face la dreapta primului argument.
SELECT employee_id,CONCAT(first_name,last_name) NAME,
Job_id, LENGTH (last_name),
INSTR(last_name,a)Contains a?
FROM employees
WHERE SUBSTR(job_id,4)=REP;

Exemplul de mai sus afieaz numele angajatului i func ia sa mpreuna,


lungimea numelui i pozi ia literei a n cadrul numelui, pentru toate persoanele
care au func ia de vnz tor.
Modifica i exemplul de mai sus astfel nct instruc iunea SQL s afieze
informa iile despre angaja i pentru acele persoane a c ror nume se termina n
litera n.

SELECT employee_id,CONCAT(first_name,last_name) NAME,


Job_id, LENGTH (last_name),
INSTR(last_name,a)Contains a?
FROM employees WHERE SUBSTR(last_name,-1,1)=n;

7-180

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
7.3

Func ii pentru valori numerice

ROUND Rotunjete valoarea cu un num r specificat de zecimale.


ROUND (45.926,2) 45.93
TRUNC Trunchiaz valoarea
TRUNC (45.926,2) 45.92
MOD
ntoarce restul mp r irii
MOD (1600,300) 100
Func iile pentru valori numerice accept valori numerice i ntorc valori
numerice. Aceasta sec iune descrie o parte din aceste func ii:
Func ie
ROUND (coloana |
expresie, n)

TRUNC (coloana |
expresie, n)
MOD (m,n)

Scop
Rotunjete coloana, expresia sau valoarea la un num r
cu n pozi ii la partea zecimal . Dac n este omis
num rul rezultat din conversie nu are parte zecimal .
Dac n este negativ este rotunjit num rul din partea
stnga a punctului zecimal.
Trunchiaz coloana, expresia sau valoarea la un num r
cu n pozi ii la partea zecimal . Dac n este omis
num rul rezultat din conversie nu are parte zecimal .
Dac n este negativ este trunchiat num rul din partea
stnga a punctului zecimal ctre zero.
ntoarce restul mp r irii dintre m i n.

Utilizarea func iei ROUND


SELECT ROUND(45.923,2), ROUND(45.923,0),ROUND(45.923,-1)
FROM DUAL;
ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1)
--------------- -------------- ----------------------------------------------45.92
46
50
Func ia ROUND rotunjete coloana, expresia sau valoarea la un num r cu n
pozi ii la partea zecimal .
Dac al doilea argument este omis sau este 0 num rul rezultat
din conversie nu are parte zecimal .
Dac al doilea argument este 2 atunci num rul rezultat din
conversie are 2 cifre la partea zecimal .
Dac al doilea argument este -2 atunci se rotunjesc primele 2
cifre ale num rului de la stnga punctului zecimal.
7-181

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Func ia ROUND poate fi utilizat asupra datelor calendaristice.


NOT : DUAL este o tabela fictiv . Mai multe detalii despre
acest aspect vor fi oferite mai trziu.

Utilizarea func iei TRUNC


SELECT TRUNC(45.923,2), TRUNC(45.923),TRUNC(45.923,-1)
FROM DUAL;
TRUNC(45.923,2) TRUNC(45.923) TRUNC(45.923,-1)
--------------- ------------- --------------45.92
45 40
Func ia TRUNC trunchiaz coloana, expresia sau valoarea la un num r cu n
pozi ii la partea zecimal .
Func ia TRUNC func ioneaz cu argumente similare ca i func ia ROUND.
Dac al doilea argument este omis sau este 0 num rul rezultat
din conversie nu are parte zecimal .
Dac al doilea argument este 2 atunci num rul rezultat din
conversie are 2 cifre la partea zecimal .
Func ia TRUNC, la fel ca i func ia ROUND, poate fi utilizat asupra datelor
calendaristice.
Utilizarea func iei MOD
SELECT
last_name, salary, MOD(salary, 5000)
FROM employees
WHERE
job_id = 'SA_REP';

Func ia MOD ntoarce restul mp r irii dintre valoarea1 i valoarea2. Exemplul


de mai sus calculeaz restul mp r irii dintre salar i 5000 pentru to i angaja ii
care sunt agen i comerciali.

7-182

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
7.4

Utilizarea datelor calendaristice

Oracle memoreaz datele calendaristice ntr-un format numeric


intern: Secol, an, luna, zi, ora, minute, secunde.
Formatul implicit pentru date calendaristice este: DD-MON-YY.
SYSDATE este o func ie care ntoarce data i timpul.
DUAL este o tabel fictiv utilizat pentru a vedea rezultatul ntors
de anumite func ii precum SYSDATE.

Formatul datei calendaristice n Oracle


Oracle memoreaz datele calendaristice ntr-un format numeric intern:
Secol, an, luna, zi, ora, minute, secunde. Formatul implicit pentru date
calendaristice este: DD-MON-YY. Valorile valide pentru date calendaristice se
situeaz ntre Ianuarie 1. 4712 B.C. i Decembrie 31. 9999 A.D.
SYSDATE este func ia care ntoarce data i timpul curent. SYSDATE se
poate utiliza identic cu orice denumire de coloan . De exemplu se poate afia
data curenta selectnd SYSDATE dintr-o tabel . Tabela pe care o folosi i
r mne la latitudinea dumneavoastr . Se poate folosi pentru afiarea datei
tabela DUAL.
Tabela DUAL este proprietatea utilizatorului SYS i poate fi accesat de
to i utilizatorii. Ea con ine o coloana DUMMY, i un rnd cu valoarea X. Tabela
DUAL este folositoare atunci cnd avem de ntors o singur valoare ca de
exemplul valoare unei constante, pseudocoloane sau o expresie care nu este
derivat dintr-o tabela cu date utilizator.
Exemplu: afiarea datei curente folosind tabela DUAL.
SELECT SYSDATE FROM DUAL;
Opera ii aritmetice cu date calendaristice

Dac aduna i sau sc de i un num r la sau dintr-o dat


calendaristica ve i ob ine tot o dat calendaristic .
Sc de i dou date pentru a g si num rul de zile dintre acestea.

Din moment ce baza de date memoreaz datele calendaristice ca


numere rezult c asupra acestor date se pot efectua opera ii aritmetice
utiliznd operatori aritmetici cum ar fi + i-. Deasemeni se pot aduna sau
sc dea constante numerice la date calendaristice. Exist posibilitatea efectu rii
urm toarelor opera ii:
7-183

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Opera ie
data + num r

Rezultat
dat

Descriere
adun un num r de zile la o dat

data num r

dat

scade un num r de zile dintr-o dat

data data

num r de zile

scade o dat din cealalt

data + num r/24

dat

adun un num r de ore la o dat

SELECT last_name, (SYSDATE-hire_date)/7 WEEKS


FROM employees
WHERE department_id = 90;

Exemplul de mai sus prezint o tabel cu numele angaja ilor din


departamentul 90 i de perioada n care au fost angaja i exprimat n
s pt mni. Pentru a afia perioada angaj rii n s pt mni se face diferen a
ntre data curent (data SYSDATE) i data la care a fost angajat persoana i
apoi se mparte rezultatul la 7.
NOT : SYSDATE este o func ie SQL ce ntoarce data i timpul
curent. Rezultatul pe care l ob ine i dac proba i exemplul poate s
difere de rezultatul de mai sus.
7.5

Func ii pentru date calendaristice

Func ie

Descriere

MONTHS_BETWEEN

ntoarce num rul de luni dintre dou date


calendaristice.

ADD_MONTHS

Adun un num r de s pt mni la o dat


calendaristic .

NEXT_DAY

ntoarce ziua ce urmeaz datei specificate

LAST_DAY

Ultima zi a lunii.

ROUND

Rotunjete data calendaristic .

TRUNC

Trunchiaz data calendaristic .

7-184

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Func iile pentru date calendaristice opereaz
asupra datelor
calendaristice de tip Oracle. Toate func iile pentru date ntorc o valoare de tip
dat cu excep ia func iei MONTH_BETWEEN, care ntoarce o valoare
numeric .
MONTHS_BETWEEN (data1,data2): G sete num rul de luni dintre data1 i
data2. Rezultatul poate fi pozitiv sau negativ.

Dac data1 este mai trzie dect data2 atunci rezultatul este pozitiv.
Dac data2 este mai trzie dect data1 atunci rezultatul este
negativ. Partea nentreaga a rezultatului reprezint o parte din lun .

ADD_MONTHS(data,n): Adun un num r de n luni la data. Num rul n trebuie


s fie ntreg i poate fi negativ.
NEXT_DAY(data,char): Determin data calendaristic a urm toarei zile
specificate, din s pt mna, care urmeaz datei data.
LAST_DAY(data): Determin data calendaristic a ultimei zile specificate, din
s pt mna, care urmeaz datei data.
ROUND(data[,fmt]): ntoarce data rotunjit n func ie de formatul fmt. Dac
fmt este omis atunci data este rotunjit la cea mai apropiata dat .
TRUNC(data[,fmt]): ntoarce data data trunchiat n func ie de formatul fmt.
Dac fmt este omis atunci data este rotunjit la cea mai apropiat zi.
Aceasta list este un subset al func iilor disponibile. Modelele pentru
format sunt tratate mai trziu n cadrul acestui capitol. Exemplele de format
sunt: month i year.
MONTHS_BETWEEN (01-SEP-95,11-JAN-94) 19.6774194
ADD_MONTHS (11-JAN-94,6)
11-JUL-94
NEXT_DAY (01-SEP-95,FRIDAY)
08-SEP-95
LAST_DAY (01-SEP-95)
30-SEP-95
Pentru toate persoanele care au fost angajate pe o perioada mai mic de
200 de luni, afia i num rul de ordine al angajatului, data angaj rii, num rul de
luni pe care persoana le-a acumulat ca angajat, data reviziei care trebuie f cut
peste 6 luni, prima vineri de dup data angaj rii, ultima zi a lunii n care s-a
f cut angajarea.
SELECT employee_id, hire_date,
MONTHS_BETWEEN (SYSDATE, hire_date) TENURE,
ADD_MONTHS (hire_date, 6) REVIEW,
NEXT_DAY (hire_date, FRIDAY), LAST_DAY(hire_date)
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) < 36;
7-185

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Func iile ROUND i TRUNC pot fi utilizate att pentru numere ct i


pentru date calendaristice. Atunci cnd sunt utilizate cu date calendaristice,
acestea rotunjesc sau trunchiaz data innd cont de modelul specificat. Astfel
se pot rotunji, de exemplu, date calendaristice spre cel mai apropiat an sau cea
mai apropiat lun .

01-AUG-95
ROUND (25-JUL-95,MONTH)
01-JAN-96
ROUND (25-JUL-95,YEAR)
01-JUL-95
TRUNC (25-JUL-95,MONTH
01-JAN-95
TRUNC (25-JUL-95,YEAR)
Exemplu:
Compara i datele n care s-au f cut angaj ri pentru toate persoanele care
au nceput sa lucreze n anul 1997. Afia i num rul de ordine al angajatului,
data angaj rii, i luna n care acesta a nceput sa lucreze exprimat sub forma
unui interval, folosind func iile ROUND i TRUNC.
SELECT employee_id, hire_date,
ROUND (hire_date, MONTH), TRUNC(hire_date, MONTH)
FROM employees WHERE hire_date like %97 ;

7-186

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
7.6

Func ii pentru conversia tipului de date


Conversia
tipului de
date

Conversie
implicita a
tipului de date

Conversie
explicita a tipului
de date

Pe lng tipurile de date din Oracle, coloanele tabelelor dintr-o baza de


date Oracle pot fi definite utiliznd tipuri de date ANSI, DB2 i SQL/DS. Intern
server-ul Oracle face conversia din aceste tipuri de date n tipuri de date Oracle.
n unele situa ii, server-ul Oracle accept anumite tipuri de date dei n
mod normal ar trebui sa primeasc alte tipuri. Acest lucru se ntmpla atunci
cnd server-ul Oracle poate face automat conversia n tipul de date pe care l
ateapt . Aceste conversii se pot face implicit efectuate de c tre server-ul
Oracle sau explicit efectuate de c tre utilizator.
Conversiile de date implicite se fac conform unui set de reguli ce va fi
detaliat mai trziu.
Conversiile de date explicite se fac utiliznd func ii de conversie. Func iile
de conversie transforma tipul unei valori n altul. n general func iile de
conversie respect urm toarea form :
tip de data1 TO tip de data2,
unde:
tip de data1este tipul de data care trebuie transformat i reprezint intrarea, iar
tip de data2 este tipul de data spre care se face conversia i reprezint ieirea.
NOT : Dei se fac conversii de date n mod implicit atunci cnd este
nevoie, este recomandat ca aceste conversii sa fie f cute implicit de
c tre utilizator pentru a asigura corectitudinea instruc iunilor.

7-187

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Conversii de date implicite
n opera ii de atribuire Oracle poate automat conversia:
DIN
VARCHAR2 sau CHAR (ir de caractere)
VARCHAR2 sau CHAR (ir de caractere)
NUMBER (valoare numeric )
DATE (data calendaristic )

IN
NUMBER (valoare numerica)
DATE
VARCHAR2 (ir de caractere)
VARCHAR2 (ir de caractere)

Opera ia de atribuire are loc cu succes dac server-ul Oracle poate


converti tipul de dat al sursei n tipul de dat al destina iei.
n cazul evalu rii expresiilor, Oracle poate automat conversia:
DIN
VARCHAR2 sau CHAR (ir de caractere)
VARCHAR2 sau CHAR (ir de caractere)

IN
NUMBER (valoare numeric )
DATE (dat calendaristic )

n general server-ul Oracle utilizeaz regulile de conversie pentru expresii


n cazul n care regulile de conversie pentru atribuire nu acoper i situa ia
respectiv .
NOT : Conversia din CHAR n NUMBER are loc cu succes doar
dac irul de caractere reprezint un num r valid. Conversia din
CHAR n DATE are loc cu succes doar dac irul de caractere
respect formatul implicit: DD-MON-YY.
Conversii de date explicite

SQL pune la dispozi ie trei func ii cu ajutorul c rora se pot face conversii
dintr-un tip de data n altul.

7-188

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Func ie
TO_CHAR (numr|data
calendaristica, [fmt])

Scop
Face conversia dintr-un num r sau o dat
calendaristic ntr-un ir de caractere de
tipul VARCHAR2 respectnd formatul fmt
specificat.

TO_NUMBER (caracter)

Face conversia dintr-un ir de caractere


ce con ine cifre ntr-o valoare numeric .

TO_DATE (caracter ,[fmt])

Face conversia dint-un ir de caractere ce


reprezint o data ntr-o valoare de tip
DATE respectnd formatul fmt specificat.
(Dac fmt este omis, formatul implicit este
DD-MON-YY)

NOT : Lista prezentat mai sus reprezint un subset din func iile disponibile
pentru conversii. Pentru mai multe detalii consultai lucrarea: Oracle
Server SQL Reference. Release 9i Conversion Function

Utilizarea func iei TO_CHAR mpreun cu date calendaristice


TO_CHAR (data calendaristica, fmt)

Modelul de formatare:
Trebuie inclus intre ghilimele simple i este:
case sensitive;
Poate include orice element valid al modelului de formatare pentru
date calendaristice ;
Are un element fm care elimina spatiile albe sau zerourile
nesemnificative;
Este separat de data calendaristic prin virgul ;
Determin afiarea datei calendaristice ntr-un anumit format.
Pn acum toate datele calendaristice au fost afiate respectnd formatul
DD-MON-YY. Func ia TO_CHAR permite conversia din formatul implicit ntr-un
format specificat de dumneavoastr .

7-189

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Observa ii:

Modelul de format trebuie inclus intre ghilimele simple i este case


sensitive;
Modelul de format poate include orice element valid al modelului de
formatare pentru date calendaristice. Asigura i-v c valoarea este
separat de modelul de formatare prin virgul ;
Pentru numele zilelor i al lunilor se ad uga automat spatii goale la
ieire ;
Pentru a elimina spatiile i zerourile nesemnificative folosi i elementul
pentru modul de umplere;
Ave i posibilitatea de a redimensiona lungimea pe care se face afiarea
pentru un cmp cu ajutorul comenzii SQL*Plus COLUMN.
Lungimea implicit a coloanei rezultate este de 80 caractere.

SELECT employee_id,TO_CHAR (hire_date, MM/YY)


Month_Hired
FROM emp
WHERE ename=Higgins;
Elementele ale modelului de formatare pentru date calendaristice
YYYY

Anul afiat pe 4 digi i

YEAR

Anul n litere

MM

Luna scris cu dou cifre

MONTH

Numele lunii

DY

O abrevia ie a denumirii unei zile din s pt mna format din


trei litere

DAY

Denumirea completa a zilei

Exemple de elementele ale modelului de formatare:


Element

Descriere

SCC sau CC

Secolul

YYYY sau SYYYY

Anul

YYY sau YY sau Y

Ultimele 3, 2 sau 1 cifre din an

Y,YYY

O virgula n cadrul anului

7-190

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
[YYY,[YY,[Y,]

4,3,2 sau o cifr din an conform standardului ISO

SYEAR sau YEAR

Anul n litere

BC sau AD

Indicatorul B.C. sau A.D.

B.C. sau A.D.

Indicatorul B.C. sau A.D.

Sfertul unui an

MM

Luna scris cu dou cifre

MONTH

Numele ntreg al lunii scris pe 9 caractere. Dac


denumirea lunii nu ocup cele 9 caractere, spa iul
r mas liber este automat umplut cu spatii

MON

O abrevia ie a denumirii unei luni format din trei litere

RM

Luna scris cu cifre romane

WW sau W

S pt mna din an sau luna

DDD sau DD sau D

Ziua din an, lun sau s pt mn .

DAY

Denumirea completa a zilei completat eventual cu


spa ii pn la 9 caractere.

DY

O abrevia ie a denumirii unei zile formata din trei litere

Num rul de zile de la data de 31 Decembrie 4713BC

Elemente ce formateaz timpul


HH24:MI:SS AM

15:45:32 PM

Ad uga i iruri de caractere prin nchiderea acestora ntre ghilimele.


DD of MONTH

12 of OCTOBER

Ad uga i sufixe pentru a scrie n litere un num r .


ddspth

fourteenth

Modele de formatare pentru timp


Utiliza i elementele descrise mai jos atunci cnd dori i s afia i timpul ntr-un
anumit format sau s folosi i litere n loc de cifre.

7-191

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Element

Descriere

AM sau PM

indicator de meridian

A.M. sau P.M.

indicator de meridian cu puncte

HH sau HH12 sau HH24

ora

MI

minute (0-59)

SS

secunde (0-59)

SSSSS

Num rul de secunde ncepnd cu miezul


nop ii

Alte formate:
Element

Descriere

/..

Punctua ia este reprodus n rezultat.

of the

irul ncadrat ntre ghilimele este reprodus

Specifica i sufixe :
Element

Descriere

TH

Num r de ordine dat n cifre (de exemplu DDTH


pentru 4TH)

SP

Num r scris n litere (de exemplu DDSP pentru


FOUR)

SPTH sau THSP

Num r de ordine scris n litere (de exemplu


DDSPTH pentru FOURTH)

Utilizarea func iei TO_CHAR mpreuna cu date calendaristice


SELECT last_name,TO_CHAR (hire_date, fmDD Month YYYY)
HIRE_DATE FROM employees;

7-192

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Exemplul de mai sus prezint o modalitate de a afia numele i data


angaj rii pentru fiecare angajat.( De remarcat este formatul n care se afieaz
data.)
Modifica i exemplul de mai sus astfel nct data calendaristic
aib urm torul format: Seventh of February 1981 08:00:00 AM.

sa

SELECT last_name,TO_CHAR (hire_date, fmDdspth of Month


YYYY fmHH:MI:SS AM) HIRE_DATE FROM employees;

De remarcat este faptul c


format specificat (INITCAP).

denumirea lunii respect

modelul pentru

Utilizarea func iei TO_CHAR mpreuna cu valori numerice


TO_CHAR (number, fmp)
Pentru a afia o valoare numeric sub forma unui caracter
utiliza i urm toarele elemente de formatare mpreuna cu func ia TO_CHAR.

7-193

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
9

Reprezint un num r

For eaz afiarea unei cifre 0

Semnul dolar

Folosete simbolul local pentru moned

Afieaz un punct

Tip rete un indicator pentru mii

Atunci cnd se lucreaz cu valori numerice drept iruri de caractere


trebuie s converti i acele numere n valori de tip caracter utiliznd func ia
TO_CHAR, care face conversia dintre o valoare de tip NUMBER spre o valoare
de tip VARCHAR2. Aceasta tehnic este folositoare n cadrul unei concaten ri.
Elemente de formatare pentru numere
Dac trebuie s converti i un num r ntr-o valoare de tip caracter pute i utiliza
urm toarele elemente:
Element

Descriere

Exemplu

Rezultat

Pozi ie numerica (num rul cifrelor de 9


determin lungimea pe care se face
afiarea)

999999

1234

Afieaz zerourile nesemnificative

099999

001234

Semnul dolar

$999999

$1234

Folosete simbolul local pentru moned

L999999

FF1234

Determin afiarea unui punct zecimal n


pozi ia specificat .

999999.99

1234.00

Determin afiarea unei virgule n pozi ia


specificat .

999,999

1,234

MI

Determin afiarea semnului minus n


partea dreapt (pentru valori negative)

999999MI

1234 -

PR

nchide ntre paranteze numerele


negative

999999PR

<1234>

EEEE

NOT ie tiin ific (formatul impune


existen a a patru litere E)

99.999EEEE

1.234E+03

nmul ire cu 10 de n ori (n = num rul de


cifre de 9 de dup litera V)

9999V99

123400

nlocuiete valorile de 0 cu blank

B9999.99

1234.00

7-194

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SELECT TO_CHAR(sal,'$99,999') SALARY
FROM emp
WHERE
last_name= 'Ernst';

Observa ii:
Server-ul Oracle afieaz semnul (#) n locul valorii numerice a c rei num r
cifre a dep it valoarea specificat prin model. Server-ul Oracle rotunjete
valoarea zecimal stocat ca o valoare cu un num r de zecimale furnizat de
ctre modelul de formatare.
Func iile TO_CHAR i TO_DATE
TO_NUMBER (char)
TO_DATE (char [, fmt ] )
Pentru a face conversia dintr-un ir de caractere ntr-un num r folosi i
func ia TO_NUMBER.
Pentru a face conversia dintr-un ir de caractere ntr-o dat calendaristic
folosi i func ia TO_DATE.
Este posibil sa ap ra o situa ie n care dori i sa face i conversia dintr-un
ir de caractere ntr-un num r sau ntr-o dat calendaristic . Pentru a realiza
aceste tipuri de conversii utiliza i func iile TO_NUMBER i TO_DATE. Modelul
dup care se face formatarea va trebui alc tuit pe baza elementelor pentru
formatare prezentate anterior.
Specificatorul fx indic potrivirea perfect dintre caracterul argument i
modelul de formatare a datei.
Punctua ia i textul dintre apostrof trebuie sa se potriveasc exact cu
modelul din clauza de formatare.
Nu pot s fie scrise blank-uri suplimentare.
Datele numerice trebuie s aib acelai num r de caractere ca i
modelul corespunz tor din format.
Exemplu: Afia i numele i data angaj rii pentru toate persoanele
care au fost angajate pe 24.05.1999.
SELECT last_name, hire_date FROM employees
WHERE hire_date = TO_DATE (May 24, 1999, fxMonth DD, YYYY);

7-195

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Formatul RR pentru date calendaristice


Anul curent

Data specificata

1995
1995
2001
2001

27-OCT-95
1995
1995
27-OCT-17
2017
1917
27-OCT-17
2017
2017
27-OCT-95
1995
2095
Dac cele doua cifre specificate ale anului sunt:
0-49
50-99
Data ntoars se
Data ntoarsa se ncadreaz n
0ncadreaz n secolul
secolul de dinaintea celui
49
curent
curent

Dac cele doua


cifre ale anului
curent sunt:

50
99

Formatul RR

Data ntoars se
ncadreaz n secolul
de dup secolul curent

Formatul YY

Data ntoars se ncadreaz


in secolul curent

Formatul RR pentru date calendaristice este similar cu elementul YY, dar


permite specificarea de secole diferite. Exist posibilitatea folosirii elementului
pentru formatarea datelor RR n locul elementului YY i astfel secolul valorii
returnate variaz n func ie de cei doi digi i specifica i n an i de ultimii doi digi i
ai anului curent. Tabelul urm tor descrie comportamentul elementului RR.
Anul curent

Data specificata

Formatul RR

1994
1994
2001

27-OCT-95
27-OCT-17
27-OCT-17

1995
2017
2017

7.7

Formatul
YY
1995
1917
2017

Func ii diverse

Func ia NVL
Convertete o valoare nul ntr-o valoare efectiv ;
Tipurile de date care pot fi folosite sunt: dat calendaristic ,
caracter i num r;
Tipurile de date trebuie s se potriveasc .
- NVL (comm,0)
- NVL (hire_date,01-JAN-97)
- NVL (job, No Job Yet)
7-196

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Sintaxa
NVL (expr1, expr2)
unde:expr1 este valoarea sau expresia surs care ar putea s
con in o valoare nul .
expr2 este valoarea int , valoarea spre care se face conversia
Ave i posibilitatea de a utiliza func ia NVL mpreun cu orice tip de dat ,
dar tipul valorii ntoarse este de fiecare dat la fel cu tipul parametrului expr1.
Conversii NVL pentru diferite tipuri de date
Tip de data
NUMBER
DATE
CHAR sau VARCHAR2

Exemplul de conversie
NVL (coloana ce con ine o valoare de tip
numeric, 9)
NVL (coloana ce con ine o valoare de tip dat
calendaristic , 01-JAN-95)
NVL (coloana ce con ine o valoare de tip
caracter,Unavariable)

SELECT last_name, salary, NVL(commission_pct,0),


(Salary*12)+(salary*12+NVL (commission_pct,0)) AN_SAL
FROM employees;

Pentru a calcula compensa ia anual pentru to i angaja ii, trebuie s


nmul i i salariul lunar cu 12 i apoi sa ad uga i comisionul.
SELECT last_name, salary, NVL(commission_pct,0),
(Salary*12)+(salary*12*commission_pct) AN_SAL FROM employees;

7-197

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Din exemplul precedent se poate remarca faptul c compensa ia anual


se calculeaz doar pentru acei angaja i care au o valoare pentru comision
nenul . Dac se ntlnete pe coloana o valoare nul atunci rezultatul este nul.
Pentru a calcula valorile pentru to i angaja ii trebuie s converti i valorile nule n
valori numerice nainte de a aplica operatorul aritmetic. O solu ie corect pentru
o astfel de problem este prezentat n exemplul precedent celui luat n
discu ie, exemplul n care pentru conversia valorilor nule s-a folosit func ia NVL.
Func ia NVL2
Sintaxa
unde:

NVL (expr1, expr2,expr3)

expr1 este valoarea sau expresia surs care ar putea sa con in o


valoare nul .
expr2 este valoarea returnat dac expr1 nu este null.
expr3 este valoarea returnat dac expr1 este null.

Func ia NVL2 examineaz prima expresie.


Dac prima expresie nu este null atunci func ia ntoarce cea de a doua
expresie.
Dac prima expresie este null atunci func ia ntoarce cea de a treia
expresie.
SELECT first_name, salary, commission_pct,
NVL2(commission_pct, SAL+COMM,SAL) income
FROM employees WHERE department_id IN
(50,80);

7-198

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

n exemplul de mai sus este analizat comisionul. Dac este sesizat o


valoare, se returneaz expresia SAL+COMM iar dac comisionul este null se
returneaz doar salariul.
Primul argument poate avea orice tip de dat .
Argumentele doi i trei pot fi de orice tip n afar de LONG. Dac tipurile
de dat pentru argumentele doi i trei sunt diferite, Oracle convertete automat
tipul de dat al argumentului trei la cel de inut de argumentul doi nainte de a
face compara ia, numai dac argumentul trei nu este null. n cest caz nu este
necesar o conversie de dat . Tipul de dat al expresiei returnate este acelai
cu al argumentului doi numai dac argumentul doi este de tip caracter, caz n
care tipul de dat returnat este varchar2.
Func ia NULLIF
Func ia NULLIF compar dou expresii. Dac ele sunt egale, func ia
returneaz null, dac nu, func ia returneaz prima expresie. Nu se poate
specifica literalul null pentru prima expresie.
Sintaxa
NULLIF (expr1, expr2,)
unde:

expr1 este valoarea sau expresia surs care se compar cu expr2


expr2 este valoarea sau expresia surs care se compar cu expr1

n exemplu se compar lungimea numelui cu lungimea prenumelui pentru


fiecare angajat. n cazul n care acestea sunt egale se returneaz null, altfel se
returneaz lungimea dat de first_name.
SELECT first_name, LENGTH(first_name) expr1,
last_name, LENGTH(last_name) expr2,
NULLIF (LENGTH(first_name), LENGTH(last_name)) result
FROM employees;

7-199

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Func ia NULLIF are ca echivalent logic expresia de tip CASE.


CASE WHEN expr1=expr2 THEN NULL ELSE expr1 END
Folosirea func iei COALESCE
Avantajul folosirii func iei COALESCE n locul folosirii func iei NVL este
faptul c func ia COALESCE poate lua mai multe valori alternative.
Daca prima expresie nu este null, func ia are ca rezultat aceast expresie
altfel, ea unete celelalte expresii.
Func ia COALESCE ntoarce prima expresie ce nu este null din list .
SINTAXA
COALESCE (expr1, expr2,... exprn)
unde :
expr1 este ntoarsa de func ie dac expr1 nu are valoarea null
expr2 este ntoarsa de func ie dac expr1 are valoarea null i expr2 nu
are valoarea null
exprn este ntoarsa de func ie dac precedentele expresii nu au
valoarea null
SELECT last_name,
COALESCE(commission_pct, salary, 10) comm
FROM employees ORDER BY commission_pct;

7-200

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Expresia CASE
Expresia de tip CASE ofer facilit ile date de o structur de tip IF THEN ELSE.
CASE expr WHEN comparison_expr1 THEN
return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_expr THEN return_expr
ELSE else_expr]
END
unde: expr1 este valoarea sau expresia sursa care se compar cu expr2
expr2 este valoarea sau expresia sursa care se compar cu expr1
ntr-o expresie simpl de tip CASE serverul verific dac prima condi ie
de tip WHEN THEN este egal cu comparison_expr i ntoarce return_expr.
Dac nici una din perechile WHEN THEN nu ndeplinesc condi iile i exist o
clauz ELSE atunci Oracle ntoarce else_expr. Altfel Oracle ntoarce null.
Literalul NULL nu poate fi specificat n return_expr i else_expr. Toate
expresiile trebuie s fie de acelai tip de dat .
SELECT last_name, job_id,salary,
CASE job_id WHEN IT_PROG THEN 1.10*salary
WHEN ST_CLERK THEN 1.15*salary
WHEN SA_REP THEN 1.20*salary
ELSE salary END Revised_salary
FROM employees ;
n exemplul de mai sus m rirea de salariu se aplic diferen iat pentru
anumite categorii de func ii i anume: programatorilor cu 10%, func ionarilor cu
15% iar vnz torilor cu 20%. Pentru celelalte func ii salariul r mne
neschimbat.
7-201

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Func ia DECODE
Faciliteaz simularea unor structuri de tip CASE sau IF-THEN-ELSE
DECODE(col/expression, search1, result1
[, search2, result2,...,]
[, default])
Func ia DECODE evalueaz o expresie ntr-un mod similar structurii IFTHEN-ELSE, structur folosit n multe limbaje de programare. Func ia
DECODE evalueaz expresia dup ce o compar cu fiecare valoare search.
Dac valoarea expresiei este identic cu valoarea con inut n search atunci
este ntoars valoarea result .
Dac valoarea default (implicit ) este omis , func ia va ntoarce o valoare nul
n cazul n care valoarea expresiei nu este identic cu nici o valoare search.
SELECT job_id, salary,
DECODE(job_id, 'IT_PROG', salary*1.1,
'ST_CLERK', salary *1.15,
'SA_REP', salary *1.20,
SALARY)REVISED_SALARY
FROM employees;

7-202

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
n exemplul de mai sus valoarea evaluat este JOB_ID. Dac JOB_ID
este IT_PROG, sporul de salar este de 10%; Dac JOB_ID este ST_CLERK,
sporul de salar este de 15% iar dac JOB_ID este SA_REP, sporul de salar
este de 20%.Pentru celelalte func ii salariile nu se modific .
Aceeai structura scris cu IF-THEN-ELSE are urm toarea form :
IF job_id = IT_PROG THEN salary = salary * 1.1
IF job_id = ST_CLERK THEN salary = salary * 1.15
IF job_id = SA_REP THEN salary = salary * 1.20
ELSE salary = salary
7.8

Imbricarea func iilor

Func iile de un singur rnd se pot imbrica de cte ori dorim.


Evaluarea func iilor imbricate ncepe de la nivelul cel mai adnc.

Func iile de un singur rnd se pot imbrica de cte ori dorim. Evaluarea lor
se face din centrul expresiei imbricate spre exteriorul acesteia. Exemplele care
urmeaz va vor demonstra flexibilitatea acestor func ii.
SELECT last_name, NVL(TO_CHAR(manager_id),'No Manager')
FROM employees WHERE manager_id IS NULL;

Exemplul de mai sus afieaz acele persoane care nu au superior.


Evaluarea instruc iunii SQL se realizeaz n doi pai.
Evaluarea func iei din interior ce face conversia dintr-o valoare
numeric n una de tip caracter. - Rezultat1=TO_CHAR (mgr)
Evaluarea func iei din exterior care nlocuiete valorile nule cu un text
NVL (Rezultat1, No Manager)
Denumirea coloanei este data de ntreaga expresie din moment ce nu
este specificat nici un alias pentru acea coloan .

7-203

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

7.9

Exerciii

1. Scrie i o interogare care sa afieze data curent . Denumi i coloana Date.


2. Afia i marca, numele, salariul i salariu m rit cu 15% exprimat ca num r
ntreg. Denumi i ultima coloana Salar Nou. Salva i instruc iunea ntr-un fiier
numit p3q2.sql.
3. Rula i programul salvat anterior.
4. Modifica i programul salvat n fiierul p3q2.sql astfel nct acesta s adauge
o coloana n care ve i trece diferen a dintre salariul nou i cel vechi.
Denumi i coloana Cretere. Rula i noul program.
5. Afia i numele angajatului, data angaj rii, data cnd se recalculeaz salariul,
care este prima luni dup 6 luni de servici. Denumi i coloana REVIEW.
Formata i afiarea datei astfel nct s arate similar cu exemplul de mai jos:
Sunday, the Seventh of September, 1981
6. Pentru fiecare angajat afia i numele i calcula i num rul de luni ntre data de
ast zi i data angaj rii. Denumi i coloana LUNI_DE_ACTIVITATE. Ordona i
rezultatul dup num rul de luni de lucru. Rotunji i num rul de luni.
7. Scrie i o interogare care sa produc urm torul afiaj pentru fiecare angajat:
<nume angajat> ctig <salariu> lunar dar ar dori <3 * salariu>. Denumi i
coloana Salariul de vis.
Exemplu: KING ctiga $5000 lunar dar ar dori $15000.
8. Scrie i o interogare care s afieze numele i salariul pentru to i angaja ii.
Afia i valoarea salariului pe 15 caractere aliniat la dreapta iar spa iul
r mas la stnga sa fie umplut cu caracterul $. Denumi i coloana SALARIU.
9. Scrie i o interogare care sa afieze numele angajatului (cu litere mici cu
excep ia primei litere care se va scrie cu liter mare) i lungimea numelui.
Interogarea se face doar pentru angaja ii a c ror nume ncepe cu una din
literele: J, A sau M.
10. Afia i numele, data angaj rii i ziua din s pt mna n care angajatul a
nceput lucrul. Denumi i coloana ZI. Ordona i rezultatul dup cmpurile
coloanei ZI ncepnd cu Monday (Luni).
11.Scrie i o interogare care sa afieze numele angajatului i valoarea
comisionului. Dac angaja ii nu ob in comision, introduce i No commission.
Denumi i coloana COMM.

7-204

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Capitolul 8 Afiarea datelor din tabele multiple


Obiective:

Scrierea expresiilor SELECT pentru a accesa date din mai multe


tabele folosind leg turi (join-uri) de egalitate i inegalitate;
Vizualizarea datelor care n general nu se acceseaz printr-o
condi ie join simpl ci folosind join-uri exterioare:
Efectuarea unui join a unui tabel cu el nsui.

Cteodat este necesar afiarea datelor ce provin din mai multe tabele.
n exemplul de mai sus rezultatul afieaz date din dou tabele: EMPLOYEES
i DEPARTMENTS.

Employee_ID exist in tabelul EMPLOYEES


Department_ID exist n ambele tabele EMPLOYEES i DEPARTMENTS
Location_ID exist n tabelul DEPARTMENTS

Pentru a se ajunge la rezultatul final tabelele EMPLOYEES i


DEPARTMENTS trebuiesc legate astfel nct accesarea datelor sa se fac din
ambele tabele.

8-205

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

8.1

Definirea JOIN-urilor

n vederea afi rii de date ce provin din mai multe tabele ale bazei de
date se folosete o condi ie de join. Liniile dintr-un tabel pot fi al turate liniilor
din alt tabel conform cu valorile comune existente n coloanele corespondente,
care sunt de obicei, coloane chei primare i chei str ine.
Pentru a afia date din dou sau mai multe tabele aflate n rela ie se
scrie o condi ie simpl de tip join n clauza WHERE.
SELECT
table1.column, table2.column
FROM table1, table2
WHERE
table1.column1 = table2.column2;
Unde :
table.column - specifica tabelul i coloana de unde este extras data
table1.column1= table2.column2 - este condi ia care al tura (leag )
tabelele mpreun
Condi ia de JOIN se scrie n clauza WHERE.
Numele coloanei se prefixeaz cu numele tabelului cnd acelai
nume de coloan apare n mai mult de un tabel.
Observa ii:

La scrierea unei expresii SELECT care leag tabele preceda i numele


coloanei cu numele tabelului pentru claritate i pentru a mari viteza de
acces la baza de date.
Daca acelai nume de coloan apare n mai multe tabele numele coloanei
trebuie prefixat cu numele tabelului.
Pentru a al tura n tabele mpreun este nevoie de minim n-1 condi ii de
join. Aadar, pentru a al tura 4 tabele, sunt necesare 3 condi ii de join.
Aceast regul s-ar putea s nu se aplice dac tabelul are o cheie primar
concatenat fiind astfel necesare mai multe coloane pentru a identifica in
mod unic fiecare linie.

8.2

Produsul Cartezian
Un produs cartezian se formeaz atunci cnd:
- o condi ie join este omis ;
- o condi ie join este invalid ;
- toate liniile din primul tabel sunt al turate la liniile din tabelul al doilea.

8-206

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Pentru a evita un produs cartezian trebuie s include i ntotdeauna ntr-o
clauza WHERE o condi ie de join valid .
Cnd o condi ie join este invalid sau este complet omis , rezultatul este
un produs cartezian n care vor fi afiate toate combina iile de linii, adic toate
liniile din primul tabel sunt al turate la toate liniile din cel de-al doilea tabel.
Un produs cartezian tinde s genereze un num r mare de linii i
rezultatul sau este rar folositor. ntotdeauna ntr-o clauza WHERE trebuie
inclus o condi ie de join valid , cu excep ia cazului cnd se dorete n mod
explicit combinarea tuturor liniilor din tabele.
Exemplu de generare a unui produs cartezian:
SELECT last_name, department_name
FROM employees, departments;

Un produs cartezian este generat dac o condi ie join este omis .


Exemplul al turat afieaz numele angajatului i numele departamentului din
tabelele EMPLOYEES i DEPARTMENTS. Deoarece nu a fost specificat nici o
condi ie de join n clauza WHERE, toate liniile din tabelul EMPLOYEES sunt
al turate tuturor liniilor din tabelul DEPARTMENTS, genernd astfel un tabel de
ieire ce are 160 de rnduri.

8-207

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Tipuri de Join-uri
Join uri specifice Oracle
(8i i versiuni anterioare)

Join-uri conforme cu SQL: 1999

Equijoin
Non-equijoin
Outer join
Self join

Cross Join
Natural Join
Using Clause
Full or two-sided outer join
Arbitrary join conditions for outer join

Oracle 9i pune la dispozi ie sintaxa pentru tipuri de join care se


conformeaz cu standardul SQL 1999. nainte de 9i sintaxa pentru join era
diferit de cea cerut de standardele ANSI. Noua sintax conform cu SQL
1999 nu ofer beneficii majore n performan a join-urilor fa de cele scrise n
sintaxa specific Oracle nainte de 9i.
8.3

Echi-join

Pentru a determina numele departamentului n care lucreaz un angajat


trebuiesc comparate valorile din coloana DEPARTMENT_ID din tabelul
EMPLOYEES cu valorile din coloana DEPARTMENT_ID din tabelul
DEPARTMENTS. Rela ia dintre tabelele EMPLOYEES i DEPARTMENTS este
un echijoin, aceasta nsemnnd c valorile din coloana DEPARTMENT_ID din
ambele tabele trebuie s fie egale. Acest tip de join-uri implic frecvent
existen a cheilor primare i str ine.
ECHIJOIN -urile sunt adesea numite i simple join sau inner join.

8-208

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Extragerea nregistr rilor cu Echijoin-uri
SELECT employees.employee_id, employees.last_name,
employees.department_id, departments.department_id,
departments.location_id
FROM employees, departments
WHERE employees.department_id=departments.department_id;
n exemplul de mai sus:
Clauza SELECT specific numele de coloane de extras
- numele angajatului, num rul angajatului i num rul departamentului care
sunt coloane in tabelul EMPLOYEES;
- num rul departamentului, numele departamentului i loca ia sunt coloane
n tabelul DEPARTMENTS.
Clauza FROM specific cele 2 tabele din baza de date ce trebuiesc
accesate: tabelul EMPLOYEES i tabelul DEPARTMENTS
Clauza WHERE specific felul in care tabelele vor fi al turate.
Deoarece coloana DEPARTMENTS_ID este comun tabelelor ea trebuie
prefixat cu numele tabelului pentru a evita ambiguitatea.
Condi ii de c utare adi ionale folosind operatorul AND
n plus fa de condi ia de join se pot folosi criterii adi ionale pentru clauza
WHERE. De exemplu, pentru a afia marca angajatului Matos, numele, num rul
departamentului i loca ia departamentului, este nevoie de o condi ie
suplimentar n clauza WHERE.

8-209

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

SELECT employees.employee_id, employees.last_name,


departments.location_id
FROM employees, departments
WHERE employees.department_id=departments.department_id
AND Last_name=Matos;

Calificarea numelor de coloane ambigui

Folosi i prefixele tabelelor pentru a califica numele coloanelor ce


sunt comune mai multor tabele;
mbun t i i performanta prin folosirea prefixelor de tabele;
Distinge i coloanele care au nume identice n tabele diferite prin
folosirea aliasurilor de coloane.

Pentru a evita ambiguitatea trebuie s califica i numele coloanelor n


clauza WHERE cu numele tabelului. n exemplu, coloana DEPARTMENTS_ID
ar putea fi din tabela DEPARTMENTS sau din tabela EMPLOYEES i de aceea
este necesar ad ugarea prefixului de tabel pentru a executa interogarea.
Daca cele dou tabele nu au nume de coloane comune nu este necesar
calificarea coloanelor. Oricum, interogarea va fi mai performant prin folosirea
prefixului de tabel deoarece serverului Oracle i se specific exact de unde s
extrag coloanele.
Cererile de calificare a numelor de coloane ambigui sunt de asemenea
aplicabile la coloanele care pot fi ambigui n alte clauze cum ar fi SELECT sau
ORDER BY.
Folosirea de aliasuri pentru tabele
Folosind aliasurile de tabele se simplific scrierea interog rilor.
Prefixarea numelor coloanelor cu numele tabelului poate consuma mult
timp, mai ales dac numele tabelului este lung. Se pot folosi aliasuri de tabele
n locul numelor tabelelor. Aa cum un alias de coloan da unei coloane un alt
nume, un alias de tabel i d acestuia alt nume. Aliasurile de tabel ajut la
scrierea unei linii de cod SQL mai scurte i astfel memoria este mai pu in
folosit .

8-210

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

SELECT e.employee_id, e.last_name, e.department_id,


d.department_id, d.location_id
FROM employees e, departments d
WHERE e.department_id=d.department_id;
n exemplul de mai sus, n clauza FROM, numele tabelului este specificat
n ntregime fiind urmat de un spa iu i apoi de alias. Tabelului EMPLOYEES i-a
fost dat aliasul E, iar tabelului DEPARTMENTS aliasul D.
Observa ii:

Aliasurile de tabel pot avea pana la 30 caractere lungime, dar cu ct sunt


mai scurte, cu att mai bine;
Daca aliasul unui tabel este folosit pentru un nume de tabel particular n
clauza FROM, atunci acel alias de tabel trebuie sa fie substituitentul pentru
numele tabelului pe tot cuprinsul expresiei SELECT;
Aliasurile de tabel trebuie s aib sens;
Aliasul de tabel este valid numai pentru SELECT-ul curent.

JOIN ce folosete mai mult de 2 tabele

Uneori trebuiesc al turate (join) mai mult de dou tabele. De exemplu,


pentru a afia numele, numele departamentului i oraul pentru fiecare angajat
trebuie efectuat un join ntre tabelele EMPLOYEES, DEPARTMENTS i
LOCATIONS.
8-211

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

SELECT e.employee_id, e.last_name, e.department_id,


d.department_id, d.location_id, l.city
FROM employees e, departments d, locations l
WHERE e.department_id=d.department_id and
d.location_id=l.location_id;

Observa ie:
ntotdeauna num rul de condi ii de join scrise n clauza WHERE
trebuie sa fie cu unu mai mic dect num rul de tabele scrise n
clauza FROM. De exemplu, dac num rul tabelelor este n,
num rul condi iilor de join din clauza WHERE trebuie sa fie ,n-1.

8.4

Non-echi-join

EMPLOYEES
Last_Name

JOB_GRADES
Salary

Grade

Lowest_sal

Highest_sal

King

24000

1000

2999

Kochhar

17000

3000

5999

De Haan

17000

6000

9999

Hunold

9000

10000

14999

Ernst

8000

15000

24999

Mourgos

5800

25000

40000

salarul din tabelul EMPLOYEES


este cuprins ntre salarul minim i maxim din
tabelul JOB_GRADES

8-212

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Rela ia dintre tabelele EMPLOYEES i JOB_GRADE este de tip nonechijoin, adic nicio coloan din tabelul EMPLOYEES nu corespunde direct
unei coloane din tabelul JOB_GRADE. Rela ia dintre cele dou tabele este
astfel: valorile din coloana SAL din EMPLOYEES sunt cuprinse ntre valorile din
coloanele LOWEST_SAL i HIGHEST_SAL din tabelul JOB_GRADE. Rela ia
(leg tura) se ob ine folosind un operator, altul dect egal (=).

Extragerea inregistrarilor cu Non-echijoin-uri


SELECT e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
WHERE e.salary between j.lowest_sal and j.highest_sal;
Exemplul de sus creeaz un non-echijoin pentru a evalua gradul salarului
unui angajat. Salarul trebuie sa fie intre orice pereche "cel mai mic"-"cel mai
mare" a intervalelor salariale.

Este important de remarcat c to i angaja ii apar doar odat atunci cnd


aceast interogare este executat . Niciun angajat nu este repetat n list i
acest lucru are la baz dou motive:
- Nicio linie din tabelul cu gradele salariale nu con ine trepte salariale
suprapuse (cu valorile pentru alte trepte salariale). Astfel, valoarea
salariului unui angajat poate oscila numai ntre salariul minim i maxim
din una din liniile tabelului ce con ine treptele salariale.
- Toate salariile angaja ilor sunt ncadrate ntre limitele date de treptele
salariale. Astfel, nici un angajat nu ctiga mai pu in dect cea mai mic
valoare din coloana LOWEST_SAL sau mai mult dect cea mai mare
valoare con inut n coloana HIGHEST_SAL.

8-213

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Observa ie: Se pot folosi i al i operatori, cum ar fi <= i >=, dar este
mai simplu de folosit BETWEEN. Cnd se folosete BETWEEN
trebuie specificat mai nti valoarea minim i apoi valoarea
maxim . Aliasurile de tabele au fost specificate din motive de performan i nu
datorit unei posibile ambiguit i.
8.5

Outer-join

Nici un angajat in departamentul 190


Returnarea nregistr rilor cu NoDirectMatch (Potrivire Indirect ) cu Joinuri
externe.
Dac o linie (nregistrare) nu satisface condi ia de join, acea linie nu va
ap rea n rezultatul interog rii. De exemplu, n condi ia de echijoin a tabelelor
EMPLOYEES i DEPARTMENTS, departamentul OPERATIONS nu va ap rea
pentru c nu lucreaz nimeni n acel departament.
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id;
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column;

8-214

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

SELECT table1.column, table2.column


FROM table1, table2
WHERE table1.column(+) = table2.column;
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column(+);
n sintax :
table1.column = este condi ia de join a tabelelor;
table2.column(+) este simbolul pentru join extern; poate fi plasat n
oricare parte a condi iei din clauza WHERE, dar nu n ambele
par i deodat . Plasa i simbolul join extern dup numele
coloanei din tabelul deficitar n informa ii.
Folosi i un join extern pentru a vedea liniile care nu ndeplinesc
condi ia de join.
Operatorul join extern este semnul plus (+).
Linia (liniile) lips pot fi returnate dac este folosit un join extern n
condi ia de join. Operatorul este un semn "plus" scris ntre paranteze (+) care
este plasat lng tabelul ce prezint un deficit de informa ie. Acest operator are
efectul cre rii a unei sau mai multe linii goale (nule), pentru fiecare linie din
tabelul non-deficient.
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;

8-215

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Exemplul afieaz numele angajatului, num rul i numele pentru toate


departamentele. Departamentul Contracting, care nu are nici un angajat este de
asemenea afiat.
Restric ii la Join extern
- Operatorul join extern poate s apar numai ntr-o singur parte a
unei expresii i anume n partea deficitar n informa ii. El returneaz
acele linii din tabel care nu au corespondent direct n celalalt tabel.
- O condi ie implicat ntr-un join extern nu poate folosi operatorul IN
sau nu poate fi legat la o alta condi ie prin operatorul OR.

8.6

Self Join

Uneori este necesar al turarea (join) unui tabel cu el nsui. De


exemplu, pentru a g si numele fiec rui angajat pentru un manager este
necesar un self-join pe tabela EMPLOYEES. De exemplu, pentru a g si numele
managerului lui Whalen este nevoie s :
o l g si i pe Whalen n tabelul EMPLOYEES uitndu-va n coloana
Last_name;
o G si i num rul managerului pentru Whalen uitndu-va n coloana
Manager_ID. Num rul managerului lui Whalen este 101.
o G si i numele managerului cu EMPLOYEE_ID egal cu 101 uitndu-v n
coloana LAST_NAME. Num rul angajatului Kochhar este 101 deci
Kochhar este managerul lui Whalen.

8-216

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

"MGR din tabelul WORKER este egal cu EMPNO din tabelul MANAGER"
n acest proces c utarea n tabel se execut de dou ori. Prima dat se
caut n tabel angajatul Whalen n coloana Last_name i g sete valoarea
pentru Manager_ID care este egal cu 101. A doua oar se caut n coloana
EMPLOYEE_ID pentru a g si valoarea 101 pentru care n coloana Last_name
se valoarea este Kochhar.
SELECT worker.last_name || ' works for '|| manager.last_name
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id;
Exemplul de mai sus al tur tabela EMPLOYEES cu ea ns i. Pentru a
simula cele doua tabele n clauze FROM se folosesc dou aliasuri, numite
WORKER i MANAGER, pentru acelai tabel, EMPLOYEES.
n acest exemplu clauza WHERE con ine join-ul care nseamn "unde
num rul managerului pentru un subaltern este identic cu num rul angajatului
pentru acel manager".

8-217

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
8.7

Definirea join-urilor folosind sintaxa SQL 1999


SELECT table1.column, table2.column
FROM table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
ON (table1.column_name = table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)];

n sintax :
table1.column - tabelul i coloana de unde se extrag datele;
CROSS JOIN - returneaz produsul cartezian a celor dou tabele;
NATURAL JOIN - face un join pe cele dou tabele pe baza unei coloane
comune;
JOIN table USING - column_name execut un echi-join bazat pe coloana
specificat ;
JOIN table ON table1.column_name = table2.column_name - execut un join
bazat pe condi ia specificat n clauza ON.

Crearea Cross Joins


Folosirea clauzei CROSS JOIN duce la apari ia unui produs cartezian a
datelor din dou tabele.
SELECT last_name, department_name
FROM employees
CROSS JOIN departments;
Exemplul de mai sus duce la acelai rezultat dat de exemplul urm tor:

8-218

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SELECT last_name, department_name FROM employees,
departments;

Crearea Natural Joins


Clauza NATURAL JOIN are la baz toate coloanele din cele dou tabele
ce au acelai nume. La execu ie se selecteaz rndurile din cele dou tabele ce
au valori egale n toatele coloanele comune. Dac coloanele ce au acelai
nume au tipuri diferite de date apare o eroare.
n versiunile Oracle premerg toare Oracle9i nu se putea face un join f r
a specifica coloanele pe care s se execute join-ul. ncepnd cu aceast
versiune este posibil ca join-ul s se execute complet automat folosind cuvintele
cheie NATURAL JOIN care permit executarea join-ului pe baza coloanelor celor
doua tabele ce au acelai nume i acelai tip de dat .
SELECT department_id, department_name,
location_id, city
FROM departments NATURAL JOIN locations;
n exemplu tabela LOCATIONS este al turata tabelei DEPARTMENT
prin coloana comun LOCATION_ID care este singura coloana ce are acelai
nume n ambele tabele. Dac ar fi fost i alte coloane care sa aib acelai
nume n ambele tabele ar fi fost folosite i acestea.
Equijoins
Natural join poate fi scris i ca un equijoin:
SELECT department_id, department_name,
departments.location_id, city
FROM departments, locations
WHERE departments.location_id = locations.location_id;
Natural Joins cu clauza WHERE
Folosind clauza WHERE se pot impune restric ii suplimentare n folosirea
unui natural join. Exemplul de mai jos limiteaz rndurile afiate la cele ce
corespund condi iei ca department_ ID s fie 20 sau 50.
SELECT department_id, department_name,
location_id, city
FROM departments
NATURAL JOIN locations WHERE department_id IN (20, 50);
8-219

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Crearea de Joins folosind clauza USING


Dac anumite coloane din tabele diferite au acelai nume dar nu au
acelai tip de dat , clauza NATURAL JOIN poate fi modificat prin folosirea
clauzei USING pentru a specifica coloanele ce trebuie folosite in equijoin.

Not:

Cnd referi i coloana, oriunde n instruc iunea SQL, nu trebuie s


folosi i numele tabelei sau aliasul.
Clauzele NATURAL JOIN i USING sunt mutual exclusive

De exemplu urm toarea instruc iune este valid


SELECT l.city, d.department_name
FROM locations l JOIN departments d USING (location_id)
WHERE location_id = 1400;
Urm toarea instruc iune este invalid deoarece coloana LOCATION_ID
este calificat n clauza WHERE:
SELECT l.city, d.department_name
FROM locations l JOIN departments d USING (location_id)
WHERE d.location_id = 1400;
ORA-25154: column part of USING clause cannot have qualifier
8-220

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Aceeai restric ie se aplica i la NATURAL JOIN.
Aadar coloanele ce au acelai nume n ambele tabele trebuie s fie
scrise f r calificatori.
SELECT e.employee_id, e.last_name, d.location_id
FROM employees e JOIN departments d
USING (department_id);

n exemplu se face un join pe coloana DEPARTMENT_ID ntre tabela


EMPLOYEES i tabela DEPARTMENTS pentru a se afia loca ia unde lucreaz
un angajat. Acest lucru poate fi scris i ca un equijoin:
SELECT employee_id, last_name,
employees.department_id, location_id
FROM employees, departments
WHERE employees.department_id = departments.department_id;

Crearea de Joins folosind clauza ON


Condi ia de join pentru un natural join este de fapt un equijoin al tuturor
coloanelor ce au acelai nume. Pentru a specifica condi ii arbitrare sau
coloanele pe care se face join-ul se folosete clauza ON.
Clauza ON separ condi ia de join de alte condi ii de c utare i face
codul mai uor de n eles.
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id);
Clauza ON poate fi deasemeni folosit pentru a al tura coloane ce nu au
acelai nume.
8-221

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

SELECT e.last_name emp, m.last_name mgr


FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id);

Exemplul de mai sus este de fapt un self join pe tabela EMPLOYEES


bazat pe leg tura dintre coloanele EMPLOYEE_ID i MANAGER_ID.
Crearea de Three-Way Joins prin folosirea clauzei ON
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l ON d.location_id = l.location_id;
Un join de tip three-way join este un join bazat pe trei tabele. n sintaxa
conforma cu SQL: 1999 join-urile sunt executate de la stnga la dreapta, deci
primul join executat este cel dintre EMPLOYEES i DEPARTMENTS. Prima
condi ie de join poate referen ia coloanele din EMPLOYEES i DEPARTMENTS
dar nu poate referen ia coloane din LOCATIONS.
A doua condi ie de join poate referen ia coloane din toate cele trei tabele
Acest lucru poate fi scris ca un echijoin pe trei tabele.

8-222

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SELECT employee_id, city, department_name
FROM employees, departments, locations
WHERE employees.department_id =
departments.department_id
AND departments.location_id = locations.location_id;

INNER versus OUTER Joins


n SQL: 1999, join-ul dintre dou tabele ce returneaz doar un singur rnd
comun este un inner join.
Un join ntre dou tabele ce returneaz att rezultatele unui inner join ct i
rndurile ce nu se potrivesc cu tabela din stnga (sau dreapta ) este un
outer join la stnga (sau dreapta).
Un join ntre doua tabele ce returneaz att rezultatul unui inner join ct i
rezultatul unui left join i right join este un full outer join.

LEFT OUTER JOIN


SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id);

8-223

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Acest exemplu afieaz toate rndurile din tabela EMPLOYEES, care


este tabele din stnga, chiar dac nu este nici o potrivire n tabela
DEPARTMENTS. Aceast interogare se poate scrie i astfel :
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE d.department_id (+) = e.department_id;
RIGHT OUTER JOIN
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);

Acest exemplu afieaz toate rndurile din tabela DEPARTMENTS, care


este tabela din dreapta, chiar dac nu este nici o potrivire cu tabela
EMPLOYEES. Aceast interogare se poate scrie i astfel :
SELECT e.last_name, e.department_id,d.department_name
FROM employees e, departments d
WHERE d.department_id = e.department_id (+);
8-224

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
FULL OUTER JOIN
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON (e.department_id = .department_id);

Aceast interogare afieaz toate rndurile din tabela EMPLOYEES chiar


dac nu exist nici o coresponden cu datele din tabela DEPARTMENTS
Deasemeni sunt afiate toate rndurile din tabela DEPARTMENTS chiar dac
nu exist nici o corela ie cu datele din tabela EMPLOYEES.
Condi ii suplimentare
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id) AND e.manager_id = 149;
Se pot adaug n clauza WHERE condi ii suplimentare aa cum se arat
n exemplul anterior. Datele rezultate n urma join-ului dintre tabelele
EMPLOYEES i DEPARTMENTS sunt restric ionate de condi ia impus i
anume valoare coloanei manager_ID din tabela employees sa fie egala cu 149.

8-225

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
8.8

Exerciii

1. Scrie i o interogare care sa afieze numele, num rul departamentului i


numele departamentului pentru to i angaja ii.

2. Scrie i o interogare care s afieze meseriile distincte (jobs) i numele


departamentului pentru to i angaja ii din departamentul 30. Include i i
loca ia pentru departamentul 90.

3.

Scrie i o interogare care afieaz


numele angajatului, numele
departamentului, loca ia i oraul tuturor angaja ilor care ctiga un
comision.

4. Afia i numele angajatului i numele departamentului pentru to i angaja ii


care au un a in numele lor. Salva i tabelul SQL ntr-un fiier numit p4q4.sql.

8-226

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

4. Scrie i o interogare care afieaz numele, meseria, num rul departamentului


i numele departamentului pentru to i angaja ii care lucreaz in Toronto.

5. Afia i numele i marca angajatului mpreuna cu numele i marca


managerului acestuia. Eticheta i coloanele Employee, Emp#, Manager,
Mgr#. Salva i interogarea SQL ntr-un fiier numit p4q6.sql.

8-227

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
6. Modifica i p4q6.sql pentru a afia to i angaja ii incluznd pe King care nu are
manager.

7. Crea i o interogare care va afia pentru to i angaja ii numele angajatului,


num rul departamentului i to i angaja ii care lucreaz
n acelai
departament (colegii lui). Denumi i ultima coloan Coleg. Ave i grija ca n
interogare s nu apar un angajat coleg cu el nsui.

8. Afia i structura tabelului JOB_GRADEs. Crea i o interogare care va afia


numele, meseria, numele departamentului, salariul i treapta de salarizare
pentru to i angaja ii.

8-228

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

9. Crea i o interogare care afieaz numele i data angaj rii pentru lucr torii
angaja i dup data de angajare a lui Davies.

10. Afia i toate numele angaja ilor i data angaj rii mpreun cu numele
managerilor i data lor de angajare, pentru to i cei care au fost angaja i
naintea managerilor lor. Eticheta i coloanele Employee, respectiv Emp,
Hiredate, Manager, i Mgr Hiredate.

8-229

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

11. Crea i o interogare care afieaz numele angaja ilor i salariile indicate
prin asteriscuri. Fiecare asterisc nseamn 100 $. Sorta i datele n
ordinea descendent a salariilor. Eticheta i coloana
EMPLOYEE_AND_THEIR_SALARIES.

EMPLOYEE_AND_THEIR_SALARIES
KING
*************************************************
FORD
********************************
SCOTT
********************************
JONES
*******************************
BLAKE
******************************
CLARK
*************************
ALLEN
****************
TURNER
***************
MILLER
*************
MARTIN
************
WARD
************
ADAMS
***********
JAMES
********
SMITH
*******
14 rows selected.

8-230

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Capitolul 9 Folosirea func iilor de grup


Obiective:
Identificarea func iilor de grup disponibile;
Descrierea folosirii func iilor de grup;
Gruparea datelor folosind clauza Group By;
Includerea sau excluderea liniilor grupate folosind clauza HAVING .
9.1

Ce sunt func iile de GRUP ?

Func iile de grup opereaz pe seturi de linii oferind un singur rezultat


pentru tot grupul.

Spre deosebire de func iile de un singur rnd, func iile de grup opereaz
pe seturi de rnduri pentru a da un singur rezultat unui grup. Aceste seturi pot fi
ntregul tabel sau tabelul mp r it la rndul lui n grupuri. Func iile de grup sunt
urm toarele :
AVG
COUNT
MAX
MIN
STDDEV
SUM
VARIANCE
Fiecare din func ii accept /primete un argument. Urm torul tabel
identific op iunile pe care le pute i folosi n sintax .
9-231

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Func ie
AVG([DISTINCT|ALL]n)

COUNT({*|[DISTINCT|ALL]
expr})

MAX([DISTINCT|ALL]expr)
MIN([DISTINCT|ALL]expr)
STDDEV([DISTINCT|ALL]x)
SUM([DISTINCT|ALL]n)
VARIANCE([DISTINCT|ALL]x)

SELECT
FROM
[WHERE
[ORDER BY

Descriere
Valoarea medie a lui n, ignornd valorile
nule;
Num rul de rnduri, unde expresia
evalueaz altceva dect valori nule.
Num r toate rndurile selectate folosind
*, inclusiv duplicatele i rndurile cu valori
nule;
Valoarea maximal a expresiei, ignornd
valorile nule;
Valoarea minim a expresiei, ignornd
valorile nule;
Abaterea standard a lui n, ignornd
valorile nule;
Suma valorilor lui n, ignornd valorile
nule;
Varia ia lui n, ignornd valorile nule;

coloana, funcie_de_grup(coloana)
tabela
condiie]
coloana ];

Sfaturi pentru folosirea func iilor de grup:


DISTINCT face ca func ia s ia n considerare numai valorile
distincte. ALL ia n considera ie fiecare valoare,
inclusiv valorile duble. ALL este implicit i deci nu
mai trebuie specificat.

Tipurile de date pentru argumente pot fi : CHAR, VARCHAR2,


NUMBER sau DATE.
Toate func iile de grup, cu excep ia COUNT(*) ignora valorile nule.
Pentru a nlocui o valoare cu valori nule folosi i func ia
NVL,NVL2 sau COALESCE..

9.2

Folosirea funciilor AVG, SUM, MIN, MAX

Func iile AVG sau SUM se pot folosi pentru date de tip numeric.

9-232

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SELECT AVG(salary), MAX(salary),
MIN(salary), SUM(salary)
FROM employees
WHERE job_id LIKE '%REP%';

Func iile AVG, SUM, MIN i MAX se pot folosi pentru coloanele care pot
stoca date numerice. Exemplul de mai sus afieaz media, maximul, minimul i
suma salariilor lunare pentru to i vnz torii.
Func iile MIN i MAX se pot folosi pentru orice tip de date.
SELECT MIN(hire_date), MAX(hire_date)
FROM employees;

Exemplul urm tor afieaz numele pentru primul i ultimul angajat din
lista alfabetic a tuturor angaja ilor.
SELECT MIN(last_name), MAX(last_name)
FROM employees;

9.3

Folosirea funciei COUNT

COUNT(*) returneaz num rul de linii dintr-o tabel .


SELECT COUNT(*)
FROM employees
WHERE department_id = 50;

9-233

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Func ia COUNT are trei formate :

COUNT(*)

COUNT(expr)

COUNT(DISTINCT expr)

- ntoarce num rul de rnduri in tabel,


incluznd rndurile duble i rndurile
con innd valori nule;
- ntoarce num rul rndurilor nenule
din coloana identificat prin expr.;
- ntoarce num rul rndurilor unice
nenule din coloana identificat prin
expr.

Exemplul de mai jos afieaz num rul angaja ilor din departamentul 80
care pot sa ctige un comision.
SELECT COUNT(commission_pct)
FROM employees
WHERE department_id = 80;

Exemplu: Afia i num rul departamentelor din tabelul EMPLOYEES.


SELECT COUNT(department_id)
FROM employees;

Afia i num rul departamentelor distincte din tabelul EMPLOYEES.


SELECT COUNT(DISTINCT department_id)
FROM employees;

9.4

Funciile de grup i valorile Null

Func iile de grup ignor valorile null din coloan .


SELECT AVG(commission_pct)
FROM employees;

9-234

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Toate func iile grup, cu excep ia COUNT(*), ignor valorile nule din
coloan . n exemplul de mai sus media este calculata doar pe baza rndurilor
din tabel n care coloana COMMISSION_PCT con ine o valoare valid . Media
este calculat ca sum a comisioanelor pl tite c tre to i angaja ii, mp r it la
num rul angaja ilor care primesc comision.
Func ia NVL for eaz func iile de grup s includ valori nule.
SELECT AVG(NVL(commission_pct, 0))
FROM employees;

Func ia NVL for eaz func iile grup s includ valori nule. n exemplul de
mai sus media este calculat pe baza tuturor rndurilor din tabel indiferent dac
n coloana COMMISSION_PCT sunt stocate valori nule. Media este calculat
ca un comision total pl tit tuturor angaja ilor, mp r it la num rul total al
angaja ilor companiei.
9.5

Crearea grupurilor de date

Pn acum toate func iile grup au tratat tabelul ca fiind un larg grup de
informa ii. Uneori ns tabelul trebuie mp r it n grupuri mai mici de informa ii.
9-235

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Aceasta se poate face folosind clauza GROUP BY.
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
n sintax :group by expresion specific
determin bazele pentru gruparea rndurilor.

coloanele ale c ror valori

Clauza GROUP BY se poate folosi pentru a mp r i rndurile din tabel n


grupuri, lucru ce permite folosirea func iilor de grup pentru a ntoarce sumarul
informa iei pentru fiecare grup.

Sfaturi
Dac se include o func ie de grup ntr-o clauza SELECT nu se pot
selecta rezultatele individuale dect dac coloana individual
apare n clauza GROUP BY. Dac coloana respectiv nu este
inclus n clauza Group By va fi generat un mesaj de eroare ;
Clauza WHERE exclude rndurile nainte de a formarea grupurilor.
Implicit, rndurile sunt sortate n ordinea ascendent a coloanelor
incluse n lista GROUP BY. Se poate specifica o alt ordine
folosind clauza ORDER BY.

Toate coloanele din lista SELECT care nu sunt func ii de grup


trebuie s fie men ionate n clauza GROUP BY.

SELECT department_id, AVG(salary)


FROM employees
GROUP BY department_id;

9-236

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Exemplul de mai sus afieaz num rul departamentului i media salariilor


pentru fiecare departament. Iat cum este evaluat declara ia SELECT de mai
sus, con innd o clauz GROUP BY :

Clauza SELECT specific coloanele care s fie afiate, adic num rul
departamentului i media tuturor salariilor din grupul specificat n clauza
GROUP BY.
Clauza FROM specific tabelul pe care baza de date trebuie s -l
acceseze: tabelul EMPLOYEES.
Clauza WHERE specific liniile ce trebuie incluse. Dac nu exist nici o
clauz WHERE, implicit toate rndurile sunt incluse.
Clauza GROUP BY specific modul de grupare pentru rnduri.
Rndurile sunt grupate dup num rul departamentului, deci func ia
AVG care este aplicat coloanei salariilor va calcula media salariilor
pentru fiecare departament.
Coloanele GROUP BY care nu sunt in lista SELECT:
SELECT AVG(salary)
FROM employees
GROUP BY department_id;

Coloana specificat n clauza GROUP BY nu trebuie sa fie obligatoriu


men ionat n clauza SELECT. De exemplu, declara ia SELECT de mai sus
afieaz media salariilor pentru fiecare departament f r s afieze num rul
departamentului respectiv. Totui, f r num rul departamentului, rezultatele nu
afieaz datele n mod semnificativ.
9-237

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Se poate folosi func ia de grupare, n exemplu avg(sal), n clauza ORDER BY.
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
ORDER BY AVG(salary);

9.6

Gruparea datelor dup mai multe coloane

Grupuri n grupuri
Cteodat sunt necesare rezultate pentru grupuri formate din subgrupuri.
Exemplul de mai sus arat un raport care afieaz totalul salariilor ce au fost
pl tite pentru fiecare nume de func ie, din fiecare departament.
Tabelul EMPLOYEES este grupat mai nti dup
num rul
departamentului i apoi aceast grupare se detaliaz dup numele func iei. De
exemplu, doi func ionari din departamentul 20 sunt grupa i mpreun i se
afieaz un singur rezultat ( salariul total ).

9-238

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id;

Pentru o ob ine rezultatele finale pentru grupuri i subgrupuri trebuiesc


indicate mai multe coloane n clauza GROUP BY. Ordinea implicit de ordonare
a rezultatelor poate fi determinat prin ordinea de scriere a coloanelor din
clauza GROUP BY. Iat cum se evalueaz declara ia SELECT de mai sus,
care con ine o clauza GROUP BY :

Clauza SELECT specific coloanele ce trebuie afiate:


- Num rul departamentului din tabelul EMPLOYEES;
- Numele func iei din tabelul EMPLOYEES;
- Suma tuturor salariilor din grupul specificat n clauza GROUP BY.
Clauza FROM specific tabelul pe care baza de date trebuie s -l
acceseze : tabelul EMPLOYEES;
Clauza GROUP BY specific cum trebuie grupate rndurile :
- Rndurile se grupeaz mai nti dup num rul departamentului.
- Apoi, din grupurile formate dup num rul departamentului, se
grupeaz rndurile dup numele func iei. Deci func ia SUM este
aplicat coloanei salariilor pentru toate numele de func ii din
fiecare grup format dup num rul departamentului.

9-239

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

9.7

Interogri ilegale n folosirea funciilor de grup

Orice coloan sau expresie din lista SELECT care nu este o


func ie de grup trebuie sa fie specificat n clauza GROUP BY.

SELECT department_id, COUNT(last_name)


FROM employees;
Exemplul de mai sus genereaz eroarea:
SELECT department_id, COUNT(last_name)
*
ERROR at line 1:
ORA-00937: not a single-group group function
Column missing
Ori de cate ori se folosete o combina ie de coloane individuale
(department_id) i func ii grup (COUNT(last_name)) n aceeai declara ie
SELECT, trebuie inclus o declara ie (GROUP BY ) care s specifice coloanele
individuale (in acest caz department_id).
Dac clauza GROUP BY lipsete, atunci apare mesajul de eroare not a
single-group function i un asterisc (*) care indic coloana greit . Eroarea de
mai sus se repar ad ugnd clauza (GROUP BY).
SELECT department_id, count(last_name)
FROM employees
GROUP BY department_id;

Orice coloan sau expresie din lista SELECT care nu este o


func ie de grup trebuie s fie specificat n clauza GROUP BY.

9-240

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Nu pute i
grupurilor.

folosi

clauza

WHERE

pentru

restric ionarea

Folosi i clauza HAVING pentru restric ionarea grupurilor.


Nu pute i folosi func ii de grup n clauza WHERE.

SELECT department_id, AVG(salary)


FROM employees
WHERE AVG(salary) > 8000
GROUP BY department_id;
WHERE AVG(salary) > 8000
*
ERROR at line 3:
ORA-00934: group function is not allowed here
Clauza WHERE nu poate fi folosit pentru a restric iona datele ce intra n
componen a grupurilor. Declara ia SELECT de mai sus genereaz o eroare
deoarece se folosete clauza WHERE pentru a restric iona afiarea mediei
salariilor din acele departamente care au un salariu mediu mai mare de 8000 $.
Eroarea de mai sus poate fi corectat prin folosirea clauzei HAVING
pentru restric ionarea datelor dup formarea grupurilor.
SELECT department_id, AVG(salary)
FROM employees
HAVING AVG(salary) > 8000
GROUP BY department_id;

9-241

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
9.8

Excluderea rezultatelor obinute folosind clauza Group

n acelai mod n care se folosete clauza WHERE pentru restric ionarea


rndurile selectate se poate folosi clauza HAVING pentru restric ionarea datelor
rezultate din grupuri. Pentru a afla salariul maxim pentru fiecare departament,
doar pentru departamentele care au salariul maxim mai mare de 10.000$, sunt
necesare urm toarele:
1. G sirea salariul mediu pentru fiecare departament grupnd dup num rul
departamentului.
2. Restric ionarea grupurilor la acele departamente ce au salariu maxim mai
mare de 10.000 $.
Excluderea rezultatelor date de Group BY : Clauza HAVING
Folosirea clauzei HAVING pentru restric ionarea datelor grupurilor
presupune ca :
- Rndurile sa fie grupate.
- Clauza GROUP BY sa fie aplicat .
- Grupurile care ndeplinesc condi ia din clauza HAVING sa fie afiate.
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
In sintax , group condition restric ioneaz grupurile de rnduri raportate
la acele grupuri a c ror condi ie specificata este TRUE ( adev rat ).
9-242

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Clauza HAVING poate fi folosit pentru a specifica care grupuri trebuiesc
afiate. De aceea, mai nti se restric ioneaz grupurile pe baza informa iilor
totale i apoi se exclud cele ce nu corespund condi iilor din clauza HAVING.
Serverul Oracle desf oar urm torii pai la folosirea clauzei
HAVING :
Se grupeaz rndurile;
Func ia de grup se aplica grupului;
Se afieaz grupurile care ndeplinesc criteriul din clauza HAVING.
Clauza HAVING poate precede clauza GROUP BY, dar este
recomandat scrierea mai nti a clauzei GROUP BY deoarece este
mai logic. Grupurile sunt formate i func iile grup sunt calculate
nainte de aplicarea clauzei HAVING pentru grupurile din lista
SELECT.
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000;

Exemplul de mai sus afieaz num rul departamentului i salariul maxim pentru
acele departamente la care salariul minim este mai mare de 10.000 $.
Se poate folosi clauza GROUP BY f r a se folosi o func ie de grup
n lista SELECT. Dac se restric ioneaz rndurile n baza unei func ii
de grup, este obligatoriu necesar o clauza GROUP BY i o clauza
HAVING.
Exemplul de mai jos afieaz numerele departamentelor i salariul
mediu la acele departamente la care salariul minim este mai mare
de 10.000 $.
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING max(salary)>10000;
9-243

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Exemplul de mai jos afieaz numele func iei i totalul salariului


lunar pentru fiecare nume de func ie, cu un total al statului de plata
dep ind 13.000 $. Exemplul exclude vnz torii i sorteaz lista
dup salariul lunar total.
SELECT job_id, SUM(salary) PAYROLL
FROM employees
WHERE job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING SUM(salary) > 13000
ORDER BY SUM(salary);

9.9

Imbricarea funciilor de grup

Afiarea valorii maxime a salariului mediu.


SELECT MAX(AVG(salary))
FROM employees GROUP BY department_id;

Func iile de grup pot fi imbricate pe oricte nivele de adncime. Exemplul


de mai sus afieaz salariul mediu maxim.
9.10 GROUP BY cu operatorii ROLLUP i CUBE
Obiective:
Folosirea operatorului ROLLUP pentru a ob ine subtotaluri;
Folosirea operatorului CUBE pentru a ob ine valori de intersec ie;
Folosirea func iei GROUPING pentru identificarea valorilor rndurilor
create de ROLLUP sau CUBE;
Folosirea GROUPING SETS pentru a ob ine un singur set de date.
9-244

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Operatorii ROLLUP i CUBE trebuie specifica i n cadrul clauzei GROUP
BY. Gruparea cu ROLLUP duce la ob inerea unei set de rezultate ce con ine pe
lng valorile pentru rndurile grupate n mod obinuit i rndurile pentru
subtotal.
Gruparea cu folosirea operatorului CUBE duce la gruparea rndurilor
selectate pe baza valorilor tuturor combina iilor posibile ale expresiilor
specificate i returneaz un singur rnd cu informa ii totale pentru fiecare grup.
Se poate folosi operatorul CUBE pentru a ob ine rnduri de tip cross-tabulation.
Observa ii:
La folosirea operatorilor ROLLUP i CUBE trebuie s v asigura i c
acele coloane ce sunt dup clauza GROUP BY au sens, ca exist o
rela ionare real ntre ele. n caz contrar operatorii vor da rezultate
irelevante.
Operatorii ROLLUP i CUBE sunt disponibili ncepnd cu versiunea
Oracle8i.
9.11 Operatorul ROLLUP
SELECT [column,] group_function(column)...
FROM table
[WHERE condition]
[GROUP BY [ROLLUP] group_by_expression]
[HAVING having_expression];
[ORDER BY column];
ROLLUP este o extensie a clauzei GROUP BY. Folosirea operatorului
ROLLUP duce la ob inerea unor rezultate cumulative cum ar fi subtotalurile.
ROLLUP poate fi folosit n scrierea rapoartelor, graficelor, etc. pentru a
ob ine elemente de statistic i totaluri din seturile de rezultate.
Operatorul ROLLUP creeaz grupuri prin micarea ntr-o direc ie, de la
stnga la dreapta, de-a lungul listei de coloane specificate n clauza GROUP
BY dup care aplic func ia de agregare acestor grup ri.
Observa ii:
Pentru a produce subtotaluri cu n dimensiuni, unde n este num rul de
coloane specificat n clauza GROUP BY f r a folosi operatorul
ROLLUP, trebuie unite, folosind operatorul UNION ALL n+1 fraze
SELECT. Acest lucru face ca execu ia interog rii sa fie ineficient deoarece
fiecare fraza SELECT necesit un acces la tabel.
Operatorul ROLLUP ob ine aceste rezultate cu un singur acces la tabel, motiv
pentru care folosirea operatorului este foarte eficient atunci cnd sunt
9-245

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
implicate multe coloane n producerea subtotalurilor.
EXEMPLU
SELECT department_id, job_id,sum(salary)
FROM employees WHERE department_id < 60
GROUP BY ROLLUP(department_id, job_id)

n exemplul de mai sus se afieaz :


Salariul total pentru fiecare JOB_ID din fiecare departament pentru acele
departamente a c ror ID este mai mic de 60, n conformitate cu gruparea pe
departamente specificat n clauza GROUP BY (eticheta 1)
Operatorul ROLLUP afieaz :
o

Salariul total pentru acele departamente care au ID-ul mai mic de


60 (eticheta 2);

Salariul total pentru toate departamentele care au ID-ul mai mic


de 60, n func ie de job_ID (eticheta 3);

Toate rndurile etichetate cu 1 sunt rnduri normale iar cele indicate cu


2 i 3 sunt rnduri supratotalizatoare.
Operatorul ROLLUP creeaz subtotaluri care se desf oar ncepnd de
la nivelul cel mai detaliat pn la un total general, n func ie de criteriile de
grupare specificate n clauza GROUP BY. Se calculeaz mai nti valorile totale
standard pentru grupul specificat n clauza GROUP BY (n exemplu, suma
salariilor pe fiecare func ie n cadrul departamentului), apoi se creeaz n mod
progresiv subtotalul de nivel nalt, mutndu-se de la dreapta la stnga n cadrul
listei de valori de la clauza GROUP BY (n exemplu, este calculat mai nti
suma salariilor pe fiecare departament urmat de suma salariilor pentru toate
departamentele).
Dac pentru operatorul ROLLUP din clauza GROUP BY sunt specificate
9-246

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
n coloane, rezultatul opera iei va avea n + 1 grupuri (in exemplu 2 + 1 = 3
grupuri).
Rndurile bazate pe prima expresie din cele n specificate se numesc
rnduri obinuite iar celelalte se numesc rnduri supratotalizatoare.

9.12 Operatorul CUBE


SELECT [column,] group_function(column)...
FROM table
[WHERE condition]
[GROUP BY [CUBE] group_by_expression]
[HAVING having_expression];
[ORDER BY column];
Operatorul CUBE este un comutator suplimentar al clauzei GROUP BY
dintr-o fraza SELECT. Operatorul CUBE poate fi folosit mpreuna cu toate
func iile de grup inclusiv AVG, SUM, MAX, MIN i COUNT. El este folosit
pentru a ob ine seturi de rezultate care sunt n mod obinuit folosite n
rapoartele de tip cross-tab. Pe cnd ROLLUP duce la ob inerea doar a unei
frac iuni din num rul total de combina ii posibile pentru subtotaluri, CUBE
produce subtotaluri pentru toate combina iile posibile ale grup rii specificate n
clauza GROUP BY precum i un total general.
Operatorul CUBE este folosit mpreun cu o func ie de grup pentru a
general rnduri suplimentare ntr-un set de rezultate. Coloanele incluse n
clauza GROUP BY sunt referite ncruciat n vederea gener rii unui superset
de grupuri. Func ia de grup specificat n list este aplicat acelor grupuri
pentru a produce valori de total pentru rnduri suplimentare
supratotalizatoare. Num rul grupurilor suplimentare din setul de rezultate este
dat de num rul de coloane incluse n clauza GROUP BY.
De fapt, orice combina ie posibil a coloanelor sau expresiilor men ionate
n clauza GROUP BY este folosit pentru a produce supratotaluri. Dac n
clauza GROUP BY sunt n coloane sau expresii, vor fi 2n combina ii de
supratotaluri posibile. Matematic, aceste combina ii formeaz un cub ndimensional, motiv pentru care operatorul este numit astfel.
Prin folosirea aplica iilor sau elementelor de programare, aceste valori
supratotalizatoare pot fi nc rcate n grafice care convertesc datele n elemente
vizuale.

9-247

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Exemplu:
SELECT department_id, job_id, SUM(salary)
FROM employees WHERE department_id < 60
GROUP BY CUBE (department_id, job_id);
n exemplul de mai sus rezultatul interog rii se interpreteaz astfel:
Salariul total pentru fiecare func ie din cadrul departamentului (pentru acele
departamente ce au ID-ul mai mic de 50) este afiat de clauza GROUP BY
(eticheta 1);
Salariul total pentru acele departamente ce au ID-ul mai mic de 50 (eticheta
2);
Salariul total pentru fiecare func ie indiferent de departament (eticheta 3);
Salariul total pentru acele departamente ce au ID-ul mai mic de 50, indiferent

de func ie (eticheta 4).


n exemplu, toate rndurile etichetate cu 1 sunt rnduri obinuite, toate
rndurile etichetate cu 2 i 4 sunt rnduri totalizatoare iar rndurile etichetate cu
3 sunt rnduri ce con in valori ncruciate.
Operatorul CUBE a efectuat i opera ia pe care un operator de tip
ROLLUP ar fi executat-o pentru a afia subtotalurile i salariul total pentru acele
departamente a c ror ID este mai mic, indiferent de valoarea din coloana
JOB_ID. Suplimentar operatorul CUBE afieaz salariul total pentru fiecare
func ie, indiferent de departament.
Not :
Similar cu operatorul ROLLUP, ce genereaz subtotaluri pe n
dimensiuni (unde n este num rul de coloane din clauza GROUP BY),
9-248

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
dac nu s-ar folosi operatorul CUBE ar fi fost necesare 2n fraze SELECT care
sa fie legate cu UNION ALL. Astfel, o ieire cu 3 dimensiuni ar necesita 23 = 8
fraze SELECT care s fie unite cu UNION ALL.

9.13 Funcia GROUPING


Func ia GROUPING poate fi folosit mpreun cu operatorul CUBE sau
ROLLUP. Prin folosirea ei se pot crea grupuri care s formeze subtotaluri ntrun rnd i se pot deosebi valorile de NULL stocate de valorile de NULL create
de ROLLUP sau CUBE. Func ia ntoarce valoarea 0 sau 1.
SELECT [column,] group_function(column).., GROUPING(expr)
FROM table [WHERE condition]
[GROUP BY [ROLLUP][CUBE] group_by_expression]
[HAVING having_expression];
[ORDER BY column];
Func ia GROUPING poate fi folosit mpreun cu operatorul CUBE sau
ROLLUP pentru a ajuta la n elegerea modalit ii de ob inere a valorilor de total.
Func ia GROUPING folosete o singur coloan drept argument.
Valoarea pentru expr din sintaxa trebuie s se potriveasc cu una din expresiile
scrise clauza GROUP BY. Func ia ntoarce valoarea 0 sau 1.
Valorile ntoarse de func ia GROUPING sunt folositoare pentru a:
Determina nivelul de totalizare pentru un anumit subtotal, adic
grupul sau grupurile pe care se bazeaz subtotalul;
Identific dac o valoare de NULL din coloana unui rnd dintr-un
set de rezultate indica:
valoare de NULL din tabela de baza (NULL stocat);
valoare de NULL creat de ROLLUP/CUBE (ca rezultat
a unei func ii de grup asupra acelei expresii ).

Valoare 0 returnat de func ia GROUPING bazat pe o expresie indic


urm toarele:
Expresia a intrat n calcul unei valori totale.
Valoarea NULL din expresia coloanei este o valoare stocat de
NULL.
Valoare 1 returnat de func ia GROUPING bazat pe o expresie indic
urm toarele:
Expresia nu a intrat in calcul unei valori totale.
Valoarea NULL din expresia coloanei este o valoare creat de
ROLLUP sau CUBE ca rezultat al grup rii.
9-249

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

EXEMPLU:
SELECT department_id DEPTID, job_id JOB, SUM(salary),
FROM employees
WHERE department_id < 50
GROUP BY ROLLUP(department_id, job_id);
GROUPING(department_id) GRP_DEPT,GROUPING(job_id)
GRP_JOB

n exemplul de mai sus avem in primul rnd valoarea nsumat a salariilor


i anume 4400. Aceast valoare este salariul total pentru job_ID=AD_ASST
din departamentul 10. Pentru a calcula aceast valoare total , trebuie luate n
considera ie att coloana DEPARTMENT_ID ct i JOB_ID. Astfel, valoare 0
este ntoars att pentru expresia GROUPING(department_id) ct i pentru
GROUPING(job_id).
Luam acum n discu ie valoarea total 4400 din cel de-al doilea rnd.
Aceast valoare este salariul total pentru departamentul 10 i a fost calculat
lund n considerare coloana DEPARTMENT_ID; astfel valoarea 0 a fost
returnat de GROUPING(department_id). Deoarece coloana JOB_ID nu a fost
luat n considerare n calculul acestei valori, GROUPING(job_id) returneaz
valoarea 1.
Rezultate similare se pot observa n rndul al cincilea.
Observa i valoare 23400 din ultimul rnd ce reprezint salariul total
pentru toate func iile i pentru acele departamente a c ror num r este mai mic
de 50. Pentru a calcula aceast valoare total nu au fost avute n vedere nici
coloana DEPARTMENT_ID nici JOB_ID. Astfel este returnat valoarea 1 pentru
expresia GROUPING(department_id) i pentru GROUPING(job_id).
9.14 GROUPING SETS
GROUPING SETS reprezint o extensie a clauzei GROUP BY care
permite specificarea unei grup ri multiple a datelor favoriznd astfel o sumare
eficient i astfel facilitnd analiza datelor la folosirea mai multe dimensiuni.
9-250

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Serverul Oracle calculeaz
toate grup rile specificate n clauza
GROUPING SETS i combin rezultatele grupurilor individuale cu o opera ie de
tip UNION ALL.

o
o
o

Eficien a Grouping set este datorat :


este necesar doar o singur citire a datelor din tabelul de baza;
nu este necesar scrierea unei expresii complexe de tip UNION ;
cu ct sunt mai multe elemente n GROUPING SETS cu att crete
beneficiul performan ei dat de instruc iune .

Pentru a specifica diverse tipuri de grup ri (care pot include operatori de


tip ROLLUP sau CUBE) este necesar doar o singur instruc iune SELECT
care poate fi scris mpreuna cu GROUPING SETS n locul unor fraze SELECT
multiple combinate cu operatorul UNION ALL.
De exemplu se poate scrie:
SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY
GROUPING SETS
((department_id, job_id, manager_id),
(department_id, manager_id),(job_id, manager_id));
Instruc iunea calculeaz suma pentru urm toarele grupuri : (department_id,
job_id, manager_id), (department_id, manager_id) i (job_id, manager_id).
n lipsa acestei facilita i oferite de Oracle9i ar fi trebuit scrise mai multe
instruc iuni SELECT combinate cu operatorul UNION ALL O abordare care
folosete multe interog ri este ineficient deoarece necesit multiple citiri ale
datelor. Compara i instruc iunea precedent cu alternativa :
SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY CUBE(department_id, job_id, manager_id);
Instruc iunea precedent calculeaz toate cele 8 (2 *2 *2) grupuri doar
prin unica grupare : (department_id, job_id, manager_id), (department_id,
manager_id) si (job_id, manager_id) care intereseaz .

9-251

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
O alt alternativ este instruc iunea urm toare:
SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY department_id, job_id, manager_id
UNION ALL
SELECT department_id, NULL, manager_id, AVG(salary)
FROM employees
GROUP BY department_id, manager_id
UNION ALL
SELECT NULL, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY job_id, manager_id;
Aceast instruc iune necesit trei citiri ale tabelei de baz i este deci
ineficient . CUBE i ROLLUP pot fi gndi i ca grouping sets cu o semantic
specific (echivalen a din tabelul de mai jos)

Exemplu
SELECT department_id, job_id, manager_id,avg(salary)
FROM employees
GROUP BY GROUPING SETS
((department_id,job_id), (job_id,manager_id));

9-252

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Interogarea din exemplu calculeaz suma pentru dou grupuri. Tabelul


este mp r it n urm toarele grupuri:

Department_ID, Job_ID;
Job_ID, Manager_ID.
Este calculat media salariilor pentru fiecare dintre aceste grupuri, iar
seturile de rezultate sunt afiate pentru fiecare grup.
n lista rezultatelor, grupul marcat cu 1 poate fi interpretat astfel:

Media salariilor pentru to i angaja ii ce au job_ID=AD_ASST din


departamentul 10 este 4400.
Media salariilor pentru to i angaja ii ce au job_ID=MK_MAN din
departamentul 20 este 13000.
Media salariilor pentru to i angaja ii ce au job_ID= MK_REP din
departamentul 20 este 6000.
Media salariilor pentru to i angaja ii ce au job_ID=ST_CLERK din
departamentul 50 este 2925 i aa mai departe

n lista rezultatelor, grupul marcat cu 2 poate fi interpretat astfel:

Media salariilor pentru to i angaja ii ce au job_ID=MK_MAN, ca au ca


sef persoana cu manager_ID=100 este 13000.
Media salariilor pentru to i angaja ii ce au job_ID=MK_REP, ca au ca
sef persoana cu manager_ID=201 este 6000 i aa mai departe.

Exemplul de mai sus poate fi scris dup cum urmeaz :


SELECT department_id, job_id, NULL as manager_id,
AVG(salary) as AVGSAL FROM employees
GROUP BY department_id, job_id UNION ALL
SELECT NULL, job_id, manager_id, avg(salary) as AVGSAL
FROM employees GROUP BY job_id, manager_id;
n lipsa unui element de optimizare care s caute n blocurile interog rii
pentru a genera un plan de execu ie, interogarea de mai sus necesit scanarea
dubl a tabelei EMPLOYEES, lucru ce este foarte ineficient, motiv pentru care
se recomand folosirea instruc iunii GROUPING SETS.

9-253

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
9.15 Composite Columns
O coloan compus este o colec ie de coloane care sunt tratate unitar n
momentul efectu rii calculelor pentru grupuri.
Pentru a specifica o coloana compus n clauza GROUP BY trebuie s
scrie i aceste coloane n paranteze astfel nct severul Oracle s poat
recunoate aceste coloane ca o unitate atunci cnd execut calculele pentru
clauzele ROLLUP sau CUBE, de exemplu: ROLLUP (a, (b, c), d) unde (b,c)
formeaz o coloan compus care este tratat unitar.
n general folosirea coloanelor compuse este util
la scrierea
instruc iunilor ROLLUP, CUBE sau GROUPING SETS. Dac folosi i coloane
compuse pentru instruc iunile ROLLUP sau CUBE nseamn ca dori i sa trece i
peste anumite nivele de nsumare (b,c).
De exemplu GROUP BY ROLLUP (a, (b, c)) este echivalent cu:
GROUP BY a, b, c UNION ALL
GROUP BY a UNION ALL
GROUP BY ()
Aici (b, c) sunt tratate ca o unitate iar rollup nu va fi aplicat pentru (b, c).
Este ca i cum a i folosi un alias, de exemplu z, pentru (b, c), i expresia
GROUP BY se reduce la GROUP BY ROLLUP(a, z).
NOT :
GROUP BY( ) este de obicei o clauz tipic pentru instruc iunea
SELECT cu valori de null pentru a i b i doar o func ie de grup. Se
folosete in special pentru calcularea unui total general.

SELECT NULL, NULL, aggregate_col


FROM <table_name>
GROUP BY ( );
Compara i sintaxa de forma, GROUP BY ROLLUP(a, b, c) cu :
GROUP BY a, b, c UNION ALL
GROUP BY a, b UNION ALL
GROUP BY a UNION ALL
GROUP BY ().

9-254

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Similar, GROUP BY CUBE((a, b), c) ar fi echivalent cu :
GROUP BY a, b, c UNION ALL
GROUP BY a, b UNION ALL
GROUP BY c UNION ALL
GROUP By ()
Tabelul urm tor ilustreaz diferen a dintre folosirea coloanelor compuse i
specifica iile pentru GROUP BY .

EXEMPLU:
SELECT department_id, job_id, manager_id, SUM(salary)
FROM employees
GROUP BY ROLLUP( department_id,(job_id, manager_id));
Consider m exemplul:
SELECT department_id, job_id,manager_id, SUM(salary)
FROM employees
GROUP BY ROLLUP( department_id,job_id, manager_id);
Interogarea presupune calcularea de c tre serverul Oracle Server a
valorilor pentru urm toarelor grupuri :
1. (department_id, job_id, manager_id);
2. (department_id, job_id);
3. (department_id);
4. ( ).
9-255

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Daca sunte i interesa i n gruparea dup liniile (1), (3) i (4) din exemplul
de mai sus, nu pute i limita calculul acestor grupuri f r a folosi coloane
compuse.
Folosirea coloanelor compuse d posibilitatea de a trata coloanele
JOB_ID i MANAGER_ID unitar atunci cnd se executa ROLLUP. Coloanele
incluse n paranteze sunt tratate unitar la execu ia instruc iunilor ROLLUP i
CUBE, lucru ilustrat n figur .
Scriind coloanele JOB_ID i MANAGER_ID n paranteze, indicam
serverului Oracle faptul c
trebuie s
trateze coloanele JOB_ID i
MANAGER_ID unitar, drept coloan compus .
Exemplul calculeaz grupurile :
(department_id, job_id, manager_id);
(department_id);
( ).
si afieaz urm toarele :

Salariul total pe fiecare departament (eticheta 1)


Salariul total pe fiecare departament, job_ID i manager (eticheta 2)
Totalul general (eticheta 3)
Exemplul de mai sus poate fi scris i astfel :
SELECT department_id, job_id, manager_id, SUM(salary)
FROM employees GROUP BY department_id,job_id, manager_id
UNION ALL
SELECT department_id, TO_CHAR(NULL),TO_NUMBER(NULL),
SUM(salary) FROM employees GROUP BY department_id
UNION ALL
9-256

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SELECT TO_NUMBER(NULL),
TO_CHAR(NULL),TO_NUMBER(NULL),SUM(salary)
FROM employees GROUP BY ();
n absenta unui element de optimizare care s studieze interogarea i s
creeze un plan de execu ie a interog rii, interogarea de mai sus necesita trei
scan ri ale tabelei de baza, EMPLOYEES, lucru ce este ineficient. De aceea se
recomand folosirea coloanelor compuse.
9.16 Concatenated Groupings
Grup rile concatenate ofer o solu ie concis de a genera combina ii utile
de grupuri.
Pentru a specifica seturi de grup ri concatenate trebuie sa separa i
set rile de grupuri multiple i opera iile de tip ROLLUP i CUBE prin virgule
astfel nct serverul Oracle s le combine ntr-o singura clauza GROUP BY.
Rezultatul este intersec ia valorilor grupurilor din fiecare set de grup ri.
EXEMPLU
GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)
Exemplul precedent definete urm toarele grupuri: (a, c), (a, d), (b,
c), (b, d)
Concatenarea seturilor de grup ri este foarte folositoare deoarece :
uureaz scrierea instruc iunii: nu trebuie s enumera i, prin scriere manual ,
toate grupurile ;
folosirea aplica iei: SQL-ul general de aplica ii OLAP include deseori
concatenarea seturilor de grupare, pentru fiecare set de grupare definind
seturile de grupare necesare pentru dimensionare.
EXEMPLU:
SELECT department_id, job_id, manager_id, SUM(salary)
FROM employees GROUP BY
department_id,ROLLUP(job_id),CUBE(manager_id);

9-257

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Din exemplul de mai sus rezult formarea urm toarelor grupuri :


(department_id, manager_id, job_id );
(department_id, manager_id);
(department_id, job_id);
(department_id).

Se calculeaz salariul total pentru fiecare grup, exemplul afind urm toarele :
Salariul total pentru fiecare department, job ID, manager (eticheta 1);
Salariul total pentru fiecare department, manager ID (eticheta 2);
Salariul total pentru fiecare department, job ID (eticheta 3);
Salariul total pentru fiecare department (eticheta 4).
Pentru o n elegere mai uoar , detaliile pentru departamentul 10 sunt
eviden iate n figura de mai sus.

9-258

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

9.17 Exerciii

1. Func iile de grup ac ioneaz


rezultat. (adev rat/fals).

asupra mai multor rnduri i produc un

2. Func iile de grup includ valoarea null n calcule (adev rat/fals).


3. Clauza WHERE restric ioneaz rndurile anterior includerii acestora n
grupurile de calcul (adev rat/fals).
4. Afia i cel mai mare salar, cel mai mic salar, suma i media salariului pentru
to i angaja ii. Eticheta i coloanele cu Maxim, Minim, Suma i Media.
Rotunji i rezultatele (f r zecimale). Salva i instruc iunea in fiierul p4.sql.

5. Modifica i p4.sql astfel nct s afieze aceleai informa ii pentru fiecare tip
de meserie. Salva i modific rile in p5.sql.

9-259

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
6. Scrie i o interogare pentru afiarea num rului de angajai cu aceeai
meserie.

7. Determina i num rul managerilor f r s -i lista i (doar num rul lor).


Eticheta i coloana Nr. Manageri.(Folosi i coloana Manager_ID).

8. Scrie i o interogare care s afieze diferen a dintre salariile cele mai mari i
cele mai mici. Eticheta i coloana Diferen a.

9. Afia i num rul managerului i salariul celui mai prost pl tit angajat pentru
acel manager. Exclude i pe cei care nu au manager. Exclude i grupurile
care au salariul minim mai mic dect 1600$. Sorta i rezultatele in ordine
descresc toare dup salar.

9-260

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
10. Scrie i o interogare care s afieze numele departamentului, localitatea,
num rul de angajai i salariul mediu al angaja ilor din acel departament.
Eticheta i coloanele Dname, Loc, No of People i Salary. Vezi exemplul.

11. Scrie i o interogare care afieaz num rul total de angajai i num rul total
de angaja i care au fost angaja i n anii 1995,1996,1997 i 1998. Eticheta i
coloanele corespunz tor. Vezi exemplul.

12. Afia i meseria, suma salariilor pentru meseria respectiv din cadrul
departamentelor 20, 50, 80, 90 precum i salariul total pentru acea meserie
pentru toate departamentele. Eticheta i coloanele corespunz tor. Vezi
exemplul.

9-261

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
13. Scrie i o interogare care sa afieze urm toarele informa ii pentru acei
angajai a c ror manager_ID este mai mic de 120:
Manager_ID;
Job_ID i salariul total pentru fiecare job_ID pentru angaja ii care au
acelai sef;
Salariul total pe care efii trebuie sa-l pl teasc angaja ilor ;
Salariul total pe care efii trebuie sa-l pl teasc angaja ilor, indiferent
de job_ID.

9-262

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
14. Observa i rezultatele de la punctul 13. Scrie i o interogare folosind func ii de
grupare pentru a determina dac valorile de NULL din coloanele
corespunz toare expresiilor GROUP BY sunt cauzate de opera ia ROLLUP.

9-263

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
15. Scrie i o interogare care s afieze urm toarele informa ii despre angaja ii a
c ror manager_ID este mai mic de 120 :
Manager_ID;
Func ia i salariul total pentru fiecare func ie pentru angaja ii care au
acelai sef;
Salariul total al angaja ilor ce au acelai sef ;
Salariul total pe fiecare func ie, indiferent de sef;
Salariul total indiferent de func ii.
16. Observa i rezultatele interog rii de la punctul 15. Scrie i o interogare care
s foloseasc func iile de grupare pentru a determina dac valorile de
NULL din coloanele corespunz toare clauzei GROUP BY sunt date de
operatorul CUBE.

17. Scrie i o interogare, folosind GROUPING SETS, pentru a afia urm toarele
grupuri:
- department_id, manager_id, job_id;
- department_id, job_id;
- manager_id, job_id.
Interogarea trebuie s
grupuri.

9-264

calculeze suma salariilor pentru fiecare dintre aceste

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Capitolul 10

Subinterogari

Obiective:

Descrierea tipurilor de probleme pe care le pot rezolva subinterogarile;


Definirea subinterogarilor;
Enumerarea tipurilor de subinterog ri;
Scrierea subinterogarilor de un singur rnd i a celor de mai multe
rnduri.

n acest capitol se vor studia caracteristici mai avansate ale instruc iunii
SELECT cum ar fi scrierea subinterogarilor n clauza WHERE a altei instruc iuni
SQL n scopul ob inerii de valori bazate pe o valoare necunoscut a unei
condi ii.

Cine primete un salariu mai mare dect cel al lui Jones ?

Cerere principal
Ce angajat are un salariu mai mare dect Jones ?
Subinterogare
Care este salariul lui Jones ?

10.1

Folosirea unei subinterog ri pentru a rezolva o problema

S presupunem c se dorete scrierea unei interog ri pentru a afla cine


ctig un salariu mai mare dect salariul lui Jones.
Pentru rezolvarea acestei probleme este nevoie de dou interog ri: o
interogare pentru a afla ce salariu ctig Jones i o a doua pentru a determina
cine ctig mai mult dect aceast sum .
Problema poate fi rezolvat combinnd aceste dou interog ri, integrnd
una din cereri n cealalt .
10-265

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
O cerere inclus sau o subinterogare returneaz o valoare care va fi
folosit de c tre interogarea exterioar sau principal . Folosirea unei
subinterog ri este echivalent execut rii a dou cereri secven iale i folosirii
rezultatului primei cereri ca valoare de c utare pentru cea de a dou cerere.
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list FROM table);
Subinterogarea (cererea intern ) se execut o singur dat , naintea
interog rii principale.
Rezultatul subinterog rii este utilizat de c tre cererea principal
(cererea extern ).
O subinterogare reprezint o instruc iune SELECT care este inclus ntro clauz apar innd altei instruc iuni SELECT.
Prin utilizarea subinterogarilor se pot construi instruc iuni mai puternice pornind
de la instruc iuni simple. Acestea pot fi foarte folositoare n cazurile n care se
dorete selectarea unor rnduri dintr-un tabel folosind o condi ie care depinde
de datele din tabelul propriu-zis.
Subinterogarile pot fi plasate in urm toarele clauze SQL:
WHERE
HAVING
FROM
n sintaxa mai sus prezentat expr operator implic
operatori de compara ie: >, = sau IN.

unul din urm torii

Operatorii de comparare se mpart n dou clase:


operatori pentru subinterog ri de un singur rnd: >=, <, <>, <=
operatori pentru subinterog ri de mai multe rnduri: IN, ANY, ALL.
Subinterogarea este deseori referit ca fiind o instruc iune SELECT
inclus , sub-SELECT sau instruc iune SELECT intern . n general,
subinterogarea se execut prima, iar rezultatul este folosit pentru a finaliza
condi ia de cerere pentru interogarea principal sau extern .

10-266

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SELECT last_name
FROM employees
WHERE salary >
(SELECT salary
FROM employees
WHERE last_name = 'Abel');

n figura anterioar , cererea intern determin salariul angajatului cu


numele Abel. Cererea extern preia rezultatul cererii interne i l folosete
pentru a afia to i angaja ii care au salariul mai mare dect aceast sum .
Reguli n utilzarea subinterog rilor

O subinterogare trebuie s fie inclus ntre paranteze.


O subinterogare trebuie s apar n partea dreapta a unui operator
de comparare.
Subinterogarile nu pot con ine clauza ORDER BY. Pentru o
instruc iune SELECT poate exista doar o singur clauz ORDER
BY, iar dac aceast clauza este specificat , ea trebuie sa fie
ultima clauz din instruc iunea SELECT principal .

Subinterog rile folosesc dou clase de operatori de comparare: operatori


single-row i operatori multiple-row.
10.2

Tipuri de subinterog ri

10-267

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Single-row : cereri care returneaz doar un rnd din instruc iunea SELECT
intern ;
Multiple-row : cereri care returneaz mai mult de un rnd din instruc iunea
SELECT intern .

10.3

Subinterogari single-row

O subinterogare single-row este acea subinterogare care returneaz un


singur rnd din instruc iunea SELECT intern . Acest tip de subinterogare
folosete un operator single-row.
Exemplu:
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE employee_id = 141);

Afiarea angaja ilor care lucreaz pe acelai post (au aceeai meserie) ca
i angajatul care are num rul de marc 141.
Executarea unei subinterog ri single-row:

10-268

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
O instruc iune SELECT poate fi considerat ca un bloc de cereri.
Exemplul de mai sus afieaz angaja ii a c ror func ie este aceeai cu cea a
angajatului cu num rul 141 i a c ror salariu este mai mare dect cel al
angajatului 143.
Exemplul este format din 3 blocuri de cereri: o cerere exterioar i dou
cereri interne. Blocurile de cereri interne sunt executate primele, producnd
rezultatele: FUNC IONAR (ST_CLERK), respectiv 2600. Apoi este procesat
blocul de cereri exterior care folosete valorile returnate de c tre cererile interne
pentru a finaliza propriile condi ii de c utare.
Ambele cereri interne returneaz valori singulare (FUNCTIONAR i
2600), astfel ca aceast instruc iune SQL este denumit subinterogare singlerow.
Interog rile exterioare i incluse pot prelua datele din tabele diferite.

10.4 Utilizarea func iilor de grup ntr-o subinterogare


SELECT last_name, job_id, salary
FROM employees
WHERE salary = (SELECT MIN(salary) FROM employees);

n interogarea principal pot fi afiate date prin utilizarea unei func ii de


grup folosind o subinterogare care sa returneze un singur rnd. Subinterogarea
se va plasa ntre paranteze, dup operatorul de comparare.
Exemplul din figura precedent afieaz numele, func ia i salariul tuturor
angaja ilor al c ror salariu este egal cu salariul minim. Func ia MIN (func ie de
grup) returneaz o singur valoare (i anume 2500), care este folosit de c tre
interogarea principal .
Clauza HAVING n subinterogare
Server-ul Oracle execut mai nti subinterogarile. Server-ul Oracle
returneaz rezultatele c tre clauza HAVING a interog rii principale.

10-269

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) >
(SELECT MIN(salary)
FROM employees
WHERE department_id = 50);

Subinterogarile pot fi folosite nu numai n clauza WHERE ci i n clauza


HAVING. Server-ul Oracle execut subinterogarea returnnd rezultatul c tre
clauza HAVING a subinterog rii principale.
Instruc iunea SQL prezentat n figura de mai sus are ca scop final
afiarea tuturor departamentelor la nivelul c rora salariul minim are o valoare
mai mare dect valoarea salariului minim din cadrul departamentului 50.
Exemplu: Se cere s se g seasc func ia avnd cel mai sc zut
salariu mediu.
SELECT job_id, AVG(salary)
FROM employees
GROUP BY job_id
HAVING AVG(salary) = (SELECT MIN(AVG(salary))
FROM employees
GROUP BY job_id);
10.5 Erori ce pot apare la folosirea subinterog rilor

10-270

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
O eroare obinuit la folosirea subinterog rilor o reprezint returnarea a
mai mult de un rnd de c tre o subinterogare dorit a fi de tip single-row.
n instruc iunea SQL din exemplul anterior, subinterogarea con ine o
clauz GROUP BY dup num rul departamentului (department_ID), care
implic selectarea mai multor rnduri, cte unul pentru fiecare grup g sit. n
acest caz, rezultatul subinterog rii va fi: 4400, 6000, 2500, 4200, 7000, 17000
i 8300.
Interogarea extern preia rezultatele subinterog rii i le folosete n
clauza WHERE. Clauza WHERE con ine operatorul egal ( = ), operator de
comparare single-row, care ateapt o singur valoare n partea sa dreapt .
Operatorul = nu poate accepta mai mult de o valoare primit de la
subinterogare i astfel este generat eroarea.
Pentru a corecta eroarea, operatorul (=) trebuie nlocuit cu operatorul IN.

O problem obinuit legat de subinterog ri o constituie posibilitatea


neselect rii nici unui rnd de c tre interogarea inclus .
n ceea ce privete instruc iunea SQL de mai sus, subinterogarea con ine
o clauz WHERE (ename = Haas). Se presupune c inten ia este de a selecta
angajatul cu numele Haas. Instruc iunea pare a fi corect , dar la execu ie nu se
selecteaz nici un rnd.
Problema este ortografierea greit a cuvntului Haas. Nu exist nici un
angajat cu numele de Haas. Astfel, subinterogarea nu va selecta nici un rnd.
Interogarea extern preia rezultatul subinterog rii (null, n acest caz) i
folosete acest rezultat n propria-i clauza WHERE. Interogarea extern nu
g sete nici un angajat avnd cmpul referitor la func ie de valoare nul i
astfel nu returneaz nici un rnd.

10-271

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

10.6

Subinterogari multiple-row

Selecteaz mai mult de un rnd


Folosesc operatori multiple-row de comparare
Operator
IN
ANY
ALL

Semnifica ie
Egal cu oricare din elementele listei
Compar valoarea cu fiecare valoare returnat de
subinterogare luat separat
Compar valoarea cu toate valorile returnate de
subinterogare

Subinterog rile care returneaz mai mult de un rnd se numesc


subinterog ri multiple-row. n cazul subinterog rilor multiple-row se folosesc
operatori multiple-row n locul celor single-row. Operatorul multiple-row necesit
una sau mai multe valori.
SELECT last_name, salary, department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
FROM employees
GROUP BY department_id);
Se cere s se selecteze angaja ii care ctig un salariu egal cu salariul
minim la nivel de departament.
Interogarea intern va fi prima executat producnd un r spuns. Blocul
cererii externe este apoi procesat i se folosesc valorile returnate de c tre
interogarea inclus pentru finalizarea propriei condi ii de c utare. De fapt,
interogarea principal este privit din perspectiva server-ului Oracle astfel:
SELECT last_name, salary, department_id
FROM employees
WHERE salary IN (2500, 4200, 4400, 6000, 7000, 8300, 8600, 1 7000);

10-272

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

10.7

Utilizarea operatorului ANY n subinterogarile multiple-row

Operatorul ANY compar o valoare cu fiecare valoare returnat de


subinterogare. Exemplul de mai sus afieaz angaja ii ale c ror salarii sunt mai
mici dect al oric rui programator (IT_PROG) dar care nu sunt programatori.
Salariul maxim pe care l ctig un programator este $9000. Instruc iunea SQL
afieaz to i angaja ii care nu sunt programatori dar ctig mai pu in de $9000.
< ANY
> ANY
= ANY

10.8

nseamn mai mic dect maxim.


nseamn mai mare dect minim.
este echivalent cu operatorul IN.

Utilizarea operatorului ALL n subinterog rile multiple-row

10-273

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Operatorul ALL compar o valoare cu toate valorile returnate de o
subinterogare. Exemplul de mai sus afieaz to i angaja ii ale c ror salarii sunt
mai mici dect al oric rui programator (IT_PROG) dar care nu sunt
programatori. Cel mai mic salariu al vreunui programator este $4200, aa c
interogarea va selecta acei angajai ale c ror salarii sunt mai mici dect $4200.
> ALL
< ALL

nseamn mai mare dect maxim


nseamn mai mic dect minim

Operatorul NOT poate fi folosit mpreun cu operatorii IN, ANY i ALL.


10.9

Returnarea valorilor nule n rezultatul subinterog rii

SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id FROM employees mgr);
Comanda SQL de mai sus afieaz to i angaja ii care nu au nici un
subordonat. Logic, acesta interogare SQL ar trebui sa returneze 12 linii dar nu
se returneaz nici una. Una din valorile returnate de interogare este o valoare
de null i prin urmare ntreaga interogare nu returneaz nici o linie.
Motivul este c toate aceste condi ii care compar rezultatul unei valori
cu null transform rezultatul n null. Cnd exist valori de null n rezultatul
subinterog rii, nu folosi i operatorul NOT IN.
Operatorul NOT IN este echivalent cu <>ALL. Trebuie s ave i n vedere
c valorile nulle ale rezultatului subinterog rii nu vor constitui o problem dac
folosi i operatorul IN. Operatorul IN este echivalent cu operatorul ANY. De
exemplu, pentru afiarea angaja ilor care nu au subordona i, folosi i urm toarea
exprimare SQL:
SELECT last_name FROM employees
WHERE employee_id NOT IN
(SELECT manager_id FROM employees
WHERE manager_id IS NOT NULL);

10-274

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

10.10 Subinterogari de coloane multiple


Pn acum am scris subinterog ri ce returnau una sau mai multe linii dar
care comparau valorile pentru o singur coloan n clauza WHERE sau
HAVING a instruc iunii SELECT.
Dac se dorete compararea uneia sau a mai multor coloane, la scrierea
condi iilor pentru clauza WHERE trebuie folosi i operatorii logici.
Folosirea subinterog rilor de coloane multiple ofer posibilitatea mbin rii
condi iilor din dou clauze WHERE n una singur .
SELECT column, column,...
FROM table
WHERE (column, column,...) IN
(SELECT column, column,...
FROM table
WHERE condition);
Afia i numele, num rul departamentului, salariul i comisionul
oric rui angajat a c rui salariu i comision se potrivesc cu salariul i
comisionul oric rui angajat din departamentul 30.
Exemplul de mai sus folosete o subinterogare de coloane multiple (care
returneaz mai mult de o coloan ) pentru a compara sariul i comisionul.
10.11 Compararea coloanelor (pereche i nepereche)
Compararea coloanelor ntr-o subinterogare de coloane multiple poate fi
f cut n dou moduri: pereche sau nepereche.
n exemplul urm tor, clauza WHERE con ine o compara ie pereche.
Fiecare linie returnat de comanda SELECT trebuie s aib aceeai valoare
att n coloana MANAGER_ID ct i n coloana DEPARTMENT_ID cu cele ale
angajatului cu num rul 178 sau 174.
n cazul unei compara ii nepereche, fiecare valoare a coloanelor din
clauza WHERE a interog rii principale va fi comparat n mod individual cu
valorile multiple returnate de subinterogare. Coloanele individuale pot s se
potriveasc cu orice valoare returnat de subinterogare. Toate rndurile afiate
trebuie s satisfac , n mod colectiv, toate condi iile multiple din interogarea
principal . Un exemplu de compara ie nepereche este dat mai jos.

10-275

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Compara ie pereche
SELECT employee_id, manager_id, department_id
FROM employees
WHERE (manager_id, department_id) IN
(SELECT manager_id, department_id
FROM employees
WHERE employee_id IN (178,174))
AND employee_id NOT IN (178,174);

Compara ie nepereche

SELECT employee_id, manager_id, department_id


FROM employees
WHERE manager_id IN
(SELECT manager_id
FROM employees
WHERE employee_id IN (174,141))
AND department_id IN
(SELECT department_id
FROM employees
WHERE employee_id IN (174,141))
AND employee_id NOT IN(174,141);

10.12 Folosirea unei subinterog ri n clauza FROM


Se poate folosi o subinterogare i n clauza FROM a instruc iunii
SELECT.
Exemplul urm tor afieaz
numele angaja ilor, salariul, num rul
departamentului i media salariilor pentru to i angaja ii care ctig mai mult
10-276

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
dect salariul mediu din departamentul n care lucreaz .
Exemplu
SELECT a.last_name, a.salary, a.department_id, b.salavg
FROM employees a, (SELECT department_id,
AVG(salary) salavg
FROM employees
GROUP BY department_id) b
WHERE a.department_id = b.department_id
AND a.salary > b.salavg;

10.13 Expresii scalare returnate de subinterog ri


O expresie scalar returnat de o subinterogare este o subinterogare
care returneaz valoarea exact a unei coloane aferent unui singur rnd.
n Oracle8i subinterog rile scalare erau suportate doar n cteva cazuri
similare cum ar fi:
instruc iunea SELECT ( clauza FROM, WHERE);
listele de valori din instruc iunea INSERT .
n Oracle9i, subinterog rile scalare pot fi folosite n :
Condi ii i expresii ce fac parte din instruc iuni ca DECODE i CASE;
Toate clauzele SELECT cu excep ia GROUP BY;
n partea stng a unui operator n clauza SET i WHERE a unei
instruc iuni UPDATE.
Subinterog rile de mai multe coloane scrise pentru a compara dou sau
mai multe coloane, n scrierea c rora se folosesc la clauza WHERE condi ii
compuse i operatori logici, nu sunt calificate ca subinterog ri scalare.
10-277

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Valoarea expresiilor scalare ale subinterog rii este valoarea elementului
returnat de subinterogare. Dac subinterogarea nu ntoarce nici un rnd,
valoarea expresiei scalare este NULL. Dac subinterogarea ntoarce mai mult
de un rnd, serverul Oracle returneaz o eroare.
Expresiile scalare date de subinterog ri nu sunt valide n urm toarele cazuri:
ca valori implicite pentru coloane i expresii pentru clustere;
n clauza RETURNING a unei instruc iuni DML ;
ca baz a unei func ii de baz pentru index;
n clauza GROUP BY, constrngeri CHECK, condi ii pentru WHEN;
clauza HAVING;
in clauzele START WITH i CONNECT BY;
n instruc iuni care nu sunt n leg tur cu interog ri, cum ar fi CREATE
PROFILE.
Exemplu

Primul exemplu de mai sus demonstreaz faptul c subinterog rile


scalare pot fi folosite n expresii de tip CASE. Subinterogarea returneaz
valoarea 20, care este IDul departamentului pentru care location ID este 1800.
Expresia CASE din interogarea principal
folosete rezultatul
subinterog rii pentru a afia employee ID, last name, i valoarea Canada sau
USA, n func ie de num rul departamentului, dac acesta este sau nu 20.
Rezultatul exemplului este urm torul :

10-278

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Cel de al doilea exemplu ordoneaz


rezultatele n func ie de
DEPARTMENT_NAME prin potrivirea valorilor pentru DEPARTMENT_ID din
tabela EMPLOYEES cu valorile pentru DEPARTMENT_ID din tabela
DEPARTMENTS. Aceast comparare este f cut prin folosirea subinterog rii
scalare din clauza ORDER BY. Rezultatul este afiat mai jos.

Acest exemplu folosete o subinterogare corelat . ntr-o subinterogare


corelat , subinterogarea refer
o coloan
dintr-o tabel
referit
n
subinterogarea principal .
10.14 Subinterogri corelate
Subinterog rile corelate sunt folosite pentru procesare rnd cu rnd.
Fiecare subinterogare este executat odat pentru fiecare rnd al interog rii
principale.

10-279

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Extrage rndul candidat din interogarea principal

Execut subinterogarea folosind valoarea din rndul candidat

Folosete valoarea subinterog rii pentru califica sau descalifica


rndul candidat

Serverul Oracle execut o subinterogare corelat atunci cnd o


subinterogare refer o coloan dintr-un tabel referit n interogarea principal . O
subinterogare corelat este evaluat de fiecare dat pentru fiecare rnd
procesat de interogarea principal . Interogarea principal poate fi o instruc iune
SELECT, UPDATE sau DELETE.
Subinterog ri imbricate versus subinterog ri corelate
ntr-o subinterogare imbricat normal , interogarea SELECT interioar
este executat mai nti odat , valoarea ntoars fiind folosit de interogarea
principal .
O subinterogare corelat este executat odat pentru fiecare rnd
candidat dat de interogarea principal . Cu alte cuvinte, subinterogarea este
condus de interogarea principal .
Executarea subinterog rii imbricate

Se execut mai nti subinterogarea i este returnat o valoare;


Se execut odat interogarea principal folosind valoarea dat
de subinterogare.

Executarea subinterog rii corelate

10-280

Se ia un rnd candidat, dat de interogarea principal ;


Se execut subinterogarea folosind valoarea din rndul candidat;
Se folosete valoarea dat de subinterogare pentru a califica sau
descalifica rndul candidat;
Se repet procedura pn la epuizarea rndurilor candidat.

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SELECT column1, column2,...
FROM table1
WHERE column1 operator
(SELECT colum1, column2
FROM table2
WHERE expr1 = outer.expr2);
Operatorii ANY i ALL pot fi folosi i n subinterog ri corelate.

Exemplu: G si i to i angaja ii care ctig mai mult dect salariul


mediu din departamentul n care lucreaz .
SELECT last_name, salary, department_id
FROM employees outer
WHERE salary >
(SELECT AVG(salary)
FROM employees
WHERE department_id = outer.department_id);
n acest caz subinterogarea coreleaz salariul mediu din fiecare
departament cu salariul fiec rui angajat. Deoarece att interogarea principal
ct i subinterogarea folosesc tabela EMPLOYEES n clauza FROM, acesteia i
se atribuie un alias n interogarea principal , nu doar pentru claritatea citirii ci i
datorit faptului c f r acest alias interogarea nu ar func iona corect, deoarece
subinterogarea nu ar putea s fac diferen a dintre coloana din interogarea
principal i cea din subinterogare.
Exemplu: Afia i datele angaja ilor care i-au schimbat func ia de
cel pu in dou ori.
SELECT e.employee_id, last_name,e.job_id
FROM employees e
WHERE 2 <= (SELECT COUNT(*)
FROM job_history
WHERE employee_id = e.employee_id);

10-281

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Serverul Oracle evalueaz subinterogarea corelat astfel:


Selecteaz un rnd din tabele specificat n interogarea principal , adic un
rnd candidat.
Memoreaz valoarea din rndul candidat pentru coloana referit n
subinterogare (n exemplu, coloana este E.EMPLOYEE_ID.)
Execut subinterogarea cu condi ia dat de valoarea rndului candidat din
interogarea principal (n exemplu, func ia de grup COUNT(*) este evaluat
pe baza valorii coloanei E.EMPLOYEE_ID ob inut la punctul 2).
Evalueaz clauza WHERE a interog rii principale pe baza rezultatului dat
de subinterogare ob inut n pasul 3. Acest lucru determin dac rndul
candidat va fi selectat pentru afiare sau nu. (n exemplu, num rul de
schimb ri ale func iei pentru un salariat, evaluat de subinterogare este
comparat cu acel 2 din clauza WHERE a interog rii principale. Dac
condi ia este ndeplinit de acel angajat, rndul respectiv, este afiat.)
Procedura se repet pentru urm toarele rnduri candidate pn la finalul
tabelei.

10.15 Folosirea operatorului EXISTS


Operatorul EXISTS verific existen a unei valori n setul de rezultate al
unei subinterog ri.
Dac subinterogarea ntoarce un rnd atunci:
Condi ia de c utare nu mai continu n interogarea principal ;
Condi ia este marcat ca fiind TRUE.
Dac subinterogarea nu ntoarce niciun rnd atunci:

Condi ia este marcat ca fiind FALSE;


Condi ia de c utare continu n interogarea principal .

n instruc iunile SELECT imbricate sunt accepta i to i operatorii logici.


Suplimentar se poate folosi operatorul EXISTS. Acest operator este folosit n
mod frecvent n subinterog rile corelate pentru a testa dac o valoare returnat
de interogarea principal exist sau nu n setul de rezultate dat de interogarea
secundar . Dac subinterogarea ntoarce cel pu in un rnd, operatorul ntoarce
valoarea TRUE. Dac valoarea nu exist , ntoarce FALSE. n acest sens
operatorul NOT EXISTS testeaz dac o valoare g sit de interogarea
principal este sau nu parte a setului de rezultate dat de subinterogare.

10-282

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu: G si i angajatul care are cel pu in un subaltern.
SELECT employee_id, last_name, job_id, department_id
FROM employees outer
WHERE EXISTS ( SELECT 'X'
FROM employees
WHERE manager_id =
outer.employee_id);

Operatorul EXISTS asigur asupra faptului c reg sirea datelor n


subinterogare nu continu atunci cnd s-a g sit cel pu in un rnd care s
satisfac condi ia: WHERE manager_id = outer.employee_id.
De notat faptul c subinterogarea nu trebuie s ntoarc o coloan
anume aa c poate fi aleas o constant . Din punctul de vedere al
performan ei este mai rapid selectarea unei constante.
Avnd coloana EMPLOYEE_ID n clauza SELECT a subinterog rii ar
trebui parcurs tabela pentru aceast coloan . Prin nlocuirea ei cu
constanta X, sau oricare alta, performan ele se mbun t esc, acesta
fiind un mod eficient de folosire a operatorului IN.
Operatorul IN poate fi folosit ca modalitate alternativ pentru operatorul
EXISTS, aa cum demonstreaz exemplul de mai jos:
SELECT employee_id,last_name,job_id,department_id
FROM employees
WHERE employee_id IN (SELECT manager_id
FROM employees WHERE manager_id IS NOT NULL);

10-283

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

10.16 Folosirea operatorului NOT EXISTS


Exemplu : Afia i toate departamentele ce nu au angaja i.
SELECT department_id, department_name
FROM departments d
WHERE NOT EXISTS (SELECT 'X'
FROM employees
WHERE department_id = d.department_id);

Se poate folosi o construc ie de tip NOT IN drept alternativ


operatorul NOT EXISTS, aa cum arat exemplul de mai jos.

pentru

SELECT department_id, department_name


FROM departments
WHERE department_id NOT IN
(SELECT department_id FROM employees);
Dealtfel NOT IN evalueaz FALSE dac oricare membru al setului este o
valoare de NULL. Cu att mai mult interogarea nu va returna niciun rnd chiar
dac sunt rnduri n tabel care s satisfac condi ia din clauza WHERE.

10.17 Clauza WITH


Folosind clauza WITH pute i defini un bloc pentru interogare nainte de a
l
folosi
n
aceasta.
Clauza
WITH
(cunoscut
formal
ca
subquery_factoring_clause) permite refolosirea aceluiai bloc ntr-o instruc iune
SELECT atunci cnd apare de mai multe ori ntr-o interogare complex . n mod
particular acest lucru este folositor atunci cnd exist multe referin e la acelai
bloc i sunt multe join-uri i calcule.
Folosind clauza WITH, pute i refolosi aceeai interogare atunci cnd
costul evalu rii blocului interog rii este mare i apare de mai multe ori ntr-o
interogare complex . Folosind clauza WITH serverul Oracle reg sete
rezultatele unui bloc i le stocheaz n spa iul de memorie temporar . Acest
lucru duce la creterea performan elor, beneficiile fiind:
interogarea devine uor de citit;
clauza este evaluat o singur dat chiar dac apare de mai
multe ori n interogare.

10-284

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu: scrie i o interogare, folosind clauza WITH, care s afieze
numele departamentului i salariile totale pentru acele departamente
n care salariul total este mai mare dect media salariilor pe
departamente.

Problema ar putea necesita calcule intermediare i anume:


Calculul salariului total pentru fiecare departament i stocarea rezultatelor
folosind clauza WITH.
Calculul mediei salariale pe departamente i stocarea rezultatului folosind
clauza WITH.
Compararea salariului total calculat la pasul unu cu media calculat n pasul
doi. Dac salariul total pentru un departament anume este mai mare dect
media salariilor pe departamente, se afieaz numele departamentului i
salariul total pe acel departament.

Interogarea de mai sus creeaz un bloc numit DEPT_COSTS i altul


numit AVG_COST pe care le folosete apoi n interogarea principal . Intern,
clauza WITH clause este rezolvat fie printr-un view in-line sau printr-o tabel
temporar . Elementele de optimizare sunt cele care decid n func ie de costurile
sau beneficiile de moment ale stoc rii temporare a datelor la folosirea acestei
clauze.

10-285

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Not :
Subinterogarea din clauza FROM a unei instruc iuni SELECT se
numete i in-line view. Clauza WITH se folosete numai la
instruc iuni SELECT.
Numele interog rii este vizibil tuturor elementelor WITH ale blocurilor
subinterog rilor (inclusiv subinterog rilor acestora) definite dup acestea i
blocului principal n sine (incluznd subinterog rile).
Atunci cnd numele interog rii este identic cu cel al unei tabele existente
parserul caut de la interior spre exterior, numele blocului precednd numele
tabelei.
Clauza WITH poate suporta mai mult de o interogare, fiecare interogare
fiind separat de o virgul .

10.18 Interogri ierahice


Obiective:

Interpretarea conceptului de interogare ierarhic ;


Crearea unui raport cu structur arborescent ;
Formatarea datelor ierahice;
Excluderea unor ramuri din structura arborescent .

Folosind interog ri ierarhice pute i reg si date bazndu-v


ierarhic natural , creat ntre rndurile dintr-un tabel.

pe o rela ie

O baz de date rela ional nu stocheaz nregistr rile n mod ierarhic.


Dealtfel, acolo unde exist o rela ie ierarhic ntre rndurile dintr-un singur
tabel, pute i construi o ierarhie folosind procesul numit parcurgerea arborelui.
O interogare ierarhic este o metod de afiare a ramurilor unui arbore n
ordine.
Imagina i-v o familie n care cei mai vrstnici membri se afl aproape de
baza trunchiului arborelui iar cei mai tineri membri reprezint ramurile arborelui.
Ramurile pot avea alte ramuri i aa mai departe.
O interogare ierarhic este posibil atunci cnd exist o rela ie ntre
rndurile tabelului. De exemplu, pute i observa n tabelul Employees c cei ce
au job_ID-urile egale cu AD_VP, ST_MAN, SA_MAN i MK_MAN sunt direct
subordona i preedintelui companiei. tim acest lucru deoarece coloana
MANAGER_ID pentru aceste nregistr ri are valoarea 100, care este de fapt
valoarea coloanei employee_ID pentru preedintele companiei (AD_PRES).

10-286

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Not : interog rile ierarhice pot fi folosite n diverse cazuri cum ar fi:
genealogia uman
(arborele genealogic al unei familii),
managementul companiilor (managementul ierarhic), produc ie
(asamblarea componentelor ntr-un produs finit), cercetarea evolu iei
(dezvoltarea speciilor) i cercetare tiin ific .
Structura natural a arborelui

Tabelul EMPLOYEES are o structur arborescent construit n func ie


de subordonarea angaja ilor fa de efii lor. Ierarhia poate fi creat prin
cercetarea valorilor echivalente din coloanele EMPLOYEE_ID i
MANAGER_ID. Aceast rela ie poate fi folosit folosind un self-join pe acest
tabel. Coloana MANAGER_ID con ine num rul de marc al efului respectivului
angajat. Rela ia p rinte-copil a unei structuri ierarhice v permite s controla i:

Direc ia n care se parcurge arborele;


Punctul din cadrul ierarhiei de la care se pleac .
NOT : Figura de mai sus prezint modul de organizare ierarhic al
angaja ilor din tabelul EMPLOYEES.

Interog ri ierarhice
SELECT [LEVEL], column, expr...
FROM table
[WHERE condition(s)]
[START WITH condition(s)]
[CONNECT BY PRIOR condition(s)];
WHERE condition:
expr comparison_operator expr
10-287

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Interog rile ierarhice pot fi identificate prin prezen a clauzelor CONNECT BY i
START WITH.
n sintax :
SELECT

este o instruc iune SELECT standard.

LEVEL

pentru fiecare rnd returnat de o interogare ierarhic ,


pseudocoloana LEVEL ntoarce 1 pentru un rnd
r d cin , 2 pentru un copil al unei r d cini, etc.

FROM table

specific tabelul sau vederea ce con ine coloanele.


Acestea pot fi selectate doar dintr-un singur tabel.

WHERE

restric ioneaz rndurile date de interogare f r a afecta


alte rnduri ale ierarhiei.

Condition

este compararea cu o expresie.

START WITH

specific rndurile r d cin ale arborelui, adic punctul


de plecare. Aceast clauz este obligatorie pentru o
interogare ierarhic adev rat .

CONNECT BY specific coloanele care con in elementele ce definesc


PRIOR rows rela ia dintre p rinte i copil. Aceast clauz este
obligatorie pentru o interogare ierarhic .
Instruc iunea SELECT nu poate con ine un join sau o interogare bazat pe un
view care con ine un join.
10.19 Parcurgerea arborelui punctul de start
Se specific condi iile ce trebuiesc ndeplinite;
Se poate folosi n conjunc ie cu orice alt condi ie valid .
START WITH column1 = value
De exemplu, pentru tabela EMPLOYEES, s se parcurg arborele
ncepnd cu angajatul al c rui nume este Kochhar.
...START WITH last_name = 'Kochhar'
Clauza START WITH precizeaz rndurile ce vor fi folosite ca baz a arborelui.
Aceast clauz poate fi folosit n conjunc ie cu orice alt clauz valid .
Exemple:
Folosind tabela EMPLOYEES,
preedintele companiei.

10-288

ncepe i

cu

King

care

este

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
... START WITH manager_id IS NULL
Folosind tabela EMPLOYEES, ncepe i cu angajatul Kochhar.
Condi ia pus
n clauza START WITH poate con ine o
subinterogare.
... START WITH employee_id = (SELECT employee_id
FROM employees WHERE last_name = 'Kochhar')
Dac se omite clauza START WITH, parcurgerea arborelui are la baz
toate rndurile din tabel, acestea fiind luate n considerare drept puncte de
pornire.
Dac este folosit o clauz WHERE, parcurgerea arborelui ncepe de la
toate rndurile care satisfac condi ia WHERE, ceea ce nu reflect o ierarhie
real .
NOT : Clauzele CONNECT BY PRIOR i START WITH nu sunt
ANSI SQL standard.
CONNECT BY PRIOR column1 = column2
Parcurgerea tabelei EMPLOYEES de sus n jos
CONNECT BY PRIOR column1 = column2
... CONNECT BY PRIOR employee_id = manager_id

Direc ia de parcurgere arborelui


De sus n jos
De jos n sus

Column1 = Cheia p rinte Column2 = Cheia copil


Column1 = Cheia copil Column2 = Cheia p rinte

Direc ia de parcurgere a arborelui, fie c este de la p rinte la copil sau de


la copil la p rinte, este determinat de modul de scriere al coloanelor n clauza
CONNECT BY PRIOR. Operatorul PRIOR se refer la rndul p rinte. Pentru a
determina un copil pentru un rnd p rinte, serverul Oracle evalueaz expresia
PRIOR pentru rndul p rinte i cealalt expresie pentru fiecare rnd din tabel.
Rndurile pentru care condi ia este ndeplinit sunt copii pentru p rinte.
Serverul Oracle selecteaz
ntotdeauna copii prin evaluarea condi iei
CONNECT BY din punctul de vedere al ndeplinirii cerin ei legate de rndul
p rinte.

10-289

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu: defini i o rela ie ierarhic
parcurgnd tabelul
EMPLOYEES de sus n jos, astfel nct valoarea pentru
EMPLOYEE_ID din rndul p rinte s fie egal cu cea pentru
MANAGER_ID din rndul copil.
... CONNECT BY PRIOR employee_id = manager_id
Pentru a parcurge tabela de jos n sus condi ia devine :
... CONNECT BY PRIOR manager_id = employee_id
Operatorul PRIOR nu necesit cod, n mod special, imediat dup
CONNECT BY. De exemplu expresia din exemplul de mai sus poate fi scris i
sub forma de mai jos, rezultatul fiind acelai.
... CONNECT BY employee_id = PRIOR manager_id
Aten ie : Clauza CONNECT BY nu poate con ine o subinterogare.

Parcurgerea arborelui de jos n sus


SELECT employee_id, last_name, job_id, manager_id
FROM employees
START WITH employee_id = 101
CONNECT BY PRIOR manager_id = employee_id;

Exemplul afieaz lista efilor ncepnd cu angajatul al c rui ID este 101.


n urm torul exemplu, valorile pentru EMPLOYEE_ID sunt evaluate
pentru rndul p rinte i MANAGER_ID iar valorile salariilor sunt evaluate pentru
rndurile copil. Operatorul PRIOR este aplicat doar asupra valorilor din coloana
EMPLOYEE_ID.
... CONNECT BY PRIOR employee_id = manager_id AND salary > 15000;
Pentru a fi calificat drept rnd copil, acel rnd trebuie s aib valoarea din
coloana MANAGER_ID egal cu valoarea coloanei EMPLOYEE_ID din rndul
10-290

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
p rinte i trebuie s aib salariul mai mare de $15,000.
Parcurgerea arborelui de sus n jos
SELECT last_name||' reports to '||
PRIOR last_name "Walk Top Down"
FROM employees START WITH last_name = 'King'
CONNECT BY PRIOR employee_id = manager_id;

Folosirea pesudocoloanei LEVEL pentru clasificarea rndurilor

Pute i afia n mod explicit rangul sau nivelul unui rnd n ierarhie folosind
pseudocolana LEVEL.
Aceasta va face ca raportul dvs. s fie mult mai explicit. Locurile unde
10-291

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
una sau mai multe ramuri se despart dintr-o ramur mare sunt numite noduri iar
locul unde o ramur ia sfrit se numete frunz sau frunza nodului. Diagrama
de mai sus prezint nodurile unui arbore ntors precum i valorile pentru fiecare
nivel. De exemplu, angajatul Higgens este i p rinte i copil pe cnd angajatul
Davies este doar un copil i o frunz .
Not : un nod rdcin este nodul de cel mai nalt nivel dintr-un
arbore inversat. Un nod copil este un nod care nu este r d cin . Un
nod p rinte este un nod care are copii. Un nod frunz este orice nod
care nu are copiii. Num rule nivelelor ce este returnat de o interogare
ierarhic poate fi limitat de memoria disponibil . n exemplu, King este r d cina
sau nodul p rinte (LEVEL = 1). Kochhar, De Hann, Mourgos, Zlotkey, Hartstein,
Higgens i Hunold sunt copii i deasemeni p rin i (LEVEL = 2). Whalen, Rajs,
Davies, Matos, Vargas, Gietz, Ernst, Lorentz, Abel, Taylor, Grant i Goyal sunt
copii i frunze (LEVEL = 3 i LEVEL = 4).
Valorile pseudocoloanei LEVEL sunt:
Nod r d cin ;
Copil al unui nod r d cin ;
Copil al unui copil , etc.
Formatarea rapoartelor ierarhice folosind LEVEL i LPAD
Crea i un raport care s afieze nivelele de management ale
companiei ncepnd de la nivelul cel mai nalt i identifica i fiecare
nivel de subordonare.
COLUMN org_chart FORMAT A12
SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2) -2,'_')
AS org_chart FROM employees
START WITH last_name='King'
CONNECT BY PRIOR employee_id=manager_id
Se asigneaz nodurilor arborelui cte un num r de nivel folosind func ia
LPAD mpreun cu pseudocoloana LEVEL pentru a afia un raport ierarhic sub
forma unui arbore identat.

LPAD(char1,n [,char2]) ntoarce char1, aliniat la stnga pe lungime de n


n exemplul de mai sus :

caractere folosind secven a de caractere din char2. Argumentul n reprezint


lungimea total a valorii returnate aa cum este afiat pe ecran.

LPAD(last_name,LENGTH(last_name)+(LEVEL*2)-2,'_') definete
formatul de afiare.
10-292

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
char1 este LAST_NAME , n este lungimea total a valorii returnate, adic
lungimea lui LAST_NAME +(LEVEL*2)-2 iar char2 este '_'.
Cu alte cuvinte i se spune motorului SQL s scrie la stnga valorii
LAST_NAME attea caractere '_' cte sunt date de valoarea lui
LENGTH(last_name)+(LEVEL*2)- 2. Pentru King, LEVEL = 1 deci (2 * 1)-2 = 22 = 0, aadar King nu va avea niciun caracter '_' i este afiat n coloana 1.
Pentru Kochhar, LEVEL = 2 deci (2 * 2)-2 = 4-2 = 2 aadar Kochhar va avea 2
caractere '_' i este afiat identat. Celelalte rnduri sunt afiate dup acelai
principiu.

T ierea ramurilor
Folosi i clauza WHERE
pentru a elimina un nod.

Folosi i clauza CONNECT BY


pentru a elimina o ramur .

WHERE last_name != 'Higgins'

CONNECT BY PRIOR
employee_id = manager_id
AND last_name != Higgins'

Pute i folosi clauzele WHERE i CONNECT BY pentru a t ia arborele;


acesta nseamn c pute i controla care noduri i rnduri vor fi afiate.
Predicatul pe care l folosi i ac ioneaz ca o condi ie Boolean .

10-293

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu: Pornind de la r d cin , parcurge i arborele de sus n jos i
elimina i angajatul Higgins din rezultat procesnd ns rndurile copil.
SELECT department_id, employee_id,last_name, job_id, salary
FROM employees WHERE last_name != 'Higgins' START WITH
manager_id IS NULL CONNECT BY PRIOR employee_id = manager_id;
Pornind de la r d cin , parcurge i arborele de sus n jos i elimina i
angajatul Higgins din rezultat i toate rndurile copil.
SELECT department_id, employee_id,last_name, job_id, salary
FROM employees START WITH manager_id IS NULL CONNECT BY PRIOR
employee_id = manager_id AND last_name != 'Higgins';

10-294

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

10.20

Exerci ii

1. Scrie i o interogare care s afieze numele angajatului i data angaj rii


pentru to i angaja ii din acelai departament ca Zlotkey, excluznd-ul pe
Zlotkey.

2. Scrie i o interogare pentru a afia num rul angajatului i numele s u pentru


to i angaja ii care ctig mai mult dect salariul mediu. Sorta i rezultatele
n ordinea descresc toare a salariului.

3. Scrie i o interogare care s afieze num rul i numele angajatului pentru


to i cei care lucreaz ntr-un departament care de ine cel pu in un angajat al

c rui nume con ine litera u . Salva i instruc iunea ntr-un fiier denumit
pq3.sql.
4.

Afia i numele angajatului, num rul departamentului i func ia pe care


lucreaz acesta pentru to i angaja ii al c ror ID de departament este 1700.
10-295

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

5. Afia i numele i salariul tuturor angaja ilor subordona i lui King.

6. Afia i num rul departamentului, numele i func ia tuturor angaja ilor din
departamentul numit Executive.

7. Modifica i pq3.sql pentru a afia num rul, numele i salariul tuturor


angaja ilor care ctig mai mult dect salariul mediu i totodat lucreaz
ntr-un departament care de ine cel pu in un angajat ce con ine n numele
sau litera u . Salva i fiierul ca pq7.sql. Executa i interogarea din nou.

8. Scrie i o interogare care s afieze numele, num rul departamentului i


salariul oric rui angajat al c rui num r de departament i salariu s se
potriveasc cu num rul departamentului i salariul oric rui angajat care
ctig comision.

10-296

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
9. Afia i numele, numele departamentului i salariul oric rui angajat al c rui
salariu i comision se potrivesc cu salariul i comisionul oric rui angajat
care lucreaz n location ID=1700.

10. Scrie i o interogare care s afieze numele, data angaj rii i salariul pentru
to i angaja ii care au acelai salariu i comision ca al lui Kochhar, exclusiv
Kochhar.

11. Scrie i o interogare care s afieze angaja ii care ctig un salariu mai
mare ca al oric rui angajat cu JOB_ID = 'SA_MAN'. Afia i salariile ordonat
de la cel mai mare la cel mai mic.

12. Afia i coloanele employee_ ID, last_ name i department_ID pentru acei
angaja i care locuiesc n orae a c ror nume ncepe cu T.

13. Scrie i o interogare care s afieze to i angaja ii care ctig mai mult dect
salariul mediu din departamentul lor. Afia i coloanele last_name, salary,
department_ID i media salarial pentru departament. Ordona i datele dup
salariul mediu. Folosi i alias-uri pentru coloanele returnate de interogare,
dup exemplul de mai jos.
10-297

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

14. Afia i to i angaja ii ce nu sunt supervisors.


a. Folosi i operatorul NOT EXISTS.

b. Se poate folosi operatorul NOT IN ? Cum, sau de ce nu ?


15. Scrie i o interogare care s afieze numele angaja ilor care ctig
pu in dect media salarial din departamentul lor.

mai

16. Scrie i o interogare care s afieze numele angaja ilor care au unul sau mai
10-298

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
mul i colegi de departament care s
angajare mai trzii.

aib

salarii mai mari i date de

17. Scrie i o interogare care s afieze coloanele employee _ID, last_name i


department_name pentru to i angaja ii. Folosi i n instruc iunea SELECT o
subinterogare scalar pentru a g si numele departamentului.

18. Scrie i o interogare care s afieze numele de departament pentru acele


departamente al c ror cost total cu salariile este peste 1/8 din costul total
cu salariile al ntregii companii. Folosi i clauza WITH. Numi i interogarea
SUMMARY.
DEPARTMENT_NAME DEPT_TOTAL
------------------------------ ---------Executive 58000
Sales 37100

10-299

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
19. Privi i rezultatele de mai jos. Sunt acestea rezultate n urma proces rii unei
subinterog ri ierarhice ? Explica i r spunsul dat.

10-300

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
20. Afia i structura organiza ional a departamentului lui Mourgos specificnd
numele de familie, salariul i id-ul departamentului.

21. Crea i un raport care s afieze ierarhia managerilor pentru angajatul


Lorentz. Afia i mai nti pe eful s u direct.

22. Crea i un raport identat care s afieze ierarhia managerial ncepnd de la


angajatul cu numele Kochhar. Afia i coloanele last_name, manager_ ID
i department_ID. Da i aliasuri coloanelor ca n exemplu.

23. Afia i structura organizatoric a companiei afind ierarhia managerial .


ncepe i cu persoanele de la nivelul superior, exclude i to i angaja ii ce au
job_ ID egal cu IT_PROG i exclude i-l pe De Haan i to i subordona ii
lui.

10-301

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Capitolul 11

Instruc iuni pentru Manipularea Datelor

Obiective:
Descrierea fiec rei comenzi DML(Data Manipulation Language);
Inserarea de nregistr ri ntr-un tabel (INSERT);
Actualizarea nregistr rilor dintr-un tabel (UPDATE);
tergerea nregistr rilor dintr-un tabel (DELETE):
Al turarea rndurilor unei tabele (MERGE):
Controlul tranzac iilor (COMMIT, SAVEPOINT i ROLLBACK).
O comand DML este executat atunci cnd:
- Se ad uga noi nregistr ri n tabel ;
- Se modifica nregistr rile existente ntr-o tabel ;
- Se terg nregistr ri existente dintr-o tabel .
O tranzac ie const
unitate logic de lucru.

dintr-o colec ie de comenzi DML care formeaz

Limbajul de manipulare a datelor (DML) este partea de baza a SQL.


Cnd se dorete ad ugarea, modificarea sau tergerea datelor dintr-o baza de
date, se execut o comand DML. O colec ie de comenzi DML care formeaz o
unitate logic de lucru se numete tranzacie.
Exemplu: Considera i o baz de date din domeniul bancar. Atunci cnd
un client al b ncii dorete s transfere bani dintr-un depozit ntr-un cont curent,
tranzac ia ar putea consta n 3 opera ii separate: sc derea sumei din depozit,
creterea sumei din contul curent, nregistrarea tranzac iei n jurnalul de
tranzac ii. Serverul Oracle trebuie s garanteze c toate cele 3 comenzi SQL
sunt executate n aa fel nct sa men in echilibrul necesar ntre conturi. Atunci
cnd, din anumite cauze, una dintre comenzile tranzac iei de mai sus nu se
execut , atunci celelalte comenzi ale tranzac iei trebuie s fie anulate.
Ad ugarea unei noi nregistr ri ntr-un tabel.
Imaginea de mai jos ilustreaz ad ugarea unui nou departament n
tabelul DEPARTMENTS.

11-302

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

11.1 Introducerea datelor-comanda INSERT


Folosind comanda INSERT se pot ad uga noi nregistr ri ntr-un tabel.
INSERT INTO table [(column [, column...])]
VALUES (value [, value...]);
n descrierea sintaxei:
tabel
este numele tabelului din baza de date.
coloana
este numele coloanei din tabelul respectiv.
valoare
este valoarea corespunz toare coloanei.
Not : Folosind aceast sintax pentru comanda INSERT se adaug
numai cte un rnd odat la un tabel.
La inserarea unei noi nregistr ri con innd valori pentru fiecare coloan ,
valorile se dau n ordinea prestabilit a coloanelor din tabel, precizarea
coloanelor fiind op ional .
INSERT INTO departments(department_id, department_name,
manager_id, location_id)
VALUES (70, 'Public Relations', 100, 1700);

11-303

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
DESCRIBE departments

Pentru claritate, preciza i lista coloanelor n sintaxa INSERT.


ncadra i ntre ghilimele simple doar irurile de caractere i datele
calendaristice nu i valorile numerice.
Inserarea de nregistr ri cu valori de NULL
Metoda implicit : Omiterea coloanei din list .
INSERT INTO departments (department_id,
department_name )
VALUES (30, 'Purchasing');
Metoda explicit :
Specificarea cuvntului cheie NULL n lista de la clauza VALUES.
Specifica i irul vid () n lista VALUES (numai pentru iruri de caractere
i pentru valori de tip dat calendaristic ).
INSERT INTO departments
VALUES (100, 'Finance', NULL, NULL);
Asigura i-v c pentru coloana vizat este permis valoarea NULL.
Serverul Oracle aplic automat toate constrngerile de integritate, de
domeniu i tip pentru date. Orice coloan care nu este specificat explicit n
list , va primi o valoare nul n noua nregistrare.

Erorile uzuale ce apar la introducerea datelor sunt :


Lipsa unei valori obligatoriu a fi introdus pentru o coloan ce nu
admite valori de NULL ;
Valori multiple care ncalc constrngerea de unicitate;
Valori care duc la nc lcarea constrngerii de tip cheie str in ;
Valori care duc la nc lcarea constrngerii de tip CHECK ;
Tip de data eronat;
Valoare mai mare dect maxima admis pentru acea coloan .

11-304

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Inserarea unor valori speciale
Func ia SYSDATE furnizeaz data i timpul curent.
INSERT INTO EMPLOYEES (EMPLOYEE_id,first_name,
last_name,email, phone_number,hire_date, job_id,
salary,commission_pct, manager_id,department_id)
VALUES (113,'Louis', 'Popp','LPOPP', '515.124.4567',
SYSDATE, 'AC_ACCOUNT', 6900,NULL, 205, 100);
Exemplul de mai sus nregistreaz informa ia pentru angajatul Popp n
tabela EMPLOYEES. Pentru a introduce data i ora curent n cmpul
HIREDATE este folosit func ia SYSDATE.
Se poate de asemeni folosi func ia USER la introducerea de valori ntr-un
tabel. Func ia USER furnizeaz numele utilizatorului curent.
Verificarea datelor ad ugate n tabel:
SELECT EMPLOYEE_id, last_name, job_id, hire_date,
commission _pct FROM EMPLOYEES WHERE EMPLOYEE_id = 113;

Inserarea unor valori specifice de tip dat calendaristic


Exemplu: Ad ugarea unui nou angajat
INSERT INTO EMPLOYEES VALUES
(114,'Den', 'Raphealy','DRAPHEAL', '515.127.4561', TO_DATE ('FEB 3,
1999', 'MON DD, YYYY'), 'AC_ACCOUNT', 11000, NULL, 100, 30);
Formatul DD-MON-YY este de obicei folosit pentru a insera o valoare de
tip dat calendaristic . Cu acest format, secolul este implicit cel curent.
Deoarece data con ine de asemenea informa ii despre timp, ora implicit este
00:00:00.
Dac o dat calendaristic necesit specificarea altui secol sau or ,
trebuie folosit func ia TO_DATE.
n exemplu se nregistreaz informa ia despre angajatul Raphealy n
tabela EMPLOYEES. Cmpul HIREDATE primete valoarea February 3, 1999.
Inserarea de valori folosind variabile de substitu ie
Se poate scrie o comand

INSERT care s

permit

utilizatorului s
11-305

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
adauge valori n mod interactiv folosind variabilele de substitu ie SQL*Plus.
De exemplu, se introduc informa iile pentru un nou departament n tabelul
DEPARTMENTS. Num rul departamentului, numele i loca ia sunt cerute
interactiv utilizatorului.
Pentru valori de tip dat calendaristic sau ir de caractere, ampersandul
(&) i numele variabilei sunt ncadrate de ghilimele simple (apostrof).
INSERT INTO departments
(department_id, department_name, location_id)
VALUES (&department_id, '&department_name',&location);

Crearea unui script


Un script este un fiier cu extensia sql n care sunt memorate instruc iuni.
Comenzile, care pot sa con in i variabile de substitu ie, pot fi salvate
ntr-un fiier. Acesta poate fi executat i la fiecare execu ie sunt cerute valori noi
pentru variabile. La execu ia comenzii SQL*Plus ACCEPT, valorile date
variabilelor pot fi diferite, deci se poate folosi acelai script pentru a introduce
valori diverse n tabel .
ACCEPT expr PROMPT textul specificat
Comanda ACCEPT memoreaz valoarea introdus
variabila expr iar PROMPT afieaz textul specificat.

de utilizator n

ACCEPT department_id PROMPT 'Introducei numrul


departamentului:'
ACCEPT department_name PROMPT 'Introducei numele
departamentului:'
ACCEPT location_id PROMPT 'Introducei oraul:'
INSERT INTO departments
(department_id, department_name, location_id)
VALUES (&department_id, '&department_name',&location);
Parametrul de substitu ie SQL*Plus nu trebuie precedat de & cnd este
referit ntr-o comanda ACCEPT. Pentru a continua o comanda SQL*PLUS pe
linia urm toare se folosete caracterul -.
Copierea nregistr rilor dintr-un alt tabel folosind comanda INSERT
cu o subinterogare
11-306

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Comanda INSERT poate fi folosit pentru a adaug nregistr ri ntr-un
tabel, valorile pentru cmpuri fiind extrase dintr-un tabel existent. Pentru
aceasta se folosete n locul clauzei VALUES o subinterogare.
INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT EMPLOYEE_id, last_name, salary, commission_pct
FROM EMPLOYEES WHERE job_id LIKE '%REP%';
4 rows created.
INSERT INTO tabel [ coloana ( , coloana ) ] Subinterogare;
unde:
tabel
este numele tabelului din baza de date
coloana este numele coloanei din tabelul n care se face inserarea.
subinterogare
este subinterogarea care returneaz nregistr rile n tabel.
Num rul i tipul cmpurilor (coloanelor) din lista specificat n
comanda INSERT trebuie s corespund num rului i tipului valorilor
din subinterogare.
Folosirea subinterogarilor n comanda INSERT
INSERT INTO
(SELECT employee_id,last_name,email,hire_date,job_id,salary,
department_id FROM employees WHERE department_id = 50)
VALUES (99999, 'Taylor', 'DTAYLOR',
TO_DATE('07-JUN-99', 'DD-MON-RR'),'ST_CLERK', 5000, 50);
1 row created.
n cadrul comenzii INSERT se poate folosi o subinterogare n locul
numelui tabelului. Instruc iunea SELECT a subinterog rii trebuie s aib acelai
num r de coloane ca i cel din clauza VALUES. Pentru ca INSERT s fie
executat satisf c tor trebuie s ine i cont de toate regulile care se aplic
asupra coloanelor din tabelul de baz . De exemplu, nu pute i introduce valori
duplicat sau nu este permis lipsa unei valori pentru o coloan care este
obligatoriu NOT NULL.

11-307

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

11.2 Modificarea datelor - comanda UPDATE

Figura de mai sus arat modificarea num rului departamentului pentru


cei din departamentul 60 n 30.
nregistr rile existente pot fi modificate folosind comanda UPDATE.

UPDATE table
SET column = value [, column = value,...]
[WHERE condition];
n sintaxa de mai sus:
tabel
este numele tabelului;
coloana este numele coloanei din tabelul n care se face modificarea;
Valoare este noua valoare sau o subinterogare ce produce noua valoare pentru
coloana ce se modific ;
Condiie identific nregistr rile care trebuie modificate i este alc tuita din
expresii, nume de coloane, constante, subinterog ri i operatori de
comparare.
Folosind comanda UPDATE se pot modifica simultan valorile pentru unul
sau mai multe rnduri din tabel .
Pute i avea confirmarea execut rii opera iei de modificare prin interogarea
11-308

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
tabelului, afind rndurile modificate.
NOT : n general, folosi i cheia primara pentru a identifica o singur
nregistrare. Folosirea altor coloane poate determina modificarea mai
multor nregistr ri.
De exemplu, identificarea unei singure nregistr ri n tabelul
EMPLOYEES prin nume poate fi periculoas , deoarece pot exista
mai mul i angaja i cu acelai nume.
Comanda UPDATE modific anumite nregistr ri dac este specificat
clauza WHERE. Exemplul urm tor transfer angajatul cu num rul 113 n
departamentul 70.
UPDATE employees
SET department_id = 70
WHERE employee_id = 113;
1 row updated.
Dac omite i clauza WHERE, sunt modificate toate nregistr rile dintr-un tabel.
UPDATE copy_emp
SET department_id = 110;
22 rows updated.

Actualizarea nregistr rilor folosind subinterog ri dup mai multe cmpuri


n clauza SET a unei comenzi UPDATE pot fi implementate subinterog ri
dup mai multe cmpuri.
UPDATE table
SET column = (SELECT column
FROM table WHERE condition)
[ , column =
(SELECT column
FROM table
WHERE condition)]
[WHERE condition ] ;
Modific pentru angajatul cu num rul 114 func ia i salariul astfel
nct ele s coincid cu cele ale angajatului num rul 205.

11-309

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
UPDATE employees SET
job_id = (SELECT job_id FROM employees WHERE employee_id = 205),
salary = (SELECT salary FROM employees WHERE employee_id = 205)
WHERE employee_id = 114;
1 row updated.

Actualizarea nregistr rilor folosind valori dintr-un alt tabel


Exemplul de mai jos arat cum se pot folosi subinterog ri n comenzi
UPDATE pentru a actualiza nregistr rile dintr-un tabel pe baza valorilor din alt
tabel.
UPDATE copy_emp
SET department_id = (SELECT department_id FROM employees
WHERE employee_id = 100)
WHERE job_id = (SELECT job_id FROM employees
WHERE employee_id = 200);
1 row updated.

nc lcarea constrngerii de integritate


UPDATE employees
SET department_id = 55 WHERE department_id = 110;
Dac ncerca i s atribui i unui cmp o valoare care este
legat de o constrngere de integritate, va rezulta o eroare.
n exemplul de mai sus, departamentul cu num rul 55 nu exista n tabelul
p rinte, DEPARTMENTS, i astfel ve i ob ine eroarea parent key violation ORA02291 aa cum se arata mai jos.
UPDATE employees
*
ERROR at line 1:
ORA-02291: integrity constraint (HR.EMP_DEPT_FK)
violated-parent key not found
NOT : Constrngerile de integritate asigur faptul c datele ader la
un set predefinit de reguli. Un capitol urm tor va dezvolta acest
subiect mai pe larg.

11-310

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
11.3 tergerea datelor - comanda DELETE
Folosind comanda DELETE se pot terge nregistr ri dintr-un tabel.
DELETE [FROM] table
[WHERE condition];
n sintaxa:
tabel
este numele tabelei.
Condiie identific nregistr rile care trebuie terse i este alc tuit din expresii,
nume de coloane, constante, subinterog ri i operatori de comparare.
Se pot terge doar anumite nregistr ri prin specificarea clauzei WHERE
n comanda DELETE. Exemplul de mai jos arat cum se procedeaz pentru a
terge departamentul 'Finance' din tabelul DEPARTMENTS. V pute i asigura
c tergerea s-a f cut corect, ncercnd afiarea rndurilor terse printr-un
SELECT.
DELETE FROM departments
WHERE department_name = 'Finance';
1 row deleted.
SELECT *
FROM departments WHERE department_name = 'Finance';
no rows selected.
DELETE FROM copy_emp;
Dac se omite clauza WHERE se vor terge toate rndurile din tabela.
tergerea nregistr rilor folosind valori dintr-un alt tabel
Folosi i subinterog ri n comanda DELETE pentru a terge nregistr rile
dintr-un tabel pe baza valorilor din alt tabel.
DELETE FROM employees
WHERE department_id = (SELECT department_id
FROM departments WHERE department_name LIKE
'%Public%');
1 row deleted.
11-311

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Pute i folosi subinterog ri pentru a terge nregistr ri dintr-un tabel,
folosind informa iile din alt tabel. Exemplul de mai sus terge to i angaja ii care
sunt n departamentul ce con ine n numele sau irul 'Public'. Subinterogarea
caut n tabela DEPARTMENTS num rul de departament pentru 'Public', apoi
furnizeaz
num rul de departament interog rii principale, care terge
nregistr ri din EMPLOYEES pe baza acestuia.

nc lcarea constrngerii de integritate


Dac ncerca i tergerea unei nregistr ri care con ine un cmp cu o
valoare legat de o constrngere de integritate, ve i ob ine o eroare.
n exemplul de mai jos se ncearc tergerea departamentului cu num rul
60 din tabelul DEPARTMENTS. tergerea provoac o eroare deoarece
num rul de departament este folosit ca i cheie extern n tabelul
EMPLOYEES. Dac nregistrarea p rinte pe care ncerca i s o terge i are
nregistr ri copil, atunci ve i primi un mesaj de eroare: child record found
violation ORA-02292.
DELETE FROM departments
WHERE department_id = 60;
DELETE FROM departments
*
ERROR at line 1:
ORA-02292: integrity constraint (HR.EMP_DEPT_FK)
violated-child record found
Nu pute i terge o nregistrare care con ine o cheie primar
folosit ca cheie extern n alt tabel.

Folosirea sintagmei WITH CHECK OPTION n instruc iuni de tip DML


n exemplul de mai jos se folosete o subinterogare pentru a identifica
tabelul i coloanele pentru instruc iunea DML.
Sintagma WITH CHECK OPTION mpiedic schimbarea rndurilor care
nu sunt n subinterogare.
INSERT INTO (SELECT employee_id, last_name,
email,hire_date, job_id, salary FROM employees
WHERE department_id = 50 WITH CHECK OPTION)
VALUES (99998, 'Smith', 'JSMITH',TO_DATE('07-JUN-99',
'DD- MON-RR'),'ST_CLERK', 5000);
11-312

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
INSERT INTO
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
Specifica i WITH CHECK OPTION pentru a indica faptul c , dac se
folosete o subinterogare n locul numelui tabelului ntr-o instruc iune de tip
INSERT, UPDATE sau DELETE nu sunt permise nici un fel de schimb ri
asupra rndurilor care nu sunt n subinterogare.
n exemplu este folosit
sintagma WITH CHECK OPTION.
Subinterogarea identific rndurile care sunt n departamentul 50, dar
department_ID nu este n lista de la SELECT deci nu este prev zut o valoare
pentru department_id n lista clauzei VALUES. nserarea acestui rnd, care are
pentru department_ID valoarea null, ar duce la nserarea unei valori care nu
este n subinterogare.
Folosirea op iunii DEFAULT explicit
Folosind op iune DEFAULT explicit pute i s folosi i cuvntul cheie
DEFAULT drept valoare pentru o coloan acolo unde aceasta este necesar .
Introducerea acestei op iuni a fost f cut n scopul alinierii la cerin ele
standardului SQL: 1999. Ea permite utilizatorului s controleze locul i timpul la
care op iunea DEFAULT va fi aplicat datelor.
Op iunea DEFAULT explicit poate fi folosit n instruc iunile INSERT i
UPDATE pentru a identifica o valoare implicit pentru coloan . Dac nu exist o
valoare implicit se va folosi valoarea NULL.
DEFAULT cu INSERT
INSERT INTO departments
(department_id, department_name, manager_id)
VALUES (300, 'Engineering', DEFAULT);
DEFAULT cu UPDATE
UPDATE departments
SET manager_id = DEFAULT WHERE department_id = 10;
n primul exemplu, instruc iunea INSERT folosete o valoare implicit
pentru coloana MANAGER_ID. Dac nu este definit nicio valoare implicit
pentru aceast coloana se va insera o valoare de NULL.
Cel de-al doilea exemplu folosete instruc iunea UPDATE pentru a atribui
coloanei MANAGER_ID valoarea implicit pentru cei din departamentul 10.
11-313

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Dac
nu este definit
o valoare implicit , valoarea pentru coloana
MANAGER_ID va fi NULL.
Valoarea implicit pentru o coloan se specific n momentul cre ri
tabelei.

11.4 Instruciunea MERGE

Prevede posibilitatea de a introduce sau modifica datele din tabel n


mod condi ionat;
Execut un UPDATE dac rndul exist i un INSERT dac este un
rnd nou;
Previne scrierea mai multor instruc iuni UPDATE ;
Este uor de folosit i duce la creterea performantelor:
Este folositoare n aplica ii ce gestioneaz volum mare de date.

SQL a fost extins n vederea introducerii instruc iunii MERGE. Folosind


aceasta instruc iune se pot modifica sau insera rnduri ntr-o tabel n mod
condi ionat ceea ce previne scrierea mai multor instruc iuni UPDATE. Decizia
de a modifica sau introduce rnduri n tabela inta se bazeaz pe clauza
condi ional ON.
Deoarece instruc iunea MERGE combin instruc iunile INSERT i
UPDATE, trebuie s ave i drepturi pentru modificarea sau ad ugarea de rnduri
n tabela int i dreptul de a selecta datele din tabela surs .
Instruc iunea MERGE este determinist . Nu pute i s face i UPDATE de
mai multe ori asupra aceluiai rnd din tabela folosind aceeai instruc iune
MERGE.
O abordare alternativ ar fi folosirea buclelor PL/SQL i mai multe
instruc iuni DML. Instruc iunea MERGE este dealtfel uor de folosit i mult mai
simplu de scris fiind o singur instruc iune de tip SQL.
Instruc iunea MERGE este potrivit pentru unele aplica ii de tip
warehousing. De exemplu, ntr-o asemenea aplica ie s-ar putea s fi i nevoi i s
lucra i cu date ce provin din mai multe surse, unele dintre ele putnd fi
duplicate. Folosind instruc iunea MERGE pute i ad uga sau modifica rndurile
n mod condi ionat.

11-314

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
MERGE INTO table_name AS table_alias
USING (table|view|sub_query) AS alias
ON (join condition)
WHEN MATCHED THEN
UPDATE SET
col1 = col_val1,
col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list)
VALUES (column_values);
n sintaxa :
INTO
specific tabela inta pe care se face UPDATE sau INSERT ;
USING
identific sursa datelor ce vor fi modificate sau inserate; poate fi o
tabel , view sau subinterogare ;
ON
clauz condi ional pe baza c reia MERGE execut fie modificarea
fie inserarea datelor ;
WHEN MATCHED
d instruc iuni serverului asupra felului n care s
Sau r spund la rezultatul condi iei de join.
WHEN NOT MATCHED
MERGE INTO copy_emp AS c
USING employees e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
...
c.department_id = e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date, e.job_id,
e.salary, e.commission_pct, e.manager_id,
e.department_id);
n exemplul de mai sus este evaluat condi ia c.employee_id =
e.employee_id. Deoarece tabela COPY_EMP nu are nregistr ri, condi ia
returneaz false deci se execut clauza WHEN NOT MATCHED iar
instruc iunea MERGE insereaz rndurile din tabela EMPLOYEES n tabela
COPY_EMP.
Dac tabela COPY_EMP ar con ine rnduri care ar avea n coloana
employee_ID valori egale cu cele din tabela EMPLOYEES, aceste rnduri din
tabela COPY_EMP ar fi modificate pentru a con ine valori identice cu cele din
tabela EMPLOYEES.
11-315

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
11.5

Tranzacii

Tranzac iile constau dintr-un grup format din urm toarele comenzi:

Comenzi DML care duc la o schimbare consistent a datelor;


O comanda DDL;
O comanda DCL.

Serverul Oracle asigur consisten a datelor pe baza tranzac iilor.


Tranzac iile ofer mai mult flexibilitate i control la modific ri aduse datelor i
asigur consisten a datelor n eventuala c dere a sistemului sau n cazul unei
erori a procesului utilizator.
Tranzac iile constau din comenzi DML care realizeaz o schimbare
consistenta asupra datelor. De exemplu, un transfer de fonduri ntre dou
conturi ar trebui sa includ modificarea debitului unui cont i creditului celuilalt
cont cu aceeai sum de bani. Ambele ac iuni ar trebui fie s reueasc
mpreun , fie sa eueze mpreun . Opera ia de creditare nu ar trebui sa poat fi
efectuata f r ca cea de debitare sa fie executat cu succes.
Tipuri de tranzac ii:
Tip

Descriere

Limbaj de manipulare a
datelor (DML)

Consta din orice num r de comenzi DML pe care


serverul Oracle le trateaz ca o singur entitate sau
unitate logic de lucru.

Limbaj de definire a
datelor (DDL)

Const dintr-o singur comand DDL

Limbaj de control al
datelor (DCL)

Const dintr-o singur comand DCL

Tranzac ii n baze de date:

ncep odat cu execu ia primei comenzi SQL executabile;


Se termin la apari ia unuia dintre urm toarele evenimente:
- COMMIT sau ROLLBACK;
- Execu ia unei comenzi DDL sau DCL ( automatic commit);
- Deconectarea utilizatorului;
- C derea sistemului.

Dup ce se ncheie o tranzac ie, urm toarea tranzac ie va ncepe


automat la prima comanda SQL executabila ntlnit . Rezultatele unei comenzi
11-316

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
DDL sau DCL sunt salvate automat (automat commit) motiv pentru care
tranzac ia se ncheie n mod implicit.
Avantajele comenzilor COMMIT i ROLLBACK:
Asigur consisten a datelor;
Ofer posibilitatea revederii schimb rilor f cute nainte de a le salva;
Grupeaz opera ii rela ionate logic.
Controlul tranzac iilor

Comenzi pentru controlul explicit al tranzac iilor


Pute i controla logica tranzac iilor folosind comenzile;
COMMIT,SAVEPOINT i ROLLBACK.
Controlul tranzac iilor
INSERT
COMMIT

UPDATE

INSERT

DELETE

Savepoint A

Savepoint B

ROLLBACK to Savepoint B

ROLLBACK to Savepoint A

ROLLBACK

11-317

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Comanda

Descriere

COMMIT

ncheie actuala tranzac ie f cnd ca toate modific rile


s devin permanente (salveaz modific rile)

SAVEPOINT nume

Marcheaz un punct de ntoarcere (savepoint) n cadrul


tranzac iei curente

ROLLBACK
[TO SAVEPOINT
name]

Comanda ROLLBACK ncheie tranzac ia curent ,


pierzndu-se toate modific rile temporare (pending
changes) asupra datelor. ROLLBACK TO SAVEPOINT
name terge savepoint-ul i toate schimb rile de dup el
(temporare).

Not : SAVEPOINT nu este ANSI standard SQL.


UPDATE... SAVEPOINT update_done;
Savepoint created.
INSERT... ROLLBACK TO update_done;
Rollback complete.
Procesarea implicit a tranzac iilor
Un commit (salvarea modific rilor) automat are loc n urm toarele circumstan e:
Este dat o comanda DDL;
Este dat o comanda DCL;
O p r sire normal a mediului SQL*Plus, f r a da explicit o comand
COMMIT sau ROLLBACK.
Un rollback automat are loc n condi iile unei termin ri anormale a
sesiunii SQL*Plus sau n cazul unei 'c deri' de sistem.
Stare

Circumstan e

Commit automat

Comanda DDL sau DCL


Ieire normal din SQL*Plus, f r o comand
COMMIT sau ROLLBACK explicit

Rollback automat

Terminare anormal a SQL*Plus sau c dere sistem

11-318

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Not : n SQL*Plus mai este disponibil i o a treia comand .
Comanda SQL*Plus AUTOCOMMIT poate fi setat ON sau OFF.
Dac este setat pe ON, fiecare comand DML individual duce la
salvarea modific rilor, imediat ce este executat . Nu se mai poate
reveni la situa ia dinainte (un rollback nu mai este posibil). Dac este setat pe
OFF, COMMIT poate fi dat explicit. De asemeni, COMMIT este executat
odat cu o comanda DDL sau la ieirea din SQL*Plus.
C derile sistemului: Cnd o tranzac ie este ntrerupt de o c dere a
sistemului, ntreaga tranzac ie este automat pierdut (este 'rolled back').
Aceasta mpiedic ca eroarea s determine schimb ri nedorite asupra datelor i
reface starea bazelor din momentul ultimului COMMIT (explicit sau implicit).
Astfel, SQL*Plus p streaz integritatea tabelelor (bazelor de date).

Salvarea modific rilor


Fiecare modificare efectuat n timpul tranzac iei este temporar pn la
apari ia unui 'commit' (pn la 'salvarea' tranzac iei).

Starea datelor nainte de un COMMIT sau ROLLBACK


Opera iile de manipulare a datelor afecteaz ini ial buffer-ul bazei de
date; de aceea, starea ini ial a datelor poate fi ref cut .
Utilizatorul curent poate urm ri schimb rile f cute prin interogarea
tabelelor.
Al i utilizatori nu pot vedea modific rile f cute de utilizatorul curent.
Serverul Oracle instituie o consisten la citire pentru a se asigura c fiecare
utilizator vede datele aa cum existau ele n momentul ultimei salv ri.
nregistr rile afectate sunt protejate (locked); al i utilizatori nu pot face
modific ri asupra lor.
Starea datelor dup COMMIT

Modific rile asupra datelor din baza de date devin permanente.


Starea anterioar a datelor nu mai poate fi ref cut .
To i utilizatorii pot vedea rezultatele.
nregistr rile protejate (locked) sunt deblocate pentru modificare i pot fi
schimbate de al i utilizatori.
Toate savepoint-urile sunt terse.
11-319

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Exemplu : Facei modificrile:


DELETE FROM employees WHERE employee_id = 99999;
1 row deleted.
INSERT INTO departments VALUES (290, 'Corporate Tax', NULL,
1700);
1 row inserted.
Salva i modific rile
COMMIT;
Commit complete.
Exemplul de mai sus terge din tabelul EMPLOYEES rndul ce are
employee_id egal cu 99999 i apoi introduce n tabela DEPARTMENTS un rnd
nou. Prin folosirea comenzii COMMIT modific rile devin permanente.
Starea datelor dup ROLLBACK
Pentru a anula modific rile temporare f cute folosi i comanda ROLLBACK.
Modific rile aduse datelor sunt pierdute.
Starea anterioar a datelor este ref cut .
Protec ia asupra nregistr rilor implicate este ridicat .
Exemplu:
ncercnd s terge i o nregistrare din tabelul TEST, pute i terge
accidental ntreg tabelul. Pute i corecta greeala, iar apoi s da i comenzile
corecte i s salva i modific rile.
DELETE FROM test;
25,000 rows deleted.
ROLLBACK;
Rollback complete.
DELETE FROM test WHERE id = 10
1 row deleted.
SELECT * FROM test WHERE id = 100;
No rows selected.
COMMIT;
Commit complete.
Anularea modific rilor pana la un savepoint
Pute i crea un marcaj n cadrul tranzac iei curente folosind comanda
SAVEPOINT. Astfel, tranzac ia poate fi mp r it n sec iuni mai mici. Pute i apoi
anula modific rile temporare pn la acel marcaj folosind comanda ROLLBACK
TO SAVEPOINT.
Dac crea i un al doilea savepoint cu acelai nume ca unul anterior,
11-320

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
savepoint-ul anterior este ters.
Rollback la nivel de comand
Se poate anula o parte din tranzac ie printr-un rollback implicit dac este
detectat o eroare la execu ia unei comenzi. Dac o singur comanda DML
eueaz n timpul execu iei unei tranzac ii, efectul ei este anulat printr-un
rollback la nivel de comand , dar schimb rile f cute de comenzile DML
anterioare n tranzac ie nu vor fi anulate. Ele pot fi salvate (commited) sau
anulate (rolled back) n mod explicit de c tre utilizator.
Oracle execut o comanda COMMIT implicit nainte i dup orice
comanda DDL.
Deci, chiar dac comanda DDL nu se execut cu succes, nu pute i anula
comenzile anterioare pentru c serverul a executat un commit (a salvat
modific rile).
Este bine ca tranzac iile s fie explicit finalizate prin executarea unei
comenzi COMMIT sau ROLLBACK.
11.6 Consistena la citire

Consistenta la citire garanteaz o vedere consistent datelor n fiecare


moment.
Schimb rile f cute de un utilizator nu intr n conflict cu schimb rile
realizate de un altul.
Asigur c , pentru aceleai date:
- Cei care citesc datele nu trebuie s i atepte pe cei care le
modific ;
- Cei care modific datele s nu trebuie s i atepte pe cei care
le citesc.

Utilizatorii bazei de date acceseaz tabelele din baza n dou moduri:


- Opera ii de citire (comanda SELECT);
- Opera ii de scriere (comenzile INSERT, UPDATE, DELETE).
Consisten a la citire este necesar pentru ca:
- Cei care citesc/modific datele s aib o vedere consistent a datelor;
- Cei care citesc datele s nu vad datele care sunt n curs de modificare;
- Cei care modific datele s aib siguran a c schimb rile n baza de date
se fac n mod consistent;
- Schimb rile f cute de un utilizator s nu intre n conflict sau s afecteze
schimb rile f cute de un altul.
Scopul consisten ei la citire este s asigure c fiecare utilizator vede
datele n starea n care erau la ultima salvare, nainte s nceap o opera ie
DML.
11-321

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Consisten a la citire este implementat n mod automat. Este


p strat o copie par ial a bazei de date n segmente rollback.

Cnd se realizeaz o opera ie de ad ugare, actualizare sau tergere


asupra bazei de date, serverul Oracle scrie o copie a datelor dinainte de
modificare ntr-un segment rollback.
To i utilizatorii, cu excep ia celui care a ini iat modificarea, v d baza de
date n starea de dinaintea nceperii modific rii; ei vad datele din segmentul
rollback.
nainte ca schimb rile s fie salvate n baza de date, numai utilizatorul
care modific datele vede baza de date modificat , to i ceilal i v znd datele din
segmentul rollback. Aceasta garanteaz c utilizatorii citesc consistent datele
care nu sufer schimb ri chiar n acel moment.
Cnd o comand DML este salvat , schimbarea f cut n baza de date
devine vizibil oricui execut o comanda SELECT. Spa iul ocupat de 'vechile'
date din segmentul rollback este eliberat pentru a fi reutilizat.
Dac tranzac ia este anulat , schimb rile sunt la rndul lor anulate.
Versiunea original mai veche a datelor din segmentul rollback este
scris napoi n tabel. To i utilizatorii v d baza de date aa cum era nainte de a
ncepe tranzac ia.

Protec ia la scriere (locking)


Protec ia Oracle:
Previne interac iunile destructive ntre tranzac ii concurente;
Nu necesit ac iuni din partea utilizatorului;
Folosete n mod automat cel mai mic nivel de restric ionare;
Este valabil pe durata unei tranzac ii.
Exista dou modalit i de protec ie : Exclusiv i Partajat .
Protec iile (locking) sunt mecanisme care previn interac iunea destructiv
ntre tranzac ii ce acceseaz aceeai resurs : fie un obiect utilizator (de
exemplu tabele sau nregistr ri), fie obiecte sistem care nu sunt vizibile
utilizatorilor (de exemplu structuri de date partajate i nregistr ri "data
dictionary").

11-322

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Cum protejeaz Oracle datele
Protejarea unei baze de date Oracle este automatizat n ntregime i nu
necesit ac iuni din partea utilizatorului. Implicit, protejarea are loc pentru toate
comenzile SQL cu excep ia lui SELECT. Mecanismul implicit de protec ie n
Oracle folosete n mod automat cel mai mic nivel aplicabil de restric ionare,
furniznd astfel cel mai mare grad de concuren
existent, precum i
integritatea maxima a datelor. Oracle permite i protejarea manual a datelor
de ctre utilizator.
Oracle folosete dou moduri de protec ie ntr-o baz de date
multiutilizator.
Mod de protec ie
exclusiv
(exclusiv lock)

partajat
(share lock)

Descriere
mpiedic partajarea unei resurse.
Prima tranzac ie care blocheaz resursa n mod exclusiv
este singura tranzac ie care poate modifica resursa pn
cnd protec ia exclusiv este anulat .
Permite partajarea resursei.
Mai mul i utilizatori care citesc datele le pot folosi n comun
prin crearea unor protec ii partajate ce mpiedic accesul
concurent pentru scriere (care necesit o protec ie
exclusiv ).
Mai multe tranzac ii pot ob ine protec ii partajate pentru
aceeai resurs .

11.7 Correlated UPDATE


n cazul instruc iunii UPDATE se poate folosi o subinterogare corelat
pentru a modifica rndurile dintr-un tabele pe baza valorilor dintr-un alt tabel.
UPDATE table1 alias1
SET column = (SELECT expression
FROM table2 alias2
WHERE alias1.column = alias2.column);
ALTER TABLE employees
ADD(department_name VARCHAR2(14));
UPDATE employees e
SET department_name =
(SELECT department_name
FROM departments d
WHERE e.department_id = d.department_id);
11-323

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplul de mai sus ad ug o coloana la tabelul EMPLOYEES pentru
numele departamentului i apoi introduce valori n aceast coloana folosind un
UPDATE corelat.
Folosi i o comanda UPDATE corelat pentru a modifica rndurile din
tabela EMPLOYEES pe baza valorilor din tabela REWARDS.
UPDATE EMPLOYEES
SET salary = (SELECT EMPLOYEES.salary +
rewards.pay_raise
FROM rewards
WHERE EMPLOYEE_id =
EMPLOYEES.EMPLOYEE_id
AND payraise_date =
(SELECT MAX(payraise_date)
FROM rewards
WHERE
EMPLOYEE_id = EMPLOYEES.EMPLOYEE_id))
WHERE EMPLOYEES.EMPLOYEE_id
IN (SELECT EMPLOYEE_id FROM rewards);
Acest exemplu folosete tabela REWARDS care are coloanele
EMPLOYEE_ID, PAY_RAISE i PAYRAISE_DATE. De fiecare dat cnd un
angajat primete o cretere de salariu se nregistreaz n aceast tabel un
rnd ce con ine valoarea pentru EMPLOYEE_ ID, valoarea creterii salariale i
data la care a fost executat . Tabela REWARDS poate con ine mai multe
rnduri care s aib aceeai valoare pentru cmpul EMPLOYEE_ID. Coloana
PAYRAISE_DATE are menirea de a identifica cea mai recent cretere
salarial primit de un angajat. n exemplu, coloana SALARY din tabela
EMPLOYEES este actualizat astfel nct s reflecte ultima cretere salarial
primit de un angajat. Acest lucru se realizeaz prin ad ugarea la salariul
actual a m ririi de salariu corespunz toare din tabela REWARDS.

11.8 Correlated DELETE


DELETE FROM table1 alias1
WHERE column operator
(SELECT expression FROM table2 alias2
WHERE alias1.column = alias2.column);
n cazul unei instruc iuni DELETE se poate folosi o subinterogare corelat
pentru a terge acele rnduri care exist i ntr-o alt tabel .
11-324

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
De exemplu, dac decide i ca n tabela JOB_HISTORY s p stra i doar
ultimele patru nregistr ri pentru un angajat, atunci cnd un angajat se
transfer pe o a cincea func ie, ve i terge cel mai vechi rnd din tabel
privitor la angajatul n discu ie prin c utarea valorii MIN(START_DATE).
Exemplul ilustreaz rezolvarea acestei probleme folosind un DELETE corelat.
DELETE FROM job_history JH
WHERE EMPLOYEE_id =
(SELECT EMPLOYEE_id FROM EMPLOYEES E
WHERE JH.EMPLOYEE_id = E.EMPLOYEE_id
AND START_DATE = (SELECT MIN(start_date)
FROM job_history JH
WHERE JH.EMPLOYEE_id = E.EMPLOYEE_id)
AND 5 > (SELECT COUNT(*)
FROM job_history JH
WHERE JH.EMPLOYEE_id = E.EMPLOYEE_id
GROUP BY EMPLOYEE_ID
HAVING COUNT(*) >= 4));
Folosi i o subinterogare corelat pentru a terge doar acele rnduri
din tabela EMPLOYEES care exist i n tabela
EMPLOYEES_HISTORY.
DELETE FROM EMPLOYEES E
WHERE EMPLOYEE_id = (SELECT EMPLOYEE_id
FROM EMPLOYEES_history WHERE EMPLOYEE_id =
E.EMPLOYEE_id);
n acest exemplu se folosesc dou tabele:
Tabela EMPLOYEES care con ine detalii despre to i angaja ii;
Tabela EMPLOYEES_HISTORY care con ine detalii despre func iile anterior
de inute de angaja i, aa c ar fi o greeal dac aceleai nregistr ri despre un
angajat ar exista n ambele tabele.
Instruc iunile Multitable INSERT
Instruc iunea INSERTSELECT poate fi folosit pentru a introduce
rnduri n mai multe tabele ca parte a unei singure instruc iuni DML.
Instruc iunea Multitable INSERT poate fi folosit n sistemele de tip data
warehousing pentru a transfera date de la una sau mai multe surse
opera ionale c tre un set de tabele int .
Instruc iunea Multitable INSERT ofer o mbun t ire semnificativ
performan elor din urm toarele puncte de vedere:
11-325

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
o singur instruc iune DML versus multiple instruc iuni INSERT.. SELECT ;
o singur instruc iune DML versus o procedur care s execute mai multe
instruc iuni INSERT folosind sintaxa IF...THEN.
ntr-o instruc iune multitable INSERT insera i n una sau mai multe tabele
rndurile calculate derivate din rndurile returnate n urma evalu rii datelor
furnizate de o subinterogare. Instruc iunea multitable INSERT poate juca un rol
deosebit de folositor ntr-un scenariu pentru data warehouse. Presupunem c
trebuie s nc rca i n mod regulat datele n baza pentru a facilita analiza
afacerii. Pentru a face asta trebuie s extrage i datele din unul sau mai multe
sisteme opera ionale i s le copia i n depozitul de date. Procesul de extragere
a datelor din surse i aducerea lor n depozit se numete de ETL (Extraction,
Transformation, and Loading).
n timpul extragerii, datele necesare trebuie identificate i extrase din mai
multe surse diferite cum ar fi sisteme de baze de date i aplica ii. Dup
extragere, datele trebuie transportate fizic c tre sistemul int sau un sistem
intermediar pentru a fi procesate. n func ie de modul ales pentru transport pot fi
executate unele transform ri n timpul acestui proces. De exemplu, o
instruc iune SQL care acceseaz direct o inta la distanta printr-un gateway
poate concatena doua coloane ca parte a instruc iunii SELECT.
Odat ce datele sunt nc rcate n baza Oracle9i transformarea lor poate fi
f cut folosind opera ii SQL. Instruc iunea multitable INSERT este una dintre
tehnicile implementate n Oracle9i pentru transformarea datelor.
Instruc iunea Multitable INSERTS ofer beneficiile date de instruc iunea
INSERT... SELECT atunci cnd sunt folosite mai multe tabele drept inta.
nainte de Oracle9i trebuia s folosi i mai multe instruc iuni independente de
tipul INSERT... SELECT pentru a procesa aceeai data surs de mai multe ori,
timpul aferent i munca necesara fiind indubitabil mai mari.
Fiecare nregistrare dintr-un ir de intrare, cum ar fi o tabel nonrela ional poate fi acum convertit n mai multe nregistr ri pentru mai multe
tabele rela ionale.
Oracle 9i introduce urm toarele tipuri de instruc iuni multitable INSERT :
Unconditional INSERT (INSERT necondi ionat);
Conditional ALL INSERT (Insearea tutore datelor n mod condi ionat);
Conditional FIRST INSERT (Primul INSERT condi ionat);
Pivoting INSERT (INSERT condus).
Trebuie s folosi i diferite clauze pentru a indica tipul de INSERT ce va fi
executat.

11-326

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
INSERT [ALL] [conditional_insert_clause]
[insert_into_clause values_clause] (subquery)
conditional_insert_clause[ALL] [FIRST]
[WHEN condition THEN] [insert_into_clause values_clause]
[ELSE] [insert_into_clause values_clause]
Sintaxa de mai sus red formatul generic pentru instruc iunea multitable
INSERT.
Unconditional INSERT clauza ALL
Specifica i clauza ALL urmat de mai multe clauze insert_into pentru a
executa un insert necondi ional n mai multe tabele. Serverul Oracle execut
fiecare clauza INSERT odat pentru fiecare rnd returnat de subinterogare.
Conditional INSERT: conditional_insert_clause
Specifica i clauza pentru conditional_insert_clause n vederea execut rii
unui insert condi ionat. Serverul Oracle filtreaz
fiecare clauz
insert_into_clause c utnd coresponden a cu condi ia de la clauza WHEN care
determin execu ia ei. O singur instruc iune multitable insert poate con ine
pn la 127 clauze WHEN.
Conditional INSERT: ALL
Dac specifica i ALL, serverul Oracle evalueaz fiecare clauza WHEN cu
privire la rezultatul evalu rii altor clauze WHEN. Pentru fiecare clauza WHEN a
c rei condi ie este evaluat ca fiind adev rat serverul Oracle execut lista
corespunz toare din instruc iunea INSERT.
Conditional FIRST: INSERT
Dac specifica i FIRST, serverul Oracle evalueaz fiecare clauza WHEN
n ordinea n care sunt scrise n instruc iune. Dac primul WHEN este evaluat
ca fiind adev rat, serverul Oracle execut clauza INTO corespunz toare, n caz
contrar trecnd peste urm toarea clauz WHEN pentru acel rnd.
Conditional INSERT: clauza ELSE
Pentru un anumit rnd, dac nici o clauza WHEN nu este evaluat ca
fiind adev rat :
dac specifica i clauza ELSE, serverul Oracle execut lista de la clauza INTO
asociat clauzei ELSE.
dac nu specifica i clauza ELSE, serverul Oracle nu execut nici o ac iune
pentru acel rnd.

11-327

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Restric ii pentru instruc iunea Multitable INSERT

Instruc iunea multitable insert poate fi executat numai asupra


tabelelor nu i asupra view-urilor sau tabelelor la distan (remote
table);
Nu pute i specifica o expresie format dintr-o colec ie de tabele cnd
folosi i instruc iunea multitable insert;
La folosirea instruc iunii multitable insert nu pot fi specificate mai mult
de 999 tabele int , lund n calcul toate clauzele insert_into.

Exemplu: Unconditional INSERT ALL


Selecta i valorile pentru EMPLOYEE_ID, HIRE_DATE, SALARY i
MANAGER_ID din tabela EMPLOYEES pentru acei angaja i care au
EMPLOYEE_ID> 200. Insera i valorile n tabela SAL_HISTORY i n tabela
MGR_HISTORY folosind un INSERT multitabel.
INSERT ALL
INTO sal_history VALUES (EMPLOYEESID, HIREDATE, SAL)
INTO mgr_history VALUES (EMPLOYEESID, MGR, SAL)
SELECT EMPLOYEE_id EMPLOYEESID, hire_date HIREDATE,
salary SAL, manager_id MGR
FROM EMPLOYEES
WHERE EMPLOYEE_id > 200;
n exemplu se insereaz rnduri att n tabela SAL_HISTORY ct i n
tabela MGR_HISTORY tables.
Instruc iunea SELECT extrage datele din tabela EMPLOYEES, coloanele
EMPLOYEE_ID, hire_date, salary i manager_ID pentru acei angaja i a c ror
EMPLOYEE_ID este mai mare de 200. Aceste valori sunt inserate n tabela
SAL_HISTORY i n tabela MGR_HISTORY.
Acest INSERT este necondi ionat deoarece ulterior nu se aplica restric ii
asupra rndurilor extrase de instruc iunea SELECT. Toate rndurile reg site de
instruc iunea SELECT statement sunt inserate n cele dou tabele, respectiv
SAL_HISTORY i MGR_HISTORY. Clauza VALUES de la instruc iunea
INSERT specific coloanele ce vor fi inserate n tabele. Fiecare rnd returnat de
instruc iunea SELECT duce la dou inser ri, una n tabela SAL_HISTORY i
alta n tabela MGR_HISTORY. n total au fost inserate 8 rnduri n cele dou
tabele.
11-328

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Exemplu-Conditional INSERT ALL
Selecta i valorile coloanelor EMPLOYEE_ID, HIRE_DATE, SALARY
i MANAGER_ID din tabela EMPLOYEES pentru acei angaja i a c ror id este
mai mare 200. Dac SALARY este mai mare de 10,000, insera i aceste valori n
tabela SAL_HISTORY folosind o instruc iune multitable INSERT condi ional .
Dac valoarea pentru MANAGER_ID este mai mare de 200 atunci insera i
aceste valori n tabela MGR_HISTORY folosind o instruc iune multitable
INSERT condi ional .
INSERT ALL
WHEN SAL > 10000 THEN
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
WHEN MGR > 200 THEN
INTO mgr_history VALUES(EMPID,MGR,SAL)
SELECT employee_id EMPID,hire_date HIREDATE ,
salary SAL , manager_id MGR
FROM employees
WHERE employee_id > 200;
4 rows created.
Exemplul este similar cu cel anterior deoarece se introduc date n dou
tabele i anume SAL_HISTORY i MGR_HISTORY. Instruc iunea SELECT
extrage din tabela EMPLOYEES datele despre angaja ii (ID, hire date, salary,
and manager_ID) a c ror employee_ID este mai mare dect 200. Valorile
coloanelor employee_ID, hire_date i salary sunt inserate n tabela
SAL_HISTORY iar cele din coloanele employee_ID, manager_ID i salary sunt
inserate n tabela MGR_HISTORY.
Aceast instruc iune INSERT este referit ca conditional ALL INSERT
deoarece sunt aplicate restric ii dup
extragerea rndurilor de c tre
instruc iunea SELECT. Numai acele rnduri care au valoarea din coloana SAL
mai mare de 10000 sunt inserate n tabela SAL_HISTORY i similar, numai
acele rnduri care au valoarea din coloana MGR mai mare de 200 sunt inserate
n tabela MGR_HISTORY.
Fa de exemplul precedent, de aceast dat sunt inserate numai patru
rnduri n cele dou tabele SAL_HISTORY i MGR_HISTORY.

11-329

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Conditional FIRST INSERT
INSERT FIRST
WHEN SAL > 25000 THEN
INTO special_sal VALUES(DEPARTMENTSID, SAL)
WHEN HIREDATE like ('%00%') THEN
INTO hiredate_history_00 VALUES(DEPARTMENTSID,HIREDATE)
WHEN HIREDATE like ('%99%') THEN
INTO hiredate_history_99 VALUES(DEPARTMENTSID, HIREDATE)
ELSE
INTO hiredate_history VALUES(DEPARTMENTSID, HIREDATE)
SELECT department_id DEPARTMENTSID, SUM(salary) SAL,
MAX(hire_date) HIREDATE
FROM EMPLOYEES
GROUP BY department_id;
n exemplu instruc iunea SELECT extrage valorile pentru coloanele
department_ID, salariul total i valoarea maxim pentru hire_date pentru fiecare
departament din tabela EMPLOYEES.
Aceasta instruc iune INSERT este referit ca conditional FIRST
INSERT, deoarece atunci cnd salariul total este mai mare de 25,000 apare o
excep ie. Expresia condi ional WHEN ALL > 25000 este prima evaluat . Dac
salariul total pentru un departament este mai mare de 25,000 atunci articolul
este inserat n tabela SPECIAL_SAL n func ie de valoarea coloanei hire_date.
Dac prima clauz WHEN este evaluat ca fiind True, serverul Oracle execut
clauza corespondent INTO i trece peste urm toarele clauze WHEN pentru
acest rnd.
Pentru rndurile care nu satisfac condi ia WHEN SAL > 25000, restul
condi iilor sunt evaluate ca fiind o instruc iune de tip conditional INSERT i
rndurile date de SELECT sunt inserate n tabela HIREDATE_HISTORY_00
sau HIREDATE_HISTORY_99 sau HIREDATE_HISTORY n func ie de
valoarea din coloana HIREDATE.
Se execut 8 inser ri n tabelele SPECIAL_SAL,
HIREDATE_HISTORY_00, HIREDATE_HISTORY_99 i
HIREDATE_HISTORY.

Pivoting INSERT

Presupunem c primi i un set de date despre vnz ri dintr-o baz de date


nerela ional ,
SALES_SOURCE_DATA
in
urm torul
format
:
EMPLOYEE_ID, WEEK_ID, SALES_MON, SALES_TUE, SALES_WED,
11-330

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

SALES_THUR, SALES_FRI i dori i s p stra i aceste nregistr ri n tabela


SALES_INFO ntr-un format rela ionat cum ar fi : EMPLOYEE_ID, WEEK,
SALES.
Folosind o instruc iune de tip pivoting INSERT, transforma i setul de date
primit n formatul de date rela ional dorit.

Pivotarea este opera ia prin care crea i o transformare astfel nct fiecare
nregistrare din orice ir de intrare, cum ar fi o baz de date care nu este
rela ionat , trebuie s fie convertit n mai multe nregistr ri pentru o baz de
date rela ionat . Pentru a solu iona acesta problem trebuie s construi i o
transformare astfel nct fiecare nregistrare din tabela original din baza de
date nerela ionat , SALES_SOURCE_DATA, s fie convertit n cinci
nregistr ri pentru tabela SALES_INFO din baza de date rela ionat . Aceast
opera ie este numit de obicei pivoting.
INSERT ALL
INTO sales_info VALUES (EMPLOYEE_id,week_id,sales_MON)
INTO sales_info VALUES (EMPLOYEE_id,week_id,sales_TUE)
INTO sales_info VALUES (EMPLOYEE_id,week_id,sales_WED)
INTO sales_info VALUES
(EMPLOYEE_id,week_id,sales_THUR)
INTO sales_info VALUES (EMPLOYEE_id,week_id, sales_FRI)
SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE,
sales_WED, sales_THUR,sales_FRI
FROM sales_source_data;

DESC SALES_SOURCE_DATA

SELECT * FROM SALES_SOURCE_DATA;

11-331

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
DESC SALES_INFO

SELECT * FROM sales_info;

11-332

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

11.9 Exerciii

1. Crea i tabela MY_EMPLOYEE care are urm toarele coloane : id,


last_name, first_name, userid, salary. Insera i date n tabelul
MY_EMPLOYEE.
2. Descrie i structura tabelului MY_EMPLOYEE pentru a identifica numele
cmpurilor.
3. Ad uga i prima nregistrare a tabelului din exemplul de mai jos. Nu
folosi i lista coloanelor n clauza INSERT.
ID
1
2
3
4
5

LAST_NAME
Patel
Dancs
Biri
Newman
Ropeburn

FIRST_NAME
Ralph
Betty
Ben
Chad
Audry

USERID
rpatel
bdancs
bbiri
cnewman
aropebur

SALARY
795
860
1100
750
1550

4. Introduce i n tabelul MY_EMPLOYEE i al doilea rnd de date din


exemplul de mai sus. De data aceasta, specifica i coloanele explicit n
clauza INSERT.
5. Verifica i dac au fost ad ugate n tabel.
6. Crea i un script numit load_EMPLOYEES.sql pentru a insera
nregistr ri n mod interactiv n tabelul MY_EMPLOYEE. Cere i
utilizatorului prenumele (FIRST_NAME), numele de familie
(LAST_NAME) i salariul fiec rui angajat. Concatena i prima liter a
prenumelui i primele 7 caractere ale numelui de familie pentru a crea
userid.
7. Insera i urm toarele dou nregistr ri n tabel, prin intermediul scriptului
creat.
8. Verifica i ad ug rile.
9. Salva i modific rile.
MY_EMPLOYEE.

terge i

modifica i

date

tabelul

10. Modifica i numele de familie al angajatului cu ID = 3 n Drexler.


11. Modifica i salariul la 1000 pentru to i cei cu salariul mai mic dect 900.
11-333

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
12. Verifica i modific rile f cute.
13. terge i-o pe Betty Dancs din tabelul MY_EMPLOYEE.
14. Verifica i modific rile.
15. Salva i toate modific rile temporare. Controla i tranzac iile de date
asupra tabelului MY_EMPLOYEE.
16. Insera i n tabel ultima nregistrare rulnd scriptul creat la punctul 6.
17. Verifica i ad ugarea.
18. Marca i un savepoint n cadrul tranzac iei.
19. terge i toate nregistr rile din tabel.
20. Verifica i c tabelul este gol.
21. Anula i cea mai recent opera ie DELETE f r
anterior.

a anula i INSERT-ul

22. Verifica i c rndul nou este intact. Salva i ad ugarea, f cnd-o


permanent .
23. Crea i tabelul sal_history, tabelul mgr_history i tabelul special_sal cu
structurile de mai jos:
sal_history

mgr_history

special_sal

11-334

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
24. a. Scrie i o interogare care s execute urm toarele:

S afieze EMPLOYEE_ID, hire date, salary, i manager_ID


pentru acei angaja i pentru care EMPLOYEE_ID este mai mic
de 125 (din tabela EMPLOYEES).
Dac salariul este mai mare de 20,000, insera i datele despre
angaja i (EMPLOYEE_ ID i salary) n tabela SPECIAL_SAL.
Insera i valorile pentru EMPLOYEE_ID, hire_date , salary n
tabela SAL_HISTORY.
Insera i valorile pentru EMPLOYEE_ID, manager_ID i salary
n tabela MGR_HISTORY

b. Afia i rndurile din tabela SPECIAL_SAL.

c. Afia i rndurile din tabela SAL_HISTORY.

d. Afia i rndurile din tabela MGR_HISTORY.

11-335

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
25. a. Crea i tabela sales_source_data cu structura de mai jos i
introduce i cteva datele prezentate n figur .

b. Crea i tabela sales_info cu structura de mai jos:

c. Scrie i o interogare care s afieze EMPLOYEE_ID, week_ID i vnz rile din


fiecare zi a s pt mnii (din tabela SALES_SOURCE_DATA). Construi i o
transformare astfel nct fiecare rnd din tabela SALES_SOURCE_DATA
s fie convertit n mai multe nregistr ri pentru tabela SALES_INFO i
afia i datele ob inute.

11-336

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Capitolul 12

Anexa 1

Structura tabelelor folosite n carte i datele standard con inute de


acestea
Tabela COUNTRIES
DESCRIBE countries

SELECT * FROM countries;

Tabela DEPARTMENTS
DESCRIBE departments

12-337

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SELECT * FROM departments;

Tabela EMPLOYEES
DESCRIBE employees

12-338

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
SELECT * FROM employees;

Tabela JOBS
DESCRIBE jobs

12-339

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

SELECT * FROM jobs;

Tabela JOB_GRADES
DESCRIBE job_grades

SELECT * FROM job_grades;

12-340

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Tabela JOB_HISTORY
DESCRIBE job_history

SELECT * FROM job_history;

12-341

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice
Tabela LOCATIONS
DESCRIBE locations

SELECT * FROM locations;

Tabela REGIONS
DESCRIBE regions

SELECT * FROM regions;

12-342

Facultatea de Automatic i Calculatoare Iai


Baze de date lucrri practice

Bibliografie

1. Nancy Greenberg, Priya Nathan, Introduction to SQL Student


Guide Volume 1 and 2, Oracle Corporation, 2001;
2. Visual FoxPro ;
3. C. Botez, D. Arot ri ei, I. Crlig, D. Buzea, Baze de date
Lucr ri de laborator, Editura Medex 2005, ISBN: 973-86741-0-7
4. A.Silberschatz, H.F. Korth, S.Sudarshan, Database System
Concepts, Fourth Edition, McGraw-Hill Higher Education, ISBN:
0-07-112268-0,2002.

12-343

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