Sunteți pe pagina 1din 343

Facultatea de Automatic i Calculatoare Iai

Baze de date lucrri practice




1-1
CUPRINS

CAPITOLUL 1 SISTEME DE GESTIUNE A BAZELOR DE DATE........... 1-5
1.1 Arhitectura sistemelor de gestiune a bazelor de date......................... 1-5
1.2 Obiectivele i funciile unui sistem de gestiune a bazelor de date...... 1-6
1.3 Evoluia i clasificarea sistemelor de gestiune a bazelor de date....... 1-8
1.4 Conceptul de baz de date relaional.............................................. 1-11
1.5 Terminologie specific bazelor de date relaionale........................... 1-14
1.6 Sisteme de gestiune a bazelor de date relaionale n Oracle............ 1-16
1.7 Sisteme de gestiune a bazelor de date relaionale n FoxPro........... 1-18
CAPITOLUL 2 CONCEPTE I ELEMENTE DE BAZA N FOXPRO. ..... 2-22
2.1 Descrierea mediului integrat.............................................................. 2-25
2.2 Tipuri de date n FoxPro, operatori, funcii ........................................ 2-26
2.3 Funcii pentru conversii ntre tipuri de date ....................................... 2-34
2.4 Zone de lucru..................................................................................... 2-35
2.5 Construirea bazelor de date relaionale. Componente...................... 2-36
2.6 Comenzi pentru vizualizarea i modificarea datelor din tabele......... 2-40
2.7 Exerciii .............................................................................................. 2-44
CAPITOLUL 3 INDEXAREA I RELAIONAREA TABELELOR,
INTEGRITATEA REFERENIAL. ............................................................... 3-46
3.1 Indexarea tabelelor............................................................................ 3-46
3.2 Relaionarea tabelelor ....................................................................... 3-50
3.3 Integritatea referenial...................................................................... 3-53
3.4 Funcii. Variabile de memorie. Macrosubstituia ............................... 3-54
3.5 Crearea i modificarea programelor.................................................. 3-57
3.6 Programare structurat. Proceduri. ................................................... 3-58
3.7 Comenzi de intrare/ieire................................................................... 3-60
3.8 Controlul fluxului ................................................................................ 3-65
3.9 Comenzi SQL .................................................................................... 3-67
3.10 Depanarea programelor .................................................................... 3-69
3.11 Instrumente WIZARD ........................................................................ 3-71
3.12 Exerciii .............................................................................................. 3-74
CAPITOLUL 4 PROGRAMAREA ORIENTATA PE OBIECT-CLASE I
OBIECTE N VISUAL FOX PRO.................................................................... 4-78
4.1 Crearea claselor ................................................................................ 4-81
4.2 Crearea formularelor ......................................................................... 4-85
4.3 Utilizarea controalelor predefinite...................................................... 4-87
4.4 Generatorul de rapoarte .................................................................... 4-99
4.5 Constructorul de meniuri ................................................................. 4-105
4.6 Constructorul de proiecte ................................................................ 4-108
4.7 Exerciii: ........................................................................................... 4-110
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-2
CAPITOLUL 5 LIMBAJUL SQL IMPLEMENTAT N ORACLE............. 5-111
5.1 Soluia complet Oracle .................................................................. 5-111
5.2 Comenzi SQL*Plus pentru fiiere.................................................... 5-114
5.3 Instruciuni SQL............................................................................... 5-115
5.4 Sintaxa de baz a instruciunilor SQL ............................................. 5-116
5.5 Crearea i gestionarea tabelelor ..................................................... 5-118
5.6 Comanda CREATE TABLE............................................................. 5-120
5.7 Tabele din baza de date Oracle ...................................................... 5-121
5.8 Interogarea dicionarului de date..................................................... 5-122
5.9 Tipuri de date................................................................................... 5-123
5.10 Comanda ALTER TABLE................................................................ 5-127
5.11 tergerea unei tabele ...................................................................... 5-131
5.12 Modificarea numelui unui obiect ...................................................... 5-132
5.13 Trunchierea unei tabele................................................................... 5-132
5.14 Includerea constrngerilor ............................................................... 5-133
5.15 Constrngerea NOT NULL.............................................................. 5-136
5.16 Constrngerea UNIQUE KEY ......................................................... 5-137
5.17 Constrngerea PRIMARY KEY....................................................... 5-139
5.18 Constrngerea FOREIGN KEY....................................................... 5-139
5.19 Constrngerea CHECK................................................................... 5-141
5.20 Adugarea unei constrngeri .......................................................... 5-142
5.21 tergerea unei constrngeri ............................................................ 5-143
5.22 Dezactivarea constrngerilor........................................................... 5-143
5.23 Activarea constrngerilor................................................................. 5-144
5.24 Exerciii ............................................................................................ 5-147
CAPITOLUL 6 EXPRESII ARITMETICE. OPERATORI.
RESTRICIONAREA I SORTAREA DATELOR....................................... 6-149
6.1 Expresii aritmetice ........................................................................... 6-149
6.2 Definirea alias-urilor pentru coloane................................................ 6-153
6.3 Operatorul de concatenare.............................................................. 6-154
6.4 Afiarea structurii unei tabele.......................................................... 6-157
6.5 Restricionarea i sortarea datelor .................................................. 6-158
6.6 Clauza WHERE............................................................................... 6-159
6.7 Operatori de comparaie.................................................................. 6-161
6.8 Operatori logici ................................................................................ 6-165
6.9 Clauza ORDER BY.......................................................................... 6-169
6.10 Exerciii ............................................................................................ 6-172
CAPITOLUL 7 FUNCII DE UN SINGUR RND .................................. 7-174
7.1 Funcii de un singur rnd................................................................. 7-175
7.2 Funcii pentru caractere................................................................... 7-177
7.3 Funcii pentru valori numerice ......................................................... 7-181
7.4 Utilizarea datelor calendaristice ...................................................... 7-183
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-3
7.5 Funcii pentru date calendaristice.................................................... 7-184
7.6 Funcii pentru conversia tipului de date........................................... 7-187
7.7 Funcii diverse ................................................................................. 7-196
7.8 Imbricarea funciilor ......................................................................... 7-203
7.9 Exerciii ............................................................................................ 7-204
CAPITOLUL 8 AFIAREA DATELOR DIN TABELE MULTIPLE......... 8-205
8.1 Definirea JOIN-urilor........................................................................ 8-206
8.2 Produsul Cartezian.......................................................................... 8-206
8.3 Echi-join........................................................................................... 8-208
8.4 Non-echi-join ................................................................................... 8-212
8.5 Outer-join......................................................................................... 8-214
8.6 Self Join........................................................................................ 8-216
8.7 Definirea join-urilor folosind sintaxa SQL 1999............................... 8-218
8.8 Exerciii ............................................................................................ 8-226
CAPITOLUL 9 FOLOSIREA FUNCIILOR DE GRUP.......................... 9-231
9.1 Ce sunt funciile de GRUP ? ........................................................... 9-231
9.2 Folosirea funciilor AVG, SUM, MIN, MAX...................................... 9-232
9.3 Folosirea funciei COUNT................................................................ 9-233
9.4 Funciile de grup i valorile Null....................................................... 9-234
9.5 Crearea grupurilor de date .............................................................. 9-235
9.6 Gruparea datelor dup mai multe coloane...................................... 9-238
9.7 Interogri ilegale n folosirea funciilor de grup................................ 9-240
9.8 Excluderea rezultatelor obinute folosind clauza Group.................. 9-242
9.9 Imbricarea funciilor de grup............................................................ 9-244
9.10 GROUP BY cu operatorii ROLLUP i CUBE................................... 9-244
9.11 Operatorul ROLLUP........................................................................ 9-245
9.12 Operatorul CUBE............................................................................. 9-247
9.13 Funcia GROUPING........................................................................ 9-249
9.14 GROUPING SETS........................................................................... 9-250
9.15 Composite Columns ........................................................................ 9-254
9.16 Concatenated Groupings................................................................. 9-257
9.17 Exerciii ............................................................................................ 9-259
CAPITOLUL 10 SUBINTEROGARI ....................................................... 10-265
10.1 Folosirea unei subinterogri pentru a rezolva o problema............ 10-265
10.2 Tipuri de subinterogri................................................................... 10-267
10.3 Subinterogari single-row................................................................ 10-268
10.4 Utilizarea funciilor de grup ntr-o subinterogare ........................... 10-269
10.5 Erori ce pot apare la folosirea subinterogrilor.............................. 10-270
10.6 Subinterogari multiple-row............................................................. 10-272
10.7 Utilizarea operatorului ANY n subinterogarile multiple-row.......... 10-273
10.8 Utilizarea operatorului ALL n subinterogrile multiple-row........... 10-273
10.9 Returnarea valorilor nule n rezultatul subinterogrii..................... 10-274
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-4
10.10 Subinterogari de coloane multiple................................................. 10-275
10.11 Compararea coloanelor (pereche i nepereche)........................... 10-275
10.12 Folosirea unei subinterogri n clauza FROM............................... 10-276
10.13 Expresii scalare returnate de subinterogri................................... 10-277
10.14 Subinterogri corelate ................................................................... 10-279
10.15 Folosirea operatorului EXISTS...................................................... 10-282
10.16 Folosirea operatorului NOT EXISTS ............................................. 10-284
10.17 Clauza WITH................................................................................. 10-284
10.18 Interogri ierahice.......................................................................... 10-286
10.19 Parcurgerea arborelui punctul de start ....................................... 10-288
10.20 Exerciii ......................................................................................... 10-295
CAPITOLUL 11 INSTRUCIUNI PENTRU MANIPULAREA DATELOR.... 11-
302
11.1 Introducerea datelor-comanda INSERT........................................ 11-303
11.2 Modificarea datelor - comanda UPDATE...................................... 11-308
11.3 tergerea datelor - comanda DELETE.......................................... 11-311
11.4 Instruciunea MERGE.................................................................... 11-314
11.5 Tranzacii ....................................................................................... 11-316
11.6 Consistena la citire ....................................................................... 11-321
11.7 Correlated UPDATE...................................................................... 11-323
11.8 Correlated DELETE....................................................................... 11-324
11.9 Exerciii .......................................................................................... 11-333
CAPITOLUL 12 ANEXA 1...................................................................... 12-337
STRUCTURA TABELELOR FOLOSITE N CARTE I DATELE STANDARD
CONINUTE DE ACESTEA ...................................................................... 12-337
BIBLIOGRAFIE 12-343
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-5
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
independena, relaiile logice ntre date i o redundan minim a acestora. Ele
trebuie s permit dezvoltarea rapid i la un cost avantajos a programelor de
aplicaii pentru exploatarea datelor dintr-o structur complex, precum i
accesul rapid la date i asigurarea securitii lor. Altfel spus, SGBD-ul este un
ansamblu de programe care permite utilizatorilor s interacioneze cu o baz de
date, conceput de regul pentru volume mari de date, a cror gestiune impune
nu numai o riguroas structurare dar i o accesare i prelucrare raional.

1.1 Arhitectura sistemelor de gestiune a bazelor de date

Datorit dezvoltrii 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 aprut ca o necesitate specializarea
pachetelor de programe n funcie de domeniile abordate: matematic, tehnic,
economie, proiectare, comunicaie 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
nelege: datele de prelucrat i modul de organizare a acestora pe suportul fizic
de memorare i prin gestiune totalitatea operaiilor ce se vor aplica asupra
datelor. Dintre avantajele organizrii informaiilor n baza de date fa de
fiierele clasice (de tip ASCII, binare, etc.) putem aminti redundana minim a
informaiilor, accesul mai uor la date i posibilitatea abordrii domeniului
implementat din punct de vedere sistemic (ca un sistem unitar).
Piaa SGBD-urilor este dominat nc de SGBD-urile relaionale i
distribuite, dei se observ o dezvoltare a SGBD-urilor orientate obiect.
Lucrrile practice de baze de date din aceast carte vor cuprinde prezentarea
SGBD-ului FoxPro i Oracle.
Teoria i practica SGBD-urilor ofer diferite arhitecturi difereniate n
funcie de componentele, limbajele utilizate i posibilitile de prelucrare a
datelor, existnd totui preocupri de standardizare a acestora.

n general, n arhitectura unui SGBD intr cel puin 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 aplicaii sau interactiv de la tastatur;
Limbajul de definire a datelor (LDD). Este componenta care permite
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-6
traducerea (compilarea sau interpretarea, dup caz) i descrierea
naturii datelor i a legturilor logice dintre ele, fie la nivel global (sub
forma schemei conceptuale), fie la nivelul specific fiecrei aplicaii
(sub forma schemei externe sau sub-schemei). Aceste definiii 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 SGBD-
ul utilizat (cu limbaj gazd sau SGBD autonome). n SGBD-urile cu
limbaj gazd enunurile 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 ctre operator a bazei de date. Utilitarele variaz de la un sistem
la altul i depind de complexitatea SGBD-ului. Acestea pot efectua
urmtoarele operaii: crearea versiunii iniiale a bazei de date i
ncrcarea acesteia folosindu-se fie o copie creat anterior, fie date
neorganizate; crearea i actualizarea jurnalelor tranzaciilor
realizate asupra bazelor de date: reorganizarea bazei de date
pentru recuperarea spaiului nefolosit; reorganizarea structurii fizice
i logice dup fiecare tranzacie; restructurarea bazei de date dup
un incident logic sau fizic, cu refacerea strii anterioare; diverse
statistici ce permit cunoaterea activitii i utilizrii bazei de date;
actualizarea schemei i sub-schemei fr rescrierea i compilarea
lor; detectarea sprgtorilor regulilor de integritate definite, fr 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 condiii de exploatare multi-utilizator.

1.2 Obiectivele i funciile unui sistem de gestiune a bazelor
de date

Succesul unui SGBD este susinut prin realizarea urmtoarelor obiective:
asigurarea independenei datelor. Independena datelor poate fi
definit drept imunitatea programelor de aplicaii la schimbarea
structurii de memorare i /sau a strategiei de acces. Independena
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-7
datelor trebuie urmrit att la nivel fizic ct i la nivel logic.
Independena fizic asigur modificarea datelor i a tehnicilor fizice
de memorare, fr rescrierea programelor de aplicaii.
Independena logic ofer posibilitatea adugrii de noi articole
sau extinderea structurii globale fr a necesita rescrierea
programelor;
asigurarea integritii datelor prin existena 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 ctre mai muli utilizatori n diverse aplicaii,
accesul simplu i multicriterial al utilizatorilor la date, fr a fi
necesar cunoaterea structurii ntregii baze de date; existena
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 aplicaii fr a se modifica structura bazei de
date;
asigurarea securitii datelor prin intermediul unor canale
corespunztoare i definirea unor restricii de autorizare la
accesarea datelor.

Plecnd de la aceste obiective, rezult c orice SGBD trebuie s
ndeplineasc urmtoarele funcii: de descriere, de manipulare, de utilizare.
Funcia 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 confidenialitii i integritii lor. Toate
aceste elemente se regsesc n ceea ce se numete schema bazei de date.
Definiiile se stocheaz ntr-un ansamblu de tabele, memorate n dicionarul de
date.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-8
Funcia de manipulare asigur prin intermediul limbajului special
derularea urmtoarelor activiti: ncrcarea bazei de date, adugarea de noi
nregistrri, tergerea unor nregistrri, editarea total sau parial a unor
nregistrri, ordonarea nregistrrilor, cutarea logic sau fizic a nregistrrilor
etc.
Funcia de utilizare permite comunicarea ntre utilizatori i baza de date
prin intermediul unor interfee 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 realizrii acestei funcii interacioneaz diveri utilizatori, literatura de
specialitate oferind mai multe clasificri sau grupri. Dintre acestea prezentm
n continuare doar cteva astfel de grupri.

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 declaraiile 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 ntreinerii acesteia. n acelai
raport sunt prezentate trei categorii de administratori:
administratorul structurii organizaionale care asigur gestionarea
global a aplicaiilor curente i identificarea celor viitoare;
administratorul aplicaiilor care are rolul de a dezvolta schemele
externe (sub-schemele) pentru aplicaiile 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

Perfecionarea SGBD-urilor a avut loc n paralel cu evoluia
echipamentelor de culegere, memorare, transmitere i prelucrare a datelor, pe
de o parte, i cu evoluia metodelor i tehnicilor de organizare a datelor, pe de
alt parte.
Literatura i practica de specialitate ofer o mare diversitate de sisteme
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-9
de gestiune a bazelor de date, care sintetic pot fi prezentate n trei generaii.
Prima generaie este situat n timp la sfritul anilor `60 i nceputul
anilor 70 i include modelul ierarhic i modelul reea 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 generaia
corespunztoare. 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 nlture lipsurile modelului precedent,
propunnd o structur de date mai bogat pe baza legturilor posibile i
conducnd la construirea unei reele ntre acestea.
Generaia a doua, situat n timp la sfritul anilor 80 i nceputul anilor
90 cuprinde n principal modelele relaionale. Structura datelor este format
dintr-un ansamblu de relaii sau tabele fr legturi fizice ntre ele. Apropierea
dintre date este obinut prin utilizarea unei algebre ntre tabele, considerate
ca operanzi. Din aceast generaie fac parte: IBM DB2, Oracle, Microsoft SQL
Server, PARADOX, FoxPro etc.
Generaia a treia aprut la nceputul anilor 90. Aceste sisteme se
bazeaz pe principii mult mai complexe dect precedentele i permit
gestionarea unor informaii foarte variate. Se pot ncadra n aceast generaie 4
subclase de SGBD: orientate obiect, funcionale, deductive i multimedia.
Sistemele orientate obiect permit descrierea elementelor unei baze
utiliznd conceptele abordrii obiectuale care ine seama de
aspectele statice i dinamice ale obiectelor. Aceast abordare se
caracterizeaz, n principal, pe operaia 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 fcut obiectelor. Obiectele
definite n baz au capacitatea de a transmite descendenilor,
ansamblul caracteristicilor lor prin motenire.
Sistemele funcionale au la baz noiunile de entitate i funcie i au fost
introduse n 1979 de Shipman. Pentru fiecare entitate (obiect) de un
anumit tip exist o colecie de funcii care sunt aplicate acelui obiect,
definind atributele obiectului i exprimnd asocierile dintre entiti.
Modelul funcional devine operaional prin intermediul SGBD-urilor
funcionale care ofer mecanisme i instrumente de descriere i
manipulare a datelor prin intermediul limbajelor funcionale.
Sistemele deductive utilizeaz reguli de inferen pentru a exprima situaii
bine sau mai puin bine definite din mediul unei organizaii. Ele permit
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-10
s se rspund cererilor care comport exprimarea ntr-o logic mai
mult sau mai puin 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 informaii
dect cele clasice precum: imagini, fotografii, muzic, sunete etc.
Sistemele din aceast categorie, care se comercializeaz deja,
permit organizarea de birouri fr hrtie, propunnd gestiunea
diferitelor documente (imprimate) pe discul optic cu proceduri de
nregistrare prin scanare precum i prin proceduri de consultare i
manipulare.
Preocuprile proiectanilor de SGBD sunt concentrate spre construirea
bazelor de date pe modele obiectuale, deductive i multimedia, fiind propuse
mai multe soluii de combinare i extindere a modelelor prezentate: nglobarea
n SGBD-urile relaionale a elementelor ce definesc tehnologia actual,
persistena 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
numr 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, reea, relaionale, orientate obiect etc.), distribuirea resurselor
(integrate i distribuite teritorial), destinaie (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 tendina este de generalizare i standardizare a SGBD-
urilor 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 funcie 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
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-11
care se implementeaz baza de date. Prezint avantajul exploatrii
facilitilor limbajului de nivel nalt i dezavantajul complexitii
formulrii 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
formulrii cerinelor.
n funcie de organizarea i structurarea datelor gestionate SGBD-
urile 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 funcie de locul lor de producere, cu
posibilitatea accesrii datelor din orice punct definit (Oracle, IBM
DB2, Informix).

La ora actual datorit proliferrii prelucrrilor n reea 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 relaional pentru baze de date n 1970
(http://www.wikipedia.org/wiki/Edgar_F._Codd), model ce reprezint baza
pentru sistemele de gestiune a bazelor de date (DBMS).
Principiile modelului relaional au fost subliniate pentru prima data de Dr.
E.F. Codd n lucrarea numit Un model relaional de date pentru bnci de date
mari. Cele mai populare modele ale vremii erau cele ierarhice i de reea sau
chiar fiierele simple de date. Apoi DBMS-urile au devenit foarte populare
pentru uurina n utilizare i flexibilitatea lor.
Componentele modelului relaional sunt:
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-12
Colecie de obiecte i relaii care stocheaz date;
Un set de operatori care acioneaz asupra relaiilor pentru a
produce alte relaii;
Reguli de integritate a datelor pentru consisten i acuratee.

Definirea unei baze de date relaionale
O baza de date relaional folosete relaii sau tabele bi-dimensionale
pentru stocarea informaiilor. De exemplu, pentru stocarea informaiilor despre
angajaii unei companii, ntr-o baz de date relaional vei gsi informaia
stocat n: tabela angajai, tabela departamente i tabela salarii.

Modelele de date sunt dezvoltate de proiectani pentru a explora idei i
pentru a mbunti nelegerea proiectrii bazei de date. Modelele ajut n
comunicarea conceptelor n minile 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 rspund tuturor cerinelor i
care s fie neles de utilizatorul final, care s conin detalii suficiente pentru ca
un programator s construiasc sistemul de baze de date i/sau s dezvolte o
aplicaie care s lucreze cu baze de date.


Modelul Entitate Relaie permite crearea unei diagrame entitate relaie
pe baza specificaiilor informaionale ale problemei.
M Mo od de el lu ul l
s si is st te em mu ul lu ui i
a as sa a c cu um m e es st te e
v va az zu ut t d de e c ca at tr re e
c cl li ie en nt t

M Mo od de el lu ul l
E En nt ti it ta at te e- -r re el la at ti ie e
a a c ce ee ea a c ce e e es st te e d da at t d de e
c ca at tr re e c cl li ie en nt t
( (m mo od de el lu ul l l lo og gi ic c) ) M Mo od de el lu ul l t ta ab be el la ar r
( (m mo od de el lu ul l f fi iz zi ic c) )
T Ta ab be el le e p pe e d di is sc c
S Se er rv ve er r
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-13


asignat la
compus din

Scenariu:
se asigneaz unul sau mai muli angajai la un departament
cteva departamente nu au nici un angajat
ntr-un sistem real, data este divizat n categorii discrete sau entiti. Un
model entitate relaie (ER) este o ilustrare a entitilor dintr-o problem i a
relaiilor dintre ele. Un model ER este derivat din specificaiile informaionale ale
problemei i este construit n faza de analiza a sistemului. Modelul ER separ
informaiile cerute de problema de activiti. Chiar dac activitile problemei se
schimb, tipul informaiilor trebuie s rmn constant. De aceea structurile de
date tind s rmn constante.
Avantajele modelului ER:
Documenteaz necesarul de informaii pentru organizaie ntr-o
form clar i precis;
Prezint o imagine clar a scopului cerinelor informaionale i uor
de neles pentru proiectarea bazei de date;
Ofer un mediu efectiv de integrare a aplicaiilor multiple.

Componente cheie:

Entitatea: Un obiect sau un grup de obiecte de acelai tip (cu aceleai
proprieti), cu o anumit semnificaie, despre care este necesar a fi cunoscute
informaii. Exemplu: departamente, angajai, 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 opional.

Relaie: Un nume de asociere dintre entiti care arat opionalitatea sau
gradul asocierii. Exemplu: angajai i departamente, comenzi i articole.

Identificator unic (UID Unique IDentifier) este orice combinaie de
atribute sau/i relaii care servete la distingerea apariiilor unei entiti. Fiecare
apariie a entitii trebuie sa fie identificat unic.

ANGAJAT
#* numr
* nume
o meseria
DEPARTAMENT
#* numr
* nume
o localitate
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-14
1.5 Terminologie specific bazelor de date relaionale

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

Noiuni:
Un singur rnd sau o tupl reprezint informaia 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 conine marca angajatului care este i cheie
primar. Marca (cheia primar) identific n mod unic un angajat n
tabela EMP. O cheie primar trebuie s conin o valoare. Alte tipuri de
coloane reprezint alte informaii (de ex: funcia). Ordinea coloanelor nu
este important. Coloana care conine numrul de departament este
numit i cheie extern. Cheia extern conine coloane care definesc
modul n care sunt n relaie 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 conine toate meseriile pentru toi
angajaii.
Un cmp poate fi gsit la intersecia dintre un rnd i o coloan. Poate
conine o singur valoare.
Cmpurile pot s nu conin valori. Acestea se numesc valori null.

Referirea mai multor tabele - Fiecare tabel conine date care descriu
exact o entitate. De exemplu tabela Angajai conine informaii despre angajai.
Deoarece datele despre entiti diferite sunt stocate n tabele diferite, este
necesar combinarea a dou sau mai multe tabele pentru a afla rspunsul la o
interogare. De exemplu dac vrei s aflai localitatea n care este situat
departamentul n care lucreaz un anumit angajat sunt necesare tabelele
Angajai i Departamente. Un SGBDR permite combinarea tabelelor diferite
folosind chei externe. O cheie extern este o coloan sau o combinaie de
coloane care refer o cheie primar din acelai tabel sau din unul diferit.

Proprietile bazelor de date relaionale

O baza de date relaional :
Poate fi accesat i modificat prin execuia instruciunilor
specifice;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-15
Conine o colecie de tabele fr pointeri fizici;
Folosete un set de operatori.

ntr-o baz de date relaional 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 definiii:
Un obiect este un pachet software care conine o colecie de
proceduri (metode) nrudite i date (variabile) - David Taylor,
Object-Oriented Technology: A Managers Guide Addison-Wesley
1981
Un obiect este un concept, abstracie sau lucru cu margini i
nelesuri 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 interaciune ntre obiecte;
modelele obiect se aseamn cu lumea real;
cnd se lucreaz cu modele ne axm mai mult n termenii aplicaiei
i mai puin la arhitectura sistemului de operare i cerinele
mediului de dezvoltare.
Caracteristicile sistemelor obiectuale:
Prezint informaia n forma obiect;
Clasific obiectele n tipuri de obiecte;
Motenete atribute i cod;
Ascunde date, cod i atribute;
Interacioneaz cu alte obiecte;
Recunoate diferite obiecte fr analiz;
Interpreteaz aceeai comand n moduri diferite;

Alte caracteristici:
Reprezint informaia ca lucruri coninute 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 trsturile tipului sau de obiecte
(inheritance);
Pot ascunde date i procese referitoare la obiect n cadrul
obiectului (encapsulation). Aceasta permite schimbri ale unei
componente specifice fr afectarea altor componente;
Interfaa cu alte obiecte (interface sau messaging);
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-16
Recunoaterea diferitelor tipuri de lucruri i comportamentul lor fr
analiza lor;
Folosirea aceleai cereri pentru a invoca diferite implementri ale
aceleai aciuni pentru dou obiecte diferite (polymorphism);
1.6 Sisteme de gestiune a bazelor de date relaionale n
Oracle

Oracle furnizeaz un SGBDR flexibil - Oracle Database. Trsturile
acestui SGBDR permit stocarea i gestiunea datelor cu toate avantajele
structurilor relaionale plus PL/SQL, un motor care permite stocarea i
executarea unitilor de program. Serverul permite utilizatorilor opiunea de
extragere de date bazat pe tehnici de optimizare. Sunt incluse trsturi de
control a modului de accesare i folosire a datelor. Alte caracteristici sunt
consistena i protecia 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 supremaie
ctigat de aproximativ 20 de ani n faa 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 relaionale comerciale construite pe principiile
fundamentate matematic de ctre 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 bii i 64 de bii, Linux x86 pe 32 de bii
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-17
i 64 de bii, Linux Itanium, HP-UX PA-RISC (64 bii), Solaris SPARC (64 bii),
AIX 5L pe 64 bii, etc.
Succesul firmei Oracle s-a bazat n primul rnd pe serverul de baze de
date, pe baza cruia s-au dezvoltat de-a lungul timpului suita de dezvoltare
Oracle Developer Suite (care cuprinde Oracle Forms, Reports, Designer,
JDeveloper) pentru proiectarea de aplicaii, Warehouse Builder i Discoverer
pentru domeniul numit Business Intelligence, serverul de aplicaii bazat pe
J2EE Oracle Application Server i suita back-office Oracle Collaboration
Suite. n principiu toate aceste aplicaii satelit in pasul, ca denumire de
versiune, cu versiunea bazei de date.
Serverul de baze de date Oracle a cptat de-a lungul timpului
mbuntiri care au meninut acest produs pe primul loc. Ca istoric, se poate
considera versiunea 2 ca fiind prima versiune complet bazat pe
caracteristicile relaionale introduse de limbajul SQL.
Versiunea 3 se caracterizeaz prin rescrierea n ntregime a versiunii
anterioare n limbajul C pentru asigurarea portabilitii pe mai multe platforme.
O alt caracteristic a versiunii 3 o reprezint respectarea principiului
atomicitii frazelor SQL n cadrul tranzaciilor.
Versiunea 4 aduce ca noutate principiul consistenei datelor la citire,
adic datele supuse prelucrrilor sunt intangibile celorlalte tranzacii.
Versiunea 5 aduce mbuntiri n partea de client / server, aducnd o
rspndire a produsului bazat pe folosirea bazei de date prin accesarea de pe
terminale sau staii PC mai slabe, investiia major fiind necesar doar pentru
server.
Versiunea 6 mbuntete mecanismele de blocare care, ncepnd cu
aceast versiune, se face la nivel de linie permind ca o tranzacie s nu
blocheze o tabel ntreag, ci numai liniile din tabel care sunt supuse
prelucrrii. n versiunea 7 se introduc procedurile stocate i declanatoarele
(triggeri n englez).
Odat cu versiunea 7 a aprut i varianta pentru calculatoare
personale: ORACLE Personal Edition 7.2, care permite dezvoltarea aplicaiilor
fr a fi necesar conectarea la un server n reea, ceea ce a crescut mult
popularitatea sistemului.
Versiunea 8 a introdus partea obiectual derivat din principiile
programrii orientate pe obiect ca o necesitate a creterii complexitii structurii
datelor. Practic, ncepnd cu aceast versiune, Oracle a devenit o baz de date
obiectual-relaional, fiind permis stocarea n baza de date att a structurilor
tabelare ct i a obiectelor folosind metoda maprii. 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 aplicaiile bazate pe noile tehnologii ale
internetului. Tot n acest context s-a introdus suportul pentru limbajul SQLJ care
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-18
permite ca instruciunile SQL de acces la date sa fie incluse n proceduri sau
metode scrise n Java rezidente pe server sau pe staiile client.
Versiunea 9i a mbuntit mecanismele de securitate a bazelor de date
prin introducerea conceptului de baz de date virtual, s-au adugat faciliti de
stocare i accesare a documentelor XML (eXtensible Markup Language),
mbuntind astfel limbajul SQL, mbuntirea scalabilitii 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, permind recuperarea transparent a
cderilor oricrui nod din reea.
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 reea i au
puse la dispoziie capacitatea de stocare i procesare n ASM. Dac un disc
este adugat 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
echilibrrii ncrcrii (load balancing n englez).

1.7 Sisteme de gestiune a bazelor de date relaionale n
FoxPro.

Aprnd ca urma a lui DBASE III i dotat astfel nct sa satisfac
cerinele unui SGBD modern, cu mediu de dezvoltare integrat, FoxPro are una
din cele mai atractive interfee 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 instruciuni i funcii 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 obine
un format intermediar care necesit existenta mediului FoxPro sau a
versiunii RunTime (vitez sporit).
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-19
Versiunea 2.0 (anul 1991)
compatibilitate sporit cu DBase IV (modul SQL incorporat, indeci
compui);
instrumente specifice de proiectare (generatoare de meniuri, rapoarte,
aplicaii);
utilizarea tehnologiei de optimizare Rushmore;
control superior al programatorului asupra evenimentelor din timpul
rulrii;
help senzitiv la context;
ruleaz pe reele 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 mbuntit i mult mai rapid;
optimizare Rushmore mbuntit;
import / export date n formate Excel, Paradox;
este furnizat de asemenea n dou variante.
Versiunea 2.5 pentru WINDOWS (anul 1993)
faciliti specifice mediului Windows: Dynamic Data Exchange (DDE),
Object Linking and Embedding (OLE);
mbuntirea interfeei cu utilizatorul;
faciliti 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);
prezena unui Catalog Manager;
varianta profesional permite conectivitate client-server.
Visual FoxPro 3.0 (anul 1995)
utilizarea principiilor programrii orientate obiect (POO);
mediu orientat pe evenimente (programarea orientat eveniment);
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-20
apropierea de modelul relaional al bazelor de date (introducerea
dicionarului de date);
extensii orientate obiect ale limbajului de programare;
extinderea instrumentelor de proiectare i a numrului de asisteni;
dezvoltarea rapid a aplicaiilor prin gestionarul de aplicaii 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);
mbuntirea mediului client-server;
faciliti web.
Visual FoxPro 6.0 (anul 2000)
mbuntirea Class Browser-ului pentru eficiena programrii;
noi faciliti n programarea orientat-obiect i web;
adugarea de noi metode i proprieti.

Visual FoxPro 7.0 (anul 2002)
editorul Visual FoxPro este mbuntit cu tehnologia IntelliSense
(autocompletare pe msur ce se scrie cod);
servicii web ca i obiecte (clase);
suport XML;
accesul datelor prin providerul OLE DB.
Visual FoxPro 8.0 (anul 2003)
mbuntiri ale IDE (Interactive Development Environment): Task Pane
Manager, Toolbox, IntelliSense pentru fereastra Watch, etc.;
mbuntiri ale limbajului de programare (clase, comenzi i funcii 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 anunndu-se stoparea dezvoltrii produsului de ctre
Microsoft, acesta convergnd de-a lungul ultimilor 8 ani ctre Microsoft
SQL Server;
soluie compatibil .NET cuprinznd i servicii Web XML;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


1-21
compatibilitate i interoperabilitate mrit cu SQL Server pentru a
facilita schimbul de date ntre cele dou produse (introducerea noilor
tipuri de date Varchar, Varbinary i Blob);
introducerea funciei CAST( ) pentru conversia ntre tipuri de date;
introducerea funciei inline ICASE( ) similar cu instruciunea DO
CASE;
mbuntirea raportrii;
mbuntiri la limbajul SQL (eliminarea limitrii la 9 clauze de join i
subinterogri n comanda SQL Select);
eliminarea limitrilor pentru dimensiunea irurilor (array) i lungimea
procedurilor;
Tolbox-ul este dock-abil ctre Desktop sau alte ferestre IDE (n special
s-a lucrat la dock-abilitate i la clase i funcii).
Avantaje n utilizarea FoxPro:
tehnici de optimizare performante;
limbaj performant de descriere i manipulare a datelor;
ncorporarea unui modul SQL foarte rapid;
mediu favorabil elaborrii programelor puternic modularizate i
structurate, orientate obiect;
mecanisme evoluate de conversie a programelor i a datelor (DBase-
FoxPro), suport bine pus la punct pentru XML;
utilizarea n reele de microcalculatoare, ca i client COM i COM
server ;
instalarea modular n funcie de necesiti i posibiliti;
include instrumente de proiectare de tip 4GL (4-th Generation
Language);

Dezavantajele sistemului FoxPro:
relativa simplitate a mediului (nu se pot elabora aplicaii foarte
complexe);
nu este un sistem relaional pur (de exemplu, lipsa dicionarului 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 modaliti avansate de protecie i securitate a datelor;
compatibilitatea versiunilor nu este asigurat n toate cazurile;
viteza de execuie este variabil (influenat de muli factori).
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-22

Capitolul 2 Concepte i elemente de baza n FoxPro.

Sistemul FoxPro se adreseaz, n principal, ctre dou categorii de
utilizatori :
proiectanii i programatorii care scriu aplicaii n FoxPro.
utilizatorii finali care i pot administra cu uurin datele, folosind
interfaa utilizator;

FoxPro lucreaz cu urmtoarele elemente de baz:
fiier de date: colecie de informaii organizate matricial;
fiier index: colecie de informaii auxiliare asociate unui fiier de date
cu rolul de a permite parcurgerea acestuia ntr-o anumita ordine,
respectiv pentru regsirea rapid a informaiilor pe baza unor coduri;
machet (ecran, form): interfaa de afiare i/sau de introducere a
informaiilor ntr-un fiier de date;
raport : forma de afiare a informaiilor dintr-un fiier de date la ecran,
imprimant sau fiier, avnd la baza principiul benzilor;
interogare: fiier de date virtual, obinut din unul sau mai multe fiiere
de date fizice, interconectate ntre ele pe baza unor relaii;
program: colecie de instruciuni FoxPro ordonate conform unui
algoritm ce urmrete, n general, prelucrarea informaiilor din unul sau
mai multe fiiere;
aplicaie: program special ce integreaz elementele FoxPro care au ca
scop realizarea unui grup de operaii unitare;
proiect: fiier de date special ce integreaz elementele FoxPro care au
ca scop realizarea unui grup de operaii unitare i care se folosete
pentru generarea de aplicaii 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
instruciunile i modalitile de lucru cu aceste elemente.

Fiierele de date FoxPro au o organizare special ilustrat n figura
urmtoare.

Fiier de date - reprezint conceptul central al sistemului FoxPro
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-23

Se disting dou pri importante n acest fiier: zona propriu-zis de
informaii mprit n rnduri numite articole i coloane de cmpuri i antet fiier
n care se pstreaz informaiile de organizare a zonei propriu-zise.










Fiier index
Unui fiier de date FoxPro i se pot asocia unul sau mai multe fiiere
index cu scopul de a permite regsirea rapid a articolelor n funcie de cheile
realizate pe baza unor cmpuri sau combinaii de cmpuri.
Organizarea fiierului index este prezentat n figura urmtoare:
ANTET FIIER zona n care se pstreaz informaiile despre
structura fiierului i anume: numrul de cmpuri (coloane) din
fiier, numrul de articole, data i ora ultimei actualizri. Pentru
fiecare cmp se rein: numele, tipul, lungimea, informaii de
index.




CMP


CMP: unitatea elementar de memorare n fiier ce se
regsete la intersecia dintre un articol i o coloan.
ARTICOL: poriune elementar a fiierului la care utilizatorul
are acces la un moment dat; articolul este format din mai multe
cmpuri.
COLOANA: toate cmpurile dintr-un fiier ce se
caracterizeaz prin acelai nume, tip, lungime i se afl n
articole diferite.
COLOAN
ARTICOL
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-24
Valoare cheie (ordonat) Numr de ordine articol n fiier

Valoare cheie: valorile cmpurilor sau combinaiilor de cmpuri din fiierul de
date ordonate cresctor sau descresctor, dup opiune;
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 obinut aceste valori, prin evaluarea unei
chei ordonate cresctor sau descresctor.
Numrul de perechi n` este mai mic sau egal ca numrul de articole din
fiierul de date asociat.
Avantajul cutrii n fiierul de date printr-un fiier index asociat rezult
tocmai din faptul c valorile sunt ordonate, deci cutarea n index este relativ
simpl i rapid, dup care, prin obinerea numrului de ordine al articolului
cutat, cutarea 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
aseamn 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 operaii de afiare i/sau operaii de ntreinere a
fiierelor de date, realiznd astfel o interfa ntre utilizator i sistemul FoxPro.
Avantajul folosirii machetelor const, n primul rnd, n existena unui
editor specializat n crearea i modificarea acestor machete ntr-un mod facil.
De asemenea limbajul de programare dispune de instruciuni de lucru cu
machete.
Raportul reprezint modalitatea prin care se pot realiza operaii de
afiare sau de tiprire a informaiilor din fiierele de date. Un raport conine mai
multe benzi pentru o grupare lizibil a informaiilor. Avantajul folosirii rapoartelor
const, n primul rnd, n existena unui editor specializat n crearea i
ANTET INDEX










1
2

i`

n`
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-25
modificarea acestora, n care este suficient s definim informaiile (text utilizator
i cmpuri) care se vizualizeaz n fiecare banda pentru ca afiarea/tiprirea
informaiilor 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 relaii ntre cmpurile
de acelai tip. Se permite de asemenea filtrarea informaiilor (cmpuri i/sau
articole) din oricare din fiierele fizice. FoxPro dispune de un editor specializat
n crearea i modificarea lor. Avantajul folosirii interogrilor const n economia
de spaiu necesar memorrii unui fiier virtual fa de unul fizic echivalent,
precum i din ntreinerea uoar a elementelor componente.

Programul reprezint unitatea elementara n care se pot grupa
instruciunile, conform unui algoritm. La nivelul sistemului, programele se
ntrein printr-un editor de texte ncorporat.

Aplicaia ca program integrator de elemente FoxPro, se poate realiza
i pe ci tradiionale folosind editorul de programe i scriind efectiv un astfel de
program. Metoda aceasta este specific majoritii 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 noiunea de
proiect.
Proiectul este un fiier de date special, integrator de obiecte FoxPro,
care se folosete pentru generarea de aplicaii sau programe executabile.
Sistemul FoxPro este capabil s creeze dou tipuri de formate executabile :
primul numit compact, care necesit existena unor biblioteci FoxPro, iar al
doilea numit stand-alone, care nu necesit nici un fiier suplimentar pentru a fi
lansat n execuie.
2.1 Descrierea mediului integrat

FoxPro este un sistem ce dispune de un mediu integrat compus din
modul de execuie, compilator ncorporat n sens FoxPro, generator (pentru
machete, interogri, meniuri, aplicaii), 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 posibiliti de editare ca la un program (fereastra Command), alte utilitare
(sistem de gestiune a fiierelor DOS-System, Filer, calculator, etc. ).

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-26
2.2 Tipuri de date n FoxPro, operatori, funcii
Un tip de dat reprezint o caracteristic a datelor prin care se
stabilete ce operaii se pot executa asupra lor, modul de codificare a datelor n
memoria calculatorului, semnificaia 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 funciile
referitoare la datele de tipul respectiv.
Pentru mai multe detalii asupra funciilor sau instruciunile 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 funcii, variabile de tip numeric, constante numerice. Se pot
evidenia urmtoarele:
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 octei, 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 octei. 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 octei. O valoare de
acest tip se declar prin introducerea n faa valorii numerice a
simbolului monetar ($).Exemplu A=$500.47
Operatori algebrici
( , ) Grupeaz expresiile
** , ^ Ridicare la putere
* , / , % nmulire,mprire,modulo
+ , - Adunare,scdere
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-27
Operatori relaionali
< 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 numr de zecimale
este : SET DECIMALS TO
Efect: determin numrul 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

Funcii referitoare la semnul datelor numerice:
ABS(<expn>) returneaz valoarea absoluta a unei
expresii numerice
SIGN(<expn >) returneaz un numr indicnd semnul
matematic al expresiei numerice
transmise ca parametru i anume: +1
pentru numere > 0, -1 pentru cele mai
mici ca zero sau 0
Funcii de aproximare a datelor numerice:
INT(<expn >) trunchiaz rezultatul unei expresii
numerice la partea ntreag
ROUND ( < expN1>, <expN2>)

returneaz numrul expN1 rotunjit la
numrul 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 numrul expn
FLOOR(<expn >) returneaz cel mai apropiat ntreg mai
mic sau egal ca numrul expn
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-28

Funcii matematice elementare:
EXP(<expn >) returneaz rezultatul ridicrii constantei
"e" la puterea dat ca parametru
LOG(<expn >) returneaz logaritmul natural / zecimal
pentru numrul specificat
SQRT(<expn >) returneaz valoarea radicalului din
numrul (pozitiv) specificat
MOD ( <expN1>, <expN2>)

returneaz un ntreg, restul mpririi
<expN1> la <expN2>. Semnul
rezultatului este cel al <expN2>.
MAX (< exp1>, < exp2>, <
exp3>) sau MIN(< exp1>, <
exp2>, < exp3>)
returneaz maximul / minimul dintre
dou expresii numerice
RAND (< expN>)

returneaz un numr aleator n
intervalul 0 i 0.999999. Fr
parametru sau cu o valoarea negativa
se folosete pentru iniializarea
ceasului sistem. Implicit este
0.1000001.

Tipul logic are un singur octet lungime i poate memora doua valori:
adevrat (.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 funcii, variabile de tip logic sau alte expresii logice.


Operator logic
( , ) Grupeaz expresiile
! , NOT Negaie logic
AND I logic
OR SAU logic

Exemplu :
? NOT (1=3)
.T.
? (1<=4) AND (5>3)
.T.
? 6<3 OR 4*2=9
.F.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-29
Tipul dat calendaristic are 8 octei 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 Formatul de afiare
AMERICAN
LL/ZZ/AA
ANSI
AA.LL.ZZ
BRITISH
ZZ/LL/AA
FRENCH
ZZ/LL/AA
GERMAN
ZZ.LL.AA
ITALIAN
ZZ-LL-AA
JAPAN
AA/LL/ZZ
USA
LL-ZZ-AA
MDY
LL/ZZ/AA
DMY
ZZ/LL/AA
YMD
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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-30

Funcii pentru tipul de dat calendaristic
DATE()
obinerea datei curente a sistemului
DOW(<eD>)
returneaz valoarea numeric a zilei sptmnii
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 sptmnii pentru dat
specificat
DAY(<eD>)
returneaz numrul zilei din cadrul lunii pentru data
specificat;
MONTH(<eD>)
returneaz numrul 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)
Funcii pentru controlul timpului
TIME(<eN>)
returneaz un ir de 8 caractere n formatul
HH:MM:SS ce reprezint ora exact a sistemului


Instruciuni 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 oricrui caracter ASCII, limita
impus fiind de 254 caractere. irul de caractere este o mulime
ordonat de caractere ce se trateaz ca un tot unitar. Fiecrui
caracter i se poate asocia un numr reprezentnd poziia acestuia
n cadrul irului (primul caracter are poziia 1).
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-31
Se folosete pentru a stoca valori n cmpurile de acest tip ale tabelelor
din baza de date, valorile returnate de funcii pentru date calendaristice,
variabile de tip dat calendaristica, constante de tip dat calendaristic.

Operatori de concatenare
+
concateneaz iruri, eventualele spaii finale ale fiecrui ir
rmnnd intre iruri
-
concateneaz iruri, spaiile 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
Observaii: Operatorii de comparare returneaz un rezultat adevrat (.T.) sau
fals (.F.) putnd fi utilizai 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 poziiile
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
LEN (<expC>, <memo
field>)
returneaz o valoare numeric ce indic
numrul de caractere dintr-o expresie de tip
caracter sau dintr-un cmp memo
AT (<expC>,<expC>/<memo
field>)

returneaz un numr ce indic poziia de la
care ncepe primul ir de caractere ca subir al
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>
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-32
ield>, <expN>)

- dac <expN> este zero, returneaz irul vid
- dac <expN > este mai mare dect <expC>,
se returneaz <expC> n ntregime
RIGHT (<expC>,/<memo
field>, <expN>)
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
SUBSTR (<expC>,/<memo
field>, <start
position>,<number of
characters>)
extrage i returneaz din expC un subir de
caractere ce ncepe n poziia specificat
<start position> de lungimea indicat de
<number of characters>
LOWER(<expC>)
UPPER(<expC>)
convertete literele mari n litere mici
convertete literele mici n litere mari
LTRIM (<expC>)/RTRIM
(<expC>)
terge spaiile de la stnga/ dreapta unui ir
de caractere i returneaz rezultatul
TRIM (<expC>) terge spatiile de la sfritul unui ir de
caractere i returneaz rezultatul
CHR (<expC>) convertete o expresie numeric ntr-una de
tip caracter
MAX (<expC1>,<expC2>)
MIN (<expC1>,<expC2>)
returneaz maximul/minimul dintre dou
expresii de tip caracter
SPACE (<expN>) genereaz un ir de caractere compus din
<expN> spaii
LIKE (<pattern>,<expC2>) 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')
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-33
? 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 cantitilor mari de text (fr 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 spaiului liber pe disc.


Utilizarea cmpurilor memo se recomand n situaiile n care apar
diverse comentarii i, evident, nu n toate nregistrrile (ar fi ineficient s se
stabileasc un cmp caracter cu lungimea 70 doar pentru explicaiile care apar
n cteva nregistrri). Informaiile din cmpul memo nu sunt memorate n
acelai fiier cu restul cmpurilor.
O tabel ce conine un cmp memo are asociat un fiier cu extensia FPT
numai pentru datele memo.
Editarea repetat a datelor memo conduce la fragmentri i se
recomand utilizarea comenzii PACK sau PACK MEMO ce determin
economie de spaiu pe disc i mbuntete 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 octei (valoarea implicit este de 64 octei) pentru un
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-34
bloc, care asigur o eficien mai mare n ceea ce privete dimensiunea
fiierului memo.

Tipul de dat general este utilizat pentru legarea i nglobarea obiectelor
(OLE) cum ar fi desene, documente, sunete, grafic.




Observaie: Prioritatea n cazul folosirii ntr-o expresie a mai multor operatori
este urmtoarea :
1. operatori matematici i pe iruri de caractere
2. operatori de comparare
3. operatori logici
4. toate operaiile ce sunt pe acelai nivel se execut de la stnga
la dreapta.
Pentru modificarea ordinii operaiilor se pot folosi parantezele rotunde.
2.3 Funcii pentru conversii ntre tipuri de date

Din numr n ir de caractere
STR (<expN>[,<lenght>]
[,<decimal>])
convertete un numr expN ntr-un ir
de caractere, returnnd un ir de
caractere.
<lenght> indic numrul total de
caractere al irului creat, iar
<decimal> indic numrul de zecimale
Din ir de caractere n numr
VAL (<expC>)

convertete un ir de caractere ntr-un
numr, returnnd rezultatul. Numrul
de zecimale este cel dat de SET
DECIMALS
Din ir de caractere n dat
CTOD (<expC>)/{ expC)

convertete o dat de intrare tip ir de
caractere (delimitate ca ir de
caractere) ntr-o variabila de tip dat
calendaristic, n formatul setat prin
SET DATE

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-35

Din dat n ir de caractere
DTOC (<expC>)/{ expC)
convertete o dat de intrare de tip
calendaristic n irul de caractere
corespunztor mm/dd/yy

Exemple:





2.4 Zone de lucru

FoxPro folosete aa numitele zone de lucru (n numr 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. Instruciunile referitoare la
fiierele de date lansate la un moment dat vor aciona 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> = numrul zonei de lucru activate;
<eC> = ir de caractere ce reprezint aliasul tabelei.

Observaii: dac eN=0 se selecteaz prima zon de lucru neocupat.

Deschiderea unui fiier (tabel) de date se face folosind comanda :





Clauze:
AGAIN deschiderea aceluiai fiier n mai multe zone de lucru;
NOUPDATE nu permite modificarea datelor (structur i coninut);
SHARE, EXCLUSIVE pentru lucru n reea;
? STR(25.6,4,1)
? STR(25.6,4,0)
STORE '12' TO A
STORE '13' TO B
? VAL(A) + VAL(B)
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]
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-36
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.

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, relaiile permanente ntre tabele, procedurile stocate, etc.
Un program care prelucreaz o baz de date relaional 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 relaional,
care este un container cu informaii 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
O baz de date relaional reprezint o structur folosit la
memorarea i gestionarea datelor, descriind un anumit tip de
obiecte.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-37
<fname1>,<fname2> = numele cmpurilor din noul tabel creat;
<type> - un caracter ce indica tipul datei pentru cmpul respectiv;
<type> <precision> <scale> Descriere
C n - ir de caractere de lungime n
D - - Data calendaristic
N n d Numeric, de lime n cu d zecimale
L - - Logic
M - - 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 pariale) 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 urmrii Help-ul.
Crearea unei baze de date
Pentru a crea o baza de date folosii comanda:

CREATE database <dbc_name>
sau, din meniul File, alegei opiunea New i Database, dup care apsai
butonul New File, ceea ce conduce la afiarea pe ecran a unei ferestre n care
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-38
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 aduga un nou submeniu, numit
Database, care conine opiunile necesare realizrii operaiilor specifice, cum ar
fi :
New table _ se creeaz o nou tabel n baza de date
Add Table _ se aduga la baz o nou tabel existent pe disc
O baz de date relaional include:
mai multe tabele cu proprietile descrise anterior;
relaiile permanente dintre tabele, relaii ce nu vor fi terse odat cu
terminarea programelor de prelucrare n care au fost definite (cum este
cazul relaiilor temporare intre tabelele);
datele referitoare la tabele i relaiile dintre ele sunt memorate n
dicionarul 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 funcii asociate bazei de date, care pot fi apelate n
secvenele de cod asociate tabelelor componente;
conexiuni, care reprezint mecanismul de accesare a datelor din alte
sisteme.
Caracteristicile tabelelor relaionate
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
urmtoarele observaii:
aceste nume nu trebuie sa conin spaii libere.
sistemul nu face diferena 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 faciliti, este bine ca ea sa fie folosit pentru
o mai uoar documentare ulterioar sau pentru o mai bun nelegere a
modului de concepere.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-39
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 funcie 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 faa
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 ncrcat automat la adugarea unei noi nregistrri. Valoarea respectiv
trebuie de s fie de acelai tip ca i cmpul. Se poate preciza deasemeni i o
expresie a crei evaluare va conduce la valoarea ce se va ncrca automat.
Validarea la nivel de cmp
Pentru un cmp al unei tabele legate se poate preciza o expresie logic
care se evalueaz n momentul schimbrii valorii cmpului. Dac valoarea
expresiei este adevrat, 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
nclcat). Observaii : Evaluarea condiiei are lor doar n momentul n care se
introduc sau modific datele din cmpul respectiv.
Validarea la nivel de nregistrare
Pentru o tabel ce aparine 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 nregistrri, se modific cele existente
sau se terg nregistrri.
Dac expresia returneaz un rezultat adevrat, operaia se consider
corect, dac nu, operaia 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 funcii utilizator sau secvene de
program destul de complexe.
Observaie: Validarea la nivel de nregistrare se declaneaz dup cea la
nivel de cmp, dar naintea secvenelor 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 operaiile de adugare de noi
nregistrri, modificarea celor existente sau tergerea unor nregistrri. Pentru
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-40
fiecare dintre aceste evenimente se pot specifica secvene de cod care se
execut la apariia evenimentului respectiv.
Observaie : secvenele de cod asociate evenimentelor de manipulare a
tabelei legate se declaneaz dup validrile 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 coninutului unui articol
al tabelei sau al unui fiier creat cu CREATE QUERY/VIEW
dac nu se indic un interval <scope> sau o condiie 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 urmtorul articol cu sgeata sus sau jos;
nchiderea ferestrei de editare se face cu CTRL/END pentru a salva
toate modificrile sau cu ESC pentru abandon;
daca nu s-a specificat NOAPPEND, se pot aduga 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;
NODELETE mpiedica marcarea pentru tergere;
NOCLEAR pstreaz ultimul articol pe ecran dup ce se iese din EDIT;
<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>]
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-41
BROWSE este comanda ce permite modificarea sau adugarea de articole ntr-
o 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 asemntoare cu EDIT;
WIDTH limiteaz dimensiunea coloanelor pentru cmpurile caracter;
FREEZE permite meninerea cursorului n acelai cmp al tabelei ;
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 adugarea 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 destinaia 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
destinaie, 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 inserare a datelor se specific, unde este cazul,
delimitatorul.

INSERT [BEFORE][BLANK] sau APPEND [BEFORE][BLANK]
INSERT adaug un nou articol n tabel, n poziia de articol curent
fr opiuni se lanseaz introducere datelor n tabel
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-42

funcioneaz ca APPEND, permind adugarea 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 coninutul
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 stelua n prima
poziie 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
refcute.

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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-43

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 ctre 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 gsi nici un articol

REPLACE <field1> WITH <expr1> [ADDITIVE] [, <field2> WITH
<expr2> [ADDITIVE]]..[<scope>] [FOR <expL1>] [WHILE
<expL2>]

REPLACE schimb coninutul cmpurilor specificate din tabela activ, implicit
doar articolul curent, cu condiia ca pointerul de articol s nu fie pe EOF.

ADDITIVE se refer doar la cmpurile memo i nseamn adugarea la vechiul
coninut, fr ca acesta s se piard. Dac se dorete nlocuirea n cmpul care
este cheie primar nu trebuie folosite opiunile 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 sortri dup cmpuri logice sau memo;
implicit, sortrile se fac n ordine cresctoare, A indic ordine
cresctoare, D descresctoare;
C impune s nu se diferenieze 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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-44

2.7 Exerciii


1. Afiai data curent n diferite formate (prezentate n tabelul din carte).
Aflai cte zile sunt pn n anul 2010.
2. Aflai n ce zi cade 1 ianuarie a anului viitor i a cta zi din sptmn
este.
3. Utilizai operatorii (concatenare i relaionali) definii pentru irurile de
caractere.
4. Testai funciile: SUBSTR(), LEFT(), ALLTRIM(), LEN(), LOWER(),
CHR().
5. Testai funciile de conversie ntre diferite tipuri de date.
6. Creai tabelul AGENDA cu structura urmtoare, folosind comanda
CREATE TABLE .
AGENDA
Nr.Crt. Denumire cmp Tip cmp Lungime cmp
1 Cod_ID Num 4
2 Nume Char 25
3 Prenume Char 25
4 Adresa Memo -
5 Oras_Rez Char 15
6 Tara_Rez Char 15
7 Data_nast Date -
8 Meserie Char 15
9 Loc_Munca Memo -
10 Tel_a Num 15
11 Tel_s Num 15
12 Tel_m Num 15
13 Fax Num 15
14 Email Char 25
Folosii comanda COPY STRUCTURE EXTENDED TO i creai fiierul
STRU_AGD. Consultai coninutul noului fiier. tergei logic i apoi
fizic articolele cu numerele 4,8,9,11,12,13,14. Construii structura unei
baze de date noi, AGENDA1, folosind comanda : CREATE Agenda1
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


2-45
FROM Stru_Agd.
7. Deschidei simultan doua tabele n doua zone de lucru diferite. nchidei
toate tabelele i ieii din Fox.
8. Creai tabelele de mai jos, cu indecii specificai.
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. Creai o baz de date numit Biblioteca.dbc care sa conin tabelele
anterior create la care adugai urmtoarele tabele:
Editura.dbf (CodEditura C3 Index primar, Editura C30
Index normal)
Domeniu.dbf (CodDomeniu C3 Index primar, Domeniu C30
Index normal)
10. Activai pe rnd fiecare index i vizualizai datele. Ce schimbri apar?
tergei unul dintre indecii asociai tabelei. Vizualizai datele! Care
este efectul?
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-46
Capitolul 3 Indexarea i relaionarea tabelelor, integritatea referenial.
3.1 Indexarea tabelelor


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 nregistrrilor tabelei se evalueaz cheia de
ordonare pentru fiecare nregistrare n parte. Valorile obinute se compar ntre
ele, iar ordinea nregistrrilor n tabela se stabilete n funcie de rezultatul
obinut.
Prin indexare se construiete un fiier special, numit fiier de index, ce va
fi folosit n scopul regsirii 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) conin 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 intrri de indeci pentru aceeai tabela n acelai fiier de index.
La deschiderea unei tabele indexate este necesar doar deschiderea
fiierului de index asociat, care conine toate informaiile despre toi indecii.
Utilizarea indecilor se poate face prin specificarea indexului care s dea
Indexarea reprezint operaia de ordonare logic a datelor
dintr-o tabela dup diferite criterii, operaie ce nu afecteaz
ordinea fizica a datelor din tabel, ci doar modul n care
acestea sunt vzute.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-47
ordinea dorit. La un moment dat doar unul dintre indeci poate fi activ i acest
index se numete index activ.
Toi indecii asociai unei tabele sunt memorai n acelai fiier, care are
acelai nume ca i tabela dar cu extensia cdx. Fiecrui 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 nregistrrile, indiferent de
valoarea cheii de indexare;
unici (Unique) care permit doar o valoare unic cheii de
indexare. Dac dou sau mai multe nregistrri ale tabelei au
aceleai valori ale cheii de indexare, numai prima dintre acestea va
fi disponibil, restul neaprnd n tabel (dei fizic exist) ;
candidat este un index asemntor cu cel unic, dar interzice
ncrcarea de nregistrri 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 nregistrrilor. Dintre acestea se alege unul care sa fie
folosit drept cheie primar a tabelei atunci cnd se creeaz o
relaie 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 poziionarea n modul sgeat n sus sau sgeat 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 cresctoare sau descresctoare este dat de tipul sgeii.
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 conine cmpuri ale tabelei dar nu i
cmpuri memo.
Clauza FOR permite limitarea nregistrrilor ce vor putea fi accesate prin
fiierul index la cele care ndeplinesc condiia <expL> .
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-48
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 informaiilor: cresctor /descresctor pentru indeci compui.
Clauza UNIQUE permite, n cazul n care sunt mai multe nregistrri cu
aceeai cheie de indexare, accesarea numai a primei nregistrri 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 absena 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 cu fiierele INDEX
asociate va arta astfel:
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 numrul
de ordine al fiierului index simplu sau al etichetei din fiierul index compus.
Sunt numrate mai nti fiierele index simple din list, apoi etichetele
aparinnd indexului compus structural i, n ultimul rnd, etichetele aparinnd
altor indeci compui nestructurali. Daca <expN>=0, nregistrrile vor fi
accesate n ordinea lor fizic (ca i cum nu ar exista un index).
Exemplu: tabela AGENDA care are mai muli indeci asociai:

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-49
USE agenda INDEX agenda ORDER TAG telefon
eticheta TELEFON din indexul compus structural
AGENDA.CDX- va fi indexul activ

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 asociai unei tabele se face folosind comanda :
REINDEX
Sunt multe situaii n care un index poate fi desincronizat (cderi de
tensiune, probleme de alocare clusteri dublii sau inexisteni) caz n care acesta
trebuie refcut. Cei mai puini expui unor astfel de probleme sunt indecii
compui structurali, care sunt deschii odat cu tabela asociat. i acetia pot
suferi fragmentari semnificative, n urma adugrii sau tergerii de articole. De
asemenea tergerea unei etichete dintr-un index compus nu elibereaz spaiul
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.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-50
Regsirea rapid a datelor
n afara de afiarea datelor ntr-o anumit ordine, indecii prezint i
avantajul major de regsire rapid a datelor. Cutarea rapid se face cu
comanda:
SEEK <expr>
Comanda este urmat de o expresie ce reprezint valoarea cutat
printre valorile cheii de indexare active. Dac este gsit o asemenea
nregistrare, indicatorul de nregistrri se va poziiona pe acesta, funcia
FOUND() va returna valoarea adevrat, iar funcia EOF() va returna fals. n caz
contrar, indicatorul de nregistrri se poziioneaz dup ultima nregistrare
FOUND() returneaz fals iar EOF() returneaz True.
3.2 Relaionarea tabelelor

O baz de date relaional reprezint o baz de date n care tabelele
(fiierele de date -.DBF) sunt organizate i accesate prin intermediul relaiilor. O
relaie este o legtur ntre fiiere de date, legtur care permite accesarea
informaiilor din mai multe fiiere (nu numai cea din zona curent). Legtura
reprezint condiia de asociere ntre fiierele de date, i este materializat printr-un
cmp comun fiierelor de date. Modelul relaional al bazelor de date implic
organizarea datelor n tabele legate ntre ele prin relaii. Scopul stabilirii relaiilor
este acela de coordonare, dup diferite criterii, a datelor din tabelele aflate in
legtur.
Relaiile dintre tabele se pot clasifica n urmtoarele patru clase:
Una la una caz n care fiecare nregistrare din tabela printe este
pus n coresponden cu o nregistrare din tabela copil;
Una la mai multe unei nregistrri din tabela printe i corespund
mai multe nregistrri din tabela copil;
Mai multe- la- una- unei nregistrri din tabela copil i corespund mai
multe nregistrri din tabela printe;
Mai multe- la- mai multe- unei nregistrri din tabela printe n
corespund mai multe nregistrri din tabela copil i invers, unei
nregistrri din tabela copil i corespund mai multe nregistrri din
tabela printe.
n Visual Fox Pro sunt implementate doar primele trei tipuri de relaii, cea de
a patra putnd fi redus la doua relaii 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 relaiilor
dintre tabele, exist :
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-51
Relaii temporare sau dinamice, care se creeaz prin comenzi n
timpul rulrii programelor i sunt disponibile numai n timpul rulrii
acestora;
Relaii permanente, ce se creeaz n faza de proiectare a bazei de
date i sunt deschise automat de ctre sistem odat cu deschiderea
bazei de date;
Pentru crearea relaiilor permanente ntre dou tabele este necesar ca:
Tabela printe s fi indexat cu un index candidat sau primar;
Tabela copil s fie indexat cu orice fel de index ;
Indecii corespunztori trebuie s existe anterior crerii relaiei.

Observaii : Tabela printe 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 printe, dup indexul respectiv,
nu pot exista mai multe nregistrri cu aceeai valoare a cheii primare.

Presupunnd ca baza de date este deschis i tabelele sunt
corespunztor indexate, stabilirea unei relaii permanente se face printr-un click
pe indexul primar sau candidat n tabela printe dup care se trage mouse-ul
peste indexul din tabela copil.

De exemplu, avem tabelele AG(enti) i TR(anzacii). Agenii care au
intermediat tranzacii se regsesc n fiierul TR, prin intermediul cmpului
NR_AGENT i nu prin intermediul cmpurilor NUME i PRENUME. Deci se poate
stabili o relaie ntre cele dou tabele prin intermediul cmpului NR_AGENT, care
aparine 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 printe (cea activ n momentul comenzii
i anume Ageni) i una sau mai multe tabele copii (Tranzacii) specificate prin
numr <expN
i
> sau alias <expC>, toate aceste tabele fiind deschise n zone de
lucru diferite.

Cheia relaiei este stabilit prin <expr
i
> care corespunde unui cmp (sau la
mai multe cmpuri) din tabela printe. Cheia relaiei este i cheia de indexare a
tabelei copil.
Stabilirea unei relaii ntre 2 tabele presupune c mutarea pointer-lui de
articol n tabela printe determin i mutarea pointer-ului n tabela copil.
Bineneles c iniial se evalueaz <expr
i
> i dac sunt gsite nregistrrile
corespunztoare 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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-52
Clauza ADDITIVE face ca relaiile deja existente pentru TABELA activ s
nu fie terse.
Aceast comand face ca fiecrei nregistrri din tabela printe s-i
corespund o nregistrare n tabela copil, unde saltul se face automat. Se pune
ntrebarea, ce se ntmpla cnd unei nregistrri printe i corespund mai multe
articole n tabela copil (care nu are activ un index unic). n aceasta situaie
comanda determin numai gsirea primei nregistrri, deci exist o relaie ONE
TO ONE "UNA LA UNA".
Comanda care permite gsirea tuturor nregistrrilor din tabela copil ce
corespund unei singure nregistrri din tabela printe, adic o relaie tip ONE
TO MANY "UNA LA MAI MULTE" este:
SET SKIP TO [<alias1> [,alias2>]...]
Pentru o folosi, relaiile trebuie s fie deja create cu o comand
SET RELATION TO...
Modul de lucru al comenzii este urmtorul: dac se mut pointer-ul n tabela
printe n urma unor comenzi GOTO, LOCATE sau SEEK, pointerul se mut pe
articolul corespunztor i n tabela copil. Urmtoarele salturi n tabela printe cu
SKIP sau cu o bucl SCAN.. ENDSCAN nu vor determina mutarea pointer-ului, n
schimb n tabela copil vom fi poziionai pe urmtoarele nregistrri ce au aceeai
cheie cu nregistrarea din printe.



Pentru tergerea relaiilor dintre tabele se va folosi comanda:

SET RELATION OFF INTO <expN>|<expC>

care terge relaia dintre tabela curent i tabela copil specificat prin
numr -<expN> sau alias -<expC>.

SET RELATION TO folosit fr parametri determina nlturarea tuturor relaiilor
existente pentru tabela curent.
Exemplu: se indexeaz iniial 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
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-53
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 referenial reprezint un ansamblu de reguli impuse tabelelor
ntre care s-au stabilit relaii. Aceste reguli sunt necesare deoarece modificarea
datelor dintr-o tabel poate afecta relaia cu tabela legat. Evenimentele ce duc la
modificri ale cheii i reprezint evenimente tratate prin integritate referenial
sunt:
Adugarea de noi nregistrri;
tergerea unor nregistrri;
Modificarea datelor unei nregistrri care afecteaz relaia.

n cazul n care se adug o nou nregistrare n tabela copil a unei relaii
se pot specifica urmtoarele opiuni:
Ignorare se pot introduce valori, indiferent dac exist sau nu nregistrri
corespunztoare n tabela printe ;
Restricionare se genereaz un mesaj de eroare atunci cnd se ncearc
adugarea unei nregistrri n tabela copil care nu are
corespondent n tabela printe.
n cazul n care se terg nregistrri din tabela printe a unei relaii se pot
specifica urmtoarele opiuni:
Ignorare se permite tergerea, chiar dac n tabela copil exist sau nu
nregistrri legate de cea tears;
Restricionare se genereaz un mesaj de eroare atunci exist
corespondent n tabela copil;
tergere n cascad se terg automat att nregistrrile din tabela copil
ct i cele din tabela printe.
n cazul n care se face o modificare care afecteaz relaia n tabela
printe se pot specifica urmtoarele opiuni:
Ignorare se permit modificrile respective, chiar dac n tabela copil
exist sau nu nregistrri legate de cea modificat;
Restricionare se genereaz un mesaj de eroare atunci exist
corespondent n tabela copil;
Modificare n cascad se modific automat att nregistrrile din tabela
copil ct i cele din tabela printe conform noii valori a
cheii relaiei.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-54
Opiunile legate de integritatea referenial se seteaz prin accesarea
ferestrei Constructorului de baze de date n care se execut dublu click pe
relaia respectiv (linia frnta care leag tabelele). Se deschide fereastra Edit
Relationship n care se apsa pe butonul Referenial Integrity care determin
deschiderea unei alte ferestre de unde se pot alege opiunile dorite.
Cele trei pagini ale ferestrei controleaz fiecare cte un tip de eveniment
astfel :
Rules for Updating pagina cu opiuni referitoarea la modificarea datelor din
tabelele legate;
Rules for Deleting pagina cu opiuni referitoarea la tergerea datelor din
tabelele legate;
Rules for Inserting pagina cu opiuni referitoarea la adugarea datelor din
tabelele legate.
3.4 Funcii. Variabile de memorie. Macrosubstituia

Variabile de memorie reprezint zona de memorie creia 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 proiectanii FoxPro. Numele variabilelor este format din
maxim 8 caractere de tip liter, cifr sau caracterul _, cu primul
caracter diferit de cifr;
coninutul 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 asemntor ca n limbajul
BASIC, adic, pentru variabile simple, n momentul primei atribuiri a valorii se
aloca spaiu pentru variabil. Variabilele tablou (masivele) trebuie declarate n
prealabil i pot avea maxim 2 dimensiuni. Numrul 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>


Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-55
se evalueaz expresia <e>, obinndu-se o valoare de un anumit tip;
se caut n memorie variabila cu numele <var> i, dac se gsete, se
nlocuiete vechiul coninut al acesteia cu valoarea expresiei;
dac nu se gsete 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
execuia comenzii.
de obicei pentru variabilele de memorie se folosete simbolul M

O tehnic special de lucru cu variabile o reprezint macrosubstituia,
prin care coninutul 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). Macrosubstituia funcioneaz ca i cum n locul variabilei
respective ar fi pus irul de caractere coninut de aceasta, fr apostrofurile
delimitatoare. Operatorul de macrosubstituie 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 conine numele variabilelor la care se renun, separate prin virgul.
RELE ALL terge toate variabilele de memorie, mai puin cele sistem. ntr-un
program, RELE ALL terge doar variabilele locale, create n programul curent
sau n cele de nivel inferior.

Afiarea de informaii despre coninutul memoriei FOX se face folosind
comanda :

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-56
LIST / DISPLAY MEMORY [TO PRINTER / TO FILE <file name>]


care determin afiarea variabilelor de memorie i utilizator
existente, tipul i valoarea lor.

Diferena ntre LIST i DISPLAY este c la aceasta din urm se ateapt
apsarea unei taste dup umplerea unui ecran cu informaii. Se poate face
redirectarea informaiilor ctre imprimant sau ctre un fiier.

Instruciuni 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
prevzuta clauza MEMO, altfel aceste cmpuri sunt ignorate. Clauza BLANK
permite crearea unui masiv sau variabile de memorie cu elemente "goale"
(sesizabile cu funcia 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 nregistrrii curente din tabela activ. Clauzele FIELDS i
MEMO au aceeai semnificaie ca i la SCATTER. De asemenea numele
variabilelor de memorie respect convenia de la SCATTER.

Utilizatorii pot s-i defineasc propriile funcii (UFD = User Define
Function) folosind comanda:

FUNCTION <function name>


Modalitatea de transmitere a parametrilor este aceeai cu cea prezentat
la proceduri.
Scrierea codului se ncheie obligatoriu cu RETURN <exp>. Dup
execuia funciei, FOX returneaz programului apelant valoarea calculat de
funcie.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-57
Exemplu: creai un fiier TEST.prg cu urmtorul coninut:

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 testai-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 elaborrii i rulrii unui program sunt urmtoarele:
se concepe algoritmul de rezolvare a problemei propuse;
se transpune algoritmul ntr-un ir de instruciuni ce reprezint chiar
programul;
se introduce programul ntr-un fiier;
se compileaz programul;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-58
se execut programul.

Exemplu : s considerm urmtorul 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 su 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 funcionare al Fox) iar execuia
(rularea) se efectueaz cu comanda: DO PRIMUL.

Instruciunile din cadrul unui program pot fi scrise cu litere mari sau mici.
O instruciune 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 instruciuni 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
execuia lui, fiierul este compilat i apoi rulat.
Execuia unui program se realizeaz cu comanda DO avnd sintaxa :

DO <nume fiier> [WITH <lista parametri>] [IN <fiier>]

Aceasta comand execut instruciunile coninute n fiierul <fiier>.
Dac <fiier> nu are prevzut extensia, atunci se vor cuta pe disc
urmtoarele fiiere, n aceast ordine:
<fiier>.EXE - program executabil
<fiier>.APP - aplicaie
<fiier>.FXP - forma compilat a programului
<fiier>.PRG - programul surs

Modul de execuie a unui program poate depinde de parametrii externi
care se transmit programului n momentul execuiei. De exemplu, presupunem
un program de sortare a datelor dintr-un fiier care necesit ca parametri
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-59
externi numele fiierului i ordinea sortrii. La execuia comenzii DO parametrii
sunt transmii ctre program prin lista de parametri a clauzei WITH. Aceast
list poate conine expresii, constante, cmpuri ale unui tabel de date, separate
prin virgul.

Execuia unui program se va opri n una din urmtoarele situaii:
la execuia unei comenzi RETURN, CANCEL, QUIT cnd se ntlnete
sfritul fiierului;
cnd se ntlnete o alta comanda DO ;
prin apsarea tastei ESC dac SET ESCAPE este ON.

Execuia unui program din interiorul altui program folosind comanda DO
reprezint un pas important n structurarea aplicaiilor de dimensiuni mari. Pe
msur ce dimensiunea unei aplicaii crete, testarea i depanarea acesteia
devine din ce n ce mai dificil datorit numrului mare de variabile i
instruciuni folosite.

Utilizatorul poate defini anumite proceduri i funcii 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 funciile unui program se introduc, de regul, dup ultima
instruciune 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 execuie, fiierul
<fiier> unde se vor cuta procedurile ce nu se gsesc n programul apelant.

ntr-o procedur se pot defini dou tipuri de variabile :

globale (publice), ce pot fi accesate i modificate n orice procedur n
curs de execuie PUBLIC <lista variabile>;
locale (private), ce nu pot fi accesate dect n procedura curent i n
cele subordonate acesteia PRIVATE <lista variabile>.
Parametrii sunt variabile de comunicare ntre programe,
definite de utilizator, ce realizeaz interfaa programului cu
exteriorul.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-60
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>]

Instruciunea 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 funcii 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 urmtoare in timp ce ??
afieaz pe linia curent.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-61
Dac SET PRINT este ON ieirea comenzii este dirijat ctre 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.
Rspunsul utilizatorului, terminat cu ENTER, este stocat n variabila de
memorie indicat (dac este cazul, aceasta este creat). Apsarea tastei ESC
(dac se lucreaz cu SET ESCAPE ON) duce la terminarea execuiei comenzii.

WAIT [<expC>] [TO <memvar>]
Afieaz un mesaj care implicit este Press any key to continue.... i
care ateapt apsarea unei taste (opional memorate n variabila de memorie
specificat).

Comanda @ SAY... GET creeaz formate particulare pentru
intrare/ ieire.

@ <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 informaii iar GET permite introducerea sau editarea
valorii datelor;
row i column sunt expresii numerice (se poate folosi i $ pentru
poziia curent) ;
coordonatele sunt totdeauna relative la colul din stnga sus al
ecranului sau al ferestrei active (0,0) ;
GET permite afiarea i actualizarea datelor coninute n cmpuri sau
atribuite unor variabile de memorie temporare ;
comanda READ activeaz toate GET anterioare ;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-62
dac READ este comun pentru mai multe GET , se trece la urmtoarea
citire prin ENTER sau sgeata 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 condiie ce va fi evaluat cnd ncercam s
poziionam cursorul pe un cmp GET; dac este fals, se trece la
urmtorul cmp;
DEFAULT furnizeaz o valoare implicit pentru GET; expresia trebuie
s corespund tipului de dat din GET, ce nu este evaluat dect la
adugarea nregistrrilor 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
corespunztor i se ateapt apsarea tastei Space dup care se cere
o nou valoare (pn la satisfacerea restriciilor) ;
VALID stabilete condiia care trebuie sa fie ndeplinit nainte ca
datele sa fie acceptate de GET ( se poate folosi o funcie 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 fie afiat dac nu s-a
satisfcut validarea;
MESSAGE este o expresie caracter afiat la execuia 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 ncrcate
(de exemplu doar cifre) i pentru a formata afiarea. Se pot folosi mti
sau funcii de formatare pentru introducerea datelor, i anume:
Mti
! convertete litere mici in litere mari;
# permite doar cifre, spatii i semn;
$ afieaz irul de caractere corespunztor lui SET
CURRENCY in locul zerourilor nesemnificative;
* afieaz asteriscuri in locul zerourilor nesemnificative;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-63
, afieaz virgula dac exista cifre la stnga ei;
. indica poziia zecimala;
A autorizeaz doar litere;
L autorizeaz doar date logice;
N autorizeaz doar litere i cifre;
X orice caracter;
Y 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 lsat loc i pentru semn.
Funcii
! 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;
A autorizeaz doar litere;
B aliniaz la stnga textul din interiorul cmpului;
D afieaz data in formatul curent;
I centreaz textul in interiorul cmpului;
J aliniaz la dreapta textul din interiorul cmpului;
T elimina spaiile de la nceputul i de la sfritul cmpului;
Z 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
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-64
@ 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 ultima comand
CLEAR, CLEAR GETS, CLEAR ALL sau READ.
SAVE face sa nu se dezactiveze instruciunile GET la urmtoarea execuie
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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-65
3.8 Controlul fluxului
DO CASE
CASE <expL1> <statements>
[CASE <expL2> <statements>]
..
[OTHERWISE <statements>]
ENDCASE

Se execut comenzile asociate primei condiii satisfcute (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 condiia este adevrat.
ENDDO i LOOP redau controlul programului spre comanda DO
WHILE pentru ca acesta s reevalueze condiia.
EXIT transmite controlul instruciunii care urmeaz dup ENDDO (
obligatorie pentru o bucla gen DO WHILE.T. );
Sunt autorizate structurile DO WHILE imbricate.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-66
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 adevrat
condiia, respectiv rezultatul celei de-a doua condiii pentru fals.
<exp1> i <exp2> trebuie sa fie de acelai tip.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-67
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 neaprat o ntrebare pus bazei de date. Ea
poate fi i o comand pentru executarea uneia dintre aciunile urmtoare:
construirea unei tabele;
inserarea, modificarea sau s tergerea de linii sau cmpuri;
cutarea n cteva tabele o anumitor informaii 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:

Crem un tabel numit Personal, cu structura Nume C(20), Salar
N(10) i dorim afiarea tuturor salariailor a cror nume este
Popescu.:

SELECT NUME, SALAR FROM PERSONAL WHERE NUME=POPESCU

Cea mai simpla interogare este : SELECT * FROM PERSONAL

prin care se afieaz ntreg coninutul 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 spaiu.
SELECT SALAR, NUME FROM PERSONAL
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-68
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 condiiei specificate cu datele supuse interogrii i
returneaz doar nregistrrile ce satisfac condiia.

Exemplu:
Care sunt agenii 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 agenii care au realizat vreo tranzacie ?

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 afirii liniilor rezultate dup valorile din coloanele
indicate n aceast clauz. Clauza ORDER BY nu poate fi folosit ntr-o
subinterogare.
ASC ( cresctor-implicit) DESC (descresctor)

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-69
Exemplu:
Ordonarea agenilor cresctor dup nume, prenume i descresctor
dup salariu.

SELECT NUME, PRENUME, SAL_BAZA
FROM AGENTI
ORDER BY NUME ASC,PRENUME, SAL_BAZA DESC

Exemple de interogri:

Care sunt numerele de cod ale agenilor care au contractat tranzacii
cu dischete ?

SELECT NR_AGENT
FROM TRANZACT
WHERE COD_PRODUS IN
(SELECT COD_PRODUS FROM MARFURI WHERE
DENUMIRE=DISCHETE)
Care sunt numele agenilor din Iai care lucreaz cu clieni de tip regii
autonome?

SELECT NUME, NR_AGENT, ORAS, DENUMIRE
FROM AGENTI, CLIENTI
WHERE ORAS=IASI AND TIP=RA
Care sunt clienii din localitile 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 neateniei, fie
unei insuficiente cunoateri a limbajului de programare sau a omiterii unor
cazuri particulare de evoluie a programului.

Exist dou mari clase de erori de programare :
erori de sintax ;
erori de rulare, cnd programul este corect scris dar nu
funcioneaz aa cum dorim .

La rularea unui program, apariia unei erori de sintax determin
ntreruperea execuiei i afiarea unui mesaj de eroare, indicnd tipul erorii i
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-70
cernd utilizatorului luarea unei decizii astfel :
Cancel - ntreruperea implicit a programului i revenire n prompter;
Suspend - Suspendarea execuiei programului;
Ignore - Continuarea execuiei, ignornd eroarea aprut.

Detectarea erorilor de rulare presupune tehnici mai avansate cum ar fi:
rularea pas cu pas;
folosirea punctelor de ntrerupere i vizualizarea coninutului
variabilelor n paralel cu execuia programului.
Toate acestea se pot efectua cu ajutorul a dou ferestre sistem numite
TRACE i Watch, accesibile din meniul Tools, opiunea Debugger din FOX.

Fereastra TRACE

Pentru a depana un program, trebuie mai nti s-l deschidem cu OPEN
din fereastra TRACE. Execuia programului poate fi fcuta n mai multe
variante:
Pas cu pas-opiunea OVER sau STEP
cu OVER se execut cte o instruciune, dar cnd aceasta este
un apel ctre o rutin, acesta este executat n ntregime, ntr-un
singur pas;
cu STEP se execut cte o instruciune, dar cnd aceasta este
un apel ctre o rutin, acesta este executat pas cu pas;
n combinaie cu STEP se poate folosi OUT care determin
executarea continu a restului de instruciuni 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 acionare a acestor taste, cnd cursorul se afl pe o linie ce conine 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 execuiei programului ci
doar suspendarea acestuia, pn la o nou comand a utilizatorului.

Execuie continu, la vitez maxim sau execuie continu, cu viteza
controlat

Se obine folosind opiunea THROTTLE ce const n executarea
programului pas cu pas, dup executarea fiecrei instruciuni fcndu-se o
pauz stabilit de utilizator.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-71
n paralel cu executarea unui program n fereastra TRACE, se poate
vizualiza coninutul variabilelor in fereastra WATCH.
Fereastra WATCH are doua pri : n partea de sus se introduc variabile i
expresii ce se doresc a fi vizualizate n timpul execuiei 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 poziiona un astfel de punct, pe bara ce separ cele dou
pri se va amplasa un marcaj cu mouse-ul sau deplasndu-ne pe bara
separatoare cu TAB , poziionndu-ne cu ajutorul sgeilor i apsnd SPACE.

Exemplu :

Dorim s calculm 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.
Introducei o greeala in program, de exemplu in loc de SUMA+I scriei
SUMA*I i depanai programul dup indicaiile de mai sus.
3.11 Instrumente WIZARD
Instrumentele wizard au fost introduse pentru a permite utilizatorilor
mai puin avansai s profite de avantajele programului. Un wizard este un
instrument soft care ajut la efectuarea rapid i comod a operaiunilor de
prelucrare a bazelor de date, ofer instruciuni, pune ntrebri i n funcie de
ceea ce i se rspunde 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
opiunea Wizard apare o fereastr derulant cu lista instrumentelor din care l
alegem pe cel dorit.
La lansarea unui wizard trebuie citite instruciunile i trebuie date
rspunsurile la ntrebrile puse, apoi se alege butonul Next (sau Back dac se
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-72
dorete ntoarcerea la caseta anterioar) iar la ultima caset se apas butonul
Finish.
Table wizard
v ajut s creai un tabel. Fereastra Table Wizard conine o list a
tabelelor tipice cu exemple de cmpuri frecvent utilizate. Selectai
cmpurile dorite i ele vor fi incluse n noul tabel. Putei modifica
numele cmpurilor, tipul i lungimea lor precum i ordinea de sortare a
datelor. Caseta de dialog 3 are 4 opiuni 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;
Modify structure of table modifica structura tabelului.
Form Wizard
v ajut s creai un ecran pentru a gestiona informaiile 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
(printe i copil, relaionate) ;
utilizai butoanele disponibile pentru a v deplasa prin tabel i a efectua
diverse operaii. Butoanele pot avea ataate etichete text sau imagini
explicative.
n caseta 2 alegei cmpurile ce dorii s fie incluse n ecran. Un cmp
se alege prin dublu click pe numele sau din lista Avaible Fields sau prin
selectarea sa i apsarea butonului Add. Butonul Add All include toate
cmpurile din lista. nlturarea unui cmp din lista Selected Fields se
face prin selectarea lui urmat de apsarea 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 stabilii un titlu care va fi plasat n partea
superioar a noului ecran i tipul de salvare:
Save form for later use salveaz ecranul pentru o
ntrebuinare ulterioar;
Save and run form salveaz i ruleaz ecranul;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-73
Modify form with design tools modific ecranul cu
instrumentele de proiectare .
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 creai o structur care poate grupa
nregistrrile pn la trei nivele de grupare i opional
calculeaz totaluri pariale i generale pentru cmpurile
numerice;
Multi Column Report Wizard v asist la crearea unui
raport cu maxim trei coloane;
Report Wizard - raport .
Opiunile din casetele ce apar pe ecran sunt asemntoare cu cele
prezentate anterior.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-74
3.12 Exerciii


1. Folosind tabelele create n lucrrile anterioare, introducei date n fiecare
tabel, afiai structurile tabelei, testai pe rnd fiecare comand prezentat
mai sus.
2. Avnd unul dintre fiierele create la lucrrile anterioare:
creai o copie (folosind instruciunea COPY...) ;
creai un index (CDX) ;
comparai fiierul DBF dup crearea indexului cu copia fiierului
original;
tergei (DEL) fiierul index;
dai comanda USE cu fiierul DBF pentru care ai creat indexul.
3. Dai comanda PACK (fr s fie marcat pentru tergere vreun articol)
pentru unul din fiierele DBF. Urmrii lungimea fiierului nainte i dup
executarea comenzii.
4. Pentru fiierul ageni, creai urmtoarele indexuri i afiai coninutul tabelei
cu fiecare index dintre :
nume+prenume,
nume+numr de identificare (marca) ,
nume+data naterii descresctor,
nume+data angajrii +salar (descresctor)
5. Scriei procedurile pentru marcarea la tergere, n tabela cu agenii firmei,
a urmtoarele articole: agenii avnd acelai nume, agenii ce au numele
asemntor cu unul introdus de la tastatura.
6. Testai comenzile REINDEX i PACK
7. Folosind unul dintre fiierele existente, testai comanda ZAP n ambele
variante, pentru SET SAFETY ON i OFF
8. Folosind baza de date Biblioteca creat n lucrarea anterioar:
stabilii relaiile dintre tabele.
stabilii regulile de integritate referenial.
nchidei i redeschidei baza de date. Verificai dac relaiile
stabilite anterior sunt prezente.
9. Creai o baz de date numit Firma care s cuprind tabelele Ageni,
Clieni, Mrfuri, Tranzacii, Facturi cu structura de mai jos. Studiai tabelele
i creai pentru fiecare indecii necesari, apoi relaionai tabelele.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-75


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

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)
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) (intrri, ieiri)
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)

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)

10. Adugai n tabelul AGENTI o coloana numeric PRIME i completai
valorile dup cum urmeaz: 100000 pentru cei din oraul Iai, 75000
pentru cei din restul judeului, 60000 pentru ceilali.
11. tergei din tabelul MARFURI liniile cu cantitatea sub 10, sau preul unitar
<1500. Adugai n tabelul FACTURI o coloana TVA i completai valorile
cu 19% din coloana VALOARE.
12. Creai un fiier numit SALARIAT cu structura: nume, salar, impozit,
rest_plata. Calculai impozitul pentru persoanele cu un salar mai mare
dect o valoare pe care o introducei folosind comanda ACCEPT. Pentru
calculul impozitului creai o funcie numita IMPOZIT. (Exemplu: pentru
salarii intre 500000-1500000 impozitul este 105000 plus 28% din diferena
dintre salar i baza de 500000).
13. Scriei un program care sa va permit introducerea datelor ntr-un fiier
creat de dvs. folosind comenzile de intrare/ieire nvate in aceasta
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-76
lucrare. Folosii instruciunile de validare a datelor pentru cmpurile unde
acest lucru este necesar.
14. Scriei un program pentru calcularea mediilor studenilor unei grupe
format din dou semigrupe. Ca date de intrare avei fiierul STUD.DBF cu
structura :
NUME C(15)
PRENUME C15)
ID N(3.0) && numr matricol
NOT1 N(3,0)
NOT2 N(3,0)
NOT3 N(3,0)
NOT4 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 cresctoare a
semigrupelor i a mediilor, apoi n ordine cresctoare pentru
nume, prenume i numr matricol.
Mediile se vor calcula cu o funcie, dup urmtoarea regul:
pentru o singur absen, se mparte suma notelor la 3, altfel
la 4.
Atenie la folosirea literelor mari i mici i la eventualele
spaii de la nceputul cmpurilor caracter.
15. Scriei un program de calcul al salariilor agenilor comerciali pentru luna
precedent celei curente. La salariul de baz se aduga 3% din tranzaciile
"cumprare" 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. Creai fiierul DATEPERS.DBF cu urmtoarele 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 cresctor dup nume, prenume, nr_agent.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


3-77
17. Scriei un program care s creeze un fiier pentru facturile neachitate i
numrul de zile de ntrziere acumulate, grupate pe clieni, ncasri i plai.

18. Scriei un program care s realizeze un joc asemntor cu
spnzurtoarea. Cuvintele ce trebuie ghicite sunt stocate ntr-un fiier
numit BAZA. Numrul de ncercri poate fi 5, iar n loc de desenul
cunoscut putei afia diverse mesaje.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-78

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 execuia unui
program de la prima pn la ultima linie de cod, va trebui s analizam obiectele,
care sunt componente de sine stttoare ale aplicaiei, mpreun cu
proprietile 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 proprieti.
POO este o modalitate de a mpacheta codul astfel nct sa poat fi
refolosit i ntreinut mai uor.
Primul nivel de mpachetare se numete clas. Clasa reprezint
definiia, ntr-un anumit limbaj de programare, a unui tip de obiecte, adic
descrierea proprietilor i metodelor componente.
Clasele i obiectele sunt nrudite, dar nu sunt similare. Clasa conine
informaii despre cum trebuie s arate i s se comporte un obiect, deci
determina caracteristicile acestuia.
Un obiect are proprieti sau atribute determinate de clasa care st la
baza lui, proprieti ce pot fi stabilite n faza de proiectare sau execuie.
De exemplu, n tabela de mai jos sunt prezentate cteva dintre
proprietile obiectului numit caset de validare :

Proprietatea Descriere
Caption Textul descriptiv de lng caseta de validare
Enabled Specific dac utilizatorul poate selecta sau nu caseta
de validare
Fore Color Culoarea textului afiat drept titlu
Left Poziia marginii din stnga a casetei de validare
MousePointer Felul n care arat indicatorul mouse-ului cnd se afla
deasupra casetei de validare
Top Poziia marginii de sus a casetei de validare
Visible Specific dac pentru utilizator caseta de validare este
vizibil sau nu
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-79
Metode i evenimente asociate unui obiect
Fiecare obiect poate recunoate i poate reaciona la unul sau mai
multe evenimente.
Un eveniment este o aciune specific i predeterminat, iniiat de
utilizator sau de sistem. n Visual Fox Pro aciunile utilizatorilor ce pot declana
evenimente sunt micarea mouse-ului, apsarea unei taste, etc. Evenimentele
declanate de sistem sunt iniializarea 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 scriei cod
pentru metoda asociat evenimentului Click, codul respectiv se execut la
apariia evenimentului click.
Tabelul de mai jos prezint cteva evenimente asociate unei caseta de
validare:

Eveniment Descriere
Click Utilizatorul execut click n caseta de validare
GotFocus Utilizatorul selecteaz caseta de validare printr-un click de
mouse sau prin apsarea tastei TAB
LostFocus Utilizatorul selecteaz alt control
Refresh Valoarea casetei de validare este actualizat pentru a reflecta
modificrile survenite n cadrul sursei de date asociate
SetFocus Casetei de validare i se atribuie focusul (devine inta intrrilor)
ca i cum utilizatorul ar fi apsat tasta TAB

Clasele
Toate proprietile , metodele i evenimentele asociate unui obiect sunt
specificate n cadrul definiiei clasei. n plus, clasele au o serie de caracteristici
ce permit scrierea de cod care este uor de ntreinut i poate fi reutilizat.
Caracteristicile claselor sunt :
ncapsularea implic mpachetarea codului n cadrul obiectului i
abstractizarea acestuia. De exemplu, proprietile ce determin
elementele unui casete cu lista i codul ce se execut atunci cnd
selectai un element din list pot fi ncapsulate ntr-un singur control ce
se adaug la un formular.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-80
Subclasele sunt derivate dintr-o clasa existent. Subclasele
motenesc toate funcionalitile clasei printe, dar pot avea i
proprieti 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 urmtoare:
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 conin alte obiecte, permind accesul la
acestea. De exemplu, n cazul n care creai o clas container care cuprinde o
caset list i dou butoane de comand, dup care adugai unui formular un
obiect bazat pe aceast clas, fiecare obiect poate fi manipulat individual, att
la proiectare ct i n timpul execuiei.
Toate clasele recunosc urmtorul set minimal de evenimente:

Eveniment Descriere
Init Apare la crearea unui obiect
Destroy Apare la descrcarea unui obiect din memorie
Error Apare de cte ori se semnaleaz o eroare

Toate clasele recunosc urmtorul set minimal de proprieti:

Proprietate Descriere
Class Tipul clasei
BaseClass Clasa de baz din care provine (Form,
CommandButton, etc.)
ClassLibrary Biblioteca de clase n care este stocat
ParentClass 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


4-81
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.


4.1 Crearea claselor

Se poate face din cadrul gestionarului de proiecte, selectnd pagina
Classes i apoi New sau din meniul File, opiunea 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 opiunii 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.
Interfaa proiectantului de clase ne permite vizualizarea i modificarea
proprietilor 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 aduga
controale (butoane, grile, imagini, etc.).
Unei clase existente i se pot aduga proprieti noi astfel:
Din meniul Class, selectai New Property;
n caseta New Property introducei numele proprietii;
Specificai vizibilitatea (Public, Protected, Hidden) ;
Dai click pe Add.
Command Clasa de baz
Subclasa Exit
Obiect n formular
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-82
ntr-un mod asemntor se poate aduga i o metod nou unei clase.
Atunci cnd adugai o proprietate nou , valoarea ei implicit este .F.
Pentru a specifica o alt valoare, n fereastra Properties, n fia Other, dai click
pe proprietatea dorit i introducei noua valoare.
Atribuirea unei pictograme pentru noua clas n vederea afirii pe bara
de instrumente se face prin selectarea opiunii Class Info din meniul Class
(trebuie sa fii n proiectantul de clase). n caseta Class Info introducei numele
i calea pentru fiierul.bmp din caseta Toolbar Icon.
Adugarea claselor la formulare se face astfel :
1. Din meniul Tools, alegei opiunea Options, apoi alegei fia Controls;
2. Selectai Visual Class Libraries i alegei Add;
3. Din caseta de dialog Open alegei o biblioteca de clase pe care sa o
adugai i selectai 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
nregistrrilor dintr-o tabel.

Butoanele de navigare vor execut urmtoarele comenzi:

poziionare pe prima nregistrare din tabela navtop;
poziionare pe nregistrarea anterioara celei curente-navprior;
poziionare pe nregistrare urmtoare celei curente navnext;
poziionare pe ultima nregistrare din tabela navbottom.

Butoanele vor avea caracteristici comune, de aceea merit s crem o
clas pentru toate butoanele de navigare. Clasa printe este numit Navbutton
i va fi definit ulterior.
Odat definit clas printe, subclasele ce urmeaz definesc
funcionalitatea i aspectul specific fiecrui buton. Va fi creat o clas container,
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-83
numit vcr, n care va fi adugat fiecare buton. Containerul va fi apoi adugat
formularelor pentru a se putea naviga n cadrul tabelei.


Exemplu:

Scriei 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



Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-84
* 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

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-85
* 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 interfee grafice ce
ofer utilizatorului posibilitatea de a aciona asupra tabelelor de date prin
operaii de adugare, modificare, tergere sau consultare a informaiilor stocate.
Formularele sunt compuse din obiecte ce pot rspunde 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 opiunea 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 interacioneaz formularul,
precum i relaiile 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, fcndu-se
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-86
automat legtura 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 opiunea View, Data Environment, apoi click dreapta i Add. n caseta de
dialog Open alegei tabela dorit, repetnd operaia de adugare pn ce lista
de tabele este epuizat.
Cele mai importante proprieti ce trebuie setate pentru mediul de date
sunt:

Proprietate Descriere Valoare implicit
AutoCloseTables Controleaz nchiderea automat a
tabelelor la eliberarea formularului din
memorie
Adevrat(.T.)
AutoOpenTables Controleaz deschiderea automat a
tabelelor la rularea formularului
Adevrat(.T.)
InitialSelectedAlias Indic tabela selectat la rularea
formularului
Dac nu se
specific, n
momentul execuiei
este selectat primul
cursor adugat n
DataEnvironment
Eliminarea unei tabele din cadrul mediului de date se face prin
selectarea tabelei urmat de selectarea opiunii Remove din meniul
DataEnvironment.
Dac pentru tabelele ce au fost adugate n mediul de date existau
relaii permanente, acestea se pstreaz i sunt vizibile.
Dac nu exist relaii persistente ntre table, acestea se pot crea prin
tragerea unui cmp din tabela primar peste eticheta de index corespunztoare
din tabela asociat. Atunci cnd se stabilete o relaie n cadrul mediului de
date, ntre tabele va aprea o linie care reprezint relaia, proprietile acesteia
putnd fi setate din fereastra Properties.
Dup ce am definit mediul de date asociat unui formular va trebui s ii
adugam 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 interacioneaz cu controalele asociate datelor, valorile introduse de
el sunt stocate n sursa de date.
Proprietile 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 pstrat ca valoare a proprietii i nu va
fi salvat pe disc sau n memorie.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-87
4.3 Utilizarea controalelor predefinite

Butoane de opiune

Grupurile de butoane de opiune sunt containere ce cuprind butoane de
opiune. Ele permit utilizatorilor sa aleag doar una dintre opiunile puse la
dispoziie 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 ctre
o imprimant. Implicit n grupul de butoane de opiune sunt introduse dou
butoane.
Prin modificarea proprietii ButtonCount se poate specifica numrul
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 proprietii Value i se atribuie o valoare de tip caracter
nainte de rularea formularului, proprietatea Value este dat de titlul butonului
selectat.
Configurarea proprietilor se poate face manual pentru tot grupul de
butoane sau pentru fiecare buton n parte din fereastra Properties, sau n
timpul execuiei, indicnd numele butonului i valoarea respectiv pentru
proprietatea dorit.
Exemplu: considerm c avem un grup de dou butoane prin setarea crora
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 proprieti 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 proprietilor 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 opiune pot fi folosite i pentru pstrarea informaiilor ntr-
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-88
o tabel, prin salvarea proprietii Caption. Pentru aceasta va trebui s :
Atribuim un sir vid proprietii Value a grupului de butoane;
Atribuim Proprietii 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 informaii ce pot reprezenta valori dintr-un tabel sau
opiuni 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 sgeata n jos pentru a afia toate elementele
listei.

Proprieti i metode ale unei liste :

Proprietate Descriere
ColumnCount Numrul de coloane din caseta list
ControlSource Pstreaz valoarea aleas de utilizator din cadrul
listei
Multiselect Indic dac utilizatorul poate selecta mai multe
elemente la un moment dat
RowSource Sursa de provenien a elementelor afiate n list
RowSourceType Indic tipul pentru RowSource (o valoare, o tabela,
o interogare, etc.)
Metode Descriere
AddItem Adaug un element la o list pentru care
proprietatea RowSourceType este 0
RemoveItem Elimin un element dintr-o list pentru care
proprietatea RowSourceType este 0
Requery 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 proprietii RowSourceType i prin atribuirea
unei surse de date, completnd valoarea corespunztoare pentru proprietatea
RowSource.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-89
RowSourceType Sursa elementelor listei
0 Nici una. Elementele listei se adaug prin program
1 Valoare
2 Alias
3 Instruciune SQL
4 Interogare (Query)(.qpr)
5 Matrice
6 Cmpuri dintr-o tabel
7 Fiiere
8 Structur
9 Lista pop-up (inclus pentru compatibilitate cu
versiunile anterioare)

Exemple :
Dac RowSourceType este 0, elementele listei se pot aduga
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 funcie 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 setai
RowSourceType pe 3 sau pe 6.
Dac RowSourceType este 3 trebuie sa includei o instruciune SQL
SELECT n proprietatea RowSource. Dac instruciunea va fi scris
prin program, ea va trebui inclus ntre ghilimele. Este de preferat ca
rezultatele interogrii s fie plasate ntr-un cursor pentru a nu se afia
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-90
rezultatul ntr-o fereastra Browse.
Dac RowSourceType este 4 caseta poate fi populat cu rezultatul
unei interogri salvate ntr-un fiier cu extensia .qpr, caz n care
proprietii 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 opiunea c pot fi alese i alte uniti 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 opiune din list,
pentru care s fie afiate o serie ntreag de alte informaii. De exemplu, dac
lista este populat cu numele pacienilor tratai de un medic i dorim s afim
toate informaiile legate de pacient, putem proceda astfel, n funcie de sursa de
date a formularului:

RowSourceType Selectarea nregistrrilor corespunztoare
2-Alias
6-Cimpuri
Cnd utilizatorul selecteaz o valoare din list,
indicatorul de nregistrri 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
0-Nici una
1-Valori
3-Instructiune SQL
4-Interogare (qpr)

n cadrul evenimentului InteractiveChange selectai
tabela ce conine nregistrarea cu valoarea dorit, apoi
cutai valoarea respectiv. De exemplu dac
RowSource conine numele de identificare pentru
pacieni, se poate folosi codul urmtor
Select pacieni
Locate for This.Value=pacient_id
Thisform.Refresh

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-91
0 sau.F.
1 sau.T.

2

Null
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 stri posibile pentru caseta de validare i anume :

Forma afiat Proprietatea Value

Proprietatea Value a casetei de validate
indic tipul de date corespunztor
ultimei atribuiri efectuate. Daca s-a
setat valoarea .T. sau .F. tipul de data
este Logical, i nu se va schimba dect
atunci cnd vei atribui proprietii o
valoare numeric.

Dac se asociaz proprietii ControlSource a unei casete de validare
un cmp de tip logic dintr-o tabel, caseta va fi :
bifata dac valoarea nregistrrii curente este .T. ;
nu va fi bifat dac valoarea nregistrrii curente este .F. ;
va avea un semn pe fond cenuiu dac valoarea nregistrrii curente
este .null.
Caseta tip text

Caseta tip text este controlul de baz n care utilizatorul poate s
introduc sau s modifice datele pstrate 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 proprietii 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 funcia Messagebox() sau comanda Wait Wind mesajul
dvs.).
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-92
Exemplu: dorim s introducem ntr-o caset de tip text un numr 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 intrrilor
atribuii valoarea .T. proprietii 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 atribuii valoarea Y
proprietii InputMask.
Dac se dorete acceptarea introducerii unor valori fr ca acestea s
apar n clar (de exemplu la introducerea unor parole), se atribuie proprietii
PasswordChar valoarea * sau orice alt caracter generic.
Pentru a introduce date calendaristice vor fi setate urmtoarele
proprieti:

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

Cele mai importante proprieti pentru casetele tip text sunt :

Proprietate Descriere
Alignment Seteaz tipul de aliniere a valorilor introduse n caseta
(stnga, dreapta, centru, automat). Alinierea depinde
de tipul de dat introdus.
ControlSource Cmpul tabelei sau variabila a crei valoare este
afiat
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-93
InputMask Indic regulile de introducere a datelor
SelectOnEntry Stabilete dac la primirea focusului coninutul casetei
va fi selectat automat
TabStop Indic dac utilizatorul poate ajunge la caseta apsnd
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 urmtor i posibilitatea de deplasare n cadrul
textului folosind sgeile.
Casetele de editare, ca i casetele text au proprieti 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 proprieti ce pot fi configurate pentru casetele de
editare sunt :
Proprietate Descriere
AllowTabs Stabilete dac este permisa utilizarea tastei TAB n
caseta de editare (caz n care trebuie verificat dac se
poate trece la controlul urmtor cu CTRL+TAB)
HideSelection Stabilete dac textul din caseta de editare este selectat
n mod vizibil atunci cnd caseta nu deine focusul
ReadOnly Stabilete dac textul din caseta poate fi modificat sau
nu
ScrollBars Indic prezenta sau absenta barelor de defilare

Casetele combinate
Acest tip de caset reunete funcionalitile casetelor de tip list i a
celor de tip text.
Ele pot fi de dou feluri: casete combinate derulante i liste derulante,
funcie de specificaia asociata proprietii Style a controlului.
Cele mai importante proprieti ce pot fi configurate pentru casetele
combinate sunt :
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-94
Proprietate Descriere
ControlSorce Indic cmpul n care va fi pstrat valoarea aleas
sau introdus de utilizator
DisplayCount Numrul maxim de elemente afiate n list
InputMask Tipul valorilor ce pot fi introduse
IncrementalSearch Indic dac controlul ncearc s gseasc un
element din list care s corespund cu literele deja
introduse
RowSource Sursa datelor din list
RowSourceType Indic tipul sursei casetei combinate. Valorile sunt
similare cu cele de la caseta tip list
Style Indica dac caseta este o caset combinat derulant
sau list derulant.

Exemplu :
Dorim s adugam noi valori la elementele afiate ntr-o caset
combinat cu list derulant. La evenimentul Valid vom scrie
urmtoarea secvena de cod care, nainte de adugarea
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 proprietilor
KeyboardHighValue i SpinnerHighValue (valoarea maxim posibil) i
KeyboardLowValue i SpinnerLowValue (valoarea minim posibil).
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-95
Dei controlul Spinner este configurat pentru valori numerice, el poate
fi utilizat n combinaie 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 proprietii Value a casetei text iar
n codul evenimentelor UpClick i DownClik ale Spinner-ului incrementm sau
decrementm data.
Cele mai importante proprieti ce pot fi configurate pentru Spinner
sunt :
Proprietate Descriere
Interval Pasul de incrementare/decrementare
KeyboardHighValue Valoarea maxim ce poate fi introdus n
caseta text a controlului
KeyboardLowValue Valoarea minim ce poate fi introdus n
caseta text a controlului
SpinnerHighValue Cea mai mare valoarea ce poate fi afiat de
control cnd se apas butonul sgeata sus
SpinnerLowValue Cea mai mic valoarea ce poate fi afiat de
control cnd se apas butonul sgeata jos

Buton de comanda
Grup de butoane de comanda
Butoanele de comanda permit executarea unor aciuni. De obicei codul
asociat aciunii este specificat n evenimentul Click.
Cele mai importante proprieti ce pot fi configurate pentru butoanele de
comanda sunt :
Proprietate Descriere
Cancel Indic dac se execut sau nu codul asociat
evenimentului Click la apsarea tastei ESC
Caption Textul afiat pe buton
DisablePicture Fiierul de tip imagine (bmp) afiat la dezactivarea
butonului
DownPicture Fiierul de tip imagine (bmp) afiat la activarea
butonului
Enabled Dac butonul poate fi selectat sau nu
Picture Fiierul de tip imagine (bmp) afiat pe buton
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-96
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 proprieti ce pot fi configurate pentru grupurile de
butoanele de comanda sunt :

Proprietate Descriere
ButonCount Numrul de butoane din grup
BackStyle Tipul de fundal (transparent sau opac)

Controlul imagine
Permite afiarea imaginilor stocate ntr-un fiier de tip bmp pe un
formular.
Proprietile acestui control pot fi schimbate prin cod n timpul execuiei
astfel nct imaginea poate fi diferit de la un caz la altul.
Cele mai importante proprieti ce pot fi configurate pentru controlul
imagine sunt :
Proprietate Descriere
Picture Imaginea (fiierul bitmap) ataat
BorderStyle Exist sau nu chenar vizibil
Stretch 0-Clip - poriunile imaginii ce depesc dimensiunile
controlului nu sunt afiate
1-Isometric sunt pstrate dimensiunile originale ale imaginii
2- Stretch imaginea este scalat corespunztor
dimensiunilor controlului

Controlul etichet

Difer de caseta text prin urmtoarele : nu are surs de date, nu poate fi
editat direct din interiorul su, nu se poate ajunge la el prin apsarea tastei
TAB. Proprietile Caption i Visible pot fi modificate prin program.
Cele mai importante proprieti ce pot fi configurate pentru controlul
etichet sunt :
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-97
Proprietate Descriere
Caption Textul afiat drept etichet
Autosize Dac dimensiunea etichetei este ajustata funcie de cea a
textului din Caption
Backtyle Dac eticheta este opac sau transparent
WordWrap Dac textul afiat continu pe mai multe rnduri

Forme geometrice i linia

Aceste controale ajut la gruparea vizual a elementelor formularului i
pentru nfrumusearea lui.
Cele mai importante proprieti ce pot fi configurate pentru forme
geometrice sunt :

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

Cele mai importante proprieti ce pot fi configurate pentru controlul linie sunt :
Proprietate Descriere
BorderWidth Grosimea liniei n pixeli
LineSlant Direcia 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 conine mai multe
coloane, ce pot avea antet i controale, fiecare cu propriul set de proprieti,
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 relaionate de tip una la mai multe.
Cele mai importante proprieti ce pot fi configurate pentru controlul
gril sunt :
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-98
Proprietate Descriere
ChildOrder Cheia extern a tabelei fiu care este legat de cheia
primar a tabelei printe
ColumnCount Numrul de coloane: Dac este -1 grila va avea
attea coloane cte cmpuri exist n sursa de
nregistrri
LinkMaster Tabela printe a nregistrrilor fiu afiate n gril
RecordSource Datele ce vor fi afiate n gril
RecordSourceType Proveniena datelor din gril (tabel, alias, etc)

Cele mai importante proprieti ce pot fi configurate pentru coloanele
dintr-o gril sunt :

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


Cadre de pagina

Un cadru de pagin este un obiect container ce poate conine mai multe
pagini. La rndul lor, paginile pot conine controale.
Cele mai importante proprieti ce pot fi configurate pentru cadrele de
pagin sunt :

Proprietate Descriere
Tabs Indic dac fiele paginilor sunt vizibile sau nu
TabStyle Indic dac foile sunt toate de aceeai dimensiune
i dac toate mpreun au limea cadrului de
pagin
PageCount Numrul de pagini din cadrul de pagin

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-99
4.4 Generatorul de rapoarte

Rapoartele reprezint un ansamblu de informaii construite pe baza
datelor din unul sau mai multe tabele, informaii ce urmeaz a fi afiate pe
ecranul monitorului, tiprite la imprimant sau ntr-un fiier de tip text. Un raport
este format dintr-un ansamblu de elemente care conlucreaz la selectarea i
furnizarea ctre utilizator a unui set de date ntr-o form cat mai concis, clar
i plcut.
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 opiunea 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 opiunea 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 adugat submeniul Report.
Dup cum se vede n figur, iniial orice raport are n
componen benzile cu semnificaiile menionate.
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
rulrii lui, mai multe instane, n funcie de semnificaia pe care o are. O band
dintr-un raport reprezint o forma generic a raportului final.
Banda antet de pagina
Banda subsol pagin
Banda detaliu
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-100
Coninutul benzilor descrise mai sus este urmtorul :
Page Header (Antet) se folosete pentru specificarea coninutului prii
superioare a fiecrei pagini din raport. Ea va avea attea instane cate pagini va
avea raportul, i poate conine, de exemplu, numrul curent al paginii, data
curent, numele firmei care emite documentul, etc.
Detail va genera n raport rndurile de detaliu (coninutul de baz al
raportului), adic cmpurile din tabela / tabele care se doresc a fi evideniate n
raport.
Page Footer (Subsol) va conine elementele necesare a fi afiate n
subsolul paginii, cum ar fi, de exemplu, capitolul, ora listrii, etc.
Fiecare band dintr-un raport are asociat o bar, care o delimiteaz i
cu ajutorul creia 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.
nlimea minim a unei benzi este zero, caz n care ea va fi lipita de banda
anterioar.
Proprietile unei benzi pot fi specificate de utilizator. Dnd un dublu click
pe band, se deschide fereastra de proprieti n care putem specifica:
Height - nlimea benzii. Dac se dorete ca nlimea s fie constant
pentru toate instanele 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 meninerea unui contor intern care s memoreze
numrul de pagini tiprite, se poate executa o instruciune de incrementare a
controlului nainte sau dup fiecare afiare a benzii de antet de pagin.
Instruciunea va fi introdus ntr-o funcie definita de utilizator, iar apelul ei va fi
scris n una dintre expresiile On Entry sau On Exit.
Meniul Report conine urmtoarele opiuni:
Title/Summary duce la afiarea unei ferestre de dialog ce permite,
prin selecie, 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 pe ultima pagin a raportului, o
singur dat ;
Data Grouping- duce la afiarea unei ferestre de dialog ce permite
gruparea datelor din raport n funcie de anumite chei de grupare
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-101
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 rulrii raportului sau afirii
unor anumite valori ;
Default Font stabilete fontul implicit cu care se lucreaz n raport;
Private Data Session - prin selectarea/deselectarea acestei opiuni 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 dorim sau nu
adugarea tabelei la mediul de date;
Run Report rularea raportului.

Bara Report Controls conine controalele necesare popularii benzilor
raportului, i anume :

Select

selecie obiecte
Etichet

folosit la introducerea textului
Cmp

afiarea cmpurilor din tabelele asociate
Elemente
geometrice

pentru desenarea de linii, ptrate, cercuri, etc,
folosite pentru cosmetizarea raportului
Imagine

necesar afirii de imagini grafice

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-102
Mediul de date al raportului
La construirea raportului este necesar stabilirea datelor surs.
Acestea, mpreuna cu anumite variabile folosite de raport, alctuiesc mediul de
date.
Mediul de date este un obiect, el are proprieti 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, fr a fi
necesare instruciuni speciale n acest sens. Adugarea unei tabele la mediul
de date se face prin selectarea opiunii Add. Dac tabela este legata n cadrul
unei baze de date, n mediul de date al raportului se vor ncrca i legturile
respective.
n cazul rapoartelor care folosesc dou sau mai multe tabele, este
necesar specificarea n mediul de date i a legturilor dintre ele, pentru ca
informaiile s fie corect afiate.
Dac se dorete specificarea dinamic a tabelelor surs, se pot folosi
metodele mediului de date, n care se vor introduce instruciunile
corespunztoare pentru deschiderea tabelelor.
Principalele metode ale mediului de date sunt :
Before Open Tables se stabilete numele i locaia tabelelor;
Open Tables comenzile pentru deschiderea efectiv a tabelelor;
After Open tables se pot selecta tabela curent i nregistrrile
curente;
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 proprieti ale mediului de date sunt :
InitialSelectedAlias desemneaz tabela ce va fi deschisa iniial;
AutoOpenTables dac este .T. determin deschiderea automat a
tabelelor specificate;
AutoCloseTables- dac este .T. determina nchiderea automat a
tabelelor specificate.

Cmpurile unui raport (Fields)
Cmpurile reprezint elementele variabile ale unui raport. Ele pot avea
ca surs:
un cmp din tabelele folosite;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-103
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;
Formatul de afiare (caracter, numeric, dat calendaristic, aliniere) ;
Funcia de calcul (sum, medie, numrare, etc) ;
Condiii dinamice de afiare .
Cmpurile calculate dintr-un raport se obin folosind funcii predefinite,
disponibile la acionarea butonului Calculation a ferestrei Report Expresion.
Funcia se alege prin intermediul butonului de selecie.
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 facilitai 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 nregistrrile 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 informaiilor nu va fi concludent.
Specificarea expresiilor de grupare se face n fereastra Data
Grouping.
Lista Group Expresions conine 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 urmtoarele proprieti:
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 spaiului din coloan va fi lsat liber i urmtorul
grup ncepe n coloana urmtoare.
Start each group on a new page fiecare grup ncepe pe o pagin
nou.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-104
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 - tiprete 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 spaiul rmas 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 afirii listei pe ecran se va aduga 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 funcie de anumite variabile ce pot fi setate.
De exemplu, dac se dorete raportare unei situaii a vnzrilor 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 urmtoarele:

Se construiete o form cu care se preiau de la utilizator variabilele
necesare ( cele specificate anterior). Forma va trebui s conin n
afar de cmpurile necesare prelurii datelor i minim dou butoane
pentru rularea raportului i nchiderea formei.
Se efectueaz preluarea datelor din tabele n funcie de parametrii
specificai, adic se extrag datele, se grupeaz corespunztor 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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-105
4.5 Constructorul de meniuri

Meniul reprezint un ansamblu de opiuni pus la dispoziia utilizatorului,
opiuni la alegerea crora sunt declanate diferite operaii de prelucrare.
Meniul apare n partea superioar a ferestrei unei aplicaii i are o
structur standard, format dintr-o bara orizontal (submeniu orizontal) ce
conine mai multe opiuni. Fiecare opiune poate conine un submeniu vertical,
care va fi activat numai la alegerea opiunii respective.
Proiectarea unui meniu const n specificarea elementelor componente
(submeniuri i opiuni) 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, obinndu-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 consideraie.
Comanda de creare a unui meniu este :
CREATE MENU <numemeniu>
sau alegnd din meniul File opiunea New Meniu, se deschide o fereastr din
care se alege opiunea :
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 opiunea Open.
Proprietile generale ale unui meniu se stabilesc n fereastra de dialog
General Options, ce se deschide la alegerea opiunii cu acelai nume a
meniului View.
Poziia noului meniu relativ la meniul standard al sistemului este
stabilit prin intermediul butoanelor din seciunea Location. Opiunile sunt :
Replace Noul meniu l nlocuiete pe cel al sistemului;
Append Noul meniu va fi adugat la cel al sistemului;
Before Noul meniu va fi poziionat naintea opiunii din meniul sistem
aleas din lista derulant;
After Noul meniu va fi poziionat dup opiunea din meniul sistem
aleas din lista derulant.
Pot fi specificate secvene de cod care s fie executate la apariia unor
evenimente i care vor fi scrise n zona Procedure sau n fereastra deschis
prin apsarea butonului Edit.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-106
Se pot specifica secvene de cod att pentru iniializarea meniului
Setup ct i pentru tergerea sa Cleanup, n fereastra deschis prin activarea
comutatoarelor Setup sau Cleanup urmat de acionarea butonului OK.
Fereastra de lucru a constructorului de meniuri arat ca n figura de mai
jos :


Prima coloan conine butonul de schimbare a poziiei opiunii - prin
tragerea cu mouse-ul ea poate fi deplasat n sus sau jos.
n coloana Prompt se introduce textul explicativ al opiunii, text ca va fi
afiat ca bar de meniu (ex : Adugare).
Coloana Results cuprinde o list derulant ce conine opiunile
descrise mai jos, fiecreia 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 adugare) ;
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 setri pentru respectiva bara de meniu, i anume :
Key label : combinaia de taste, echivalent cu click cu
mouse-ul pe opiunea respectiv, ce se determina prin
apsarea tastelor dorite;
Key text textul suplimentar ce se va afia lng opiune
indicnd combinaia de taste aleas;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-107
Skip for se scrie expresia ce va fi evaluat la fiecare
accesare a opiunii de meniu. Dac rezultatul evalurii
este adevrat, se permite executarea comenzii asociate,
n caz contrar opiunea nu va fi accesibil. Aceasta
facilitate este bine venit n cazul n care, de exemplu,
ntr-o anumit secvena de meniu este permis accesul
doar unor anumii utilizatori, sau sunt dezactivate, la un
moment dat, anumite seciuni din meniu, n funcie de
anumite condiii, pentru a preveni anumite erori de rulare
a programului.
Message se indica textul explicativ asociat opiunii de
meniu.
Comment se pot introduce texte explicative, pentru o
mai buna nelegere 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 apsarea
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 acionarea butonului OK.
Butoanele din seciunea Item sunt folosite pentru adugarea de noi
elemente (Insert i Insert Bar) sau pentru tergerea unor opiuni (Delete).

Observaii:

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 opiunii. Caracterul va aprea ca fiind subliniat.
scrierea caracteruli \ naintea textului din coloana Prompt determin ca
opiunea respectiv s fie dezactivat, ea aprnd 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 opiuni ale aceluiai submeniu.

Orice meniu trebuie generat, operaie ce se realizeaz prin alegerea
opiunii 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 aplicaiei.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-108
Revenirea la meniul sistem se face cu comanda
SET SYSMENU TO DEFAULT
4.6 Constructorul de proiecte

Proiectele reprezint nglobarea elementelor unui sistem informatic ntr-
un tot unitar. Proiectul este o facilitate pus la dispoziia proiectanilor de
sisteme informatice, cu ajutorul creia se poate ine cu uurina evidenta tuturor
componentelor unui sistem, cum ar fi baze de date, tabele, vederi, programe,
forme, meniuri, rapoarte, interogri, etc.
Se recomand folosirea proiectelor n momentul n care sistemul
informatic ce urmeaz a fi proiectat va conine un numr 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 operaiile 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, opiunea New
Project i se acioneaz
butonul New File. Tipurile
de elemente ce pot fi
incluse ntr-un proiect
sunt: baze de date, tabele
libere, interogri, forme,
rapoarte, etichete,
biblioteci de clase,
programe, biblioteci API,
aplicaii, meniuri, fiiere text, alte tipuri de fiiere.
Fereastra ce se deschide la pornirea generatorului de proiecte arat ca
n figura de mai sus i conine mai multe pagini corespunztoare gruprii logice
a elementelor componente.
Adugarea de noi elemente la un proiect se face astfel: se activeaz
pagina proiectului n care va fi inclus respectivul element i se selecteaz din
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-109
list tipul elementului de adugat. Dac elementul a fost deja creat n afara
proiectului i se dorete adugarea 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 apsarea butonului Modify.
Rularea unui element din proiect se face prin selectarea elementului
urmat de apsarea butonului Run.
nlturarea unui element din proiect se face prin selectarea elementului
urmat de apsarea butonului Remove.
Recompilarea elementelor proiectului se face prin apsarea butonului
Build. n acest caz poate fi aleas una dintre opiunile specificate n seciunea
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 seciunea Action ale crei opiuni
sunt urmtoarele :
Rebuild project recompilarea proiectului;
Build Application se realizeaz o aplicaie. Aplicaia este un tip
special de fiier ce conine toate elementele unui sistem informatic i
care poate fi rulat n mediu VisualFox. Elementele componente ale
unei aplicaii pot fi mprite 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
aplicaie (baze de date, tablele) ale cror coninut se actualizeaz
permanent n momentul rulrii. Orice aplicaie se construiete n jurul
unui program principal (acel program care va fi lansat primul la rularea
aplicaiei). Stabilirea lui se face prin selectarea lui i alegerea opiunii
Set Main (click buton dreapta din meniul rapid).
Build Executable VisualFoxPro permite rularea programelor n
varianta compilat i a aplicaiilor. 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 condiiile expuse la
generarea aplicaiilor i alegerea butonului Build executable. Va fi
generat un fiier cu extensia .exe
Rularea unei aplicaii se face cu comanda:
DO <nume aplicatie.app>
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


4-110

4.7 Exerciii:

1. Construii un raport cu ajutorul cruia s putei lista agenii n ordine
alfabetic. (folosii fiierul Ag.dbf i afiai cmpurile: nume, prenume,
data naterii, data angajrii, salariul de baz ).
2. Construii un raport pentru a lista agenii ce au efectuat tranzacii ntr-o
perioad specificat, n ordinea datei la care a fost efectuata tranzacia
(folosii fiierele Ag.dbf, Tr.dbf i afiai cmpurile cod agent, nume i
prenume agent, data tranzaciei ).
3. Construii un raport pentru a lista tranzaciile efectuate ntr-o anumit
luna dintr-un anumit an, specificnd totalul valoric pentru operaiile de
vnzare i cumprare pentru fiecare zi n parte i deasemeni un total
general la sfrit de luna (folosii fiierele Cl.dbf, Tr.dbf Ma.dbf i afiai
cmpurile nume client, data tranzaciei, valoarea de intrare, valoare de
ieire).
4. Construii o form care s conin o caset de tip list care s permit
selectarea unui anumit autor din tabela de autori, pentru care s listai,
n ordine alfabetic, toate crile existente n bibliotec, ntr-un fiier de
tip.txt, pe care sa-l afiai apoi pe ecran.
5. Construii un raport care s va permit afiarea imaginilor grafice. De
exemplu, putei lista toate mrfurile din fiierul Ma.dbf, grupnd datele
n funcie de codul produsului, iar la fiecare cod produs putei asocia
elemente grafice diferite, reprezentative.
6. Construii un meniu n care s folosii toate opiunile puse la dispoziie
de constructorul de meniuri i n care s includei rularea unor forme,
rapoarte i programe construite n laboratoarele anterioare.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-111

Capitolul 5 Limbajul SQL implementat n Oracle
5.1 Soluia complet Oracle




Oracle SGBDR (Sistem de Gestiune Baze de Date Relaionale) este
produsul de baz al Oracle. El include Oracle Server i mai multe instrumente
pentru a ajuta utilizatorii n mentenan, monitorizarea i utilizarea datelor.
Dicionarul de date Oracle este o component foarte important a Serverului. El
conine un set de tabele i view-uri care prezint o imagine read-only a bazei de
date.
SGBDR gestioneaz sarcini ca:
- managementul stocrii i definirii datelor;
- controlul i restricionarea accesului la date i concurena;
- posibiliti de salvare i restaurare;
- interpreteaz instruciuni SQL i PL/SQL.

Instruciunile 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 ctre server sintaxe SQL i
PL/SQL spre execuie i conine propriile comenzi.
Oracle furnizeaz o mare varietate de instrumente GUI pentru
construirea aplicaiilor, precum i o gam larg de aplicaii software pentru
afaceri i industrie.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-112
SQL i SQL*Plus
SQL este un limbaj de comenzi pentru comunicarea cu Serverul Oracle
din orice instrument sau aplicaie. SQL Oracle conine multe extensii. Cnd se
introduce o instruciune SQL, aceasta este stocat ntr-o zon de memorie
numit buffer SQL i este disponibil pn la introducerea unei noi instruciuni.
SQL*Plus este un instrument Oracle ce conine propriu limbaj de
comenzi i care recunoate i trimite instruciuni SQL la server pentru execuie.
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 instruciuni SQL;
Furnizeaz un editor n mod linie pentru modificarea instruciunilor SQL;
Controleaz setrile de mediu;
Formateaz rezultatele interogrilor in rapoarte;

Comparaie ntre SQL i SQL*Plus

SQL SQL*Plus
Este un limbaj pentru comunicarea cu
serverul Oracle pentru accesarea
datelor
Recunoate instruciuni SQL i le trimite la
server
Este bazat pe standardul ANSI SQL
Este o interfa proprietate Oracle pentru
executarea instruciunilor SQL
Manipuleaz date i definiii de tabele
n baze de date
Nu permite manipularea valorilor n baze
de date
O instruciune se stocheaz in
bufferul SQL, pe una sau mai multe
linii
Este permis o singur comand pe linie
care nu este stocat n bufferul SQL
Nu are caracter de continuare
Are caracterul (-) pentru continuarea unei
comenzi dac aceasta nu ncape pe o
singur linie
Folosete un caracter de terminare
pentru executarea imediat a
comenzii
Nu are nevoie de caractere de terminare.
Se executa imediat
Nu pot fi abreviate Pot fi abreviate
Folosete funcii pentru anumite
formatri
Folosete comenzi pentru formatri
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-113
Interaciunea SQL i SQL*Plus

SQL*Plus este un mediu care permite:
Conectarea la SQL*Plus;
Afiarea structurii unei tabele;
Editarea instruciunilor SQL;
Executarea instruciunilor SQL din SQL*Plus;
Salvarea instruciunilor SQL in fiiere;
Executarea fiierelor salvate;
ncrcarea comenzilor din fiier in buffer pentru editare;
Executarea instruciunilor SQL pentru a extrage, modifica, aduga i
terge date din baza de date;
Formatarea, calcularea, stocarea i listarea rezultatele interogrilor sub
forma de rapoarte;
Crearea fiierelor de script pentru stocarea instruciunilor SQL.

Comenzi SQL*Plus

Categorie Scop
Mediu
Afecteaz comportamentul general al instruciunilor SQL
pentru sesiunea respectiv
Formatare Formateaz rezultatele interogrii
Manipulri de
fiiere
Salveaz, ncrc i ruleaz fiiere de script
Execuie Trimite instruciuni SQL din bufferul SQL la serverul Oracle
Editare Modifica instruciuni SQL in buffer
Interaciune
Permite crearea i trimiterea variabilelor la instruciuni SQL,
afiarea variabilelor i listarea mesajelor pe ecran
Diverse
Are diferite comenzi pentru conectarea la baza de date,
manipularea mediului SQL*Plus i afiarea coloanelor
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-114
Conectarea la SQL*Plus

SQL*Plus se poate apela in funcie 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 se lanseaz
urmtoarea comand:

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 coninutul buferului SQL ntr-un fiier.
GET filename scrie coninutul 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 coninutul bufferului ntr-un
fiier afiedt.buf
ED[IT] filename lanseaz editorul pentru editarea coninutului unui fiier
salvat
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-115
SPO[OL]
[filename]OFF | OUT

stocheaz rezultatul unei interogri ntr-un fiier. OFF
nchide fiierul OUT nchide fiierul i l trimite la
imprimanta sistem
EXIT prsete 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 tranzaciilor (gestioneaz schimbrile fcute de instruciunile DML;
actualizrile efectuate asupra datelor pot fi grupate mpreuna in tranzacii
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 si)
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 (Organizaia Internaionala pentru
Standarde). Att ANSI cat i ISO au acceptat SQL ca limbajul standard pentru
baze de date relaionale.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-116
Tabelele folosite n acest carte sunt:

EMPLOYEES , tabela care conine detalii despre angajai;
DEPARTAMENTS, tabela care conine detalii despre departamente;
JOB_GRADES, tabela care conine detalii despre salarii i trepte de
salarizare:
5.4 Sintaxa de baz a instruciunilor SQL

Comanda SELECT extrage informaii din bazele de date. Folosind
comanda SELECT, se pot face urmtoarele :
SELECTIE (SELECTION): poate fi folosit pentru a alege liniile
necesare din tabelele de date. Se pot folosi criterii diferite de
selecie.
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 legturi 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, instruciunea SELECT include urmtoarele clauze :

SELECT, care specific ce coloane vor fi afiate;
FROM, care specific tabelele ce conin 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 conine/conin coloanele.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-117

NOT : n aceast carte, cuvintele : cuvnt cheie, clauza ,
instruciune 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 instruciune SQL.. De exemplu,
SELECT employee_id, first_name,.. reprezint o clauz.
O instruciune este o combinaie de dou sau mai multe clauze i
cuvinte cheie. De exemplu, SELECT * FROM employee este o
instruciune SQL.

Scrierea instruciunilor SQL

Utiliznd urmtoarele reguli se pot construi instruciuni valide, uor de citit
i de editat:
Instruciunile SQL pot fi scrise cu litere mari sau mici, n afar de
cazurile indicate;
Instruciunile SQL pot fi introduse pe una sau mai multe linii;
Cuvintele cheie nu pot fi abreviate sau desprite 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 convenie de NOTre, nu o regula.
n cadrul SQL*Plus, instruciunile SQL sunt introduse de la prompterul
SQL, iar urmtoarele linii sunt numerotate. Acesta este un buffer SQL.
Doar o singura instruciune poate fi adus la un moment dat din buffer.


Executarea instruciunilor SQL se face urmnd regulile:


Poziionarea caracterului punct i virgul (;) la sfritul ultimei clauze;
Poziionarea unui slash (/) la sfritul ultimei linii din buffer;
Scrierea unui slash la prompterul SQL;
Comanda RUN sau @ la prompterul SQL.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-118
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 conine coloanele:
DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID.
Tabelul conine linii pentru fiecare departament.

Se pot afia toate coloanele din tabela scriind toate coloanele dup
cuvntul cheie SELECT. Instruciunea 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
specificaiilor 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 a unor date dintr-una sau mai multe
tabele.
Sequence Genereaz valori pentru chei primare.
Index Mrete viteza n cazul interogrilor.
Synonym Nume alternative date obiectelor.

O baza de date Oracle poate conine 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.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-119
Structura tabelelor in Oracle9i


Tabelele pot fi create n orice moment, chiar n momentul cnd utilizatorul
folosete baza de date. Nu este obligatorie specificarea mrimii unei tabele.
Este important de tiut ce spaiu va ocupa tabela dup un timp. Structura unei
tabele poate fi modificat dinamic.

Convenii 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 entiti din tabele
diferite. De exemplu, coloana cu numrul departamentului este
denumita DEPTNO att In tabela EMPLOYEES ct i n tabela
DEPARTMENTS.

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
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-120
5.6 Comanda CREATE TABLE

Pentru a crea o tabel utilizatorul trebuie s dein :
Drepturi pentru crearea unei tabele (drepturi Oracle);
Spaiu 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 colecie 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, secvene, proceduri stocate, indeci, clustere
i legturile bazei.
Tabelele a cror 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).

Opiunea DEFAULT

Specific valoarea implicit pentru o coloan, ntr-o operaie de inserare.

Select hiredate DATE DEFAULT SYSDATE from employees;

Valorile permise sunt valori literale, expresii sau funcii 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


5-121

Unei coloane i se poate asigna o valoare implicit utiliznd opiunea
DEFAULT. Aceast opiune previne atribuirea unor valori de null pentru datele
inserate fr precizarea unei valori explicite. Valoarea poate fi un literal, o
expresie sau o funcie 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










Confirmarea crerii tabelei:

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 instruciunea CREATE TABLE este una de tip DML, la
rularea ei se execut n mod automat i o instruciune 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 colecie de tablele create i
administrate de utilizator ce conin informaiile utilizatorilor;
Dicionarul de date ce reprezint o colecie de tabele create i
administrate de Oracle Server ce conin informaii despre baza de date.
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.
SQL> desc departments;
Name Null? Type
----------------------------------------- -------- ------------
DEPARTMENT_ID NUMBER(4)
DEPARTMENT_NAME VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-122

Toate tabelele din dicionarul de date sunt proprietatea utilizatorului SYS
i sunt accesate rar de ctre utilizatori pentru c informaiile pe care acestea le
conin sunt greu de neles. De aceea, n mod obinuit, utilizatorii acceseaz
vederile din dicionarul de date pentru c informaiile sunt prezentate ntr-o
forma uor de neles.
Informaiile stocate n dicionarul de date conin:
numele utilizatorilor bazei Oracle i drepturile acestora ;
obiectele bazei de date numele lor, constrngerile i informaii
legate de audit.

n dicionarul 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 - conin informaii despre obiectele aflate n
proprietatea userului.
ALL_View - conin informaii despre toate tipurile de tabel
(obiecte tabel i tabele relaionale) accesibile utilizatorului.
DBA_ View - Aceste view-uri sunt restricionate, ele putnd fi
accesate doar de cei care au rolul de DataBase Administrator.
V$ - Aceste view-uri sunt view-uri cu performane dinamice,
performane ale serverului de baze de date, memorie i blocri.
5.8 Interogarea dicionarului de date

Afiarea numelor tabelelor (coloana table_name) unui utilizator,
precum i alte informaii 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 secvenelor unui utilizator:

SQL> select * from user_catalog;
Putei interoga dicionarul de date pentru a afia informaii diverse
despre obiectele de tip baza de date ale unui utilizator. Tabelele cele mai des
utilizate din dicionarul de date sunt USER_TABLES, USER_OBJECTS i
USER_CATALOG. Tabela USER_CATALOG are un sinonim numit CAT.
Putei folosi acest nume n loc de USER_CATALOG n comenzi.

SQL> select * from cat;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-123
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) Numr 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 la 2
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.

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 mbuntiri 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 fraciuni de secund i
reprezint o extensie a tipului de dat DATE. Specificarea acestui tip de data se
face cu:
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-124
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 fraciunilor
pentru secunde. Presupunem c s-au introdus dou rnduri n tabela
NEW_EMPLOYEES .
Ieirile arata diferena 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 diferena 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
decalrii 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'
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-125

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 conine
timpul local. Timpul local nu este stocat ca parte a unei coloane de tip DATE.
Atunci cnd se iniiaz o sesiune local serverul returneaz data n formatul ce
afieaz timpul local.

TIMESTAMP WITH LOCAL TIME ZONE are urmtoarea sintaxa:
TIMESTAMP[(fractional_seconds_precision)]WITH LOCAL TIME ZONE

Spre deosebire de TIMESTAMP WITH TIME ZONE, putei specifica ca o
coloana de tipul TIMESTAMP WITH LOCAL TIME ZONE ca fiind parte a unei
chei primare sau unice.
Afiarea timpului va preciza diferena (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 numrul de cifre in care se va afia anul, implicit 2.

Restricie

Prima valoare trebuie s fie semnificativ mai mare dect cea de-a
doua. De exemplu: INTERVAL '0-1'MONTH TO YEAR nu este valid.


Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-126
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

Creai o tabela i inserai linii combinnd comanda CREATE TABLE cu
opiunea AS subquery;





Numrul coloanelor tabelei trebuie sa fie egal cu numrul coloanelor din
subinterogare;
Utiliznd opiunea AS subquery se creeaz tabela i insereaz
nregistrrile furnizate de interogare.
Sintaxa:
- table numele tabelei;
- column numele coloanei, valoarea implicit i constrngerile de
tip;
- subquery comanda SELECT care definete un set de nregistrri
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, numrul acestora trebuie sa fie
egal cu numrul 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.
CREATE TABLE table
[column (,column)]
AS subquery ;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-127

Exemplu:








Table created.

DESCRIBE dept80

n exemplu se creeaz tabela DEPT80 ce conine date despre angajaii
ce lucreaz in departamentul 80. Observai c datele au fost aduse din tabela
EMPLOYEES.
Putei verifica existenta tabelei i a definiiei coloanelor folosind comanda
iSQL*Plus DESCRIBE.

Verificai dac ai redenumit coloanele ce conin expresii.
n exemplul nostru coloana SALARY*12 a fost redenumita ANNSAL.
Fr 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 aduga noi coloane utiliznd clauza ADD, modifica coloane existente
sau defini valori implicite pentru coloane utiliznd clauza MODIFY, terge
coloane folosind clauza DROP.

CREATE TABLE dept80
AS
SELECT employee_id, last_name,
salary*12 ANNSAL,
hire_date
FROM employees
WHERE department_id = 80;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-128
Adugarea unei coloane
Sintaxa:
- table numele tabelei;
- column numele noii coloane;
- datatype tipul datei i lungimea;
- DEFAULT expr specific valoarea implicit pentru coloan.

EXEMPLU:




Observaii:


Se pot aduga, modifica sau terge coloane din tabela. Facilitatea de a
terge o coloana dintr-o tabela a aprut n versiunea Oracle 9i.
Nu putei specifica locul de apariie al noii coloane. Noua coloan devine
automat ultima coloan. Dac tabela conine nregistrri n momentul
adugrii unei noi coloane, atunci noua coloan se iniializeaz cu valori
nule pentru toate nregistrrile.

ALTER TABLE dept30 ADD (job_id varchar2(10));
Tabl e al t er ed.
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);
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-129


Modificarea unei coloane

Se pot modifica specificaiile coloanelor utiliznd comanda ALTER
TABLE, cu clauza MODIFY. Modificrile permise pot fi: schimbarea tipului de
data, a mrimii i a valorii iniiale.

EXEMPLU




Observaii:

Se poate mari limea sau precizia unei coloane numerice;
Se poate micora limea unei coloane dac aceasta conine
numai valori nule sau dac tabela nu are rnduri;
Se poate schimba tipul de dat dac coloana conine numai
valori null;
ALTER TABLE dept30
MODIFY (first_name varchar2(25));
Table altered.
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
Noua
coloa
na
JOB_
ID
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
aduga o nou coloana n tabela dept30
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-130
Se poate converti o coloana de tip CHAR la una de tip
VARCHAR2 sau invers dac aceasta conine valori null sau dac
nu se schimb limea ;
Schimbarea valorii predefinite pentru o coloan afecteaz numai
inserrile ulterioare n tabela.

tergerea unei coloane

EXEMPLU

Observaii:

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

Opiunea SET UNUSED

Putei folosi opiunea SET UNUSED pentru a marca una sau mai multe
coloane ca fiind nefolosite.
Putei folosi opiunea DROP UNUSED COLUMNS pentru a terge
coloanele marcate ca fiind nefolosite.

Opiunea 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
ALTER TABLE dept30
DROP COLUMN job_id;
Tabl e al t er ed.
ALTER TABLE table DROP UNUSED COLUMNS;
ALTER TABLE table SET UNUSED (column);
sau
ALTER TABLE table SET UNUSED COLUMN (column);
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-131
numele i tipul de dat pentru coloanele marcate astfel. Putei aduga tabelei o
nou coloan cu acelai nume pe care l are o coloan marcat ca fiind
nefolosit.
Informaia dat de SET UNUSED este stocat n dicionarul de date n
view-ul USER_UNUSED_COL_TABS.

Opiunea DROP UNUSED terge din tabel coloanele marcate ca fiind
nefolosite. Aceast opiune se poate folosi atunci cnd se dorete eliberarea
spaiului pe disc. Dac tabela nu are coloane marcate, executarea instruciunii
nu ntoarce eroare.

EXEMPLU








5.11 tergerea unei tabele
Sintaxa:





EXEMPLU





Comanda DROP TABLE terge definiia unei tabele din dicionarul de
date Oracle. Cnd se aplic comanda DROP unei tabele, baza de date pierde
toate nregistrrile din tabel, mpreun cu indecii asociai acesteia. Comanda
este ireversibil.

ALTER TABLE dept30
SET UNUSED last_name;
Tabl e al t er ed.
ALTER TABLE dept30
DROP UNUSED COLUMNS;
Tabl e al t er ed.
DROP TABLE table;
SQL> DROP TABLE dept30;
Tabl e dr opped.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-132

Observaii:

Toate datele sunt terse;
Orice view sau sinonim asociat va rmne, dar va fi invalid;
Orice tranzacie 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, secvene sau sinonim se
folosete comanda RENAME .
Sintaxa:
- old_name numele vechi al obiectului;
- new_name numele nou al obiectului;

EXEMPLU

Observaie: Numai proprietarul obiectului poate modifica numele
obiectului.

5.13 Trunchierea unei tabele

Comanda terge toate nregistrrile din tabela specificat, elibernd
spaiul folosit de tabel. Operaiunea este ireversibil.

Comanda DELETE terge nregistrrile din tabel, dar nu elibereaz
spaiu de stocare (fcnd astfel posibila readucerea nregistrrilor prin comanda
ROLLBACK).
RENAME old_name TO new_name;
SQL> RENAME departments TO departments_new;
Tabl e r enamed.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-133

Sintaxa: - table este numele tabelei.

EXEMPLU

Comanda TRUNCATE este mai rapida dect DELETE din
urmtoarele motive:


TRUNCATE este o instruciune de tip DDL i nu genereaz informaii
de tip rollback.
Trunchierea unei tabele nu declaneaz triggerii tabelei. Dac tabela
este de tip printe ntr-o relaie de integritate referenial nu putei
aplica comanda TRUNCATE. Trebuie mai nti sa dezactivai
constrngerea i apoi lansai comanda.

5.14 Includerea constrngerilor

Ce fac constrngerile ?
Constrngerile foreaz regulile la nivel de tabela.
Constrngerile previn tergerea unei tabele sau a datelor din tabela dac
exista dependene.

Oracle lucreaz cu urmtoarele tipuri de constrngeri:
- NOT NULL
- UNIQUE KEY
- PRIMARY KEY
- FOREIGN KEY
- CHECK
TRUNCATE TABLE table;
SQL>TRUNCATE TABLE department;
Tabl e t r uncat ed.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-134
Constrngerile de integritate a datelor

Constrngere Descriere
NOT NULL Specific faptul c aceast coloan nu poate conine o
valoare nul.
UNIQUE Key Specific o coloan sau o combinaie de coloane a
cror valoare trebuie s fie unic pentru toate
nregistrrile tabelei.
PRIMARY KEY Identific unic fiecare nregistrare
FOREIGN KEY Stabilete i foreaz o relaie de tip cheie extern ntre
coloan i o coloan dintr-o tabela referit.
CHECK Specific o condiie care trebuie s fie adevrat.

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 numr ntreg unic.
Se poate crea o constrngere:
- n timpul crerii tabelei sau
- dup ce tabela a fost creat
Vizualizarea constrngerea se face doar n dicionarul de date.

Toate constrngerile sunt pstrate n dicionarul 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 accesm din dicionarul view-ul
USER_CONSTRAINTS.

Definirea constrngerilor
CREATE TABLE [schema.] table
(column datatype [DEFAULT expr]
(column_constraint],

[table_constraint] [,]);
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-135
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 definiiei coloanei
table_constraint constrngere de integritate ca parte a definiiei tabelei

Exemplu:







De obicei constrngerile sunt create n acelai timp cu tabela dar ele
pot fi adugate i dup crearea tabelei.
Constrngerile pot fi definite la unul din urmtoarele 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 definiiile coloanelor n
tabela: poate defini orice tip de constrngere
exceptnd NOT NULL
column ,
[CONSTRAINT constraint_name] constraint_type
(column, ),
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));
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-136
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 fr constrngerea NOT NULL pot conine implicit valori
null.

EMPLOYEE_ID FIRST_NAME COMMIS
SION_P
CT
DEPARTMENT_ID
7839 KING 10
7698 BLAKE 30
7782 CLARK 10
7566 JONES 20







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.



Constrngere
NOT NULL
(nici o nregistrare nu
poate conine o
valoare NULL pe
aceasta coloana)
Absena constrngerii
NOT NULL (orice
nregistrare poate
conine null pentru
aceasta coloan)
Constrngere
NOT NULL
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-137








Numele constrngerii poate fi specificat n timpul specificrii constrngerilor.

EXEMPLU:
hire_date DATE
CONSTRAINT emp_hire_date_nn NOT NULL

5.16 Constrngerea UNIQUE KEY














O constrngere de integritate de tip cheie unic cere ca fiecare valoare
din coloana sau din setul de coloane specificat s fie unice dou nregistrri
ale tabelei nu pot avea valori duplicat n coloana sau setul de coloane care
formeaz constrngerea. Coloana (setul de coloane) inclus n definiia cheii
unice se numete cheie unic. Dac cheia unic conine mai multe coloane se
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

EMPLOYEE_ID LAST_NAME EMAIL
100 King SKING
101 Kochhar NKOCHHAR
102 De Haan LDEHAAN
103 Hunold AHUNOLD
EMPLOYEES
208 Smith LSMITH
209 Smith LSMITH
INSERT INTO
PERMIS
Nu este permis
exista deja
Constrngerea UNIQUE key
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-138
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
numr de nregistrri pot include valori null n coloane fr 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.







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 definiia la nivel de
tabel. Serverul Oracle foreaz implicit constrngerea de cheie
unic crend un index unic dup cheia 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)
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-139
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 foreaz unicitatea coloanei sau a setului de coloane i asigur c
nici o coloan care este parte a cheii primare nu poate conine 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
numrul de buletin. Acelai numr 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.







5.18 Constrngerea FOREIGN KEY

Cheia externa sau constrngerea de integritate referenial,
desemneaz o coloan sau o combinaie de coloane n funcie de cheia extern
i stabilete o relaie 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 printe).
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));
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-140
Valoarea unei chei externe trebuie sa se potriveasc cu o valoare
existent n tabela printe sau sa fie NULL.

Observaii:

Cheile externe sunt bazate pe valorile datelor i sunt pointeri pur
logici, nu fizici.
Constrngerea de tip cheie extern poate fi definit la nivel de
coloan sau tabel.
cheie extern compus este creat folosind definiia 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.
200 Ford 9
201 Ford 60
Constrngerea FOREIGN key

DEPARTMENT _ID
DEPARTMENT_NAME
MANAGER_ID
10
Administration
200
20
Marketing
201
DEPARTMENT
PRIMARY
KEY

EMPLOYEE_ID LAST_NAME DEPARTMENT _ID
100 King 90
101 Kochhar 90
102 De Haan 90
103 Hunold 60
EMPLOYEES
FOREIGN
KEY
Nu este permis
9 nu exista
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-141


Cuvintele cheie ale constrngerii FOREIGN KEY

Constrngerile externe sunt definite n tabela copil i tabela care
conine coloana referit este tabela printe. Constrngerile externe sunt definite
folosind combinaii ale urmtoarelor cuvinte:
FOREIGN KEY- Definete coloana n tabela copil la nivelul constrngerii de
tabel.
REFERENCES- Identific tabela i coloana n tabela printe.
ON DELETE CASCADE- Permite tergeri n tabela printe precum i tergeri
de linii independente n tabela copil. Cnd rndul din tabela printe este
ters, rndurile independente din tabela copil sunt deasemeni terse. Fr
opiunea ON DELETE CASCADE, rndul din tabela printe nu va putea fi
ters dac este referit n tabela copil.
ON DELETE SET NULL convertete valoarea cheii strine pe NULL atunci
cnd valoarea corespunztoare din tabela printe este tearsa.
5.19 Constrngerea CHECK

Definete o condiie pe care fiecare rnd trebuie sa o ndeplineasc.
Expresii care nu sunt permise:
- Referiri la pseudocoloanele CURRVAL, NEXTVAL, LEVEL i
ROWID.
- Apeluri la funciile SYSDATE, UID, USER i USERENV .
- Interogri care fac referine la alte valori din alte rnduri.
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)
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-142
5.20 Adugarea unei constrngeri

Se poate aduga o constrngere la tabelele existente folosind
declaraia ALTER TABLE mpreun cu clauza ADD.
n sintax:
table este numele tabelei
constraint este numele constrngerii
type este tipul constrngerii
column este numele coloanei afectate de constrngere
Denumirea constrngerii este opional i totui ea este recomandat.
Daca nu dai nume constrngerilor, sistemul va genera automat un nume.

Se poate aduga, terge, activa, dezactiva o constrngere, dar nu
se poate modifica structura acesteia.
Se poate aduga 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 conine
rnduri, deoarece nu se pot specifica date pentru rndurile existente
n acelai timp n care adugam 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.

, salary NUMBER (2)
CONSTRAINT emp_salary_min CHECK (salary>0),
ALTER TABLE table
ADD [CONSTRAINT constraint] type (column);

ALTER TABLE employees
ADD CONSTRAINT emp_manager_fk
FOREIGN KEY (manager_id)
REFERENCES employee (employee_id);
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-143
5.21 tergerea unei constrngeri

Exemplu : tergerea constrngerii manager din tabela EMPLOYEES.
tergerea constrngerii de tip cheie primara din tabela EMPLOYEES.
Pentru a terge a constrngerea trebuie identificat numele
constrngerii, pe care l putei afla accesnd USER_CONSTRAINS i
USER_CONS_COLUMNS. Apoi se folosete funcia ALTER TABLE mpreun
cu clauza DROP. Opiunea CASCADE din clauza DROP are ca efect i
eliminarea tuturor constrngerilor dependente.
Sintaxa:





unde: table este numele tabelei;
column este numele coloanei afectate de constrngere;
constraint este numele constrngerii.
Atenie:
Cnd se terge o constrngere de integritate, aceasta nu mai este
folosita de ctre Oracle Server i nu mai este disponibila n
dicionarul de date.
5.22 Dezactivarea constrngerilor

Executarea clauzei DISABLE din funcia ALTER TABLE pentru a
dezactiva o constrngere de integritate.
Aplicarea opiunii CASCADE pentru a dezactiva constrngeri de integritate
dependente.
ALTER TABLE employees
DROP PRIMARY KEY CASCADE;
Table altered.
ALTER TABLE table
DROP PRIMARY KEY | UNIQUE (column)|
CONSTRAINT constraint [CASCADE};
ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;
Table altered.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-144

Se poate dezactiva o constrngere fr a fi necesar tergerea
acesteia sau recrearea ei, folosind funcia ALTER TABLE mpreuna cu clauza
DISABLE.
Unde: table este numele tabelei.
constraint este numele constrngerii.
clauza DISABLE se poate folosi att n funcia CREATE TABLE ct i
n funcia ALTER TABLE.
clauza CASCADE dezactiveaz constrngerile de integritate
dependente.
5.23 Activarea constrngerilor
Activarea unei constrngeri de integritate care este dezactivat folosind
clauza ENABLE n definirea tabelei.
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 fr a o terge sau a o recrea folosind funcia
ALTER TABLE mpreuna cu clauza ENABLE.

Sintaxa:
Unde: table este numele tabelei.
constraint este numele constrngerii.



ALTER TABLE table
ENABLE CONSTRAINT constraint;
ALTER TABLE employees
DISABLE CONSTRAINT emp_emp_id_pk CASCADE;
Table altered.
ALTER TABLE table
DISABLE CONSTRAINT constraint [CASCADE];
ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk;
Tabl e al t er ed.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-145

Atenie:


Daca se activeaz o constrngere, constrngerea este aplicat tuturor
datelor din tabel. Toate datele din tabel trebuie sa ndeplineasc
condiiile 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 funcia CREATE TABLE ct i n
funcia ALTER TABLE.

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

Dup crearea unei tabele, se poate confirma existena 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.
Exemplul afieaz toate constrngerile tabelei EMPLOYEES.
SELECT constraint_name, constraint_type,
sear ch_condi t i on
FROM user_cons_columns
WHERE table_name=EMPLOYEES;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-146
NOT:
Constrngerilor care nu primesc un nume de la posesorul tabelei li se
atribuie automat de ctre sistem un nume. La numirea tipului de
constrngere, C provine de la CHECK, P de la PRIMARY KEY, R de la
integritate referenial, 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 ctre sistem.



SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name = 'EMPLOYEES';
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-147

5.24 Exerciii


1. Creai tabelul DEPT bazat pe structura din tabelul urmtor. Salvai
instruciunea n scriptul p1.sql , executai scriptul i verificai.
Column Name Id Name
Datatype Number Varchar2
Length 7 25
2. Introducei nregistrri n tabela DEPT din tabela DEPARTMENT. Includei
doar coloanele de care avei nevoie.
3. Creai tabela EMP bazata pe tabelul urmtor. Salvai instruciunea ntr-un
script p3.sql i apoi executai scriptul. Verificai existenta tabelei.

Column Name ID LAST_NAME FIRST_NAME DEPT_ID
Datatype Number Varchar2 Varchar2 Number
Length 7 25 25 7

4. Modificai tabela EMP pentru a permite nume mai lungi n coloana
Last_name. Verificai efectuarea modificrii.
5. Asigurai-v c cele dou tabele create sunt stocate de dicionarul de date.
6. Creai tabela EMPLOYEE2 bazat pe structura tabelei EMP, incluznd doar
coloanele EMPNO, ENAME i DEPTNO. Redenumii coloanele n noua
tabela astfel: ID, LAST_NAME, DEPT_ID.
7. Redenumii tabela EMPLOYEE2 n EMPLOYEE3.
8. tergei tabela EMPLOYEE3.
9 Adugai o constrngere de tip PRIMARY KEY la tabela EMP folosind
coloana ID. Constrngerea trebuie sa fie activata la creare.
10. Creai o constrngere PRIMARY KEY n tabela DEPT folosind coloana ID.
Constrngerea trebuie sa fie activata la creare.
11. Adugai o referin de tip cheie extern la tabela EMP care va asigura ca
angajaii nu sunt asignai unui departament inexistent.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


5-148
12. Confirmai constrngerile adugate interognd tabela
USER_CONSTRAINTS. Observai numele i tipul constrngerilor. Salvai
textul ntr-un fiier.
CONSTRAINT_NAME C
DEPT_ID_PK P
EMP_ID_PK P
EMP_DEPT_ID_FK R

13. Afiai numele i tipul obiectelor din dicionarul USER_OBJECTS al
tabelelor EMP i DEPT. Formatai coloanele pentru refolosirea lor.
Observai 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. Modificai tabela EMP. Adugai o coloana SALARY de tip NUMBER,
precizie 7.
15. tergei coloana FIRST_NAME din tabela EMP. Confirmai modificrile
efectuate prin verificarea descrierii tabelei.
16. Marcai ca fiind nefolosit coloana DEPT_ID din tabela EMP. Confirmai
modificrile efectuate prin verificarea descrierii tabelei.
17. tergei toate coloanele nefolosite din tabela EMP. Confirmai modificrile
efectuate prin verificarea descrierii tabelei.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-149
Capitolul 6 Expresii aritmetice. Operatori. Restricionarea i sortarea
datelor

Instruciunea 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 conine 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
- Scdere
* nmulire
/ mprire

Exemplu:

SELECT last_name, salary, salary+300 FROM employees;

n exemplul dat s-a folosit operatorul adunare pentru a mri salariile cu
300$ pentru toi angajaii. Se afieaz noua coloan SALARY+300 . n urma
adunrii coloana rezultat (SALARY+300) nu este o coloan nou n tabela
EMPLOYEES; aceasta este vizibil doar la afiarea rezultatelor. Implicit,
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-150
denumirea noii coloane provine de la operaia care a generat-o, n acest caz
SALARY+300.


NOT: SQL*Plus ignor spaiile din faa i din spatele operatorilor
aritmetici.

Prioritatea operatorilor este * / + -
nmulirea i mprirea au prioritate fa de adunare i scdere.
Operatorii de aceeai prioritate sunt evaluai de la stnga la dreapta.
Parantezele sunt folosite pentru a fora evalurile prioritare i a clarifica
regulile.
Dac o expresie aritmetic conine mai mult de un operator, nmulirea
i mprirea sunt evaluate primele. Dac operatorii folosii ntr-o
expresie sunt de aceeai prioritate, evaluarea se va face de la stnga la
dreapta. Putei folosi parantezele pentru a fora 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 compensaia
anual a angajailor. Aceasta este calculat nmulind salariul lunar cu 12 plus o
prim de 100$. Deci, nmulirea se efectueaz naintea adunrii.

Folosirea parantezelor pentru a ntri ordinea fireasc a operaiilor va
arata astfel : (12*SALARY)+100, operaie care nu va schimba rezultatul.

Folosirea parantezelor
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-151

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 folosii. n exemplul dat sunt
afiate numele, salariul i compensaia anual a salariailor. Aceasta este
formata din salariul lunar plus o prima, totul nmulit cu 12. Datorit
parantezelor, adunarea are prioritate fa de nmulire.

Definirea valorii nule (null vallue)

Valoarea null este nedisponibil, neatribuit, necunoscut sau
inaplicabil.
Valoarea nul nu este aceeai cu zero sau spaiu.


Exemplu:

SELECT last_name, job_id,salary,commission_pct
FROM employees;

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-152

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 spaiu. Zero este numr
iar spaiul este un caracter.
Coloanele de orice tip de dat pot conine valoarea vid, cu excepia
celor care au fost definite nenule sau chei primare.
Se observ c unii angajai pot ctiga comision iar alii nu - coloana
COMMISSION_PCT din tabela EMPLOYEES. Valoarea vid reprezint un fapt
n sine. Trebuie subliniat faptul ca vnztorul are comisionul 0 nu null.

Valoarea nul n expresii aritmetice


Expresiile aritmetice care conin valoarea null sunt evaluate ca
nule.



Exemplu:

SELECT last_name, 12*salary*commission_pct
FROM employees;

Dac o coloan dintr-o expresie aritmetic conine valoarea null,
rezultatul este null. De exemplu, dac ncercai s executai o mprire la zero,
obinei o eroare. Oricum, dac mprii un numr la valoarea null, rezultatul
este null sau necunoscut.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-153

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; opional se poate
folosi cuvntul cheie AS intre numele coloanei i alias;
Aliasurile necesita doua ghilimele ( / dac conin spatii, caractere
speciale sau au importanta literele mari (mici).
La afiarea rezultatului unei interogri 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 nelege coninutul coloanei. Numele
coloanei se poate schimba folosind aliasul.

Aliasul se specific dup numele coloanei n lista SELECT folosind
spaiul ca separator. Implicit capul de tabel obinut prin alias este scris cu litere
mari. Dac aliasul conine 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;




Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-154


SELECT last_name as Name, salary*12 Annual Salary
FROM employees;

Primul exemplu afieaz numele i comisionul lunar al tuturor angajailor.
Cuvntul cheie AS a fost folosit nainte de alias. Rezultatul interogrii 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 fcut cu litere mari. Deci, implicit capul de coloana apare cu litere
mari.

n cel de-al doilea exemplu afiam numele i salariul anual al angajailor.
Deoarece Annual Salary implic folosirea spaiului, 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.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-155

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. Observai c funcia 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 instruciunea SELECT.


iruri de caractere

Un literal este un caracter, o expresie sau un numr 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 angajailor. Coloana poart
titlul Detaliile angajatului. Observai spatiile dintre ghilimelele simple din
instruciunea SELECT care mbuntesc lizibilitatea ieirii.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-156
n exemplul urmtor, numele i salariul fiecrui angajat este concatenat
cu un literal pentru a da rndurilor mai mult neles.

SELECT last_name ||:1 Month salary = ||salary Monthly
FROM employees;


Rnduri duplicate

Implicit, interogrile afieaz toate rndurile, incluznd rndurile
duplicate.

Exemplu:
SELECT department_id FROM employees;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-157

SQL*Plus va afia rezultatul interogrii fr 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 combinaie
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
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-158
unde tablename este numele unei tabele existente, a unei vizualizri sau
a unui sinonim accesibil utilizatorului.


Exemplu:
DESCRIBE EMPLOYEES


Se afieaz informaii despre structura tabelei EMPLOYEES. Null? indic
dac o coloana trebuie sa conin date; NOT NULL indic faptul ca acea
coloan trebuie s conin date. Type afieaz tipul de dat al coloanei.

Tip de date Descriere
NUMBER(p,s)
Valori numerice avnd un numr maxim de p cifre, unde s
este numrul 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 Restricionarea i sortarea datelor

La citirea datelor dintr-o baza de date s-ar putea sa fie necesar
reducerea numrului de linii afiate sau specificarea ordinii n care acestea s
fie afiate.

n exemplul de mai jos se dorete afiarea tuturor angajailor din
departamentul 90. Setul de linii care au valoarea 90 n coloana
DEPARTMENT_ID sunt singurele returnate. Aceast metod de restricionare
reprezint baza clauzei WHERE n SQL.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-159
Limitarea liniilor folosind o selecie

EMPLOYEES
EMPLOYEE_ID LAST_NAME JOB_ID
DEPARTMENT
_ID
100 King AD_PRES 90
101 Kochhar AD_VP 90
102 De Haan AD_VP 90
103 Hunold IT_PROG 90
60
returneaz
toi angajaii
din
departamentul
90

EMPLOYEES
EMPLOYEE_ID LAST_NAME JOB_ID DEPARTMENT_ID
100 King AD_PRES 90
101 Kochhar AD_VP 90
102 De Haan AD_VP 90

6.6 Clauza WHERE

n sintaxa:
WHERE restricioneaz interogarea la liniile ce ndeplinesc condiia.
condition e compus din nume de coloane, expresii, constante i
operatori de comparaie.

Clauza WHERE urmeaz dup clauza FROM

Putei reduce numrul de linii returnate de o interogare folosind clauza
WHERE.
O clauza WHERE conine o condiie ce trebuie ndeplinit i urmeaz
imediat dup o clauza FROM.
Clauza WHERE poate compara valorile din coloane, valori literale,
expresii aritmetice sau funcii. Clauza WHERE e compus din trei elemente ;
Numele coloanei;
Operatorul de comparaie;
Nume de coloana, constant sau list de valori.
SELECT [DISTINCT] {*, column [alias], }
FROM table
[WHERE condition(s)];
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-160

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 funcia tuturor
angajailor 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 cutrile de
tip caracter sunt case-sensitiv. n exemplul urmtor nu este returnat nici o linie
deoarece tabela EMPLOYEES conine 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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-161

NOT: schimbarea formatului implicit va fi explicat n alt capitolul.
6.7 Operatori de comparaie

Operator Semnificaie
= Egal cu
> Mai mare dect
>= Mai mare sau egal
< Mai mic dect
<= Mai mic sau egal
<> Diferit de
!= Diferit de

Operatorii de comparaie sunt folosii n condiiile care compar dou
expresii. Acetia sunt folosii n clauza WHERE n urmtorul format:

Sintaxa:
WHERE expresie operator valoare


Exemplu:
WHERE hiredate=01-JAN-95
WHERE sal>=1500
WHERE ename=SMITH

Folosirea operatorilor de comparaie

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.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-162
Ali operatori de comparaie

Operator Semnificaie
BETWEEN AND ntre dou valori (inclusiv)
IN(lista) Potrivete orice valoare din list
LIKE Potrivete un tip de caracter
IS NULL Este o valoare nul


Operatorul BETWEEN

Operatorul BETWEEN se folosete pentru afiarea valorilor cuprinse ntr-
un 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
toi angajaii cal cror 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 numrul, numele, salariul i numrul
managerului pentru toi angajaii ai cror manageri au numrul 100,101 sau
201.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-163

Operatorul IN poate fi folosit cu orice tip de dat.
Urmtorul exemplu returneaz o linie din tabela EMPLOYEES pentru
fiecare angajat al crui 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 cutri folosind
caractere wildcard n irurile valide de cutare.

Condiiile cutrii pot conine 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 cutm. Folosind
operatorul LIKE se pot selecta liniile care se potrivesc cu un anumit ablon de
ctare format dintr-un ir de caractere numit wildcard. Pentru construirea
irurilor de cutare pot fi folosite dou simboluri.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-164

Simbol Semnificaie
% Reprezint orice secvena de dou sau mai multe caractere
_ Reprezint un singur caracter

SELECT-ul de mai sus afieaz numele angajailor din tabela
EMPLOYEES pentru toi angajaii ai cror nume ncepe cu S. Numele care
ncep cu s nu vor fi returnate.
Operatorul LIKE poate fi folosit i n comparaiile ce folosesc operatorul
BETWEEN. Urmtorul exemplu afieaz numele i data angajrii pentru
salariaii ce au fost angajai ntre ianuarie 1981 i decembrie 1981.

SELECT last_name, hire_date FROM EMPLOYEES
WHERE hire_date LIKE %95;

Se pot face diverse combinaii de caractere cum ar fi :
SELECT last_name FROM EMPLOYEES
WHERE last_name LIKE _o%;

Se poate folosi identificatorul ESCAPE pentru a cuta caracterele
% i _.

Combinri de caractere wildcard:

Simbolurile % i _ pot fi folosite n orice combinaie cu caracterele literale.
Exemplul afieaz numele tuturor angajailor care au al doilea caracter A.

Opiunea ESCAPE:
Cnd este nevoie de o potrivire exacta a caracterelor % i _ trebuie
folosita opiunea ESCAPE. Aceasta opiune specific care este caracterul
ESCAPE. Pentru a afia numele tuturor angajailor care conine secvena A_B
se va folosi urmtorul SELECT:

SELECT employee_id,last_name,job_id
FROM EMPLOYEES
WHERE job_id LIKE %SA\_% ESCAPE \;

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-165
Opiunea 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 cuta 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 angajailor care nu au manager.
De exemplu pentru a afia numele, funcia i comisionul tuturor
angajailor care nu au dreptul la comision se va folosi urmtorul SELECT:


SELECT last_name,job_id,commission_pct
FROM EMPLOYEES
WHERE commission_pct IS NULL;

6.8 Operatori logici

Operator Semnificaie
AND
Returneaz TRUE dac ambele componente ale condiiei sunt
adevrate
OR
Returneaz TRUE dac una din componentele condiiei este
adevrat
NOT Returneaz TRUE dac condiia este fals

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-166
Un operator logic combin rezultatul a dou componente de tip condiie
pentru a produce un singur rezultat bazat pe acestea sau pentru a inversa
rezultatul unei singure condiii.

Folosirea operatorului AND

AND cere ca ambele condiii sa fie adevrate.

SELECT employee_id, last_name,job_id,salary
FROM EMPLOYEES
WHERE salary>=10000 AND job_id LIKE %MAN%;
n exemplul de mai sus ambele condiii trebuie sa fie adevrate pentru a fi
selectat vreo nregistrare. De acea va fi selectat doar angajatul pentru care
numele codului funciei ncepe cu MAN i care ctig mai mult de 10000.
Toate cutrile 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 adevr 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 condiii sa fie adevrat.


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 condiii poate fi adevrat pentru a fi
selectat vreo nregistrare. De acea un angajat pentru care numele codului
funciei ncepe cu MAN sau ctiga mai mult de 10000 va fi selectat.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-167



Tabela de adevr 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 funcia tuturor angajailor a
cror funcie nu este IT_PROG, ST_CLERK, SA_REP.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-168
Tabela de adevr a operatorului NOT

NOT TRUE FALSE UNKNOWN
FALSE TRUE UNKNOWN


Not: operatorul NOT poate fi folosit mpreun cu ali 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 evalurii Operator
1 Toi operatorii de comparaie
2 Operatori de concatenare
3 Condiii de comparare
4 IS [NOT] NULL, LIKE, [NOT] IN
5 [NOT] BETWEEN
6 NOT
7 AND
8 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 condiii ce trebuie ndeplinite i anume:
Funcia trebuie s fie AD_PRES i salariul sa fie mai mare de 15000.
Funcia trebuie s fie SA_REP.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-169
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 fora 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 condiii:
Funcia trebuie s fie SA_REP sau AD_PRES ;
Salariul trebuie s fie mai mare de 15000.
De aceea SELECT-ul citete urmtoarele: 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 specific ordinea n care sunt afiate liniile.
ASC ordoneaz liniile ascendent implicit.
DESC ordoneaz liniile descendent.

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

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-170
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 01-
JAN-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 secvene ascendente i
primele pentru secvene 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 salariailor.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-171
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 sortrii.
Se poate face sortare i dup o coloana care nu este n lista SELECT.
Rezultatele interogrii pot fi sortate dup mai multe coloane. Limita
sortrii este dat de numrul de coloane din tabela respectiv.
n clauza ORDER BY trebuiesc specificate coloanele separate prin
virgule. Dac se dorete schimbarea ordinii afirii unei coloane se
specific DESC dup numele coloanei respective.

Exemplu:
Sa se afieze numele i salariul tuturor angajailor. Rezultatele s se
afieze dup numrul departamentului i apoi n ordine
descresctoare dup salariu.
SELECT last_name,department_id,salary
FROM EMPLOYEES ORDER BY department_id,salary DESC ;










Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-172


6.10 Exerciii


1. Iniiai o sesiune SQL*Plus.
2. Comenzile SQL*Plus acceseaz o baza de date: adevrat / fals.
3. Instruciunea SELECT se va executa cu succes : adevrat / fals.
SELECT last_name, job_id, salary SALARY FROM EMPLOYEES;
4. Instruciunea SELECT se va executa cu succes : adevrat / fals.
SELECT * FROM salgrade;
5. n instruciunea urmtoare sunt cteva erori. Identificai-le.
SELECT first_name, salary x 12 ANNUAL SALARY FROM EMPLOYEES;
6. Afiai structura tabelei DEPARTMENTS i coninutul ei.
7. Afiai structura tabelei EMPLOYEES. Creai o interogare care sa afieze
numele angajatului, meseria, data angajrii i numrul angajatului. Salvai
instruciunea ntr-un fiier abc.sql.
8. Rulai interogarea din fiierul abc.sql.
9. Afiai meseriile distincte din tabela EMPLOYEES.
10. ncrcai fiierul abc.sql n bufferul SQL. Redenumii numele coloanelor cu:
EMPLOYEES#, Job, Hire Date i apoi rulai interogarea.
11. Afiai numele concatenat cu meseria, separate de virgula i un spaiu i
numii coloana EMPLOYEES -JOB and Title.
12. Afiai datele din tabela EMPLOYEES. Separai fiecare coloan cu o virgul
i numii coloana THE_OUTPUT.
13. Afiai numele i salariul angajailor care ctiga mai mult de 28500$.
Salvai instruciunea SQL ntr-un fiier p1.sql i apoi rulai-l.
14. Afiai numele angajatului cu marca 201 i numrul departamentului n care
lucreaz.
15. Modificai p1.sql astfel nct sa afiai numele i salariul tuturor angajailor a
cror salarii nu intr n intervalul 15000$ i 28500$. Salvai instruciunea
n fiierul p3.sql i apoi rulai-l.
16. Afiai numele, meseria i data de nceput pentru cei care s-au angajat ntre
20.02.1985 i 1.05.1992. Afiarea va fi fcut n ordinea cresctoare a
datei de angajare.
17. Afiai numele angajailor i numerele de departament ale celor care
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


6-173
lucreaz n departamentele 10 i 30; ordonai alfabetic dup nume.
18. Modificai fiierul p3.sql i afiai numele i salariul celor care ctiga mai
mult de 15000$ i sunt n departamentele 10 sau 30. Redenumii
coloanele Angajat i Salar Lunar. Salvai modificrile n fiierul p6.sql i
apoi rulai-l.
19. Afiai numele i data angajrii pentru cei care au fost angajai n anul 1995.
20. Afiai numele i meseria pentru angajaii care nu au manager.
21. Afiai numele, salariul i comisionul pentru toi angajaii care au comision.
Sortai datele n ordine descresctoare dup salariu i comision.
22. Afiai numele angajailor care au a treia liter a numelui A.
23. Afiai numele angajailor care au 2 de L oriunde n numele lor i sunt din
departamentul 30 mpreuna cu acei angajai care au managerul cu marca
100.
24. Afiai numele, meseria i salariul pentru toi cei care sunt funcionari sau
analiti iar salariul lor nu este egal cu 10000$ sau 30000$ sau 50000$.
25. Modificai p6.sql i afiai numele, salariul i comisionul pentru toi angajaii
care au comisionul mai mare dect salariul mrit cu 10%. Salvai
modificrile n fiierul p13.sql i apoi rulai-l.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-174
Capitolul 7 Funcii de un singur rnd

Funciile fac blocul de baza al interogrii mai puternic i sunt folosite
pentru a manipula date. Acesta capitol este primul dintr-un set de dou capitole
ce au ca obiectiv descrierea funciilor. Ea se ocup att de funciile de un singur
rnd pentru caractere, numere i date calendaristice ct i de funciile ce fac
conversii dintr-un tip de data n altul de exemplu: din caracter n numr.











Funciile 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 tiprite pe ecran;
Schimbarea tipului de dat a unei coloane.

Funciile SQL accepta argumente i ntorc valori.

NOT : Majoritatea funciilor descrise n acest capitol sunt specifice
versiunii SQL pentru Oracle.

Exista dou tipuri distincte de funcii:
Funcii de un singur rnd
Funcii de mai multe rnduri
Funcii
Funcii de un
singur rnd
Funcii de mai
multe rnduri
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-175
Funcii de un singur rnd

Aceste funcii acioneaz doar asupra unui singur rnd i ntorc un
rezultat pentru fiecare rnd. Exist mai multe tipuri de funcii de un singur
rnd. Acest capitol se ocupa de urmtoarele tipuri: Caracter, Numr, Data
calendaristic, Conversie.

Funcii de mai multe rnduri

Aceste funcii acioneaz 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 Funcii de un singur rnd

Funciile de un singur:

Manipuleaz articole;
Acioneaz asupra fiecrui rnd rezultat din interogare ;
ntorc un singur rezultat pentru fiecare rnd;
Pot modifica tipuri de date;
Pot fi imbricate.
unde:
nume_funcie este numele funciei
coloana este un nume de coloan din baza de date
expresie este orice ir de caractere sau expresie calculabil
arg1, arg2, sunt argumentele utilizate de funcie

Funciile 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 funcie poate avea ca argument unul din
urmtoarele:
o constanta furnizat de utilizator;
o variabil;
o denumire de coloan;
o expresie.
Caracteristici ale funciilor de un singur rnd
nume_funcie (coloana | expresie,
[arg1, arg2, ] )
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-176

Acioneaz asupra fiecrui rd ntors de interogare;
ntorc o valoare pentru fiecare rnd;
Pot ntoarce o dat a crui 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.


Acest capitol prezint urmtoarele tipuri de funcii:
Funcii pentru caractere: accept argumente de tip caracter i ntorc
rezultate de tip caracter sau numeric;
Funcii pentru numere: accept argumente de tip numeric i ntorc
rezultate de tip numeric;
Funcii pentru date calendaristice: accept argumente de tip dat
calendaristic i ntorc rezultate de tip dat calendaristic cu excepia
funciei MONTH_BEETWEEN care ntoarce o valoare numeric;
Funcii pentru conversie: fac conversia dintr-un tip de data n altul;
Funcii generale: NVL,NVL2,NULLIF,COALSECE,CASE,DECODE.















Funcii de un
singur rnd
Caractere
Numere
Data calendaristic
Generale
Conversie
Funcii pentru
caractere
Funcii de conversie a
caracterelor din litere
mari in litere mici.
LOWER
UPPER
INITCAP
Funcii de manipulare a
caracterelor.
CONCAT
SUBSTR
LENGTH
INSTR
LPAD,RPAD
TRIM
REPLACE
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-177
7.2 Funcii pentru caractere

Funciile de un singur rnd pentru caractere accept argumente de tip
caracter i ntorc rezultate de tip caracter sau numeric. Funciile pentru
caractere se pot mpri n :
Funcii de conversie a caracterelor din litere mari n litere mici.
Funcii de manipulare a caracterelor

Funcie 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 funcie este echivalenta cu
operatorul de concatenare ( || ).
SUBSTR(expresie coloana, m/,n/)
ntoarce un sir de caractere din cadrul valorii
de tip caracter ncepnd cu poziia m i
avnd lungimea n. Dac m este negativ
atunci poziia de nceput a numrrii se
consider a fi ultimul caracter din ir. Dac n
este omis atunci funcia ntoarce toate
caracterele de la poziia m pn la sfritul
irului.
LENGTH(expresie coloana)
ntoarce numrul de caractere dintr-o valoare
de tip caracter.
INSTR(expresie coloana,m)
ntoarce poziia 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 gsete l
nlocuiete cu valoarea din
replacement_string.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-178


Funcie Rezultat
LOWER (SQL Course) sql course
UPPER (SQL Course) SQL COURSE
INITCAP (SQL Course) Sql Course

Funcii de conversie a caracterelor din litere mari n litere mici.

Cele trei funcii 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;



Afiai numrul 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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-179
SELECT employee_id, last_name, department_id
FROM employees
WHERE LOWER(last_name)=higgins;


Clauza WHERE din prima instruciune SQL specific numele angajatului
ca fiind higgins. Din moment ce toate informaiile din tabela EMPLOYEES sunt
memorate ca fiind scrise cu capitalizare, numele higgins (scris cu litere mici)
nu poate fi gsit i ca urmare nu se afieaz nimic.

Clauza WHERE din cea de-a doua instruciune SQL face mai nti
conversia numelui memorat n tabela n litere mici i compar rezultatul obinut
cu numele higgins. n acest caz ambii termeni din comparaie sunt scrii cu
litere mici i deci, de aceasta dat, se pot selecta informaiile necesare din
tabel. Clauza WHERE mai poate fi scris ca n exemplul de mai jos, efectul
instruciunii fiind acelai. WHERE (last_name)=Higgins

Numele angajatului din partea dreapta a comparaiei 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 utilizai funcia INITCAP.

Funcii pentru manipulat caractere

FUNCTIE REZULTAT
CONCAT (Good,String)
SUBSTR (String,1,3)
LENGTH (String)
INSTR (String,r)
LPAD (salary,10,*)
GoodString
Str
6
3
******5000

Funciile pentru manipulat caractere prezentate n cadrul acestei lecii
sunt: CONCAT, SUBSTR, LENGTH, INSTR i LPAD.

CONCAT Concateneaz cei doi parametri. Funcia limiteaz numrul
parametrilor la 2.
SUBSTR Extrage un sir de caracter de o lungime specificat.
LENGTH ntoarce lungimea irului de caractere (ntoarce o valoare
numeric).
INSTR Gsete poziia caracterului specificat.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-180
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 funcia 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 funcia sa mpreuna,
lungimea numelui i poziia literei a n cadrul numelui, pentru toate persoanele
care au funcia de vnztor.

Modificai exemplul de mai sus astfel nct instruciunea SQL s afieze
informaiile despre angajai pentru acele persoane a cror 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;

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-181
7.3 Funcii pentru valori numerice

ROUND Rotunjete valoarea cu un numr specificat de zecimale.
ROUND (45.926,2) 45.93

TRUNC Trunchiaz valoarea
TRUNC (45.926,2) 45.92

MOD ntoarce restul mpririi
MOD (1600,300) 100

Funciile pentru valori numerice accept valori numerice i ntorc valori
numerice. Aceasta seciune descrie o parte din aceste funcii:

Funcie Scop
ROUND (coloana |
expresie, n)
Rotunjete coloana, expresia sau valoarea la un numr
cu n poziii la partea zecimal. Dac n este omis
numrul rezultat din conversie nu are parte zecimal.
Dac n este negativ este rotunjit numrul din partea
stnga a punctului zecimal.
TRUNC (coloana |
expresie, n)
Trunchiaz coloana, expresia sau valoarea la un numr
cu n poziii la partea zecimal. Dac n este omis
numrul rezultat din conversie nu are parte zecimal.
Dac n este negativ este trunchiat numrul din partea
stnga a punctului zecimal ctre zero.
MOD (m,n) ntoarce restul mpririi dintre m i n.

Utilizarea funciei 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

Funcia ROUND rotunjete coloana, expresia sau valoarea la un numr cu n
poziii la partea zecimal.
Dac al doilea argument este omis sau este 0 numrul rezultat
din conversie nu are parte zecimal.
Dac al doilea argument este 2 atunci numrul rezultat din
conversie are 2 cifre la partea zecimal.
Dac al doilea argument este -2 atunci se rotunjesc primele 2
cifre ale numrului de la stnga punctului zecimal.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-182

Funcia 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 funciei 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

Funcia TRUNC trunchiaz coloana, expresia sau valoarea la un numr cu n
poziii la partea zecimal.
Funcia TRUNC funcioneaz cu argumente similare ca i funcia ROUND.
Dac al doilea argument este omis sau este 0 numrul rezultat
din conversie nu are parte zecimal.
Dac al doilea argument este 2 atunci numrul rezultat din
conversie are 2 cifre la partea zecimal.

Funcia TRUNC, la fel ca i funcia ROUND, poate fi utilizat asupra datelor
calendaristice.

Utilizarea funciei MOD

SELECT last_name, salary, MOD(salary, 5000)
FROM employees
WHERE job_id = 'SA_REP';



Funcia MOD ntoarce restul mpririi dintre valoarea1 i valoarea2. Exemplul
de mai sus calculeaz restul mpririi dintre salar i 5000 pentru toi angajaii
care sunt ageni comerciali.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-183
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 funcie care ntoarce data i timpul.
DUAL este o tabel fictiv utilizat pentru a vedea rezultatul ntors
de anumite funcii 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 funcia 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 folosii
rmne la latitudinea dumneavoastr. Se poate folosi pentru afiarea datei
tabela DUAL.

Tabela DUAL este proprietatea utilizatorului SYS i poate fi accesat de
toi utilizatorii. Ea conine 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;

Operaii aritmetice cu date calendaristice

Dac adunai sau scdei un numr la sau dintr-o dat
calendaristica vei obine tot o dat calendaristic.
Scdei dou date pentru a gsi numrul de zile dintre acestea.

Din moment ce baza de date memoreaz datele calendaristice ca
numere rezult c asupra acestor date se pot efectua operaii aritmetice
utiliznd operatori aritmetici cum ar fi + i-. Deasemeni se pot aduna sau
scdea constante numerice la date calendaristice. Exist posibilitatea efecturii
urmtoarelor operaii:
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-184

Operaie Rezultat Descriere
data + numr dat adun un numr de zile la o dat
data numr dat scade un numr de zile dintr-o dat
data data numr de zile scade o dat din cealalt
data + numr/24 dat adun un numr 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 angajailor din
departamentul 90 i de perioada n care au fost angajai exprimat n
sptmni. Pentru a afia perioada angajrii n sptmni se face diferena
ntre data curent (data SYSDATE) i data la care a fost angajat persoana i
apoi se mparte rezultatul la 7.

NOT: SYSDATE este o funcie SQL ce ntoarce data i timpul
curent. Rezultatul pe care l obinei dac probai exemplul poate s
difere de rezultatul de mai sus.
7.5 Funcii pentru date calendaristice

Funcie Descriere
MONTHS_BETWEEN
ntoarce numrul de luni dintre dou date
calendaristice.
ADD_MONTHS
Adun un numr de sptmni 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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-185
Funciile pentru date calendaristice opereaz asupra datelor
calendaristice de tip Oracle. Toate funciile pentru date ntorc o valoare de tip
dat cu excepia funciei MONTH_BETWEEN, care ntoarce o valoare
numeric.
MONTHS_BETWEEN (data1,data2): Gsete numrul 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 numr de n luni la data. Numrul n trebuie
s fie ntreg i poate fi negativ.
NEXT_DAY(data,char): Determin data calendaristic a urmtoarei zile
specificate, din sptmna, care urmeaz datei data.
LAST_DAY(data): Determin data calendaristic a ultimei zile specificate, din
sptmna, care urmeaz datei data.
ROUND(data[,fmt]): ntoarce data rotunjit n funcie de formatul fmt. Dac
fmt este omis atunci data este rotunjit la cea mai apropiata dat.
TRUNC(data[,fmt]): ntoarce data data trunchiat n funcie de formatul fmt.
Dac fmt este omis atunci data este rotunjit la cea mai apropiat zi.
Aceasta list este un subset al funciilor 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, afiai numrul de ordine al angajatului, data angajrii, numrul de
luni pe care persoana le-a acumulat ca angajat, data reviziei care trebuie fcut
peste 6 luni, prima vineri de dup data angajrii, ultima zi a lunii n care s-a
fcut 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;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-186
Funciile 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.

ROUND (25-JUL-95,MONTH) 01-AUG-95
ROUND (25-JUL-95,YEAR) 01-JAN-96
TRUNC (25-JUL-95,MONTH 01-JUL-95
TRUNC (25-JUL-95,YEAR) 01-JAN-95

Exemplu:

Comparai datele n care s-au fcut angajri pentru toate persoanele care
au nceput sa lucreze n anul 1997. Afiai numrul de ordine al angajatului,
data angajrii, i luna n care acesta a nceput sa lucreze exprimat sub forma
unui interval, folosind funciile ROUND i TRUNC.


SELECT employee_id, hire_date,
ROUND (hire_date, MONTH), TRUNC(hire_date, MONTH)
FROM employees WHERE hire_date like %97 ;

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-187
7.6 Funcii pentru conversia 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 situaii, 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 ctre server-ul
Oracle sau explicit efectuate de ctre 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 funcii de conversie. Funciile
de conversie transforma tipul unei valori n altul. n general funciile de
conversie respect urmtoarea 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 fcute implicit de
ctre utilizator pentru a asigura corectitudinea instruciunilor.





Conversia
tipului de
date
Conversie
explicita a tipului
de date
Conversie
implicita a
tipului de date
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-188
Conversii de date implicite

n operaii de atribuire Oracle poate automat conversia:

DIN IN
VARCHAR2 sau CHAR (ir de caractere) NUMBER (valoare numerica)
VARCHAR2 sau CHAR (ir de caractere)
DATE

NUMBER (valoare numeric) VARCHAR2 (ir de caractere)
DATE (data calendaristic) VARCHAR2 (ir de caractere)

Operaia de atribuire are loc cu succes dac server-ul Oracle poate
converti tipul de dat al sursei n tipul de dat al destinaiei.

n cazul evalurii expresiilor, Oracle poate automat conversia:

DIN IN
VARCHAR2 sau CHAR (ir de caractere) NUMBER (valoare numeric)
VARCHAR2 sau CHAR (ir de caractere) 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 situaia
respectiv.

NOT: Conversia din CHAR n NUMBER are loc cu succes doar
dac irul de caractere reprezint un numr 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 dispoziie trei funcii cu ajutorul crora se pot face conversii
dintr-un tip de data n altul.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-189

Funcie Scop
TO_CHAR (numr|data
calendaristica, [fmt])
Face conversia dintr-un numr 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 conine 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 funciile disponibile
pentru conversii. Pentru mai multe detalii consultai lucrarea: Oracle
Server SQL Reference. Release 9i Conversion Function



Utilizarea funciei TO_CHAR mpreun cu date calendaristice







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. Funcia TO_CHAR permite conversia din formatul implicit ntr-un
format specificat de dumneavoastr.
TO_CHAR (data calendaristica, fmt)
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-190


Observaii:

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. Asigurai-v c valoarea este
separat de modelul de formatare prin virgul;
Pentru numele zilelor i al lunilor se aduga automat spatii goale la
ieire ;
Pentru a elimina spatiile i zerourile nesemnificative folosii elementul
pentru modul de umplere;
Avei 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 digii
YEAR Anul n litere
MM Luna scris cu dou cifre
MONTH Numele lunii
DY
O abreviaie a denumirii unei zile din sptmna 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
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-191
[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.
Q 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, spaiul
rmas liber este automat umplut cu spatii
MON O abreviaie a denumirii unei luni format din trei litere
RM Luna scris cu cifre romane
WW sau W Sptmna din an sau luna
DDD sau DD sau D Ziua din an, lun sau sptmn.
DAY
Denumirea completa a zilei completat eventual cu
spaii pn la 9 caractere.
DY O abreviaie a denumirii unei zile formata din trei litere
J Numrul de zile de la data de 31 Decembrie 4713BC

Elemente ce formateaz timpul

HH24:MI:SS AM
15:45:32 PM

Adugai iruri de caractere prin nchiderea acestora ntre ghilimele.

DD of MONTH
12 of OCTOBER

Adugai sufixe pentru a scrie n litere un numr .

ddspth
fourteenth

Modele de formatare pentru timp

Utilizai elementele descrise mai jos atunci cnd dorii s afiai timpul ntr-un
anumit format sau s folosii litere n loc de cifre.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-192

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
Numrul de secunde ncepnd cu miezul
nopii

Alte formate:
Element Descriere
/.. Punctuaia este reprodus n rezultat.
of the irul ncadrat ntre ghilimele este reprodus

Specificai sufixe :
Element Descriere
TH
Numr de ordine dat n cifre (de exemplu DDTH
pentru 4TH)
SP
Numr scris n litere (de exemplu DDSP pentru
FOUR)
SPTH sau THSP
Numr de ordine scris n litere (de exemplu
DDSPTH pentru FOURTH)


Utilizarea funciei TO_CHAR mpreuna cu date calendaristice

SELECT last_name,TO_CHAR (hire_date, fmDD Month YYYY)
HIRE_DATE FROM employees;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-193


Exemplul de mai sus prezint o modalitate de a afia numele i data
angajrii pentru fiecare angajat.( De remarcat este formatul n care se afieaz
data.)

Modificai exemplul de mai sus astfel nct data calendaristic sa
aib urmtorul format: Seventh of February 1981 08:00:00 AM.

SELECT last_name,TO_CHAR (hire_date, fmDdspth of Month
YYYY fmHH:MI:SS AM) HIRE_DATE FROM employees;


De remarcat este faptul c denumirea lunii respect modelul pentru
format specificat (INITCAP).

Utilizarea funciei TO_CHAR mpreuna cu valori numerice




Pentru a afia o valoare numeric sub forma unui caracter
utilizai urmtoarele elemente de formatare mpreuna cu funcia TO_CHAR.

TO_CHAR (number, fmp)
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-194
9 Reprezint un numr
0 Foreaz afiarea unei cifre 0
$ Semnul dolar
L Folosete simbolul local pentru moned
. Afieaz un punct
, Tiprete un indicator pentru mii

Atunci cnd se lucreaz cu valori numerice drept iruri de caractere
trebuie s convertii acele numere n valori de tip caracter utiliznd funcia
TO_CHAR, care face conversia dintre o valoare de tip NUMBER spre o valoare
de tip VARCHAR2. Aceasta tehnic este folositoare n cadrul unei concatenri.

Elemente de formatare pentru numere

Dac trebuie s convertii un numr ntr-o valoare de tip caracter putei utiliza
urmtoarele elemente:

Element Descriere Exemplu Rezultat
9
Poziie numerica (numrul cifrelor de 9
determin lungimea pe care se face
afiarea)
999999 1234
0 Afieaz zerourile nesemnificative 099999 001234
$ Semnul dolar $999999 $1234
L Folosete simbolul local pentru moned L999999 FF1234
.
Determin afiarea unui punct zecimal n
poziia specificat.
999999.99 1234.00
,
Determin afiarea unei virgule n poziia
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
NOTie tiinific (formatul impune
existena a patru litere E)
99.999EEEE 1.234E+03
V
nmulire cu 10 de n ori (n = numrul de
cifre de 9 de dup litera V)
9999V99 123400
B nlocuiete valorile de 0 cu blank B9999.99 1234.00

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-195
SELECT TO_CHAR(sal,'$99,999') SALARY
FROM emp
WHERE last_name= 'Ernst';



Observaii:

Server-ul Oracle afieaz semnul (#) n locul valorii numerice a crei numr
cifre a depit valoarea specificat prin model. Server-ul Oracle rotunjete
valoarea zecimal stocat ca o valoare cu un numr de zecimale furnizat de
ctre modelul de formatare.

Funciile TO_CHAR i TO_DATE





Pentru a face conversia dintr-un ir de caractere ntr-un numr folosii
funcia TO_NUMBER.

Pentru a face conversia dintr-un ir de caractere ntr-o dat calendaristic
folosii funcia TO_DATE.

Este posibil sa apra o situaie n care dorii sa facei conversia dintr-un
ir de caractere ntr-un numr sau ntr-o dat calendaristic. Pentru a realiza
aceste tipuri de conversii utilizai funciile TO_NUMBER i TO_DATE. Modelul
dup care se face formatarea va trebui alctuit pe baza elementelor pentru
formatare prezentate anterior.
Specificatorul fx indic potrivirea perfect dintre caracterul argument i
modelul de formatare a datei.
Punctuaia 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 numr de caractere ca i
modelul corespunztor din format.

Exemplu: Afiai numele i data angajrii 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);

TO_NUMBER (char)
TO_DATE (char [, fmt ] )
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-196

Formatul RR pentru date calendaristice

Anul curent Data specificata Formatul RR Formatul YY
1995 27-OCT-95 1995 1995
1995 27-OCT-17 2017 1917
2001 27-OCT-17 2017 2017
2001 27-OCT-95 1995 2095
Dac cele doua cifre specificate ale anului sunt:

0-49 50-99
0-
49
Data ntoars se
ncadreaz n secolul
curent
Data ntoarsa se ncadreaz n
secolul de dinaintea celui
curent Dac cele doua
cifre ale anului
curent sunt:

50
-
99
Data ntoars se
ncadreaz n secolul
de dup secolul curent
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 funcie de cei doi digii specificai n an i de ultimii doi digii
ai anului curent. Tabelul urmtor descrie comportamentul elementului RR.

Anul curent Data specificata Formatul RR
Formatul
YY
1994 27-OCT-95 1995 1995
1994 27-OCT-17 2017 1917
2001 27-OCT-17 2017 2017

7.7 Funcii diverse

Funcia NVL
Convertete o valoare nul ntr-o valoare efectiv;
Tipurile de date care pot fi folosite sunt: dat calendaristic,
caracter i numr;
Tipurile de date trebuie s se potriveasc.
- NVL (comm,0)
- NVL (hire_date,01-JAN-97)
- NVL (job, No Job Yet)
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-197

Sintaxa


unde:expr1 este valoarea sau expresia surs care ar putea s
conin o valoare nul.
expr2 este valoarea int, valoarea spre care se face conversia
Avei posibilitatea de a utiliza funcia 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 Exemplul de conversie
NUMBER
NVL (coloana ce conine o valoare de tip
numeric, 9)
DATE
NVL (coloana ce conine o valoare de tip dat
calendaristic, 01-JAN-95)
CHAR sau VARCHAR2
NVL (coloana ce conine 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 compensaia anual pentru toi angajaii, trebuie s
nmulii salariul lunar cu 12 i apoi sa adugai comisionul.

SELECT last_name, salary, NVL(commission_pct,0),
(Salary*12)+(salary*12*commission_pct) AN_SAL FROM employees;
NVL (expr1, expr2)
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-198

Din exemplul precedent se poate remarca faptul c compensaia anual
se calculeaz doar pentru acei angajai care au o valoare pentru comision
nenul. Dac se ntlnete pe coloana o valoare nul atunci rezultatul este nul.
Pentru a calcula valorile pentru toi angajaii trebuie s convertii valorile nule n
valori numerice nainte de a aplica operatorul aritmetic. O soluie corect pentru
o astfel de problem este prezentat n exemplul precedent celui luat n
discuie, exemplul n care pentru conversia valorilor nule s-a folosit funcia NVL.

Funcia NVL2

Sintaxa


unde: expr1 este valoarea sau expresia surs care ar putea sa conin o
valoare nul.
expr2 este valoarea returnat dac expr1 nu este null.
expr3 este valoarea returnat dac expr1 este null.

Funcia NVL2 examineaz prima expresie.
Dac prima expresie nu este null atunci funcia ntoarce cea de a doua
expresie.
Dac prima expresie este null atunci funcia ntoarce cea de a treia
expresie.








NVL (expr1, expr2,expr3)
SELECT first_name, salary, commission_pct,
NVL2(commission_pct, SAL+COMM,SAL) income
FROM employees WHERE department_id IN
(50,80);
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-199












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 deinut de argumentul doi nainte de a
face comparaia, 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.

Funcia NULLIF

Funcia NULLIF compar dou expresii. Dac ele sunt egale, funcia
returneaz null, dac nu, funcia returneaz prima expresie. Nu se poate
specifica literalul null pentru prima expresie.
Sintaxa


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;
NULLIF (expr1, expr2,)
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-200

Funcia NULLIF are ca echivalent logic expresia de tip CASE.
CASE WHEN expr1=expr2 THEN NULL ELSE expr1 END

Folosirea funciei COALESCE

Avantajul folosirii funciei COALESCE n locul folosirii funciei NVL este
faptul c funcia COALESCE poate lua mai multe valori alternative.
Daca prima expresie nu este null, funcia are ca rezultat aceast expresie
altfel, ea unete celelalte expresii.
Funcia COALESCE ntoarce prima expresie ce nu este null din list.

SINTAXA

COALESCE (expr1, expr2,... exprn)
unde :
expr1 este ntoarsa de funcie dac expr1 nu are valoarea null
expr2 este ntoarsa de funcie dac expr1 are valoarea null i expr2 nu
are valoarea null
exprn este ntoarsa de funcie dac precedentele expresii nu au
valoarea null

SELECT last_name,
COALESCE(commission_pct, salary, 10) comm
FROM employees ORDER BY commission_pct;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-201


Expresia CASE

Expresia de tip CASE ofer facilitile date de o structur de tip IF THEN ELSE.

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 condiie
de tip WHEN THEN este egal cu comparison_expr i ntoarce return_expr.
Dac nici una din perechile WHEN THEN nu ndeplinesc condiiile 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 mrirea de salariu se aplic difereniat pentru
anumite categorii de funcii i anume: programatorilor cu 10%, funcionarilor cu
15% iar vnztorilor cu 20%. Pentru celelalte funcii salariul rmne
neschimbat.
CASE expr WHEN comparison_expr1 THEN
return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_expr THEN return_expr
ELSE else_expr]
END
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-202



Funcia DECODE

Faciliteaz simularea unor structuri de tip CASE sau IF-THEN-ELSE

Funcia DECODE evalueaz o expresie ntr-un mod similar structurii IF-
THEN-ELSE, structur folosit n multe limbaje de programare. Funcia
DECODE evalueaz expresia dup ce o compar cu fiecare valoare search.
Dac valoarea expresiei este identic cu valoarea coninut n search atunci
este ntoars valoarea result .
Dac valoarea default (implicit) este omis, funcia 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;


DECODE(col/expression, search1, result1
[, search2, result2,...,]
[, default])
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-203
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 funcii salariile nu se modific.
Aceeai structura scris cu IF-THEN-ELSE are urmtoarea 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 funciilor

Funciile de un singur rnd se pot imbrica de cte ori dorim.
Evaluarea funciilor imbricate ncepe de la nivelul cel mai adnc.



Funciile 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 funcii.

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 instruciunii SQL se realizeaz n doi pai.
Evaluarea funciei din interior ce face conversia dintr-o valoare
numeric n una de tip caracter. - Rezultat1=TO_CHAR (mgr)
Evaluarea funciei 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.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


7-204

7.9 Exerciii


1. Scriei o interogare care sa afieze data curent. Denumii coloana Date.
2. Afiai marca, numele, salariul i salariu mrit cu 15% exprimat ca numr
ntreg. Denumii ultima coloana Salar Nou. Salvai instruciunea ntr-un fiier
numit p3q2.sql.
3. Rulai programul salvat anterior.
4. Modificai programul salvat n fiierul p3q2.sql astfel nct acesta s adauge
o coloana n care vei trece diferena dintre salariul nou i cel vechi.
Denumii coloana Cretere. Rulai noul program.
5. Afiai numele angajatului, data angajrii, data cnd se recalculeaz salariul,
care este prima luni dup 6 luni de servici. Denumii coloana REVIEW.
Formatai afiarea datei astfel nct s arate similar cu exemplul de mai jos:
Sunday, the Seventh of September, 1981
6. Pentru fiecare angajat afiai numele i calculai numrul de luni ntre data de
astzi i data angajrii. Denumii coloana LUNI_DE_ACTIVITATE. Ordonai
rezultatul dup numrul de luni de lucru. Rotunjii numrul de luni.
7. Scriei o interogare care sa produc urmtorul afiaj pentru fiecare angajat:
<nume angajat> ctig <salariu> lunar dar ar dori <3 * salariu>. Denumii
coloana Salariul de vis.
Exemplu: KING ctiga $5000 lunar dar ar dori $15000.
8. Scriei o interogare care s afieze numele i salariul pentru toi angajaii.
Afiai valoarea salariului pe 15 caractere aliniat la dreapta iar spaiul
rmas la stnga sa fie umplut cu caracterul $. Denumii coloana SALARIU.
9. Scriei o interogare care sa afieze numele angajatului (cu litere mici cu
excepia primei litere care se va scrie cu liter mare) i lungimea numelui.
Interogarea se face doar pentru angajaii a cror nume ncepe cu una din
literele: J, A sau M.
10. Afiai numele, data angajrii i ziua din sptmna n care angajatul a
nceput lucrul. Denumii coloana ZI. Ordonai rezultatul dup cmpurile
coloanei ZI ncepnd cu Monday (Luni).
11.Scriei o interogare care sa afieze numele angajatului i valoarea
comisionului. Dac angajaii nu obin comision, introducei No commission.
Denumii coloana COMM.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-205

Capitolul 8 Afiarea datelor din tabele multiple

Obiective:
Scrierea expresiilor SELECT pentru a accesa date din mai multe
tabele folosind legturi (join-uri) de egalitate i inegalitate;
Vizualizarea datelor care n general nu se acceseaz printr-o
condiie 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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-206
8.1 Definirea JOIN-urilor

n vederea afirii de date ce provin din mai multe tabele ale bazei de
date se folosete o condiie de join. Liniile dintr-un tabel pot fi alturate liniilor
din alt tabel conform cu valorile comune existente n coloanele corespondente,
care sunt de obicei, coloane chei primare i chei strine.
Pentru a afia date din dou sau mai multe tabele aflate n relaie se
scrie o condiie 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 condiia care altura (leag)
tabelele mpreun

Condiia 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.

Observaii:


La scrierea unei expresii SELECT care leag tabele precedai 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 altura n tabele mpreun este nevoie de minim n-1 condiii de
join. Aadar, pentru a altura 4 tabele, sunt necesare 3 condiii 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 condiie join este omis;
- o condiie join este invalid;
- toate liniile din primul tabel sunt alturate la liniile din tabelul al doilea.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-207
Pentru a evita un produs cartezian trebuie s includei ntotdeauna ntr-o
clauza WHERE o condiie de join valid.

Cnd o condiie join este invalid sau este complet omis, rezultatul este
un produs cartezian n care vor fi afiate toate combinaiile de linii, adic toate
liniile din primul tabel sunt alturate la toate liniile din cel de-al doilea tabel.

Un produs cartezian tinde s genereze un numr mare de linii i
rezultatul sau este rar folositor. ntotdeauna ntr-o clauza WHERE trebuie
inclus o condiie de join valid, cu excepia 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 condiie join este omis.
Exemplul alturat afieaz numele angajatului i numele departamentului din
tabelele EMPLOYEES i DEPARTMENTS. Deoarece nu a fost specificat nici o
condiie de join n clauza WHERE, toate liniile din tabelul EMPLOYEES sunt
alturate tuturor liniilor din tabelul DEPARTMENTS, genernd astfel un tabel de
ieire ce are 160 de rnduri.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-208
Tipuri de Join-uri

Join uri specifice Oracle
(8i i versiuni anterioare)
Join-uri conforme cu SQL: 1999
Equijoin Cross Join
Non-equijoin Natural Join
Outer join Using Clause
Self join Full or two-sided outer join
Arbitrary join conditions for outer join

Oracle 9i pune la dispoziie 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 performana 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. Relaia 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
existena cheilor primare i strine.

ECHIJOIN -urile sunt adesea numite i simple join sau inner join.




Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-209
Extragerea nregistrrilor 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, numrul angajatului i numrul departamentului care
sunt coloane in tabelul EMPLOYEES;
- numrul departamentului, numele departamentului i locaia 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 alturate.


Deoarece coloana DEPARTMENTS_ID este comun tabelelor ea trebuie
prefixat cu numele tabelului pentru a evita ambiguitatea.

Condiii de cutare adiionale folosind operatorul AND

n plus fa de condiia de join se pot folosi criterii adiionale pentru clauza
WHERE. De exemplu, pentru a afia marca angajatului Matos, numele, numrul
departamentului i locaia departamentului, este nevoie de o condiie
suplimentar n clauza WHERE.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-210

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

Folosii prefixele tabelelor pentru a califica numele coloanelor ce
sunt comune mai multor tabele;
mbuntii performanta prin folosirea prefixelor de tabele;
Distingei coloanele care au nume identice n tabele diferite prin
folosirea aliasurilor de coloane.

Pentru a evita ambiguitatea trebuie s calificai 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 adugarea 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 interogrilor.

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 puin
folosit.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-211

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 spaiu i apoi de alias. Tabelului EMPLOYEES i-a
fost dat aliasul E, iar tabelului DEPARTMENTS aliasul D.

Observaii:


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 alturate (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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-212

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;

Observaie:

ntotdeauna numrul de condiii de join scrise n clauza WHERE
trebuie sa fie cu unu mai mic dect numrul de tabele scrise n
clauza FROM. De exemplu, dac numrul tabelelor este n,
numrul condiiilor de join din clauza WHERE trebuie sa fie ,n-1.



8.4 Non-echi-join

EMPLOYEES JOB_GRADES
Last_Name Salary Grade Lowest_sal Highest_sal
King 24000 A 1000 2999
Kochhar 17000 B 3000 5999
De Haan 17000 C 6000 9999
Hunold 9000 D 10000 14999
Ernst 8000 E 15000 24999
Mourgos 5800

F 25000 40000

salarul din tabelul EMPLOYEES
este cuprins ntre salarul minim i maxim din
tabelul JOB_GRADES
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-213

Relaia dintre tabelele EMPLOYEES i JOB_GRADE este de tip non-
echijoin, adic nicio coloan din tabelul EMPLOYEES nu corespunde direct
unei coloane din tabelul JOB_GRADE. Relaia 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. Relaia
(legtura) se obine 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 toi angajaii 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 conine 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 conine treptele salariale.
- Toate salariile angajailor sunt ncadrate ntre limitele date de treptele
salariale. Astfel, nici un angajat nu ctiga mai puin dect cea mai mic
valoare din coloana LOWEST_SAL sau mai mult dect cea mai mare
valoare coninut n coloana HIGHEST_SAL.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-214

Observaie: Se pot folosi i ali 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 ambiguiti.
8.5 Outer-join

Nici un angajat in departamentul 190

Returnarea nregistrrilor cu NoDirectMatch (Potrivire Indirect) cu Joinuri
externe.

Dac o linie (nregistrare) nu satisface condiia de join, acea linie nu va
aprea n rezultatul interogrii. De exemplu, n condiia de echijoin a tabelelor
EMPLOYEES i DEPARTMENTS, departamentul OPERATIONS nu va aprea
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;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-215


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 condiia de join a tabelelor;
table2.column(+) este simbolul pentru join extern; poate fi plasat n
oricare parte a condiiei din clauza WHERE, dar nu n ambele
pari deodat. Plasai simbolul join extern dup numele
coloanei din tabelul deficitar n informaii.

Folosii un join extern pentru a vedea liniile care nu ndeplinesc
condiia de join.
Operatorul join extern este semnul plus (+).

Linia (liniile) lips pot fi returnate dac este folosit un join extern n
condiia de join. Operatorul este un semn "plus" scris ntre paranteze (+) care
este plasat lng tabelul ce prezint un deficit de informaie. Acest operator are
efectul crerii 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;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-216

Exemplul afieaz numele angajatului, numrul i numele pentru toate
departamentele. Departamentul Contracting, care nu are nici un angajat este de
asemenea afiat.
Restricii la Join extern

- Operatorul join extern poate s apar numai ntr-o singur parte a
unei expresii i anume n partea deficitar n informaii. El returneaz
acele linii din tabel care nu au corespondent direct n celalalt tabel.

- O condiie implicat ntr-un join extern nu poate folosi operatorul IN
sau nu poate fi legat la o alta condiie prin operatorul OR.

8.6 Self Join

Uneori este necesar alturarea (join) unui tabel cu el nsui. De
exemplu, pentru a gsi numele fiecrui angajat pentru un manager este
necesar un self-join pe tabela EMPLOYEES. De exemplu, pentru a gsi numele
managerului lui Whalen este nevoie s:
o l gsii pe Whalen n tabelul EMPLOYEES uitndu-va n coloana
Last_name;
o Gsii numrul managerului pentru Whalen uitndu-va n coloana
Manager_ID. Numrul managerului lui Whalen este 101.
o Gsii numele managerului cu EMPLOYEE_ID egal cu 101 uitndu-v n
coloana LAST_NAME. Numrul angajatului Kochhar este 101 deci
Kochhar este managerul lui Whalen.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-217

"MGR din tabelul WORKER este egal cu EMPNO din tabelul MANAGER"

n acest proces cutarea n tabel se execut de dou ori. Prima dat se
caut n tabel angajatul Whalen n coloana Last_name i gsete valoarea
pentru Manager_ID care este egal cu 101. A doua oar se caut n coloana
EMPLOYEE_ID pentru a gsi 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 altur tabela EMPLOYEES cu ea nsi. 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 conine join-ul care nseamn "unde
numrul managerului pentru un subaltern este identic cu numrul angajatului
pentru acel manager".

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-218
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 condiia specificat n clauza ON.


Crearea Cross Joins

Folosirea clauzei CROSS JOIN duce la apariia 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 urmtor:


Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-219
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 execuie 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 premergtoare Oracle9i nu se putea face un join fr
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 alturata 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 restricii suplimentare n folosirea
unui natural join. Exemplul de mai jos limiteaz rndurile afiate la cele ce
corespund condiiei 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);
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-220
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 referii coloana, oriunde n instruciunea SQL, nu trebuie s
folosii numele tabelei sau aliasul.
Clauzele NATURAL JOIN i USING sunt mutual exclusive

De exemplu urmtoarea instruciune este valid

SELECT l.city, d.department_name
FROM locations l JOIN departments d USING (location_id)
WHERE location_id = 1400;

Urmtoarea instruciune 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

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-221
Aceeai restricie se aplica i la NATURAL JOIN.
Aadar coloanele ce au acelai nume n ambele tabele trebuie s fie
scrise fr 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 locaia 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

Condiia de join pentru un natural join este de fapt un equijoin al tuturor
coloanelor ce au acelai nume. Pentru a specifica condiii arbitrare sau
coloanele pe care se face join-ul se folosete clauza ON.
Clauza ON separ condiia de join de alte condiii de cutare i face
codul mai uor de neles.

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 altura coloane ce nu au
acelai nume.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-222

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 legtura 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
condiie de join poate referenia coloanele din EMPLOYEES i DEPARTMENTS
dar nu poate referenia coloane din LOCATIONS.
A doua condiie de join poate referenia coloane din toate cele trei tabele
Acest lucru poate fi scris ca un echijoin pe trei tabele.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-223
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);

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-224

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 (+);
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-225
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 corelaie cu datele din tabela EMPLOYEES.

Condiii 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 condiii suplimentare aa cum se arat
n exemplul anterior. Datele rezultate n urma join-ului dintre tabelele
EMPLOYEES i DEPARTMENTS sunt restricionate de condiia impus i
anume valoare coloanei manager_ID din tabela employees sa fie egala cu 149.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-226
8.8 Exerciii


1. Scriei o interogare care sa afieze numele, numrul departamentului i
numele departamentului pentru toi angajaii.

2. Scriei o interogare care s afieze meseriile distincte (jobs) i numele
departamentului pentru toi angajaii din departamentul 30. Includei i
locaia pentru departamentul 90.


3. Scriei o interogare care afieaz numele angajatului, numele
departamentului, locaia i oraul tuturor angajailor care ctiga un
comision.

4. Afiai numele angajatului i numele departamentului pentru toi angajaii
care au un a in numele lor. Salvai tabelul SQL ntr-un fiier numit p4q4.sql.



Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-227

4. Scriei o interogare care afieaz numele, meseria, numrul departamentului
i numele departamentului pentru toi angajaii care lucreaz in Toronto.

5. Afiai numele i marca angajatului mpreuna cu numele i marca
managerului acestuia. Etichetai coloanele Employee, Emp#, Manager,
Mgr#. Salvai interogarea SQL ntr-un fiier numit p4q6.sql.


Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-228
6. Modificai p4q6.sql pentru a afia toi angajaii incluznd pe King care nu are
manager.


7. Creai o interogare care va afia pentru toi angajaii numele angajatului,
numrul departamentului i toi angajaii care lucreaz n acelai
departament (colegii lui). Denumii ultima coloan Coleg. Avei grija ca n
interogare s nu apar un angajat coleg cu el nsui.


8. Afiai structura tabelului JOB_GRADEs. Creai o interogare care va afia
numele, meseria, numele departamentului, salariul i treapta de salarizare
pentru toi angajaii.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-229


9. Creai o interogare care afieaz numele i data angajrii pentru lucrtorii
angajai dup data de angajare a lui Davies.

10. Afiai toate numele angajailor i data angajrii mpreun cu numele
managerilor i data lor de angajare, pentru toi cei care au fost angajai
naintea managerilor lor. Etichetai coloanele Employee, respectiv Emp,
Hiredate, Manager, i Mgr Hiredate.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


8-230


11. Creai o interogare care afieaz numele angajailor i salariile indicate
prin asteriscuri. Fiecare asterisc nseamn 100 $. Sortai datele n
ordinea descendent a salariilor. Etichetai 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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-231
Capitolul 9 Folosirea funciilor de grup

Obiective:
Identificarea funciilor de grup disponibile;
Descrierea folosirii funciilor de grup;
Gruparea datelor folosind clauza Group By;
Includerea sau excluderea liniilor grupate folosind clauza HAVING .
9.1 Ce sunt funciile de GRUP ?

Funciile de grup opereaz pe seturi de linii oferind un singur rezultat
pentru tot grupul.



Spre deosebire de funciile de un singur rnd, funciile de grup opereaz
pe seturi de rnduri pentru a da un singur rezultat unui grup. Aceste seturi pot fi
ntregul tabel sau tabelul mprit la rndul lui n grupuri. Funciile de grup sunt
urmtoarele :
AVG
COUNT
MAX
MIN
STDDEV
SUM
VARIANCE

Fiecare din funcii accept/primete un argument. Urmtorul tabel
identific opiunile pe care le putei folosi n sintax.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-232
Funcie Descriere
AVG([DISTINCT|ALL]n)
Valoarea medie a lui n, ignornd valorile
nule;
COUNT({*|[DISTINCT|ALL]
expr})
Numrul de rnduri, unde expresia
evalueaz altceva dect valori nule.
Numr toate rndurile selectate folosind
*, inclusiv duplicatele i rndurile cu valori
nule;
MAX([DISTINCT|ALL]expr)
Valoarea maximal a expresiei, ignornd
valorile nule;
MIN([DISTINCT|ALL]expr)
Valoarea minim a expresiei, ignornd
valorile nule;
STDDEV([DISTINCT|ALL]x)
Abaterea standard a lui n, ignornd
valorile nule;
SUM([DISTINCT|ALL]n)
Suma valorilor lui n, ignornd valorile
nule;
VARIANCE([DISTINCT|ALL]x)
Variaia lui n, ignornd valorile nule;


Sfaturi pentru folosirea funciilor de grup:
DISTINCT face ca funcia s ia n considerare numai valorile
distincte. ALL ia n consideraie 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 funciile de grup, cu excepia COUNT(*) ignora valorile nule.
Pentru a nlocui o valoare cu valori nule folosii funcia
NVL,NVL2 sau COALESCE..
9.2 Folosirea funciilor AVG, SUM, MIN, MAX

Funciile AVG sau SUM se pot folosi pentru date de tip numeric.
SELECT coloana, funcie_de_grup(coloana)
FROM tabela
[WHERE condiie]
[ORDER BY coloana ];
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-233

SELECT AVG(salary), MAX(salary),
MIN(salary), SUM(salary)
FROM employees
WHERE job_id LIKE '%REP%';

Funciile 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 toi vnztorii.
Funciile MIN i MAX se pot folosi pentru orice tip de date.
SELECT MIN(hire_date), MAX(hire_date)
FROM employees;

Exemplul urmtor afieaz numele pentru primul i ultimul angajat din
lista alfabetic a tuturor angajailor.
SELECT MIN(last_name), MAX(last_name)
FROM employees;



9.3 Folosirea funciei COUNT

COUNT(*) returneaz numrul de linii dintr-o tabel.
SELECT COUNT(*)
FROM employees
WHERE department_id = 50;

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-234
Funcia COUNT are trei formate :
COUNT(*) - ntoarce numrul de rnduri in tabel,
incluznd rndurile duble i rndurile
coninnd valori nule;
COUNT(expr) - ntoarce numrul rndurilor nenule
din coloana identificat prin expr.;
COUNT(DISTINCT expr) - ntoarce numrul rndurilor unice
nenule din coloana identificat prin
expr.

Exemplul de mai jos afieaz numrul angajailor din departamentul 80
care pot sa ctige un comision.
SELECT COUNT(commission_pct)
FROM employees
WHERE department_id = 80;

Exemplu: Afiai numrul departamentelor din tabelul EMPLOYEES.
SELECT COUNT(department_id)
FROM employees;

Afiai numrul departamentelor distincte din tabelul EMPLOYEES.
SELECT COUNT(DISTINCT department_id)
FROM employees;

9.4 Funciile de grup i valorile Null

Funciile de grup ignor valorile null din coloan.
SELECT AVG(commission_pct)
FROM employees;

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-235

Toate funciile grup, cu excepia 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 conine o valoare valid. Media
este calculat ca sum a comisioanelor pltite ctre toi angajaii, mprit la
numrul angajailor care primesc comision.
Funcia NVL foreaz funciile de grup s includ valori nule.
SELECT AVG(NVL(commission_pct, 0))
FROM employees;

Funcia NVL foreaz funciile 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 pltit tuturor angajailor, mprit la numrul total al
angajailor companiei.
9.5 Crearea grupurilor de date

Pn acum toate funciile grup au tratat tabelul ca fiind un larg grup de
informaii. Uneori ns tabelul trebuie mprit n grupuri mai mici de informaii.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-236
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 coloanele ale cror valori
determin bazele pentru gruparea rndurilor.
Clauza GROUP BY se poate folosi pentru a mpri rndurile din tabel n
grupuri, lucru ce permite folosirea funciilor de grup pentru a ntoarce sumarul
informaiei pentru fiecare grup.

Sfaturi
Dac se include o funcie 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 funcii de grup
trebuie s fie menionate n clauza GROUP BY.



SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-237

Exemplul de mai sus afieaz numrul departamentului i media salariilor
pentru fiecare departament. Iat cum este evaluat declaraia SELECT de mai
sus, coninnd o clauz GROUP BY :
Clauza SELECT specific coloanele care s fie afiate, adic numrul
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 numrul departamentului, deci funcia
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
menionat n clauza SELECT. De exemplu, declaraia SELECT de mai sus
afieaz media salariilor pentru fiecare departament fr s afieze numrul
departamentului respectiv. Totui, fr numrul departamentului, rezultatele nu
afieaz datele n mod semnificativ.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-238
Se poate folosi funcia 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
pltite pentru fiecare nume de funcie, din fiecare departament.
Tabelul EMPLOYEES este grupat mai nti dup numrul
departamentului i apoi aceast grupare se detaliaz dup numele funciei. De
exemplu, doi funcionari din departamentul 20 sunt grupai mpreun i se
afieaz un singur rezultat ( salariul total ).

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-239
SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id;




Pentru o obine 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 declaraia SELECT de mai sus,
care conine o clauza GROUP BY :
Clauza SELECT specific coloanele ce trebuie afiate:
- Numrul departamentului din tabelul EMPLOYEES;
- Numele funciei 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 numrul departamentului.
- Apoi, din grupurile formate dup numrul departamentului, se
grupeaz rndurile dup numele funciei. Deci funcia SUM este
aplicat coloanei salariilor pentru toate numele de funcii din
fiecare grup format dup numrul departamentului.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-240
9.7 Interogri ilegale n folosirea funciilor de grup

Orice coloan sau expresie din lista SELECT care nu este o
funcie 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 combinaie de coloane individuale
(department_id) i funcii grup (COUNT(last_name)) n aceeai declaraie
SELECT, trebuie inclus o declaraie (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 adugnd 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
funcie de grup trebuie s fie specificat n clauza GROUP BY.


Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-241
Nu putei folosi clauza WHERE pentru restricionarea
grupurilor.
Folosii clauza HAVING pentru restricionarea grupurilor.
Nu putei folosi funcii 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 restriciona datele ce intra n
componena grupurilor. Declaraia SELECT de mai sus genereaz o eroare
deoarece se folosete clauza WHERE pentru a restriciona 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 restricionarea datelor dup formarea grupurilor.
SELECT department_id, AVG(salary)
FROM employees
HAVING AVG(salary) > 8000
GROUP BY department_id;


Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-242
9.8 Excluderea rezultatelor obinute folosind clauza Group

n acelai mod n care se folosete clauza WHERE pentru restricionarea
rndurile selectate se poate folosi clauza HAVING pentru restricionarea 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 urmtoarele:
1. Gsirea salariul mediu pentru fiecare departament grupnd dup numrul
departamentului.
2. Restricionarea 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 restricionarea datelor grupurilor
presupune ca :
- Rndurile sa fie grupate.
- Clauza GROUP BY sa fie aplicat.
- Grupurile care ndeplinesc condiia 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 restricioneaz grupurile de rnduri raportate
la acele grupuri a cror condiie specificata este TRUE ( adevrat ).
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-243
Clauza HAVING poate fi folosit pentru a specifica care grupuri trebuiesc
afiate. De aceea, mai nti se restricioneaz grupurile pe baza informaiilor
totale i apoi se exclud cele ce nu corespund condiiilor din clauza HAVING.

Serverul Oracle desfoar urmtorii pai la folosirea clauzei
HAVING :

Se grupeaz rndurile;
Funcia 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 funciile 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 numrul departamentului i salariul maxim pentru
acele departamente la care salariul minim este mai mare de 10.000 $.
Se poate folosi clauza GROUP BY fr a se folosi o funcie de grup
n lista SELECT. Dac se restricioneaz rndurile n baza unei funcii
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;
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-244

Exemplul de mai jos afieaz numele funciei i totalul salariului
lunar pentru fiecare nume de funcie, cu un total al statului de plata
depind 13.000 $. Exemplul exclude vnztorii 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;

Funciile 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 obine subtotaluri;
Folosirea operatorului CUBE pentru a obine valori de intersecie;
Folosirea funciei GROUPING pentru identificarea valorilor rndurilor
create de ROLLUP sau CUBE;
Folosirea GROUPING SETS pentru a obine un singur set de date.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-245
Operatorii ROLLUP i CUBE trebuie specificai n cadrul clauzei GROUP
BY. Gruparea cu ROLLUP duce la obinerea unei set de rezultate ce conine 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 combinaiilor posibile ale expresiilor
specificate i returneaz un singur rnd cu informaii totale pentru fiecare grup.
Se poate folosi operatorul CUBE pentru a obine rnduri de tip cross-tabulation.

Observaii:
La folosirea operatorilor ROLLUP i CUBE trebuie s v asigurai c
acele coloane ce sunt dup clauza GROUP BY au sens, ca exist o
relaionare 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 obinerea unor rezultate cumulative cum ar fi subtotalurile.
ROLLUP poate fi folosit n scrierea rapoartelor, graficelor, etc. pentru a
obine elemente de statistic i totaluri din seturile de rezultate.
Operatorul ROLLUP creeaz grupuri prin micarea ntr-o direcie, de la
stnga la dreapta, de-a lungul listei de coloane specificate n clauza GROUP
BY dup care aplic funcia de agregare acestor grupri.

Observaii:
Pentru a produce subtotaluri cu n dimensiuni, unde n este numrul de
coloane specificat n clauza GROUP BY fr a folosi operatorul
ROLLUP, trebuie unite, folosind operatorul UNION ALL n+1 fraze
SELECT. Acest lucru face ca execuia interogrii sa fie ineficient deoarece
fiecare fraza SELECT necesit un acces la tabel.
Operatorul ROLLUP obine aceste rezultate cu un singur acces la tabel, motiv
pentru care folosirea operatorului este foarte eficient atunci cnd sunt
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-246
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 cror 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);
o Salariul total pentru toate departamentele care au ID-ul mai mic
de 60, n funcie 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 desfoar ncepnd de
la nivelul cel mai detaliat pn la un total general, n funcie 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 funcie 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
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-247
n coloane, rezultatul operaiei 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
funciile de grup inclusiv AVG, SUM, MAX, MIN i COUNT. El este folosit
pentru a obine seturi de rezultate care sunt n mod obinuit folosite n
rapoartele de tip cross-tab. Pe cnd ROLLUP duce la obinerea doar a unei
fraciuni din numrul total de combinaii posibile pentru subtotaluri, CUBE
produce subtotaluri pentru toate combinaiile posibile ale gruprii specificate n
clauza GROUP BY precum i un total general.
Operatorul CUBE este folosit mpreun cu o funcie de grup pentru a
general rnduri suplimentare ntr-un set de rezultate. Coloanele incluse n
clauza GROUP BY sunt referite ncruciat n vederea generrii unui superset
de grupuri. Funcia de grup specificat n list este aplicat acelor grupuri
pentru a produce valori de total pentru rnduri suplimentare
supratotalizatoare. Numrul grupurilor suplimentare din setul de rezultate este
dat de numrul de coloane incluse n clauza GROUP BY.

De fapt, orice combinaie posibil a coloanelor sau expresiilor menionate
n clauza GROUP BY este folosit pentru a produce supratotaluri. Dac n
clauza GROUP BY sunt n coloane sau expresii, vor fi 2n combinaii de
supratotaluri posibile. Matematic, aceste combinaii formeaz un cub n-
dimensional, motiv pentru care operatorul este numit astfel.
Prin folosirea aplicaiilor sau elementelor de programare, aceste valori
supratotalizatoare pot fi ncrcate n grafice care convertesc datele n elemente
vizuale.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-248

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 interogrii se interpreteaz astfel:
Salariul total pentru fiecare funcie 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 funcie indiferent de departament (eticheta 3);
Salariul total pentru acele departamente ce au ID-ul mai mic de 50, indiferent
de funcie (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 conin valori ncruciate.

Operatorul CUBE a efectuat i operaia pe care un operator de tip
ROLLUP ar fi executat-o pentru a afia subtotalurile i salariul total pentru acele
departamente a cror ID este mai mic, indiferent de valoarea din coloana
JOB_ID. Suplimentar operatorul CUBE afieaz salariul total pentru fiecare
funcie, indiferent de departament.

Not:
Similar cu operatorul ROLLUP, ce genereaz subtotaluri pe n
dimensiuni (unde n este numrul de coloane din clauza GROUP BY),
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-249
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 2
3
= 8
fraze SELECT care s fie unite cu UNION ALL.

9.13 Funcia GROUPING

Funcia GROUPING poate fi folosit mpreun cu operatorul CUBE sau
ROLLUP. Prin folosirea ei se pot crea grupuri care s formeze subtotaluri ntr-
un rnd i se pot deosebi valorile de NULL stocate de valorile de NULL create
de ROLLUP sau CUBE. Funcia 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];

Funcia GROUPING poate fi folosit mpreun cu operatorul CUBE sau
ROLLUP pentru a ajuta la nelegerea modalitii de obinere a valorilor de total.
Funcia GROUPING folosete o singur coloan drept argument.
Valoarea pentru expr din sintaxa trebuie s se potriveasc cu una din expresiile
scrise clauza GROUP BY. Funcia ntoarce valoarea 0 sau 1.

Valorile ntoarse de funcia 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 funcii de grup asupra acelei expresii ).

Valoare 0 returnat de funcia GROUPING bazat pe o expresie indic
urmtoarele:
Expresia a intrat n calcul unei valori totale.
Valoarea NULL din expresia coloanei este o valoare stocat de
NULL.

Valoare 1 returnat de funcia GROUPING bazat pe o expresie indic
urmtoarele:
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 gruprii.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-250

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
consideraie 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 discuie 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.
Observai valoare 23400 din ultimul rnd ce reprezint salariul total
pentru toate funciile i pentru acele departamente a cror numr 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 grupri multiple a datelor favoriznd astfel o sumare
eficient i astfel facilitnd analiza datelor la folosirea mai multe dimensiuni.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-251
Serverul Oracle calculeaz toate gruprile specificate n clauza
GROUPING SETS i combin rezultatele grupurilor individuale cu o operaie de
tip UNION ALL.

Eficiena Grouping set este datorat :
o este necesar doar o singur citire a datelor din tabelul de baza;
o nu este necesar scrierea unei expresii complexe de tip UNION ;
o cu ct sunt mai multe elemente n GROUPING SETS cu att crete
beneficiul performanei dat de instruciune .

Pentru a specifica diverse tipuri de grupri (care pot include operatori de
tip ROLLUP sau CUBE) este necesar doar o singur instruciune 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));

Instruciunea calculeaz suma pentru urmtoarele grupuri : (department_id,
job_id, manager_id), (department_id, manager_id) i (job_id, manager_id).

n lipsa acestei facilitai oferite de Oracle9i ar fi trebuit scrise mai multe
instruciuni SELECT combinate cu operatorul UNION ALL O abordare care
folosete multe interogri este ineficient deoarece necesit multiple citiri ale
datelor. Comparai instruciunea precedent cu alternativa :

SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY CUBE(department_id, job_id, manager_id);

Instruciunea 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.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-252
O alt alternativ este instruciunea urmtoare:

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 instruciune necesit trei citiri ale tabelei de baz i este deci
ineficient. CUBE i ROLLUP pot fi gndii ca grouping sets cu o semantic
specific (echivalena 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));
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-253

Interogarea din exemplu calculeaz suma pentru dou grupuri. Tabelul
este mprit n urmtoarele 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 toi angajaii ce au job_ID=AD_ASST din
departamentul 10 este 4400.
Media salariilor pentru toi angajaii ce au job_ID=MK_MAN din
departamentul 20 este 13000.
Media salariilor pentru toi angajaii ce au job_ID= MK_REP din
departamentul 20 este 6000.
Media salariilor pentru toi angajaii 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 toi angajaii ce au job_ID=MK_MAN, ca au ca
sef persoana cu manager_ID=100 este 13000.
Media salariilor pentru toi angajaii 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 interogrii
pentru a genera un plan de execuie, interogarea de mai sus necesit scanarea
dubl a tabelei EMPLOYEES, lucru ce este foarte ineficient, motiv pentru care
se recomand folosirea instruciunii GROUPING SETS.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-254
9.15 Composite Columns

O coloan compus este o colecie de coloane care sunt tratate unitar n
momentul efecturii calculelor pentru grupuri.
Pentru a specifica o coloana compus n clauza GROUP BY trebuie s
scriei 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
instruciunilor ROLLUP, CUBE sau GROUPING SETS. Dac folosii coloane
compuse pentru instruciunile ROLLUP sau CUBE nseamn ca dorii sa trecei
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 ai 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 instruciunea
SELECT cu valori de null pentru a i b i doar o funcie de grup. Se
folosete in special pentru calcularea unui total general.

SELECT NULL, NULL, aggregate_col
FROM <table_name>
GROUP BY ( );

Comparai 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 ().

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-255
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 urmtor ilustreaz diferena dintre folosirea coloanelor compuse i
specificaiile pentru GROUP BY .

EXEMPLU:

SELECT department_id, job_id, manager_id, SUM(salary)
FROM employees
GROUP BY ROLLUP( department_id,(job_id, manager_id));

Considerm 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 ctre serverul Oracle Server a
valorilor pentru urmtoarelor grupuri :
1. (department_id, job_id, manager_id);
2. (department_id, job_id);
3. (department_id);
4. ( ).
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-256
Daca suntei interesai n gruparea dup liniile (1), (3) i (4) din exemplul
de mai sus, nu putei limita calculul acestor grupuri fr 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 execuia instruciunilor 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 urmtoarele :
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
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-257
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 execuie a interogrii, interogarea de mai sus necesita trei
scanri ale tabelei de baza, EMPLOYEES, lucru ce este ineficient. De aceea se
recomand folosirea coloanelor compuse.
9.16 Concatenated Groupings
Gruprile concatenate ofer o soluie concis de a genera combinaii utile
de grupuri.
Pentru a specifica seturi de grupri concatenate trebuie sa separai
setrile de grupuri multiple i operaiile de tip ROLLUP i CUBE prin virgule
astfel nct serverul Oracle s le combine ntr-o singura clauza GROUP BY.
Rezultatul este intersecia valorilor grupurilor din fiecare set de grupri.
EXEMPLU
GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)
Exemplul precedent definete urmtoarele grupuri: (a, c), (a, d), (b,
c), (b, d)
Concatenarea seturilor de grupri este foarte folositoare deoarece :
uureaz scrierea instruciunii: nu trebuie s enumerai, prin scriere manual,
toate grupurile ;
folosirea aplicaiei: SQL-ul general de aplicaii 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);


Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-258
Din exemplul de mai sus rezult formarea urmtoarelor 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 urmtoarele :
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 nelegere mai uoar, detaliile pentru departamentul 10 sunt
evideniate n figura de mai sus.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-259
9.17 Exerciii


1. Funciile de grup acioneaz asupra mai multor rnduri i produc un
rezultat. (adevrat/fals).
2. Funciile de grup includ valoarea null n calcule (adevrat/fals).
3. Clauza WHERE restricioneaz rndurile anterior includerii acestora n
grupurile de calcul (adevrat/fals).
4. Afiai cel mai mare salar, cel mai mic salar, suma i media salariului pentru
toi angajaii. Etichetai coloanele cu Maxim, Minim, Suma i Media.
Rotunjii rezultatele (fr zecimale). Salvai instruciunea in fiierul p4.sql.

5. Modificai p4.sql astfel nct s afieze aceleai informaii pentru fiecare tip
de meserie. Salvai modificrile in p5.sql.


Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-260
6. Scriei o interogare pentru afiarea numrului de angajai cu aceeai
meserie.

7. Determinai numrul managerilor fr s-i listai (doar numrul lor).
Etichetai coloana Nr. Manageri.(Folosii coloana Manager_ID).

8. Scriei o interogare care s afieze diferena dintre salariile cele mai mari i
cele mai mici. Etichetai coloana Diferena.

9. Afiai numrul managerului i salariul celui mai prost pltit angajat pentru
acel manager. Excludei pe cei care nu au manager. Excludei grupurile
care au salariul minim mai mic dect 1600$. Sortai rezultatele in ordine
descresctoare dup salar.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-261
10. Scriei o interogare care s afieze numele departamentului, localitatea,
numrul de angajai i salariul mediu al angajailor din acel departament.
Etichetai coloanele Dname, Loc, No of People i Salary. Vezi exemplul.

11. Scriei o interogare care afieaz numrul total de angajai i numrul total
de angajai care au fost angajai n anii 1995,1996,1997 i 1998. Etichetai
coloanele corespunztor. Vezi exemplul.

12. Afiai meseria, suma salariilor pentru meseria respectiv din cadrul
departamentelor 20, 50, 80, 90 precum i salariul total pentru acea meserie
pentru toate departamentele. Etichetai coloanele corespunztor. Vezi
exemplul.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-262
13. Scriei o interogare care sa afieze urmtoarele informaii pentru acei
angajai a cror manager_ID este mai mic de 120:
- Manager_ID;
- Job_ID i salariul total pentru fiecare job_ID pentru angajaii care au
acelai sef;
- Salariul total pe care efii trebuie sa-l plteasc angajailor ;
- Salariul total pe care efii trebuie sa-l plteasc angajailor, indiferent
de job_ID.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-263
14. Observai rezultatele de la punctul 13. Scriei o interogare folosind funcii de
grupare pentru a determina dac valorile de NULL din coloanele
corespunztoare expresiilor GROUP BY sunt cauzate de operaia ROLLUP.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


9-264
15. Scriei o interogare care s afieze urmtoarele informaii despre angajaii a
cror manager_ID este mai mic de 120 :
- Manager_ID;
- Funcia i salariul total pentru fiecare funcie pentru angajaii care au
acelai sef;
- Salariul total al angajailor ce au acelai sef ;
- Salariul total pe fiecare funcie, indiferent de sef;
- Salariul total indiferent de funcii.

16. Observai rezultatele interogrii de la punctul 15. Scriei o interogare care
s foloseasc funciile de grupare pentru a determina dac valorile de
NULL din coloanele corespunztoare clauzei GROUP BY sunt date de
operatorul CUBE.


17. Scriei o interogare, folosind GROUPING SETS, pentru a afia urmtoarele
grupuri:
- department_id, manager_id, job_id;
- department_id, job_id;
- manager_id, job_id.

Interogarea trebuie s calculeze suma salariilor pentru fiecare dintre aceste
grupuri.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-265

Capitolul 10 Subinterogari

Obiective:
Descrierea tipurilor de probleme pe care le pot rezolva subinterogarile;
Definirea subinterogarilor;
Enumerarea tipurilor de subinterogri;
Scrierea subinterogarilor de un singur rnd i a celor de mai multe
rnduri.
n acest capitol se vor studia caracteristici mai avansate ale instruciunii
SELECT cum ar fi scrierea subinterogarilor n clauza WHERE a altei instruciuni
SQL n scopul obinerii de valori bazate pe o valoare necunoscut a unei
condiii.


10.1 Folosirea unei subinterogri pentru a rezolva o problema

S presupunem c se dorete scrierea unei interogri pentru a afla cine
ctig un salariu mai mare dect salariul lui Jones.
Pentru rezolvarea acestei probleme este nevoie de dou interogri: 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 interogri, integrnd
una din cereri n cealalt.
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 ?

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-266
O cerere inclus sau o subinterogare returneaz o valoare care va fi
folosit de ctre interogarea exterioar sau principal. Folosirea unei
subinterogri este echivalent executrii a dou cereri secveniale i folosirii
rezultatului primei cereri ca valoare de cutare 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
interogrii principale.
Rezultatul subinterogrii este utilizat de ctre cererea principal
(cererea extern).

O subinterogare reprezint o instruciune SELECT care este inclus ntr-
o clauz aparinnd altei instruciuni SELECT.
Prin utilizarea subinterogarilor se pot construi instruciuni mai puternice pornind
de la instruciuni simple. Acestea pot fi foarte folositoare n cazurile n care se
dorete selectarea unor rnduri dintr-un tabel folosind o condiie care depinde
de datele din tabelul propriu-zis.

Subinterogarile pot fi plasate in urmtoarele clauze SQL:
WHERE
HAVING
FROM

n sintaxa mai sus prezentat expr operator implic unul din urmtorii
operatori de comparaie: >, = sau IN.

Operatorii de comparare se mpart n dou clase:
operatori pentru subinterogri de un singur rnd: >=, <, <>, <=
operatori pentru subinterogri de mai multe rnduri: IN, ANY, ALL.

Subinterogarea este deseori referit ca fiind o instruciune SELECT
inclus, sub-SELECT sau instruciune SELECT intern. n general,
subinterogarea se execut prima, iar rezultatul este folosit pentru a finaliza
condiia de cerere pentru interogarea principal sau extern.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-267
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 toi angajaii care au salariul mai mare dect aceast sum.

Reguli n utilzarea subinterogrilor


O subinterogare trebuie s fie inclus ntre paranteze.
O subinterogare trebuie s apar n partea dreapta a unui operator
de comparare.
Subinterogarile nu pot conine clauza ORDER BY. Pentru o
instruciune SELECT poate exista doar o singur clauz ORDER
BY, iar dac aceast clauza este specificat, ea trebuie sa fie
ultima clauz din instruciunea SELECT principal.

Subinterogrile folosesc dou clase de operatori de comparare: operatori
single-row i operatori multiple-row.
10.2 Tipuri de subinterogri

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-268
Single-row : cereri care returneaz doar un rnd din instruciunea SELECT
intern;
Multiple-row : cereri care returneaz mai mult de un rnd din instruciunea
SELECT intern.

10.3 Subinterogari single-row

O subinterogare single-row este acea subinterogare care returneaz un
singur rnd din instruciunea 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 angajailor care lucreaz pe acelai post (au aceeai meserie) ca
i angajatul care are numrul de marc 141.

Executarea unei subinterogri single-row:


Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-269
O instruciune SELECT poate fi considerat ca un bloc de cereri.
Exemplul de mai sus afieaz angajaii a cror funcie este aceeai cu cea a
angajatului cu numrul 141 i a cror 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: FUNCIONAR (ST_CLERK), respectiv 2600. Apoi este procesat
blocul de cereri exterior care folosete valorile returnate de ctre cererile interne
pentru a finaliza propriile condiii de cutare.
Ambele cereri interne returneaz valori singulare (FUNCTIONAR i
2600), astfel ca aceast instruciune SQL este denumit subinterogare single-
row.

Interogrile exterioare i incluse pot prelua datele din tabele diferite.


10.4 Utilizarea funciilor 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 funcii 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, funcia i salariul tuturor
angajailor al cror salariu este egal cu salariul minim. Funcia MIN (funcie de
grup) returneaz o singur valoare (i anume 2500), care este folosit de ctre
interogarea principal.

Clauza HAVING n subinterogare

Server-ul Oracle execut mai nti subinterogarile. Server-ul Oracle
returneaz rezultatele ctre clauza HAVING a interogrii principale.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-270
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 ctre
clauza HAVING a subinterogrii principale.
Instruciunea SQL prezentat n figura de mai sus are ca scop final
afiarea tuturor departamentelor la nivelul crora salariul minim are o valoare
mai mare dect valoarea salariului minim din cadrul departamentului 50.

Exemplu: Se cere s se gseasc funcia avnd cel mai sczut
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 subinterogrilor

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-271
O eroare obinuit la folosirea subinterogrilor o reprezint returnarea a
mai mult de un rnd de ctre o subinterogare dorit a fi de tip single-row.
n instruciunea SQL din exemplul anterior, subinterogarea conine o
clauz GROUP BY dup numrul departamentului (department_ID), care
implic selectarea mai multor rnduri, cte unul pentru fiecare grup gsit. n
acest caz, rezultatul subinterogrii va fi: 4400, 6000, 2500, 4200, 7000, 17000
i 8300.
Interogarea extern preia rezultatele subinterogrii i le folosete n
clauza WHERE. Clauza WHERE conine 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 subinterogri o constituie posibilitatea
neselectrii nici unui rnd de ctre interogarea inclus.
n ceea ce privete instruciunea SQL de mai sus, subinterogarea conine
o clauz WHERE (ename = Haas). Se presupune c intenia este de a selecta
angajatul cu numele Haas. Instruciunea pare a fi corect, dar la execuie 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 subinterogrii (null, n acest caz) i
folosete acest rezultat n propria-i clauza WHERE. Interogarea extern nu
gsete nici un angajat avnd cmpul referitor la funcie de valoare nul i
astfel nu returneaz nici un rnd.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-272
10.6 Subinterogari multiple-row

Selecteaz mai mult de un rnd
Folosesc operatori multiple-row de comparare

Operator Semnificaie
IN Egal cu oricare din elementele listei
ANY
Compar valoarea cu fiecare valoare returnat de
subinterogare luat separat
ALL
Compar valoarea cu toate valorile returnate de
subinterogare

Subinterogrile care returneaz mai mult de un rnd se numesc
subinterogri multiple-row. n cazul subinterogrilor 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 angajaii care ctig un salariu egal cu salariul
minim la nivel de departament.
Interogarea intern va fi prima executat producnd un rspuns. Blocul
cererii externe este apoi procesat i se folosesc valorile returnate de ctre
interogarea inclus pentru finalizarea propriei condiii de cutare. 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);
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-273
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 angajaii ale cror salarii sunt mai
mici dect al oricrui programator (IT_PROG) dar care nu sunt programatori.
Salariul maxim pe care l ctig un programator este $9000. Instruciunea SQL
afieaz toi angajaii care nu sunt programatori dar ctig mai puin de $9000.

< ANY nseamn mai mic dect maxim.
> ANY nseamn mai mare dect minim.
= ANY este echivalent cu operatorul IN.

10.8 Utilizarea operatorului ALL n subinterogrile multiple-row

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-274
Operatorul ALL compar o valoare cu toate valorile returnate de o
subinterogare. Exemplul de mai sus afieaz toi angajaii ale cror salarii sunt
mai mici dect al oricrui 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 cror salarii sunt mai mici dect $4200.

> ALL nseamn mai mare dect maxim
< ALL nseamn mai mic dect minim


Operatorul NOT poate fi folosit mpreun cu operatorii IN, ANY i ALL.

10.9 Returnarea valorilor nule n rezultatul subinterogrii

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 toi angajaii 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 condiii care compar rezultatul unei valori
cu null transform rezultatul n null. Cnd exist valori de null n rezultatul
subinterogrii, nu folosii operatorul NOT IN.
Operatorul NOT IN este echivalent cu <>ALL. Trebuie s avei n vedere
c valorile nulle ale rezultatului subinterogrii nu vor constitui o problem dac
folosii operatorul IN. Operatorul IN este echivalent cu operatorul ANY. De
exemplu, pentru afiarea angajailor care nu au subordonai, folosii urmtoarea
exprimare SQL:

SELECT last_name FROM employees
WHERE employee_id NOT IN
(SELECT manager_id FROM employees
WHERE manager_id IS NOT NULL);

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-275
10.10 Subinterogari de coloane multiple

Pn acum am scris subinterogri ce returnau una sau mai multe linii dar
care comparau valorile pentru o singur coloan n clauza WHERE sau
HAVING a instruciunii SELECT.
Dac se dorete compararea uneia sau a mai multor coloane, la scrierea
condiiilor pentru clauza WHERE trebuie folosii operatorii logici.
Folosirea subinterogrilor de coloane multiple ofer posibilitatea mbinrii
condiiilor din dou clauze WHERE n una singur.

SELECT column, column,...
FROM table
WHERE (column, column,...) IN
(SELECT column, column,...
FROM table
WHERE condition);

Afiai numele, numrul departamentului, salariul i comisionul
oricrui angajat a crui salariu i comision se potrivesc cu salariul i
comisionul oricrui 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
fcut n dou moduri: pereche sau nepereche.
n exemplul urmtor, clauza WHERE conine o comparaie 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 numrul 178 sau 174.
n cazul unei comparaii nepereche, fiecare valoare a coloanelor din
clauza WHERE a interogrii 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 condiiile multiple din interogarea
principal. Un exemplu de comparaie nepereche este dat mai jos.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-276
Comparaie 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);


Comparaie 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 subinterogri n clauza FROM

Se poate folosi o subinterogare i n clauza FROM a instruciunii
SELECT.
Exemplul urmtor afieaz numele angajailor, salariul, numrul
departamentului i media salariilor pentru toi angajaii care ctig mai mult
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-277
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 subinterogri

O expresie scalar returnat de o subinterogare este o subinterogare
care returneaz valoarea exact a unei coloane aferent unui singur rnd.
n Oracle8i subinterogrile scalare erau suportate doar n cteva cazuri
similare cum ar fi:
instruciunea SELECT ( clauza FROM, WHERE);
listele de valori din instruciunea INSERT .
n Oracle9i, subinterogrile scalare pot fi folosite n :
Condiii i expresii ce fac parte din instruciuni ca DECODE i CASE;
Toate clauzele SELECT cu excepia GROUP BY;
n partea stng a unui operator n clauza SET i WHERE a unei
instruciuni UPDATE.

Subinterogrile de mai multe coloane scrise pentru a compara dou sau
mai multe coloane, n scrierea crora se folosesc la clauza WHERE condiii
compuse i operatori logici, nu sunt calificate ca subinterogri scalare.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-278
Valoarea expresiilor scalare ale subinterogrii 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 subinterogri nu sunt valide n urmtoarele cazuri:
ca valori implicite pentru coloane i expresii pentru clustere;
n clauza RETURNING a unei instruciuni DML ;
ca baz a unei funcii de baz pentru index;
n clauza GROUP BY, constrngeri CHECK, condiii pentru WHEN;
clauza HAVING;
in clauzele START WITH i CONNECT BY;
n instruciuni care nu sunt n legtur cu interogri, cum ar fi CREATE
PROFILE.

Exemplu



Primul exemplu de mai sus demonstreaz faptul c subinterogrile
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
subinterogrii pentru a afia employee ID, last name, i valoarea Canada sau
USA, n funcie de numrul departamentului, dac acesta este sau nu 20.
Rezultatul exemplului este urmtorul :
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-279


Cel de al doilea exemplu ordoneaz rezultatele n funcie de
DEPARTMENT_NAME prin potrivirea valorilor pentru DEPARTMENT_ID din
tabela EMPLOYEES cu valorile pentru DEPARTMENT_ID din tabela
DEPARTMENTS. Aceast comparare este fcut prin folosirea subinterogrii
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

Subinterogrile corelate sunt folosite pentru procesare rnd cu rnd.
Fiecare subinterogare este executat odat pentru fiecare rnd al interogrii
principale.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-280


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 instruciune
SELECT, UPDATE sau DELETE.

Subinterogri imbricate versus subinterogri 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 subinterogrii imbricate

Se execut mai nti subinterogarea i este returnat o valoare;
Se execut odat interogarea principal folosind valoarea dat
de subinterogare.

Executarea subinterogrii corelate

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.
Extrage rndul candidat din interogarea principal
Execut subinterogarea folosind valoarea din rndul candidat
Folosete valoarea subinterogrii pentru califica sau descalifica
rndul candidat
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-281
SELECT column1, column2,...
FROM table1
WHERE column1 operator
(SELECT colum1, column2
FROM table2
WHERE expr1 = outer.expr2);

Operatorii ANY i ALL pot fi folosii n subinterogri corelate.



Exemplu: Gsii toi angajaii 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 fiecrui 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 fr acest alias interogarea nu ar funciona corect, deoarece
subinterogarea nu ar putea s fac diferena dintre coloana din interogarea
principal i cea din subinterogare.

Exemplu: Afiai datele angajailor care i-au schimbat funcia de
cel puin 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);



Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-282
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 condiia dat de valoarea rndului candidat din
interogarea principal (n exemplu, funcia de grup COUNT(*) este evaluat
pe baza valorii coloanei E.EMPLOYEE_ID obinut la punctul 2).
Evalueaz clauza WHERE a interogrii principale pe baza rezultatului dat
de subinterogare obinut n pasul 3. Acest lucru determin dac rndul
candidat va fi selectat pentru afiare sau nu. (n exemplu, numrul de
schimbri ale funciei pentru un salariat, evaluat de subinterogare este
comparat cu acel 2 din clauza WHERE a interogrii principale. Dac
condiia este ndeplinit de acel angajat, rndul respectiv, este afiat.)
Procedura se repet pentru urmtoarele rnduri candidate pn la finalul
tabelei.

10.15 Folosirea operatorului EXISTS

Operatorul EXISTS verific existena unei valori n setul de rezultate al
unei subinterogri.

Dac subinterogarea ntoarce un rnd atunci:
Condiia de cutare nu mai continu n interogarea principal;
Condiia este marcat ca fiind TRUE.

Dac subinterogarea nu ntoarce niciun rnd atunci:

Condiia este marcat ca fiind FALSE;
Condiia de cutare continu n interogarea principal.

n instruciunile SELECT imbricate sunt acceptai toi operatorii logici.
Suplimentar se poate folosi operatorul EXISTS. Acest operator este folosit n
mod frecvent n subinterogrile 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 puin un rnd, operatorul ntoarce
valoarea TRUE. Dac valoarea nu exist, ntoarce FALSE. n acest sens
operatorul NOT EXISTS testeaz dac o valoare gsit de interogarea
principal este sau nu parte a setului de rezultate dat de subinterogare.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-283

Exemplu: Gsii angajatul care are cel puin 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 regsirea datelor n
subinterogare nu continu atunci cnd s-a gsit cel puin un rnd care s
satisfac condiia: 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
performanei este mai rapid selectarea unei constante.
Avnd coloana EMPLOYEE_ID n clauza SELECT a subinterogrii ar
trebui parcurs tabela pentru aceast coloan. Prin nlocuirea ei cu
constanta X, sau oricare alta, performanele se mbuntesc, 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);

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-284
10.16 Folosirea operatorului NOT EXISTS

Exemplu : Afiai toate departamentele ce nu au angajai.

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 construcie de tip NOT IN drept alternativ pentru
operatorul NOT EXISTS, aa cum arat exemplul de mai jos.

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 condiia din clauza WHERE.

10.17 Clauza WITH

Folosind clauza WITH putei 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 instruciune
SELECT atunci cnd apare de mai multe ori ntr-o interogare complex. n mod
particular acest lucru este folositor atunci cnd exist multe referine la acelai
bloc i sunt multe join-uri i calcule.
Folosind clauza WITH, putei refolosi aceeai interogare atunci cnd
costul evalurii blocului interogrii este mare i apare de mai multe ori ntr-o
interogare complex. Folosind clauza WITH serverul Oracle regsete
rezultatele unui bloc i le stocheaz n spaiul de memorie temporar. Acest
lucru duce la creterea performanelor, beneficiile fiind:
interogarea devine uor de citit;
clauza este evaluat o singur dat chiar dac apare de mai
multe ori n interogare.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-285

Exemplu: scriei 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 funcie de costurile
sau beneficiile de moment ale stocrii temporare a datelor la folosirea acestei
clauze.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-286
Not:
Subinterogarea din clauza FROM a unei instruciuni SELECT se
numete i in-line view. Clauza WITH se folosete numai la
instruciuni SELECT.
Numele interogrii este vizibil tuturor elementelor WITH ale blocurilor
subinterogrilor (inclusiv subinterogrilor acestora) definite dup acestea i
blocului principal n sine (incluznd subinterogrile).
Atunci cnd numele interogrii 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 interogri ierarhice putei regsi date bazndu-v pe o relaie
ierarhic natural, creat ntre rndurile dintr-un tabel.
O baz de date relaional nu stocheaz nregistrrile n mod ierarhic.
Dealtfel, acolo unde exist o relaie ierarhic ntre rndurile dintr-un singur
tabel, putei construi o ierarhie folosind procesul numit parcurgerea arborelui.
O interogare ierarhic este o metod de afiare a ramurilor unui arbore n
ordine.
Imaginai-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 relaie ntre
rndurile tabelului. De exemplu, putei observa n tabelul Employees c cei ce
au job_ID-urile egale cu AD_VP, ST_MAN, SA_MAN i MK_MAN sunt direct
subordonai preedintelui companiei. tim acest lucru deoarece coloana
MANAGER_ID pentru aceste nregistrri are valoarea 100, care este de fapt
valoarea coloanei employee_ID pentru preedintele companiei (AD_PRES).
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-287
Not: interogrile ierarhice pot fi folosite n diverse cazuri cum ar fi:
genealogia uman (arborele genealogic al unei familii),
managementul companiilor (managementul ierarhic), producie
(asamblarea componentelor ntr-un produs finit), cercetarea evoluiei
(dezvoltarea speciilor) i cercetare tiinific.
Structura natural a arborelui











Tabelul EMPLOYEES are o structur arborescent construit n funcie
de subordonarea angajailor fa de efii lor. Ierarhia poate fi creat prin
cercetarea valorilor echivalente din coloanele EMPLOYEE_ID i
MANAGER_ID. Aceast relaie poate fi folosit folosind un self-join pe acest
tabel. Coloana MANAGER_ID conine numrul de marc al efului respectivului
angajat. Relaia printe-copil a unei structuri ierarhice v permite s controlai:
Direcia 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
angajailor din tabelul EMPLOYEES.


Interogri 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
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-288
Interogrile ierarhice pot fi identificate prin prezena clauzelor CONNECT BY i
START WITH.

n sintax:
SELECT este o instruciune SELECT standard.
LEVEL pentru fiecare rnd returnat de o interogare ierarhic,
pseudocoloana LEVEL ntoarce 1 pentru un rnd
rdcin, 2 pentru un copil al unei rdcini, etc.
FROM table specific tabelul sau vederea ce conine coloanele.
Acestea pot fi selectate doar dintr-un singur tabel.
WHERE restricioneaz rndurile date de interogare fr a afecta
alte rnduri ale ierarhiei.
Condition este compararea cu o expresie.
START WITH specific rndurile rdcin ale arborelui, adic punctul
de plecare. Aceast clauz este obligatorie pentru o
interogare ierarhic adevrat.
CONNECT BY specific coloanele care conin elementele ce definesc
PRIOR rows relaia dintre printe i copil. Aceast clauz este
obligatorie pentru o interogare ierarhic.
Instruciunea SELECT nu poate conine un join sau o interogare bazat pe un
view care conine un join.
10.19 Parcurgerea arborelui punctul de start

Se specific condiiile ce trebuiesc ndeplinite;
Se poate folosi n conjuncie cu orice alt condiie valid.

START WITH column1 = value
De exemplu, pentru tabela EMPLOYEES, s se parcurg arborele
ncepnd cu angajatul al crui 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 conjuncie cu orice alt clauz valid.
Exemple:
Folosind tabela EMPLOYEES, ncepei cu King care este
preedintele companiei.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-289
... START WITH manager_id IS NULL

Folosind tabela EMPLOYEES, ncepei cu angajatul Kochhar.
Condiia pus n clauza START WITH poate conine 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 condiia 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


Direcia de parcurgere arborelui

De sus n jos Column1 = Cheia printe Column2 = Cheia copil
De jos n sus Column1 = Cheia copil Column2 = Cheia printe
Direcia de parcurgere a arborelui, fie c este de la printe la copil sau de
la copil la printe, este determinat de modul de scriere al coloanelor n clauza
CONNECT BY PRIOR. Operatorul PRIOR se refer la rndul printe. Pentru a
determina un copil pentru un rnd printe, serverul Oracle evalueaz expresia
PRIOR pentru rndul printe i cealalt expresie pentru fiecare rnd din tabel.
Rndurile pentru care condiia este ndeplinit sunt copii pentru printe.
Serverul Oracle selecteaz ntotdeauna copii prin evaluarea condiiei
CONNECT BY din punctul de vedere al ndeplinirii cerinei legate de rndul
printe.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-290
Exemplu: definii o relaie ierarhic parcurgnd tabelul
EMPLOYEES de sus n jos, astfel nct valoarea pentru
EMPLOYEE_ID din rndul printe 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 condiia 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

Atenie : Clauza CONNECT BY nu poate conine 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 crui ID este 101.

n urmtorul exemplu, valorile pentru EMPLOYEE_ID sunt evaluate
pentru rndul printe 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
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-291
printe 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


Putei 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
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-292
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 printe 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 rdcin. Un
nod printe este un nod care are copii. Un nod frunz este orice nod
care nu are copiii. Numrule nivelelor ce este returnat de o interogare
ierarhic poate fi limitat de memoria disponibil. n exemplu, King este rdcina
sau nodul printe (LEVEL = 1). Kochhar, De Hann, Mourgos, Zlotkey, Hartstein,
Higgens i Hunold sunt copii i deasemeni prini (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 rdcin;
Copil al unui nod rdcin;
Copil al unui copil , etc.

Formatarea rapoartelor ierarhice folosind LEVEL i LPAD

Creai un raport care s afieze nivelele de management ale
companiei ncepnd de la nivelul cel mai nalt i identificai 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 numr de nivel folosind funcia
LPAD mpreun cu pseudocoloana LEVEL pentru a afia un raport ierarhic sub
forma unui arbore identat.

n exemplul de mai sus :
LPAD(char1,n [,char2]) ntoarce char1, aliniat la stnga pe lungime de n
caractere folosind secvena 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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-293
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 = 2-
2 = 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.






Tierea ramurilor

Folosii clauza WHERE Folosii clauza CONNECT BY
pentru a elimina un nod. pentru a elimina o ramur.

WHERE last_name != 'Higgins' CONNECT BY PRIOR
employee_id = manager_id
AND last_name != Higgins'








Putei folosi clauzele WHERE i CONNECT BY pentru a tia arborele;
acesta nseamn c putei controla care noduri i rnduri vor fi afiate.
Predicatul pe care l folosii acioneaz ca o condiie Boolean.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-294
Exemplu: Pornind de la rdcin, parcurgei arborele de sus n jos i
eliminai 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 rdcin, parcurgei arborele de sus n jos i eliminai
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';


Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-295
10.20 Exerciii


1. Scriei o interogare care s afieze numele angajatului i data angajrii
pentru toi angajaii din acelai departament ca Zlotkey, excluznd-ul pe
Zlotkey.


2. Scriei o interogare pentru a afia numrul angajatului i numele su pentru
toi angajaii care ctig mai mult dect salariul mediu. Sortai rezultatele
n ordinea descresctoare a salariului.

3. Scriei o interogare care s afieze numrul i numele angajatului pentru
toi cei care lucreaz ntr-un departament care deine cel puin un angajat al
crui nume conine litera u . Salvai instruciunea ntr-un fiier denumit
pq3.sql.

4. Afiai numele angajatului, numrul departamentului i funcia pe care
lucreaz acesta pentru toi angajaii al cror ID de departament este 1700.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-296

5. Afiai numele i salariul tuturor angajailor subordonai lui King.

6. Afiai numrul departamentului, numele i funcia tuturor angajailor din
departamentul numit Executive.

7. Modificai pq3.sql pentru a afia numrul, numele i salariul tuturor
angajailor care ctig mai mult dect salariul mediu i totodat lucreaz
ntr-un departament care deine cel puin un angajat ce conine n numele
sau litera u . Salvai fiierul ca pq7.sql. Executai interogarea din nou.



8. Scriei o interogare care s afieze numele, numrul departamentului i
salariul oricrui angajat al crui numr de departament i salariu s se
potriveasc cu numrul departamentului i salariul oricrui angajat care
ctig comision.



Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-297
9. Afiai numele, numele departamentului i salariul oricrui angajat al crui
salariu i comision se potrivesc cu salariul i comisionul oricrui angajat
care lucreaz n location ID=1700.


10. Scriei o interogare care s afieze numele, data angajrii i salariul pentru
toi angajaii care au acelai salariu i comision ca al lui Kochhar, exclusiv
Kochhar.


11. Scriei o interogare care s afieze angajaii care ctig un salariu mai
mare ca al oricrui angajat cu JOB_ID = 'SA_MAN'. Afiai salariile ordonat
de la cel mai mare la cel mai mic.


12. Afiai coloanele employee_ ID, last_ name i department_ID pentru acei
angajai care locuiesc n orae a cror nume ncepe cu T.

13. Scriei o interogare care s afieze toi angajaii care ctig mai mult dect
salariul mediu din departamentul lor. Afiai coloanele last_name, salary,
department_ID i media salarial pentru departament. Ordonai datele dup
salariul mediu. Folosii alias-uri pentru coloanele returnate de interogare,
dup exemplul de mai jos.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-298

14. Afiai toi angajaii ce nu sunt supervisors.
a. Folosii operatorul NOT EXISTS.

b. Se poate folosi operatorul NOT IN ? Cum, sau de ce nu ?

15. Scriei o interogare care s afieze numele angajailor care ctig mai
puin dect media salarial din departamentul lor.


16. Scriei o interogare care s afieze numele angajailor care au unul sau mai
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-299
muli colegi de departament care s aib salarii mai mari i date de
angajare mai trzii.


17. Scriei o interogare care s afieze coloanele employee _ID, last_name i
department_name pentru toi angajaii. Folosii n instruciunea SELECT o
subinterogare scalar pentru a gsi numele departamentului.

18. Scriei o interogare care s afieze numele de departament pentru acele
departamente al cror cost total cu salariile este peste 1/8 din costul total
cu salariile al ntregii companii. Folosii clauza WITH. Numii interogarea
SUMMARY.

DEPARTMENT_NAME DEPT_TOTAL
------------------------------ ----------
Executive 58000
Sales 37100

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-300
19. Privii rezultatele de mai jos. Sunt acestea rezultate n urma procesrii unei
subinterogri ierarhice ? Explicai rspunsul dat.









































Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


10-301
20. Afiai structura organizaional a departamentului lui Mourgos specificnd
numele de familie, salariul i id-ul departamentului.

21. Creai un raport care s afieze ierarhia managerilor pentru angajatul
Lorentz. Afiai mai nti pe eful su direct.

22. Creai un raport identat care s afieze ierarhia managerial ncepnd de la
angajatul cu numele Kochhar. Afiai coloanele last_name, manager_ ID
i department_ID. Dai aliasuri coloanelor ca n exemplu.

23. Afiai structura organizatoric a companiei afind ierarhia managerial.
ncepei cu persoanele de la nivelul superior, excludei toi angajaii ce au
job_ ID egal cu IT_PROG i excludei-l pe De Haan i toi subordonaii
lui.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-302
Capitolul 11 Instruciuni pentru Manipularea Datelor

Obiective:
Descrierea fiecrei comenzi DML(Data Manipulation Language);
Inserarea de nregistrri ntr-un tabel (INSERT);
Actualizarea nregistrrilor dintr-un tabel (UPDATE);
tergerea nregistrrilor dintr-un tabel (DELETE):
Alturarea rndurilor unei tabele (MERGE):
Controlul tranzaciilor (COMMIT, SAVEPOINT i ROLLBACK).

O comand DML este executat atunci cnd:
- Se aduga noi nregistrri n tabel;
- Se modifica nregistrrile existente ntr-o tabel;
- Se terg nregistrri existente dintr-o tabel.

O tranzacie const dintr-o colecie de comenzi DML care formeaz o
unitate logic de lucru.

Limbajul de manipulare a datelor (DML) este partea de baza a SQL.
Cnd se dorete adugarea, modificarea sau tergerea datelor dintr-o baza de
date, se execut o comand DML. O colecie de comenzi DML care formeaz o
unitate logic de lucru se numete tranzacie.

Exemplu: Considerai o baz de date din domeniul bancar. Atunci cnd
un client al bncii dorete s transfere bani dintr-un depozit ntr-un cont curent,
tranzacia ar putea consta n 3 operaii separate: scderea sumei din depozit,
creterea sumei din contul curent, nregistrarea tranzaciei n jurnalul de
tranzacii. Serverul Oracle trebuie s garanteze c toate cele 3 comenzi SQL
sunt executate n aa fel nct sa menin echilibrul necesar ntre conturi. Atunci
cnd, din anumite cauze, una dintre comenzile tranzaciei de mai sus nu se
execut, atunci celelalte comenzi ale tranzaciei trebuie s fie anulate.

Adugarea unei noi nregistrri ntr-un tabel.

Imaginea de mai jos ilustreaz adugarea unui nou departament n
tabelul DEPARTMENTS.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-303


11.1 Introducerea datelor-comanda INSERT

Folosind comanda INSERT se pot aduga noi nregistrri 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 corespunztoare coloanei.

Not: Folosind aceast sintax pentru comanda INSERT se adaug
numai cte un rnd odat la un tabel.

La inserarea unei noi nregistrri coninnd valori pentru fiecare coloan,
valorile se dau n ordinea prestabilit a coloanelor din tabel, precizarea
coloanelor fiind opional.

INSERT INTO departments(department_id, department_name,
manager_id, location_id)
VALUES (70, 'Public Relations', 100, 1700);

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-304
DESCRIBE departments


Pentru claritate, precizai lista coloanelor n sintaxa INSERT.
ncadrai ntre ghilimele simple doar irurile de caractere i datele
calendaristice nu i valorile numerice.

Inserarea de nregistrri 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.
Specificai 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);


Asigurai-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 nclcarea constrngerii de tip cheie strin;
Valori care duc la nclcarea constrngerii de tip CHECK ;
Tip de data eronat;
Valoare mai mare dect maxima admis pentru acea coloan.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-305
Inserarea unor valori speciale

Funcia 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 informaia pentru angajatul Popp n
tabela EMPLOYEES. Pentru a introduce data i ora curent n cmpul
HIREDATE este folosit funcia SYSDATE.
Se poate de asemeni folosi funcia USER la introducerea de valori ntr-un
tabel. Funcia USER furnizeaz numele utilizatorului curent.

Verificarea datelor adugate 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: Adugarea 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 conine de asemenea informaii despre timp, ora implicit este
00:00:00.
Dac o dat calendaristic necesit specificarea altui secol sau or,
trebuie folosit funcia TO_DATE.
n exemplu se nregistreaz informaia despre angajatul Raphealy n
tabela EMPLOYEES. Cmpul HIREDATE primete valoarea February 3, 1999.

Inserarea de valori folosind variabile de substituie

Se poate scrie o comand INSERT care s permit utilizatorului s
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-306
adauge valori n mod interactiv folosind variabilele de substituie SQL*Plus.
De exemplu, se introduc informaiile pentru un nou departament n tabelul
DEPARTMENTS. Numrul departamentului, numele i locaia 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 instruciuni.
Comenzile, care pot sa conin i variabile de substituie, pot fi salvate
ntr-un fiier. Acesta poate fi executat i la fiecare execuie sunt cerute valori noi
pentru variabile. La execuia 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 de utilizator n
variabila expr iar PROMPT afieaz textul specificat.

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 substituie SQL*Plus nu trebuie precedat de & cnd este
referit ntr-o comanda ACCEPT. Pentru a continua o comanda SQL*PLUS pe
linia urmtoare se folosete caracterul -.

Copierea nregistrrilor dintr-un alt tabel folosind comanda INSERT
cu o subinterogare
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-307
Comanda INSERT poate fi folosit pentru a adaug nregistrri 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 nregistrrile n tabel.

Numrul i tipul cmpurilor (coloanelor) din lista specificat n
comanda INSERT trebuie s corespund numrului 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. Instruciunea SELECT a subinterogrii trebuie s aib acelai
numr de coloane ca i cel din clauza VALUES. Pentru ca INSERT s fie
executat satisfctor trebuie s inei cont de toate regulile care se aplic
asupra coloanelor din tabelul de baz. De exemplu, nu putei introduce valori
duplicat sau nu este permis lipsa unei valori pentru o coloan care este
obligatoriu NOT NULL.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-308
11.2 Modificarea datelor - comanda UPDATE



Figura de mai sus arat modificarea numrului departamentului pentru
cei din departamentul 60 n 30.

nregistrrile 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 nregistrrile care trebuie modificate i este alctuita din
expresii, nume de coloane, constante, subinterogri i operatori de
comparare.

Folosind comanda UPDATE se pot modifica simultan valorile pentru unul
sau mai multe rnduri din tabel.
Putei avea confirmarea executrii operaiei de modificare prin interogarea
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-309
tabelului, afind rndurile modificate.

NOT: n general, folosii cheia primara pentru a identifica o singur
nregistrare. Folosirea altor coloane poate determina modificarea mai
multor nregistrri.
De exemplu, identificarea unei singure nregistrri n tabelul
EMPLOYEES prin nume poate fi periculoas, deoarece pot exista
mai muli angajai cu acelai nume.

Comanda UPDATE modific anumite nregistrri dac este specificat
clauza WHERE. Exemplul urmtor transfer angajatul cu numrul 113 n
departamentul 70.

UPDATE employees
SET department_id = 70
WHERE employee_id = 113;
1 row updated.

Dac omitei clauza WHERE, sunt modificate toate nregistrrile dintr-un tabel.

UPDATE copy_emp
SET department_id = 110;
22 rows updated.




Actualizarea nregistrrilor folosind subinterogri dup mai multe cmpuri

n clauza SET a unei comenzi UPDATE pot fi implementate subinterogri
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 numrul 114 funcia i salariul astfel
nct ele s coincid cu cele ale angajatului numrul 205.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-310
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 nregistrrilor folosind valori dintr-un alt tabel

Exemplul de mai jos arat cum se pot folosi subinterogri n comenzi
UPDATE pentru a actualiza nregistrrile 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.


nclcarea constrngerii de integritate

UPDATE employees
SET department_id = 55 WHERE department_id = 110;

Dac ncercai s atribuii unui cmp o valoare care este
legat de o constrngere de integritate, va rezulta o eroare.
n exemplul de mai sus, departamentul cu numrul 55 nu exista n tabelul
printe, DEPARTMENTS, i astfel vei obine eroarea parent key violation ORA-
02291 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 urmtor va dezvolta acest
subiect mai pe larg.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-311
11.3 tergerea datelor - comanda DELETE

Folosind comanda DELETE se pot terge nregistrri dintr-un tabel.

DELETE [FROM] table
[WHERE condition];

n sintaxa:

tabel este numele tabelei.
Condiie identific nregistrrile care trebuie terse i este alctuit din expresii,
nume de coloane, constante, subinterogri i operatori de comparare.

Se pot terge doar anumite nregistrri prin specificarea clauzei WHERE
n comanda DELETE. Exemplul de mai jos arat cum se procedeaz pentru a
terge departamentul 'Finance' din tabelul DEPARTMENTS. V putei asigura
c tergerea s-a fcut 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 nregistrrilor folosind valori dintr-un alt tabel

Folosii subinterogri n comanda DELETE pentru a terge nregistrrile
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.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-312
Putei folosi subinterogri pentru a terge nregistrri dintr-un tabel,
folosind informaiile din alt tabel. Exemplul de mai sus terge toi angajaii care
sunt n departamentul ce conine n numele sau irul 'Public'. Subinterogarea
caut n tabela DEPARTMENTS numrul de departament pentru 'Public', apoi
furnizeaz numrul de departament interogrii principale, care terge
nregistrri din EMPLOYEES pe baza acestuia.


nclcarea constrngerii de integritate

Dac ncercai tergerea unei nregistrri care conine un cmp cu o
valoare legat de o constrngere de integritate, vei obine o eroare.

n exemplul de mai jos se ncearc tergerea departamentului cu numrul
60 din tabelul DEPARTMENTS. tergerea provoac o eroare deoarece
numrul de departament este folosit ca i cheie extern n tabelul
EMPLOYEES. Dac nregistrarea printe pe care ncercai s o tergei are
nregistrri copil, atunci vei 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 putei terge o nregistrare care conine o cheie primar
folosit ca cheie extern n alt tabel.


Folosirea sintagmei WITH CHECK OPTION n instruciuni de tip DML

n exemplul de mai jos se folosete o subinterogare pentru a identifica
tabelul i coloanele pentru instruciunea 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);
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-313

INSERT INTO
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

Specificai WITH CHECK OPTION pentru a indica faptul c, dac se
folosete o subinterogare n locul numelui tabelului ntr-o instruciune de tip
INSERT, UPDATE sau DELETE nu sunt permise nici un fel de schimbri
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 prevzut 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 opiunii DEFAULT explicit

Folosind opiune DEFAULT explicit putei s folosii cuvntul cheie
DEFAULT drept valoare pentru o coloan acolo unde aceasta este necesar.
Introducerea acestei opiuni a fost fcut n scopul alinierii la cerinele
standardului SQL: 1999. Ea permite utilizatorului s controleze locul i timpul la
care opiunea DEFAULT va fi aplicat datelor.
Opiunea DEFAULT explicit poate fi folosit n instruciunile 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, instruciunea 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 instruciunea UPDATE pentru a atribui
coloanei MANAGER_ID valoarea implicit pentru cei din departamentul 10.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-314
Dac nu este definit o valoare implicit, valoarea pentru coloana
MANAGER_ID va fi NULL.

Valoarea implicit pentru o coloan se specific n momentul creri
tabelei.


11.4 Instruciunea MERGE

Prevede posibilitatea de a introduce sau modifica datele din tabel n
mod condiionat;
Execut un UPDATE dac rndul exist i un INSERT dac este un
rnd nou;
Previne scrierea mai multor instruciuni UPDATE ;
Este uor de folosit i duce la creterea performantelor:
Este folositoare n aplicaii ce gestioneaz volum mare de date.
SQL a fost extins n vederea introducerii instruciunii MERGE. Folosind
aceasta instruciune se pot modifica sau insera rnduri ntr-o tabel n mod
condiionat ceea ce previne scrierea mai multor instruciuni UPDATE. Decizia
de a modifica sau introduce rnduri n tabela inta se bazeaz pe clauza
condiional ON.
Deoarece instruciunea MERGE combin instruciunile INSERT i
UPDATE, trebuie s avei drepturi pentru modificarea sau adugarea de rnduri
n tabela int i dreptul de a selecta datele din tabela surs.
Instruciunea MERGE este determinist. Nu putei s facei UPDATE de
mai multe ori asupra aceluiai rnd din tabela folosind aceeai instruciune
MERGE.
O abordare alternativ ar fi folosirea buclelor PL/SQL i mai multe
instruciuni DML. Instruciunea MERGE este dealtfel uor de folosit i mult mai
simplu de scris fiind o singur instruciune de tip SQL.
Instruciunea MERGE este potrivit pentru unele aplicaii de tip
warehousing. De exemplu, ntr-o asemenea aplicaie s-ar putea s fii nevoii s
lucrai cu date ce provin din mai multe surse, unele dintre ele putnd fi
duplicate. Folosind instruciunea MERGE putei aduga sau modifica rndurile
n mod condiionat.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-315
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 condiional pe baza creia MERGE execut fie modificarea
fie inserarea datelor ;
WHEN MATCHED d instruciuni serverului asupra felului n care s
Sau rspund la rezultatul condiiei 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 condiia c.employee_id =
e.employee_id. Deoarece tabela COPY_EMP nu are nregistrri, condiia
returneaz false deci se execut clauza WHEN NOT MATCHED iar
instruciunea MERGE insereaz rndurile din tabela EMPLOYEES n tabela
COPY_EMP.
Dac tabela COPY_EMP ar conine 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 conine valori identice cu cele din
tabela EMPLOYEES.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-316
11.5 Tranzacii

Tranzaciile constau dintr-un grup format din urmtoarele comenzi:
Comenzi DML care duc la o schimbare consistent a datelor;
O comanda DDL;
O comanda DCL.
Serverul Oracle asigur consistena datelor pe baza tranzaciilor.
Tranzaciile ofer mai mult flexibilitate i control la modificri aduse datelor i
asigur consistena datelor n eventuala cdere a sistemului sau n cazul unei
erori a procesului utilizator.
Tranzaciile 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 aciuni ar trebui fie s reueasc
mpreun, fie sa eueze mpreun. Operaia de creditare nu ar trebui sa poat fi
efectuata fr ca cea de debitare sa fie executat cu succes.
Tipuri de tranzacii:
Tip Descriere
Limbaj de manipulare a
datelor (DML)
Consta din orice numr 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
Tranzacii n baze de date:
ncep odat cu execuia primei comenzi SQL executabile;
Se termin la apariia unuia dintre urmtoarele evenimente:
- COMMIT sau ROLLBACK;
- Execuia unei comenzi DDL sau DCL ( automatic commit);
- Deconectarea utilizatorului;
- Cderea sistemului.

Dup ce se ncheie o tranzacie, urmtoarea tranzacie va ncepe
automat la prima comanda SQL executabila ntlnit. Rezultatele unei comenzi
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-317
DDL sau DCL sunt salvate automat (automat commit) motiv pentru care
tranzacia se ncheie n mod implicit.

Avantajele comenzilor COMMIT i ROLLBACK:
Asigur consistena datelor;
Ofer posibilitatea revederii schimbrilor fcute nainte de a le salva;
Grupeaz operaii relaionate logic.

Controlul tranzaciilor












Comenzi pentru controlul explicit al tranzaciilor

Putei controla logica tranzaciilor folosind comenzile;
COMMIT,SAVEPOINT i ROLLBACK.




















Controlul tranzaciilor



INSERT UPDATE DELETE INSERT
COMMIT Savepoint A Savepoint B
ROLLBACK to Savepoint B
ROLLBACK to Savepoint A
ROLLBACK
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-318

Comanda Descriere
COMMIT
ncheie actuala tranzacie fcnd ca toate modificrile
s devin permanente (salveaz modificrile)
SAVEPOINT nume
Marcheaz un punct de ntoarcere (savepoint) n cadrul
tranzaciei curente
ROLLBACK
[TO SAVEPOINT
name]
Comanda ROLLBACK ncheie tranzacia curent,
pierzndu-se toate modificrile temporare (pending
changes) asupra datelor. ROLLBACK TO SAVEPOINT
name terge savepoint-ul i toate schimbrile 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 tranzaciilor

Un commit (salvarea modificrilor) automat are loc n urmtoarele circumstane:
Este dat o comanda DDL;
Este dat o comanda DCL;
O prsire normal a mediului SQL*Plus, fr a da explicit o comand
COMMIT sau ROLLBACK.

Un rollback automat are loc n condiiile unei terminri anormale a
sesiunii SQL*Plus sau n cazul unei 'cderi' de sistem.

Stare Circumstane
Commit automat
Comanda DDL sau DCL
Ieire normal din SQL*Plus, fr o comand
COMMIT sau ROLLBACK explicit
Rollback automat Terminare anormal a SQL*Plus sau cdere sistem
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-319

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 modificrilor, imediat ce este executat. Nu se mai poate
reveni la situaia 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.

Cderile sistemului: Cnd o tranzacie este ntrerupt de o cdere a
sistemului, ntreaga tranzacie este automat pierdut (este 'rolled back').
Aceasta mpiedic ca eroarea s determine schimbri nedorite asupra datelor i
reface starea bazelor din momentul ultimului COMMIT (explicit sau implicit).
Astfel, SQL*Plus pstreaz integritatea tabelelor (bazelor de date).


Salvarea modificrilor

Fiecare modificare efectuat n timpul tranzaciei este temporar pn la
apariia unui 'commit' (pn la 'salvarea' tranzaciei).


Starea datelor nainte de un COMMIT sau ROLLBACK

Operaiile de manipulare a datelor afecteaz iniial buffer-ul bazei de
date; de aceea, starea iniial a datelor poate fi refcut.
Utilizatorul curent poate urmri schimbrile fcute prin interogarea
tabelelor.
Ali utilizatori nu pot vedea modificrile fcute 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 salvri.
nregistrrile afectate sunt protejate (locked); ali utilizatori nu pot face
modificri asupra lor.

Starea datelor dup COMMIT

Modificrile asupra datelor din baza de date devin permanente.
Starea anterioar a datelor nu mai poate fi refcut.
Toi utilizatorii pot vedea rezultatele.
nregistrrile protejate (locked) sunt deblocate pentru modificare i pot fi
schimbate de ali utilizatori.
Toate savepoint-urile sunt terse.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-320
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.
Salvai modificrile
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 modificrile devin permanente.

Starea datelor dup ROLLBACK

Pentru a anula modificrile temporare fcute folosii comanda ROLLBACK.
Modificrile aduse datelor sunt pierdute.
Starea anterioar a datelor este refcut.
Protecia asupra nregistrrilor implicate este ridicat.

Exemplu:
ncercnd s tergei o nregistrare din tabelul TEST, putei terge
accidental ntreg tabelul. Putei corecta greeala, iar apoi s dai comenzile
corecte i s salvai modificrile.
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 modificrilor pana la un savepoint

Putei crea un marcaj n cadrul tranzaciei curente folosind comanda
SAVEPOINT. Astfel, tranzacia poate fi mprit n seciuni mai mici. Putei apoi
anula modificrile temporare pn la acel marcaj folosind comanda ROLLBACK
TO SAVEPOINT.
Dac creai un al doilea savepoint cu acelai nume ca unul anterior,
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-321
savepoint-ul anterior este ters.

Rollback la nivel de comand

Se poate anula o parte din tranzacie printr-un rollback implicit dac este
detectat o eroare la execuia unei comenzi. Dac o singur comanda DML
eueaz n timpul execuiei unei tranzacii, efectul ei este anulat printr-un
rollback la nivel de comand, dar schimbrile fcute de comenzile DML
anterioare n tranzacie nu vor fi anulate. Ele pot fi salvate (commited) sau
anulate (rolled back) n mod explicit de ctre utilizator.
Oracle execut o comanda COMMIT implicit nainte i dup orice
comanda DDL.
Deci, chiar dac comanda DDL nu se execut cu succes, nu putei anula
comenzile anterioare pentru c serverul a executat un commit (a salvat
modificrile).
Este bine ca tranzaciile 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.
Schimbrile fcute de un utilizator nu intr n conflict cu schimbrile
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:
- Operaii de citire (comanda SELECT);
- Operaii de scriere (comenzile INSERT, UPDATE, DELETE).

Consistena 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 sigurana c schimbrile n baza de date
se fac n mod consistent;
- Schimbrile fcute de un utilizator s nu intre n conflict sau s afecteze
schimbrile fcute de un altul.
Scopul consistenei la citire este s asigure c fiecare utilizator vede
datele n starea n care erau la ultima salvare, nainte s nceap o operaie
DML.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-322

Consistena la citire este implementat n mod automat. Este
pstrat o copie parial a bazei de date n segmente rollback.


Cnd se realizeaz o operaie de adugare, actualizare sau tergere
asupra bazei de date, serverul Oracle scrie o copie a datelor dinainte de
modificare ntr-un segment rollback.
Toi utilizatorii, cu excepia celui care a iniiat modificarea, vd baza de
date n starea de dinaintea nceperii modificrii; ei vad datele din segmentul
rollback.
nainte ca schimbrile s fie salvate n baza de date, numai utilizatorul
care modific datele vede baza de date modificat, toi ceilali vznd datele din
segmentul rollback. Aceasta garanteaz c utilizatorii citesc consistent datele
care nu sufer schimbri chiar n acel moment.
Cnd o comand DML este salvat, schimbarea fcut n baza de date
devine vizibil oricui execut o comanda SELECT. Spaiul ocupat de 'vechile'
date din segmentul rollback este eliberat pentru a fi reutilizat.
Dac tranzacia este anulat, schimbrile sunt la rndul lor anulate.
Versiunea original mai veche a datelor din segmentul rollback este
scris napoi n tabel. Toi utilizatorii vd baza de date aa cum era nainte de a
ncepe tranzacia.


Protecia la scriere (locking)

Protecia Oracle:
Previne interaciunile destructive ntre tranzacii concurente;
Nu necesit aciuni din partea utilizatorului;
Folosete n mod automat cel mai mic nivel de restricionare;
Este valabil pe durata unei tranzacii.

Exista dou modaliti de protecie : Exclusiv i Partajat.

Proteciile (locking) sunt mecanisme care previn interaciunea destructiv
ntre tranzacii ce acceseaz aceeai resurs: fie un obiect utilizator (de
exemplu tabele sau nregistrri), fie obiecte sistem care nu sunt vizibile
utilizatorilor (de exemplu structuri de date partajate i nregistrri "data
dictionary").

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-323
Cum protejeaz Oracle datele

Protejarea unei baze de date Oracle este automatizat n ntregime i nu
necesit aciuni din partea utilizatorului. Implicit, protejarea are loc pentru toate
comenzile SQL cu excepia lui SELECT. Mecanismul implicit de protecie n
Oracle folosete n mod automat cel mai mic nivel aplicabil de restricionare,
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 protecie ntr-o baz de date
multiutilizator.

Mod de protecie Descriere
exclusiv
(exclusiv lock)
mpiedic partajarea unei resurse.
Prima tranzacie care blocheaz resursa n mod exclusiv
este singura tranzacie care poate modifica resursa pn
cnd protecia exclusiv este anulat.
partajat
(share lock)
Permite partajarea resursei.
Mai muli utilizatori care citesc datele le pot folosi n comun
prin crearea unor protecii partajate ce mpiedic accesul
concurent pentru scriere (care necesit o protecie
exclusiv).
Mai multe tranzacii pot obine protecii partajate pentru
aceeai resurs.
11.7 Correlated UPDATE

n cazul instruciunii 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);
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-324
Exemplul de mai sus adug o coloana la tabelul EMPLOYEES pentru
numele departamentului i apoi introduce valori n aceast coloana folosind un
UPDATE corelat.

Folosii 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 conine valoarea pentru EMPLOYEE_ ID, valoarea creterii salariale i
data la care a fost executat. Tabela REWARDS poate conine 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 adugarea la salariul
actual a mririi de salariu corespunztoare 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 instruciuni DELETE se poate folosi o subinterogare corelat
pentru a terge acele rnduri care exist i ntr-o alt tabel.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-325
De exemplu, dac decidei ca n tabela JOB_HISTORY s pstrai doar
ultimele patru nregistrri pentru un angajat, atunci cnd un angajat se
transfer pe o a cincea funcie, vei terge cel mai vechi rnd din tabel
privitor la angajatul n discuie prin cutarea 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));

Folosii 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 conine detalii despre toi angajaii;
Tabela EMPLOYEES_HISTORY care conine detalii despre funciile anterior
deinute de angajai, aa c ar fi o greeal dac aceleai nregistrri despre un
angajat ar exista n ambele tabele.

Instruciunile Multitable INSERT

Instruciunea INSERTSELECT poate fi folosit pentru a introduce
rnduri n mai multe tabele ca parte a unei singure instruciuni DML.
Instruciunea Multitable INSERT poate fi folosit n sistemele de tip data
warehousing pentru a transfera date de la una sau mai multe surse
operaionale ctre un set de tabele int.
Instruciunea Multitable INSERT ofer o mbuntire semnificativ a
performanelor din urmtoarele puncte de vedere:
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-326
o singur instruciune DML versus multiple instruciuni INSERT.. SELECT ;
o singur instruciune DML versus o procedur care s execute mai multe
instruciuni INSERT folosind sintaxa IF...THEN.
ntr-o instruciune multitable INSERT inserai n una sau mai multe tabele
rndurile calculate derivate din rndurile returnate n urma evalurii datelor
furnizate de o subinterogare. Instruciunea multitable INSERT poate juca un rol
deosebit de folositor ntr-un scenariu pentru data warehouse. Presupunem c
trebuie s ncrcai n mod regulat datele n baza pentru a facilita analiza
afacerii. Pentru a face asta trebuie s extragei datele din unul sau mai multe
sisteme operaionale i s le copiai 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 aplicaii. Dup
extragere, datele trebuie transportate fizic ctre sistemul int sau un sistem
intermediar pentru a fi procesate. n funcie de modul ales pentru transport pot fi
executate unele transformri n timpul acestui proces. De exemplu, o
instruciune SQL care acceseaz direct o inta la distanta printr-un gateway
poate concatena doua coloane ca parte a instruciunii SELECT.
Odat ce datele sunt ncrcate n baza Oracle9i transformarea lor poate fi
fcut folosind operaii SQL. Instruciunea multitable INSERT este una dintre
tehnicile implementate n Oracle9i pentru transformarea datelor.

Instruciunea Multitable INSERTS ofer beneficiile date de instruciunea
INSERT... SELECT atunci cnd sunt folosite mai multe tabele drept inta.
nainte de Oracle9i trebuia s folosii mai multe instruciuni 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 non-
relaional poate fi acum convertit n mai multe nregistrri pentru mai multe
tabele relaionale.

Oracle 9i introduce urmtoarele tipuri de instruciuni multitable INSERT :
Unconditional INSERT (INSERT necondiionat);
Conditional ALL INSERT (Insearea tutore datelor n mod condiionat);
Conditional FIRST INSERT (Primul INSERT condiionat);
Pivoting INSERT (INSERT condus).

Trebuie s folosii diferite clauze pentru a indica tipul de INSERT ce va fi
executat.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-327
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 instruciunea multitable
INSERT.

Unconditional INSERT clauza ALL
Specificai clauza ALL urmat de mai multe clauze insert_into pentru a
executa un insert necondiional n mai multe tabele. Serverul Oracle execut
fiecare clauza INSERT odat pentru fiecare rnd returnat de subinterogare.

Conditional INSERT: conditional_insert_clause
Specificai clauza pentru conditional_insert_clause n vederea executrii
unui insert condiionat. Serverul Oracle filtreaz fiecare clauz
insert_into_clause cutnd corespondena cu condiia de la clauza WHEN care
determin execuia ei. O singur instruciune multitable insert poate conine
pn la 127 clauze WHEN.

Conditional INSERT: ALL
Dac specificai ALL, serverul Oracle evalueaz fiecare clauza WHEN cu
privire la rezultatul evalurii altor clauze WHEN. Pentru fiecare clauza WHEN a
crei condiie este evaluat ca fiind adevrat serverul Oracle execut lista
corespunztoare din instruciunea INSERT.

Conditional FIRST: INSERT
Dac specificai FIRST, serverul Oracle evalueaz fiecare clauza WHEN
n ordinea n care sunt scrise n instruciune. Dac primul WHEN este evaluat
ca fiind adevrat, serverul Oracle execut clauza INTO corespunztoare, n caz
contrar trecnd peste urmtoarea clauz WHEN pentru acel rnd.

Conditional INSERT: clauza ELSE
Pentru un anumit rnd, dac nici o clauza WHEN nu este evaluat ca
fiind adevrat :
dac specificai clauza ELSE, serverul Oracle execut lista de la clauza INTO
asociat clauzei ELSE.
dac nu specificai clauza ELSE, serverul Oracle nu execut nici o aciune
pentru acel rnd.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-328

Restricii pentru instruciunea Multitable INSERT


Instruciunea multitable insert poate fi executat numai asupra
tabelelor nu i asupra view-urilor sau tabelelor la distan (remote
table);
Nu putei specifica o expresie format dintr-o colecie de tabele cnd
folosii instruciunea multitable insert;
La folosirea instruciunii multitable insert nu pot fi specificate mai mult
de 999 tabele int, lund n calcul toate clauzele insert_into.


Exemplu: Unconditional INSERT ALL

Selectai valorile pentru EMPLOYEE_ID, HIRE_DATE, SALARY i
MANAGER_ID din tabela EMPLOYEES pentru acei angajai care au
EMPLOYEE_ID> 200. Inserai 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.
Instruciunea SELECT extrage datele din tabela EMPLOYEES, coloanele
EMPLOYEE_ID, hire_date, salary i manager_ID pentru acei angajai a cror
EMPLOYEE_ID este mai mare de 200. Aceste valori sunt inserate n tabela
SAL_HISTORY i n tabela MGR_HISTORY.
Acest INSERT este necondiionat deoarece ulterior nu se aplica restricii
asupra rndurilor extrase de instruciunea SELECT. Toate rndurile regsite de
instruciunea SELECT statement sunt inserate n cele dou tabele, respectiv
SAL_HISTORY i MGR_HISTORY. Clauza VALUES de la instruciunea
INSERT specific coloanele ce vor fi inserate n tabele. Fiecare rnd returnat de
instruciunea SELECT duce la dou inserri, una n tabela SAL_HISTORY i
alta n tabela MGR_HISTORY. n total au fost inserate 8 rnduri n cele dou
tabele.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-329

Exemplu-Conditional INSERT ALL
Selectai valorile coloanelor EMPLOYEE_ID, HIRE_DATE, SALARY
i MANAGER_ID din tabela EMPLOYEES pentru acei angajai a cror id este
mai mare 200. Dac SALARY este mai mare de 10,000, inserai aceste valori n
tabela SAL_HISTORY folosind o instruciune multitable INSERT condiional.
Dac valoarea pentru MANAGER_ID este mai mare de 200 atunci inserai
aceste valori n tabela MGR_HISTORY folosind o instruciune multitable
INSERT condiional.

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. Instruciunea SELECT
extrage din tabela EMPLOYEES datele despre angajaii (ID, hire date, salary,
and manager_ID) a cror 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 instruciune INSERT este referit ca conditional ALL INSERT
deoarece sunt aplicate restricii dup extragerea rndurilor de ctre
instruciunea 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.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-330
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 instruciunea SELECT extrage valorile pentru coloanele
department_ID, salariul total i valoarea maxim pentru hire_date pentru fiecare
departament din tabela EMPLOYEES.
Aceasta instruciune INSERT este referit ca conditional FIRST
INSERT, deoarece atunci cnd salariul total este mai mare de 25,000 apare o
excepie. Expresia condiional 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 funcie de valoarea coloanei hire_date.
Dac prima clauz WHEN este evaluat ca fiind True, serverul Oracle execut
clauza corespondent INTO i trece peste urmtoarele clauze WHEN pentru
acest rnd.
Pentru rndurile care nu satisfac condiia WHEN SAL > 25000, restul
condiiilor sunt evaluate ca fiind o instruciune de tip conditional INSERT i
rndurile date de SELECT sunt inserate n tabela HIREDATE_HISTORY_00
sau HIREDATE_HISTORY_99 sau HIREDATE_HISTORY n funcie de
valoarea din coloana HIREDATE.
Se execut 8 inserri n tabelele SPECIAL_SAL,
HIREDATE_HISTORY_00, HIREDATE_HISTORY_99 i
HIREDATE_HISTORY.


Pivoting INSERT

Presupunem c primii un set de date despre vnzri dintr-o baz de date
nerelaional, SALES_SOURCE_DATA in urmtorul format :
EMPLOYEE_ID, WEEK_ID, SALES_MON, SALES_TUE, SALES_WED,
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-331
SALES_THUR, SALES_FRI i dorii s pstrai aceste nregistrri n tabela
SALES_INFO ntr-un format relaionat cum ar fi : EMPLOYEE_ID, WEEK,
SALES.
Folosind o instruciune de tip pivoting INSERT, transformai setul de date
primit n formatul de date relaional dorit.

Pivotarea este operaia prin care creai o transformare astfel nct fiecare
nregistrare din orice ir de intrare, cum ar fi o baz de date care nu este
relaionat, trebuie s fie convertit n mai multe nregistrri pentru o baz de
date relaionat. Pentru a soluiona acesta problem trebuie s construii o
transformare astfel nct fiecare nregistrare din tabela original din baza de
date nerelaionat, SALES_SOURCE_DATA, s fie convertit n cinci
nregistrri pentru tabela SALES_INFO din baza de date relaionat. Aceast
operaie 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;

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-332
DESC SALES_INFO



SELECT * FROM sales_info;


Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-333

11.9 Exerciii


1. Creai tabela MY_EMPLOYEE care are urmtoarele coloane : id,
last_name, first_name, userid, salary. Inserai date n tabelul
MY_EMPLOYEE.
2. Descriei structura tabelului MY_EMPLOYEE pentru a identifica numele
cmpurilor.
3. Adugai prima nregistrare a tabelului din exemplul de mai jos. Nu
folosii lista coloanelor n clauza INSERT.

ID LAST_NAME FIRST_NAME USERID SALARY
1 Patel Ralph rpatel 795
2 Dancs Betty bdancs 860
3 Biri Ben bbiri 1100
4 Newman Chad cnewman 750
5 Ropeburn Audry aropebur 1550

4. Introducei n tabelul MY_EMPLOYEE i al doilea rnd de date din
exemplul de mai sus. De data aceasta, specificai coloanele explicit n
clauza INSERT.
5. Verificai dac au fost adugate n tabel.
6. Creai un script numit load_EMPLOYEES.sql pentru a insera
nregistrri n mod interactiv n tabelul MY_EMPLOYEE. Cerei
utilizatorului prenumele (FIRST_NAME), numele de familie
(LAST_NAME) i salariul fiecrui angajat. Concatenai prima liter a
prenumelui i primele 7 caractere ale numelui de familie pentru a crea
userid.
7. Inserai urmtoarele dou nregistrri n tabel, prin intermediul scriptului
creat.
8. Verificai adugrile.
9. Salvai modificrile. tergei i modificai date n tabelul
MY_EMPLOYEE.
10. Modificai numele de familie al angajatului cu ID = 3 n Drexler.
11. Modificai salariul la 1000 pentru toi cei cu salariul mai mic dect 900.
Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-334
12. Verificai modificrile fcute.
13. tergei-o pe Betty Dancs din tabelul MY_EMPLOYEE.
14. Verificai modificrile.
15. Salvai toate modificrile temporare. Controlai tranzaciile de date
asupra tabelului MY_EMPLOYEE.
16. Inserai n tabel ultima nregistrare rulnd scriptul creat la punctul 6.
17. Verificai adugarea.
18. Marcai un savepoint n cadrul tranzaciei.
19. tergei toate nregistrrile din tabel.
20. Verificai c tabelul este gol.
21. Anulai cea mai recent operaie DELETE fr a anula i INSERT-ul
anterior.
22. Verificai c rndul nou este intact. Salvai adugarea, fcnd-o
permanent.
23. Creai tabelul sal_history, tabelul mgr_history i tabelul special_sal cu
structurile de mai jos:
sal_history

mgr_history

special_sal


Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-335
24. a. Scriei o interogare care s execute urmtoarele:
S afieze EMPLOYEE_ID, hire date, salary, i manager_ID
pentru acei angajai pentru care EMPLOYEE_ID este mai mic
de 125 (din tabela EMPLOYEES).
Dac salariul este mai mare de 20,000, inserai datele despre
angajai (EMPLOYEE_ ID i salary) n tabela SPECIAL_SAL.
Inserai valorile pentru EMPLOYEE_ID, hire_date , salary n
tabela SAL_HISTORY.
Inserai valorile pentru EMPLOYEE_ID, manager_ID i salary
n tabela MGR_HISTORY

b. Afiai rndurile din tabela SPECIAL_SAL.

c. Afiai rndurile din tabela SAL_HISTORY.

d. Afiai rndurile din tabela MGR_HISTORY.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


11-336
25. a. Creai tabela sales_source_data cu structura de mai jos i
introducei cteva datele prezentate n figur.
b. Creai tabela sales_info cu structura de mai jos:

c. Scriei o interogare care s afieze EMPLOYEE_ID, week_ID i vnzrile din
fiecare zi a sptmnii (din tabela SALES_SOURCE_DATA). Construii o
transformare astfel nct fiecare rnd din tabela SALES_SOURCE_DATA
s fie convertit n mai multe nregistrri pentru tabela SALES_INFO i
afiai datele obinute.

Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


12-337
Capitolul 12 Anexa 1
Structura tabelelor folosite n carte i datele standard coninute de
acestea

Tabela COUNTRIES

DESCRIBE countries


SELECT * FROM countries;




Tabela DEPARTMENTS

DESCRIBE departments






Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


12-338
SELECT * FROM departments;



Tabela EMPLOYEES

DESCRIBE employees









Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


12-339

SELECT * FROM employees;



























Tabela JOBS

DESCRIBE jobs






Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


12-340



SELECT * FROM jobs;




Tabela JOB_GRADES

DESCRIBE job_grades



SELECT * FROM job_grades;





Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


12-341



Tabela JOB_HISTORY

DESCRIBE job_history



SELECT * FROM job_history;





Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


12-342
Tabela LOCATIONS

DESCRIBE locations



SELECT * FROM locations;




Tabela REGIONS

DESCRIBE regions



SELECT * FROM regions;





Facultatea de Automatic i Calculatoare Iai
Baze de date lucrri practice


12-343
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. Arotriei, I. Crlig, D. Buzea, Baze de date
Lucrri 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.