Vous êtes sur la page 1sur 343

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice CUPRINS CAPITOLUL 1 1.1 1.2 1.3 1.4 1.

.5 1.6 1.7 2.1 2.2 2.3 2.4 2.5 2.6 2.7 SISTEME DE GESTIUNE A BAZELOR DE DATE ........... 1-5

Arhitectura sistemelor de gestiune a bazelor de date ......................... 1-5 Obiectivele i func iile unui sistem de gestiune a bazelor de date ...... 1-6 Evolu ia i clasificarea sistemelor de gestiune a bazelor de date ....... 1-8 Conceptul de baz de date rela ional .............................................. 1-11 Terminologie specific bazelor de date rela ionale ........................... 1-14 Sisteme de gestiune a bazelor de date rela ionale n Oracle............ 1-16 Sisteme de gestiune a bazelor de date rela ionale n FoxPro........... 1-18 CONCEPTE I ELEMENTE DE BAZA N FOXPRO. ..... 2-22 Descrierea mediului integrat.............................................................. 2-25 Tipuri de date n FoxPro, operatori, func ii ........................................ 2-26 Func ii pentru conversii ntre tipuri de date ....................................... 2-34 Zone de lucru..................................................................................... 2-35 Construirea bazelor de date rela ionale. Componente...................... 2-36 Comenzi pentru vizualizarea i modificarea datelor din tabele ......... 2-40 Exerci ii .............................................................................................. 2-44

CAPITOLUL 2

CAPITOLUL 3 INDEXAREA I RELA IONAREA TABELELOR, INTEGRITATEA REFEREN IAL . ............................................................... 3-46 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 Indexarea tabelelor............................................................................ 3-46 Rela ionarea tabelelor ....................................................................... 3-50 Integritatea referen ial ...................................................................... 3-53 Func ii. Variabile de memorie. Macrosubstitu ia ............................... 3-54 Crearea i modificarea programelor.................................................. 3-57 Programare structurat . Proceduri. ................................................... 3-58 Comenzi de intrare/ieire................................................................... 3-60 Controlul fluxului ................................................................................ 3-65 Comenzi SQL .................................................................................... 3-67 Depanarea programelor .................................................................... 3-69 Instrumente WIZARD ........................................................................ 3-71 Exerci ii .............................................................................................. 3-74

CAPITOLUL 4 PROGRAMAREA ORIENTATA PE OBIECT-CLASE I OBIECTE N VISUAL FOX PRO.................................................................... 4-78 4.1 4.2 4.3 4.4 4.5 4.6 4.7 Crearea claselor ................................................................................ 4-81 Crearea formularelor ......................................................................... 4-85 Utilizarea controalelor predefinite...................................................... 4-87 Generatorul de rapoarte .................................................................... 4-99 Constructorul de meniuri ................................................................. 4-105 Constructorul de proiecte ................................................................ 4-108 Exerci ii: ........................................................................................... 4-110 1-1

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice CAPITOLUL 5 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15 5.16 5.17 5.18 5.19 5.20 5.21 5.22 5.23 5.24 LIMBAJUL SQL IMPLEMENTAT N ORACLE............. 5-111

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

CAPITOLUL 6 EXPRESII ARITMETICE. OPERATORI. RESTRIC IONAREA I SORTAREA DATELOR....................................... 6-149 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 7.1 7.2 7.3 7.4 1-2 Expresii aritmetice ........................................................................... 6-149 Definirea alias-urilor pentru coloane................................................ 6-153 Operatorul de concatenare.............................................................. 6-154 Afiarea structurii unei tabele .......................................................... 6-157 Restric ionarea i sortarea datelor .................................................. 6-158 Clauza WHERE ............................................................................... 6-159 Operatori de compara ie.................................................................. 6-161 Operatori logici ................................................................................ 6-165 Clauza ORDER BY.......................................................................... 6-169 Exerci ii ............................................................................................ 6-172 FUNC II DE UN SINGUR RND .................................. 7-174 Func ii de un singur rnd ................................................................. 7-175 Func ii pentru caractere................................................................... 7-177 Func ii pentru valori numerice ......................................................... 7-181 Utilizarea datelor calendaristice ...................................................... 7-183

CAPITOLUL 7

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

CAPITOLUL 8

CAPITOLUL 9

CAPITOLUL 10

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 10.10 10.11 10.12 10.13 10.14 10.15 10.16 10.17 10.18 10.19 10.20 Subinterogari de coloane multiple ................................................. 10-275 Compararea coloanelor (pereche i nepereche)........................... 10-275 Folosirea unei subinterog ri n clauza FROM ............................... 10-276 Expresii scalare returnate de subinterog ri................................... 10-277 Subinterog ri corelate ................................................................... 10-279 Folosirea operatorului EXISTS...................................................... 10-282 Folosirea operatorului NOT EXISTS ............................................. 10-284 Clauza WITH ................................................................................. 10-284 Interog ri ierahice.......................................................................... 10-286 Parcurgerea arborelui punctul de start ....................................... 10-288 Exerci ii ......................................................................................... 10-295 INSTRUC IUNI PENTRU MANIPULAREA DATELOR.... 11-

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

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

CAPITOLUL 12

STRUCTURA TABELELOR FOLOSITE N CARTE I DATELE STANDARD CON INUTE DE ACESTEA ...................................................................... 12-337 BIBLIOGRAFIE 12-343

1-4

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

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

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

1.2

Obiectivele i funciile unui sistem de gestiune a bazelor de date

Succesul unui SGBD este sus inut prin realizarea urm toarelor obiective: asigurarea independenei datelor. Independen a datelor poate fi definit drept imunitatea programelor de aplica ii la schimbarea structurii de memorare i /sau a strategiei de acces. Independen a

1-6

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

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

1-7

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

1.3

Perfec ionarea SGBD-urilor a avut loc n paralel cu evolu ia echipamentelor de culegere, memorare, transmitere i prelucrare a datelor, pe de o parte, i cu evolu ia metodelor i tehnicilor de organizare a datelor, pe de alt parte. Literatura i practica de specialitate ofer o mare diversitate de sisteme 1-8

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

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

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

1.4

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Un set de operatori care ac ioneaz produce alte rela ii; Colec ie de obiecte i rela ii care stocheaz date; asupra rela iilor pentru a i acurate e.

Reguli de integritate a datelor pentru consisten Definirea unei baze de date rela ionale

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

Modelul sistemului asa cum este vazut de catre client

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

Modelul tabelar (modelul fizic)


Server

Tabele pe disc

Modelul Entitate Rela ie permite crearea unei diagrame entitate rela ie pe baza specifica iilor informa ionale ale problemei. 1-12

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

ANGAJAT #* numr * nume o meseria


Scenariu:

asignat la compus din

DEPARTAMENT #* numr * nume o localitate

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 1.5 Terminologie specific bazelor de date relaionale

O baza de date relaional con ine una sau mai multe tabele. O tabel reprezint structura de baz a unui SGBDR (Sistem de Gestiune a Bazelor de Date Rela ionale). O tabel con ine toate datele necesare despre un aspect al lumii reale. Se consider exemplul tabelei Angaja i. No iuni: Un singur rnd sau o tupl reprezint informa ia necesar pentru un angajat specificat. Fiecare rnd din tabel trebuie identificat de o cheie primar, care nu permite rnduri duplicate. Ordinea rndurilor nu este semnificativ . O coloan sau un atribut con ine marca angajatului care este i cheie primar. Marca (cheia primar ) identific n mod unic un angajat n tabela EMP. O cheie primar trebuie s con in o valoare. Alte tipuri de coloane reprezint alte informa ii (de ex: func ia). Ordinea coloanelor nu este important . Coloana care con ine num rul de departament este numit i cheie extern. Cheia extern con ine coloane care definesc modul n care sunt n rela ie tabele diferite. O cheie extern refer o cheie primar sau o cheie unic din alt tabel. O coloan reprezint un domeniu de date dintr-o tabel . n exemplul dat meseria este coloana ce con ine toate meseriile pentru to i angaja ii. Un cmp poate fi g sit la intersec ia dintre un rnd i o coloan. Poate con ine o singur valoare. Cmpurile pot s nu con in valori. Acestea se numesc valori null.

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

prin execu ia instruc iunilor

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Con ine o colec ie de tabele f r pointeri fizici; Folosete un set de operatori.

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Recunoaterea diferitelor tipuri de lucruri i comportamentul lor f r analiza lor; Folosirea aceleai cereri pentru a invoca diferite implement ri ale aceleai ac iuni pentru dou obiecte diferite (polymorphism); 1.6 Sisteme de gestiune a bazelor de date relaionale n Oracle

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

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

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

1-17

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

1.7

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

1-18

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice apropierea de modelul rela ional al bazelor de date (introducerea dic ionarului de date); extensii orientate obiect ale limbajului de programare; extinderea instrumentelor de proiectare i a num rului de asisten i; dezvoltarea rapid a aplica iilor prin gestionarul de aplica ii Project Manager; apropierea FoxPro-Acces.

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

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

Avantaje n utilizarea FoxPro: tehnici de optimizare performante; limbaj performant de descriere i manipulare a datelor; ncorporarea unui modul SQL foarte rapid; mediu favorabil elabor rii programelor puternic modularizate i structurate, orientate obiect; mecanisme evoluate de conversie a programelor i a datelor (DBaseFoxPro), suport bine pus la punct pentru XML; utilizarea n re ele de microcalculatoare, ca i client COM i COM server ; instalarea modular n func ie de necesit i i posibilit i; include instrumente de proiectare de tip 4GL (4-th Generation Language); Dezavantajele sistemului FoxPro: relativa simplitate a mediului (nu se pot elabora aplica ii foarte complexe); nu este un sistem rela ional pur (de exemplu, lipsa dic ionarului de date la versiunile mai mici de 3.0); nu prezint intrinsec caracteristici client-server, prezint dezavantaje n rol de server ntr-o arhitectur client-server; nu este recomandat pentru WAN (Wide Area Network); nu prezint modalit i avansate de protec ie i securitate a datelor; compatibilitatea versiunilor nu este asigurat n toate cazurile; viteza de execu ie este variabil (influen at de mul i factori). 1-21

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

Fiierele de date FoxPro au o organizare special ilustrat urm toare.

n figura

2-22

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

Se disting dou p r i importante n acest fiier: zona propriu-zis de informa ii mp r it n rnduri numite articole i coloane de cmpuri i antet fiier n care se p streaz informa iile de organizare a zonei propriu-zise.

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

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

2-23

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice ANTET INDEX

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

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

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

2-25

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 2.2 Tipuri de date n FoxPro, operatori, funcii

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

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

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

2-27

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Func ii matematice elementare: returneaz rezultatul ridic rii constantei "e" la puterea dat ca parametru LOG(<expn >) returneaz logaritmul natural / zecimal pentru num rul specificat SQRT(<expn >) returneaz valoarea radicalului din num rul (pozitiv) specificat MOD ( <expN1>, <expN2>) returneaz un ntreg, restul mp r irii <expN1> la <expN2>. Semnul rezultatului este cel al <expN2>. EXP(<expn >) MAX (< exp1>, < exp2>, < exp3>) sau MIN(< exp1>, < exp2>, < exp3>) RAND (< expN>) returneaz maximul / minimul dintre dou expresii numerice returneaz un num r aleator n intervalul 0 i 0.999999. F r parametru sau cu o valoarea negativa se folosete pentru ini ializarea ceasului sistem. Implicit este 0.1000001.

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

(,) ! , NOT AND OR Exemplu :

Operator logic Grupeaz expresiile Nega ie logic I logic SAU logic

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

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

2-29

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Func ii pentru tipul de dat calendaristic DATE() DOW(<eD>) ob inerea datei curente a sistemului returneaz valoarea numeric a zilei s pt mnii dintr-o expresie de tip dat calendaristic (ncepe cu 1 pentru duminic ) returneaz un ir de caractere ce reprezint numele zilei din cadrul s pt mnii pentru dat specificat returneaz num rul zilei din cadrul lunii pentru data specificat ; returneaz num rul lunii pentru data specificat returneaz un ir de caractere ce reprezint numele lunii din cadrul unei expresii de tip dat returneaz valoarea numeric a anului pentru data specificat convertete o dat de intrare de tip calendaristic n formatul zi-luna-an (returneaz un ir de caractere) convertete o dat de intrare tip calendaristic n formatul lun -zi-an (returneaz un ir de caractere) Func ii pentru controlul timpului TIME(<eN>) returneaz un ir de 8 caractere n formatul HH:MM:SS ce reprezint ora exact a sistemului

CDOW(<eD>)

DAY(<eD>) MONTH(<eD>) CMONTH(<eD>) YEAR(<eD>) DMY ( <expD>)

MDY ( <expC>)

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Se folosete pentru a stoca valori n cmpurile de acest tip ale tabelelor din baza de date, valorile returnate de func ii pentru date calendaristice, variabile de tip dat calendaristica, constante de tip dat calendaristic . Operatori de concatenare + concateneaz iruri, eventualele spa ii finale ale fiec rui ir r mnnd intre iruri concateneaz iruri, spa iile finale fiind duse la sfritul irului rezultat Operatori de comparare <,>,= <>, # <= sau =< >= sau => $ == mai mic, mai mare, egal diferit de mai mic sau egal mai mare sau egal folosit pentru concatenarea irurilor de caractere identic

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

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

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

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

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

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice bloc, care asigur fiierului memo. o eficien mai mare n ceea ce privete dimensiunea

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

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

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

2-34

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

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

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

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

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice <fname1>,<fname2> = numele cmpurilor din noul tabel creat; <type> - un caracter ce indica tipul datei pentru cmpul respectiv; <type> C D N L M <precision> n n ALTE COMENZI <scale> d Descriere ir de caractere de lungime n Data calendaristic Numeric, de l ime n cu d zecimale Logic Memo

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice trebuie specificat numele noii baze de date i calea n care aceasta va fi salvat . Pe ecran este deschis fereastra Constructorului de baze de date (Database Designer), iar la meniul sistem se ad uga un nou submeniu, numit Database, care con ine op iunile necesare realiz rii opera iilor specifice, cum ar fi : New table _ se creeaz o nou tabel n baza de date Add Table _ se ad uga la baz o nou tabel existent pe disc O baz de date rela ional include: mai multe tabele cu propriet ile descrise anterior; rela iile permanente dintre tabele, rela ii ce nu vor fi terse odat cu terminarea programelor de prelucrare n care au fost definite (cum este cazul rela iilor temporare intre tabelele); datele referitoare la tabele i rela iile dintre ele sunt memorate n dic ionarul bazei de date i sunt restabilite automat la deschiderea acesteia; vederi, care reprezint tabele virtuale construite pe baza unuia sau mai multor cmpuri din mai multe tabele; proceduri i func ii asociate bazei de date, care pot fi apelate n secven ele de cod asociate tabelelor componente; conexiuni, care reprezint mecanismul de accesare a datelor din alte sisteme.

Caracteristicile tabelelor rela ionate Numele lungi pentru tabele i cmpurile acestora - Unei tabele i se poate ataa un nume lung de maxim 128 caractere, care conduce la o mai buna lizibilitate. Aceast regul este valabil i pentru numele cmpurilor dintr-o tabel , cu urm toarele observa ii: aceste nume nu trebuie sa con in spa ii libere. sistemul nu face diferen a ntre litere mari i mici. daca o tabel a fost creat mai nti ca fiind una simpl i apoi a fost inclus ntr-o baz de date, odat definite numele lungi pentru cmpurile acesteia, cele vechi (de maxim 10 caractere) nu mai pot fi folosite. Comentarii i observaii referitoare la tabelele legate i la cmpurile componente Dei comentarea tabelelor i a cmpurilor acestora ntr-o baz de date nu este una dintre cele mai puternice facilit i, este bine ca ea sa fie folosit pentru o mai uoar documentare ulterioar sau pentru o mai bun n elegere a modului de concepere.

2-38

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice fiecare dintre aceste evenimente se pot specifica secven e de cod care se execut la apari ia evenimentului respectiv. Observa ie : secven ele de cod asociate evenimentelor de manipulare a tabelei legate se declaneaz dup valid rile la nivel de cmp i la nivel de nregistrare. 2.6 Comenzi pentru vizualizarea i modificarea datelor din tabele

EDIT [FIELDS <field list>][<scope>][FOR <expL1>][WHILE <expL2>] [FONT <expC1> [,<expN1>]][STYLE <expC2>][FREEZE <field>] [KEY <expr1> [,<expr2>] [NOAPPEND] [NOCLEAR] [NODELETE] [NOEDIT | NOMODIFY] EDIT este comanda ce permite afiarea i modificarea con inutului unui articol al tabelei sau al unui fiier creat cu CREATE QUERY/VIEW dac nu se indic un interval <scope> sau o condi ie FOR, WHILE se pot parcurge toate articolele din tabel ; se trece de la un cmp la altul cu tasta TAB, se trece la precedentul sau urm torul articol cu s geata sus sau jos; nchiderea ferestrei de editare se face cu CTRL/END pentru a salva toate modific rile sau cu ESC pentru abandon; daca nu s-a specificat NOAPPEND, se pot ad uga articole n tabela prin CTRL/N. La terminarea comenzii se revine la locul de unde a fost lansat ; NOMENU mpiedica accesul la linia menu; NOEDIT mpiedica modificarea datelor; NODELETE mpiedica marcarea pentru tergere; NOCLEAR p streaz 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>] 2-40

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice BROWSE este comanda ce permite modificarea sau ad ugarea de articole ntro tabel : dac nu este deschis nici o tabel se solicit numele celei dorite; cmpurile calculate sunt accesibile doar la citire; afiarea se face sub forma de tablou, n ordinea cmpurilor din tabel sau a celor specificate n FIELDS, clauzele Font i Style determinnd tipul i dimensiunea literelor ; comanda este asem n toare cu EDIT; WIDTH limiteaz dimensiunea coloanelor pentru cmpurile caracter; FREEZE permite men inerea 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 ad ugarea unuia sau mai multor articole din fiierul surs specificat la sfritul tabelei active. se pot adaug date i din fiiere de alt tip, nu doar din DBF. Dac sursa i destina ia sunt DBF, se copie doar cmpurile comune celor dou tabele ; dac SET DELETED este OFF se copie i articolele marcate pentru tergere (dar nu i marcajul) ; dac un cmp din surs este mai mare dect omologul sau din destina ie, datele de tip caracter n exces se pierd iar cele numerice sunt nlocuite de asteriscuri; dac structurile celor dou fiiere nu corespund se afieaz mesajul 0 row(s) inserted. Coloanele ce nu apar n tabel sunt ignorate; dac nu se indica TYPE se presupune ca este un fiier surs tip dbf; se pot importa date din fiiere de mai multe tipuri; pentru o mai bun delimitatorul. inserare a datelor se specific , unde este cazul,

INSERT [BEFORE][BLANK] sau APPEND [BEFORE][BLANK] INSERT adaug un nou articol n tabel , n pozi ia de articol curent f r op iuni se lanseaz introducere datelor n tabel 2-41

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

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

2-43

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

2.7

Exerciii

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

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

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

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

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

2-45

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

Indexarea reprezint opera ia de ordonare logic a datelor dintr-o tabela dup diferite criterii, opera ie ce nu afecteaz ordinea fizica a datelor din tabel , ci doar modul n care acestea sunt v zute. Ordonarea unei tabele presupune stabilirea criteriilor n care aceasta va fi parcurs . Cheia de ordonare sau Criteriul de ordonare poate fi un cmp al tabelei sau o expresie rezultat din combinarea mai multor cmpuri. Pentru stabilirea ordinii nregistr rilor tabelei se evalueaz cheia de ordonare pentru fiecare nregistrare n parte. Valorile ob inute se compar ntre ele, iar ordinea nregistr rilor n tabela se stabilete n func ie de rezultatul ob inut. Prin indexare se construiete un fiier special, numit fiier de index, ce va fi folosit n scopul reg sirii datelor n ordinea stabilit de cheia de ordonare. Un index poate fi considerat ca un filtru ce poate fi aplicat unei tabele pentru ca datele respective s poate fi privite ntr-o anumit ordine. Fiierele index ce pot fi asociate unei tabele pot fi: fiiere index simple (extensia IDX) con in o singura cheie de indexare; fiiere index simple compacte (extensia IDX)- care utilizeaz tehnologia de compresie dinamic de la indecii compui (vezi mai jos !!) ; fiiere index compuse (extensia CDX)- care memoreaz chei de indexare (etichete, tag-uri) ntr-un singur fiier index, la un moment dat fiind activ una singur .

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice ordinea dorit . La un moment dat doar unul dintre indeci poate fi activ i acest index se numete index activ. To i indecii asocia i unei tabele sunt memora i n acelai fiier, care are acelai nume ca i tabela dar cu extensia cdx. Fiec rui index dintr-un fiier de index i se atribuie un nume (eticheta index), nume prin care se face referirea n comenzile de prelucrare. Indecii pot fi de mai multe tipuri, i anume : normali (Regular) care construiesc pentru fiecare nregistrare din tabela cte o nregistrare n fiierul index respectiv, indiferent de duplicarea sau multiplicarea valorii cheii de indexare. ntr-o astfel de tabel sunt accesibile toate nregistr rile, indiferent de valoarea cheii de indexare; unici (Unique) care permit doar o valoare unic cheii de indexare. Dac dou sau mai multe nregistr ri ale tabelei au aceleai valori ale cheii de indexare, numai prima dintre acestea va fi disponibil , restul neap rnd n tabel (dei fizic exist ) ; candidat este un index asem n tor cu cel unic, dar interzice nc rcarea de nregistr ri ce dubleaz valoarea cheii de indexare, caz n care se genereaz un mesaj de eroare; primar (cheie primara) n cadrul unei tabele pot exista mai multe cmpuri (sau mai multe criterii) care s asigure identificarea unic a nregistr rilor. Dintre acestea se alege unul care sa fie folosit drept cheie primar a tabelei atunci cnd se creeaz o rela ie ntre tabela respectiv i o alt tabela din baza de date.

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

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

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

3-48

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice USE agenda INDEX agenda ORDER TAG telefon eticheta TELEFON din indexul AGENDA.CDX- va fi indexul activ compus structural

USE agenda INDEX agenda_d ORDER TAG data_nast eticheta DATA_NAST din indexul compus AGENDA_D.CDX- va fi indexul activ

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

3-49

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

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

3-50

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

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

3.3

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

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

Variabile de memorie reprezint zona de memorie c reia i se atribuie un nume i care poate stoca o valoare de un anumit tip. Deci elementele unei variabile sunt: numele folosit pentru identificare i atribuit de programator sau predefinit de proiectan ii FoxPro. Numele variabilelor este format din maxim 8 caractere de tip liter , cifr sau caracterul _, cu primul caracter diferit de cifr ; con inutul sau valoarea variabilei reprezint data ce este memorat n zona de memorie a variabilei;

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

3-54

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice se evalueaz expresia <e>, ob inndu-se o valoare de un anumit tip; se caut n memorie variabila cu numele <var> i, dac se g sete, se nlocuiete vechiul con inut al acesteia cu valoarea expresiei; dac nu se g sete variabila respectiv , FoxPro creeaz una nou cu numele <var>, n care depune valoarea expresiei; tipul variabilei este dat de tipul valorii expresiei, indiferent de tipul anterior al variabilei, n cazul n care aceasta exista i nainte de execu ia comenzii. de obicei pentru variabilele de memorie se folosete simbolul M

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

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

3-55

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

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

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

MODIFY COMMAND /FILE <filename> [WINDOW <window name>] Comanda apeleaz editorul de texte din FOX. n varianta COMMAND se caut implicit extensia.PRG. Dac fiierul indicat nu exist , acesta se creeaz . Se scriu liniile de comand iar la tastarea CTRL/ END se ncheie editarea, se salveaz fiierul pe disc i se revine la prompter. Meniul ofer comenzi similare. Etapele elabor rii i rul rii unui program sunt urm toarele: se concepe algoritmul de rezolvare a problemei propuse; se transpune algoritmul ntr-un ir de instruc iuni ce reprezint programul; se introduce programul ntr-un fiier; se compileaz programul; 3-57 chiar

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice se execut programul.

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

3.6

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice externi numele fiierului i ordinea sort rii. La execu ia comenzii DO parametrii sunt transmii c tre program prin lista de parametri a clauzei WITH. Aceast list poate con ine expresii, constante, cmpuri ale unui tabel de date, separate prin virgul . Execu ia unui program se va opri n una din urm toarele situa ii: la execu ia unei comenzi RETURN, CANCEL, QUIT cnd se ntlnete sfritul fiierului; cnd se ntlnete o alta comanda DO ; prin ap sarea tastei ESC dac SET ESCAPE este ON. Execu ia unui program din interiorul altui program folosind comanda DO reprezint un pas important n structurarea aplica iilor de dimensiuni mari. Pe m sur ce dimensiunea unei aplica ii crete, testarea i depanarea acesteia devine din ce n ce mai dificil datorit num rului mare de variabile i instruc iuni folosite. Utilizatorul poate defini anumite proceduri i func ii ce pot fi executate de mai multe ori n cadrul unui program, apelndu-le din diverse puncte de program, cu diverse valori ale parametrilor. Scrierea unei proceduri ncepe cu : PROCEDURE <procedure name> i se ncheie obligatoriu cu RETURN. Procedurile i func iile unui program se introduc, de regul , dup ultima instruc iune a programului, n acelai fiier cu acesta. Acestea pot fi introduse i n fiiere separate care vor fi asociate programului apelant prin comanda: SET PROCEDURE TO [<fiier>] Aceast comand asociaz programului curent n execu ie, fiierul <fiier> unde se vor c uta procedurile ce nu se g sesc n programul apelant. Parametrii sunt variabile de comunicare ntre programe, definite de utilizator, ce realizeaz interfa a programului cu exteriorul. ntr-o procedur se pot defini dou tipuri de variabile : globale (publice), ce pot fi accesate i modificate n orice procedur n curs de execu ie PUBLIC <lista variabile>; locale (private), ce nu pot fi accesate dect n procedura curent i n cele subordonate acesteia PRIVATE <lista variabile>. 3-59

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Exemplu: SET TALK OFF CLEAR PRIVATE a PUBLIC b a=1 b=2 DO TEST NOTE aici se cunosc variabilele a,b,d dar nu i c ?a ?b ?c ?d WAIT RETURN PROCEDURE TEST PRIVATE c PUBLIC d c=3 d=4 NOTE aici se cunosc toate variabilele a,b,c,d ?a ?b ?c ?d WAIT RETURN RETURN [ <expresion > / TO MASTER /TO <procedure name>] Instruc iunea returneaz controlul programului apelant sau la prompter. TO MASTER permite revenirea n programul apelant de cel mai nalt nivel. TO <procedure name> permite revenirea n procedura activ indicat la sfritul unei func ii i ntoarcerea unui rezultat. 3.7 Comenzi de intrare/ieire ? /?? [<exp1> ][PICTURE <expC1>][FUNCTION <expC2>] [AT <expN2> ] Comanda afieaz valoarea pentru una sau mai multe expresii separate prin virgul .? produce afiarea pe linia urm toare in timp ce ?? afieaz pe linia curent . 3-60

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

@ <row, column> SAY <expr>[FUNCTION <expC1>] [PICTURE <expC2>] [SIZE <expN1>, <expN2>][FONT <expC3> [, <expN3]] [STYLE <expC4>] [COLOR SCHEME <expN4>| COLOR <color pair list>] @ <row, column> GET <memvar> | <field>[FUNCTION <expC1>] [PICTURE <expC2>] [FONT <expC3> [, <expN1>]] [STYLE <expC4>] [DEFAULT <expr1>] [ENABLE | DISABLE] [MESSAGE <expC5>] [[OPEN] WINDOW <window name>] [RANGE [<expr2>] [, <expr3>]] [SIZE <expN2>, <expN3>] [VALID <expL1> | <expN4> [ERROR <expC6>]] [WHEN <expL2>] [COLOR SCHEME <expN5> | COLOR <color pair list>] SAY afieaz informa ii iar GET permite introducerea sau editarea valorii datelor; row i column sunt expresii numerice (se poate folosi i $ pentru pozi ia curent ) ; coordonatele sunt totdeauna relative la col ul din stnga sus al ecranului sau al ferestrei active (0,0) ; GET permite afiarea i actualizarea datelor con inute n cmpuri sau atribuite unor variabile de memorie temporare ; comanda READ activeaz toate GET anterioare ; 3-61

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

M ti

MESSAGE este o expresie caracter afiat la execu ia READ cnd cursorul este plasat in cmpul GET asociat acestui mesaj; WINDOW permite deschiderea unei ferestre pentru editarea cmpurilor MEMO; dac se indic i OPEN fereastra se deschide automat; PICTURE se folosete pentru a limita tipul datelor ce pot fi nc rcate (de exemplu doar cifre) i pentru a formata afiarea. Se pot folosi m ti sau func ii de formatare pentru introducerea datelor, i anume: ! # $ * convertete litere mici in litere mari; permite doar cifre, spatii i semn; afieaz irul de caractere corespunz tor CURRENCY in locul zerourilor nesemnificative; lui SET

afieaz asteriscuri in locul zerourilor nesemnificative;

3-62

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice , . A L N X Y afieaz virgula dac exista cifre la stnga ei; indica pozi ia zecimala; autorizeaz doar litere; autorizeaz doar date logice; autorizeaz doar litere i cifre; orice caracter; autorizeaz doar date logice;

Masca trebuie sa aib attea caractere cte sunt specificate n structura cmpului respectiv. Dac se lucreaz cu numere, n masc trebuie inclus i punctul zecimal i trebuie l sat loc i pentru semn. Func ii ! # $ ( A B D I J T Z Exemplu : CLEAR SET TALK OFF NUME=SPACE(10) VARSTA=0 DO WHILE VARSTA <> 99 @ 6,5 SAY "NUMELE : " GET NUME PICTURE "AAAAAAAAA" @ 8,5 SAY "VARSTA : " GET VARSTA PICTURE "99" MESSAGE "pentru ieire : vrsta este de 99 ani" READ @ 10,5 SAY NUME+" ARE " @ 10, $+1 SAY VARSTA 3-63 accept orice litera i convertete litere mici in litere mari; permite doar cifre, spatii i semne; afieaz numerele in format monetar; plaseaz numerele negative in paranteze; autorizeaz doar litere; aliniaz la stnga textul din interiorul cmpului; afieaz data in formatul curent; centreaz textul in interiorul cmpului; aliniaz la dreapta textul din interiorul cmpului; elimina spa iile de la nceputul i de la sfritul cmpului; afieaz spatii in locul valorilor nule;

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

Activeaz toate comenzile @... GET executate dup CLEAR, CLEAR GETS, CLEAR ALL sau READ.

ultima comand

SAVE face sa nu se dezactiveze instruc iunile GET la urm toarea execu ie pentru READ. CLEAR GETS terge toate comenzile @.... GET emise dup ultima comand CLEAR, CLEAR ALL, CLEAR GETS sau READ dar nu terge variabilele de memorie sau elementele de tablou. 3-64

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 3.8 Controlul fluxului DO CASE CASE <expL1> <statements> [CASE <expL2> <statements>] .. [OTHERWISE <statements>] ENDCASE Se execut comenzile asociate primei condi ii satisf cute (dac nu este nici una, se execut , dac clauza OTHERWISE i comenzile asociate acesteia). Exemplu: SET TALK OFF CLEAR DIMENSION A[4] A[1]="PRIMAVARA" A[2]="VARA" A[3]="TOAMNA" A[4]="IARNA" ANOTIMP=A[1] @ 6,26 GET ANOTIMP FROM A FUNCTION "&" READ @ 15,10 SAY "ACEST ANOTIMP CONTINE LUNILE:" DO CASE CASE ANOTIMP="PRIMAVARA" ?? "MARTIE,APRILIE,MAI" CASE ANOTIMP="VARA" ?? "IUNIE,IULIE,AUGUST" CASE ANOTIMP="TOAMNA" ?? "SEPTEMBRIE,OCTOMBRIE,NOIEMBRIE" OTHERWISE ?? "DECEMBRIE,IANUARIE,FEBRUARIE" ENDCASE DO WHILE <expL> <statements> [LOOP] [EXIT] ENDDO Se execut comenzile atta timp ct condi ia este adev rat . ENDDO i LOOP redau controlul programului spre comanda DO WHILE pentru ca acesta s reevalueze condi ia. EXIT transmite controlul instruc iunii care urmeaz dup ENDDO ( obligatorie pentru o bucla gen DO WHILE.T. ); Sunt autorizate structurile DO WHILE imbricate. 3-65

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Se poate utiliza de la prompter. EXEMPLU: SET TALK OFF CLEAR A=0

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

O interogare SQL nu este neap rat o ntrebare pus bazei de date. Ea poate fi i o comand pentru executarea uneia dintre ac iunile urm toare: construirea unei tabele; inserarea, modificarea sau s tergerea de linii sau cmpuri; c utarea n cteva tabele o anumitor informa ii i returnarea rezultatele ntr-o anumit ordine;

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

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

3-68

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Exemplu: Ordonarea agen ilor cresc tor dup nume, prenume i descresc tor dup salariu. SELECT NUME, PRENUME, SAL_BAZA FROM AGENTI ORDER BY NUME ASC,PRENUME, SAL_BAZA DESC Exemple de interog ri: Care sunt numerele de cod ale agen ilor care au contractat tranzac ii cu dischete ? SELECT NR_AGENT FROM TRANZACT WHERE COD_PRODUS IN (SELECT COD_PRODUS FROM MARFURI WHERE DENUMIRE=DISCHETE) Care sunt numele agen ilor din Iai care lucreaz cu clien i de tip regii autonome? SELECT NUME, NR_AGENT, ORAS, DENUMIRE FROM AGENTI, CLIENTI WHERE ORAS=IASI AND TIP=RA Care sunt clien ii din localit ile n care nu domiciliaz nici un agent comercial ? SELECT DENUMIRE, NR_CLIENT, ORAS, JUDET FROM CLIENTI WHERE ORAS NOT IN (SELECT ORAS FROM AGENTI )

3.10

Depanarea programelor

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

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

Se ob ine folosind op iunea THROTTLE ce const n executarea programului pas cu pas, dup executarea fiec rei instruc iuni f cndu-se o pauz stabilit de utilizator.

3-70

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice dorete ntoarcerea la caseta anterioar ) iar la ultima caset se apas butonul Finish. Table wizard v ajut s crea i un tabel. Fereastra Table Wizard con ine o list a tabelelor tipice cu exemple de cmpuri frecvent utilizate. Selecta i cmpurile dorite i ele vor fi incluse n noul tabel. Pute i modifica numele cmpurilor, tipul i lungimea lor precum i ordinea de sortare a datelor. Caseta de dialog 3 are 4 op iuni i anume: Save table salveaz tabelul; Save and browse for data entry salveaz tabela i afieaz ecranul pentru introducerea datelor ;

Form Wizard

Modify structure of table modifica structura tabelului.

Save and create an Autoscreen for data entry salveaz tabelul i creeaz un ecran standard pentru introducerea datelor;

v ajut s crea i un ecran pentru a gestiona informa iile din tabela dvs. la acest tip de Wizard se afieaz mai nti un ecran din care alegem tipul de ecran i anume: Form Wizard-form asociat unui singur tabel; One to many Form Wizard-forma ce are asociate dou tabele (p rinte i copil, rela ionate) ;

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

3-72

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Modify form with design tools modific instrumentele de proiectare .

ecranul cu

Report Wizard La acest tip de Wizard se afieaz mai nti un ecran din care alegem tipul de raport i anume: Group /Total Report Wizard raport cu grupuri i totaluri, care v ajut s crea i o structur care poate grupa nregistr rile pn la trei nivele de grupare i op ional calculeaz totaluri par iale i generale pentru cmpurile numerice; asist la crearea unui

Multi Column Report Wizard v raport cu maxim trei coloane; Report Wizard - raport .

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

3-73

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 3.12 Exerciii

1.

Folosind tabelele create n lucr rile anterioare, introduce i date n fiecare tabel, afia i structurile tabelei, testa i pe rnd fiecare comand prezentat mai sus. Avnd unul dintre fiierele create la lucr rile anterioare: crea i o copie (folosind instruc iunea COPY...) ; crea i un index (CDX) ; compara i fiierul DBF dup crearea indexului cu copia fiierului original; terge i (DEL) fiierul index; da i comanda USE cu fiierul DBF pentru care a i creat indexul.

2.

3.

Da i comanda PACK (f r s fie marcat pentru tergere vreun articol) pentru unul din fiierele DBF. Urm ri i lungimea fiierului nainte i dup executarea comenzii. Pentru fiierul agen i, crea i urm toarele indexuri i afia i con inutul tabelei cu fiecare index dintre : nume+prenume, nume+num r de identificare (marca) , nume+data naterii descresc tor, nume+data angaj rii +salar (descresc tor) Scrie i procedurile pentru marcarea la tergere, n tabela cu agen ii firmei, a urm toarele articole: agen ii avnd acelai nume, agen ii ce au numele asem n tor cu unul introdus de la tastatura. Testa i comenzile REINDEX i PACK Folosind unul dintre fiierele existente, testa i comanda ZAP n ambele variante, pentru SET SAFETY ON i OFF Folosind baza de date Biblioteca creat n lucrarea anterioar : stabili i rela iile dintre tabele. stabili i regulile de integritate referen ial . nchide i i redeschide i baza de date. Verifica i dac stabilite anterior sunt prezente. rela iile

4.

5.

6. 7. 8.

9.

Crea i o baz de date numit Firma care s cuprind tabelele Agen i, Clien i, M rfuri, Tranzac ii, Facturi cu structura de mai jos. Studia i tabelele i crea i pentru fiecare indecii necesari, apoi rela iona i tabelele. 3-74

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

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

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

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

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

3-77

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Metode i evenimente asociate unui obiect Fiecare obiect poate recunoate i poate reac iona la unul sau mai multe evenimente. Un eveniment este o ac iune specific i predeterminat , ini iat de utilizator sau de sistem. n Visual Fox Pro ac iunile utilizatorilor ce pot declana evenimente sunt micarea mouse-ului, ap sarea unei taste, etc. Evenimentele declanate de sistem sunt ini ializarea unui obiect sau ntlnirea unei linii de cod ce genereaz o eroare. Metodele sunt procedurile ataate unui obiect. Metodele difer de procedurile obinuite deoarece sunt legate indisolubil de obiect i sunt apelate altfel dect celelalte proceduri. Evenimentele pot avea metode asociate. De exemplu, dac scrie i cod pentru metoda asociat evenimentului Click, codul respectiv se execut la apari ia evenimentului click. Tabelul de mai jos prezint cteva evenimente asociate unei caseta de validare: Eveniment Click GotFocus LostFocus Refresh SetFocus Descriere Utilizatorul execut click n caseta de validare Utilizatorul selecteaz caseta de validare printr-un click de mouse sau prin ap sarea tastei TAB Utilizatorul selecteaz alt control Valoarea casetei de validare este actualizat pentru a reflecta modific rile survenite n cadrul sursei de date asociate Casetei de validare i se atribuie focusul (devine inta intr rilor) ca i cum utilizatorul ar fi ap sat tasta TAB

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

4-79

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Subclasele sunt derivate dintr-o clasa existent . Subclasele motenesc toate func ionalit ile clasei p rinte, dar pot avea i propriet i noi, pe care programatorul le poate seta, reutiliznd astfel codul deja existent. Motenirea este caracteristica ce permite ca o modificare efectuat asupra unei clase s se reflecte n toate clasele definite pe baza ei, actualizarea automat ducnd la economisirea timpului i a efortului dvs.

n Visual Fox Pro clasele pot fi de tip control sau container, dup cum se arat n lista urm toare: Controale: Check Box, Combo Box, Command Button, Edit Box, Header, Hyperlynk, Image, Label , Line, List Box, OLE Bound Control, OLE Container Control, Shape, Spinner, Text Box, Timer Containere: Container, Form Set, Form ,Grid, Column, Page Frame, Page, Toolbar, Option Button Group, Command Button Group

Clasele containere pot s con in alte obiecte, permi nd accesul la acestea. De exemplu, n cazul n care crea i o clas container care cuprinde o caset list i dou butoane de comand , dup care ad uga i unui formular un obiect bazat pe aceast clas , fiecare obiect poate fi manipulat individual, att la proiectare ct i n timpul execu iei. Toate clasele recunosc urm torul set minimal de evenimente: Eveniment Init Destroy Error Descriere Apare la crearea unui obiect Apare la desc rcarea unui obiect din memorie Apare de cte ori se semnaleaz o eroare

Toate clasele recunosc urm torul set minimal de propriet i: Proprietate Class BaseClass ClassLibrary ParentClass Descriere Tipul clasei Clasa de baz din care provine (Form, CommandButton, etc.) Biblioteca de clase n care este stocat Clasa din care a fost derivat (dac deriv dintr-o clas de baz , ParentClass este aceeai cu BaseClass)

4-80

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

Exit

Subclasa

Obiect n formular

4.1

Crearea claselor

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

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

Butoanele vor avea caracteristici comune, de aceea merit s cre m o clas pentru toate butoanele de navigare. Clasa p rinte este numit Navbutton i va fi definit ulterior. Odat definit clas p rinte, subclasele ce urmeaz definesc func ionalitatea i aspectul specific fiec rui buton. Va fi creat o clas container, 4-82

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

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

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

4-83

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

4-84

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

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice automat leg tura ntre sursa de date i ceea ce va fi afiat pe ecran. Pentru a accesa fereastra de proiectare a mediului de date alegem din meniu op iunea View, Data Environment, apoi click dreapta i Add. n caseta de dialog Open alege i tabela dorit , repetnd opera ia de ad ugare pn ce lista de tabele este epuizat . Cele mai importante propriet i ce trebuie setate pentru mediul de date sunt:
Proprietate AutoCloseTables Descriere Controleaz nchiderea automat a tabelelor la eliberarea formularului din memorie Controleaz deschiderea automat a tabelelor la rularea formularului Indic tabela selectat la rularea formularului Valoare implicit Adev rat(.T.)

AutoOpenTables InitialSelectedAlias

Adev rat(.T.) Dac nu se specific , n momentul execu iei este selectat primul cursor ad ugat n DataEnvironment

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 4.3 Utilizarea controalelor predefinite

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice o tabel , prin salvarea propriet ii Caption. Pentru aceasta va trebui s : Atribuim un sir vid propriet ii Value a grupului de butoane; Atribuim Propriet ii ControlSource a grupului de butoane un cmp de tip caracter dintr-o tabel .

Casete list i casete cu list derulant Casetele tip list i casetele tip list derulant (casete combinate, pentru care proprietatea Style are valoarea 2 DropdownList) ofer utilizatorului liste cu cuprind informa ii ce pot reprezenta valori dintr-un tabel sau op iuni predefinite. ntr-o caseta tip list , n orice moment, sunt vizibile mai multe elemente ale listei. ntr-o caseta derulant este vizibil doar un singur element. Utilizatorul poate executa click pe butonul s geata n jos pentru a afia toate elementele listei. Propriet i i metode ale unei liste : Proprietate ColumnCount ControlSource Multiselect RowSource RowSourceType Metode AddItem RemoveItem Requery Descriere Num rul de coloane din caseta list P streaz valoarea aleas de utilizator din cadrul listei Indic dac utilizatorul poate selecta mai multe elemente la un moment dat Sursa de provenien a elementelor afiate n list Indic tipul pentru RowSource (o valoare, o tabela, o interogare, etc.) Descriere Adaug un element la o list pentru care proprietatea RowSourceType este 0 Elimin un element dintr-o list pentru care proprietatea RowSourceType este 0 Actualizeaz lista dac valorile din RowSourceType s-au modificat

Alegerea tipului de date pentru o caset list sau caset cu list derulant se face prin setarea propriet ii RowSourceType i prin atribuirea unei surse de date, completnd valoarea corespunz toare pentru proprietatea RowSource. 4-88

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice RowSourceType 0 1 2 3 4 5 6 7 8 9 Sursa elementelor listei Nici una. Elementele listei se adaug prin program Valoare Alias Instruc iune SQL Interogare (Query)(.qpr) Matrice Cmpuri dintr-o tabel Fiiere Structur Lista pop-up (inclus pentru compatibilitate versiunile anterioare)

cu

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

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

Se poate oferi utilizatorului posibilitatea de a alege o op iune din list , pentru care s fie afiate o serie ntreag de alte informa ii. De exemplu, dac lista este populat cu numele pacien ilor trata i de un medic i dorim s afi m toate informa iile legate de pacient, putem proceda astfel, n func ie de sursa de date a formularului: RowSourceType
2-Alias 6-Cimpuri

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

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

4-90

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Casete de validare Casetele de validare sunt folosite pentru a permite utilizatorului s specifice o stare de tip logic (True sau False, activat sau dezactivat, etc). Totui exist cazuri n care nu se poate evalua cu precizie starea dorit , motiv pentru care exist patru st ri posibile pentru caseta de validare i anume : Forma afiat Proprietatea Value 0 sau.F. 1 sau.T. 2 Null Proprietatea Value a casetei de validate indic tipul de date corespunz tor ultimei atribuiri efectuate. Daca s-a setat valoarea .T. sau .F. tipul de data este Logical, i nu se va schimba dect atunci cnd ve i atribui propriet ii o valoare numeric .

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

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

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

Cele mai importante propriet i pentru casetele tip text sunt : Proprietate Alignment Descriere Seteaz tipul de aliniere a valorilor introduse n caseta (stnga, dreapta, centru, automat). Alinierea depinde de tipul de dat introdus. Cmpul tabelei sau variabila a c rei valoare este afiat

ControlSource

4-92

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice InputMask SelectOnEntry TabStop Indic regulile de introducere a datelor Stabilete dac la primirea focusului con inutul casetei va fi selectat automat Indic dac utilizatorul poate ajunge la caseta ap snd repetat tasta TAB. Dac TabStop este .F. , ea poate fi totui selectata efectund click pe ea.

Caseta de editare Casetele de editare permit afiarea i editarea unui text provenit din cmpuri lungi de caractere sau cmpuri memo. Aceste casete asigur saltul automat al textului pe rndul urm tor i posibilitatea de deplasare n cadrul textului folosind s ge ile. Casetele de editare, ca i casetele text au propriet i ce permit lucrul cu textul selectat i anume: SelLenght, SelStart i SelText De exemplu, putem selecta primul cuvnt dintr-o caseta astfel: Form1.text1.SelStart=0 Form1.text1.SelLenght= AT( ,Form1.Text1.text)-1 Cele mai importante propriet i ce pot fi configurate pentru casetele de editare sunt : Proprietate AllowTabs Descriere Stabilete dac este permisa utilizarea tastei TAB n caseta de editare (caz n care trebuie verificat dac se poate trece la controlul urm tor cu CTRL+TAB) Stabilete dac textul din caseta de editare este selectat n mod vizibil atunci cnd caseta nu de ine focusul Stabilete dac textul din caseta poate fi modificat sau nu Indic prezenta sau absenta barelor de defilare

HideSelection ReadOnly ScrollBars

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

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

RowSource RowSourceType Style

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

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

Buton de comanda Grup de butoane de comanda Butoanele de comanda permit executarea unor ac iuni. De obicei codul asociat ac iunii este specificat n evenimentul Click. Cele mai importante propriet i ce pot fi configurate pentru butoanele de comanda sunt : Proprietate Cancel Caption DisablePicture DownPicture Enabled Picture Descriere Indic dac se execut sau nu codul asociat evenimentului Click la ap sarea tastei ESC Textul afiat pe buton Fiierul de tip imagine (bmp) afiat la dezactivarea butonului Fiierul de tip imagine (bmp) afiat la activarea butonului Dac butonul poate fi selectat sau nu Fiierul de tip imagine (bmp) afiat pe buton 4-95

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

Controlul imagine Permite afiarea imaginilor stocate ntr-un fiier de tip bmp pe un formular. Propriet ile acestui control pot fi schimbate prin cod n timpul execu iei astfel nct imaginea poate fi diferit de la un caz la altul. Cele mai importante propriet i ce pot fi configurate pentru controlul imagine sunt : Proprietate Picture BorderStyle Stretch Descriere Imaginea (fiierul bitmap) ataat Exist sau nu chenar vizibil 0-Clip - por iunile imaginii ce dep esc dimensiunile controlului nu sunt afiate 1-Isometric sunt p strate dimensiunile originale ale imaginii 2- Stretch imaginea este scalat corespunz tor dimensiunilor controlului

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Proprietate Caption Autosize Backtyle WordWrap Descriere Textul afiat drept etichet Dac dimensiunea etichetei este ajustata func ie de cea a textului din Caption Dac eticheta este opac sau transparent Dac textul afiat continu pe mai multe rnduri

Forme geometrice i linia Aceste controale ajut la gruparea vizual a elementelor formularului i pentru nfrumuse area lui. Cele mai importante propriet i ce pot fi configurate pentru forme geometrice sunt : Proprietate Curvature FillStyle SpecialEffect Descriere Valoare cuprins ntre 0 (unghi de 90 grade) i 99 (cerc sau oval) Modelul de umplere al formei geometrice Dac forma este plan sau tridimensional . Are efect doar pentru Curvature=0

Cele mai importante propriet i ce pot fi configurate pentru controlul linie sunt : Proprietate BorderWidth LineSlant Descriere Grosimea liniei n pixeli Direc ia liniei n cazul n care nu este orizontal sau vertical (valorile valabile pot fi / sau \)

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

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

LinkMaster RecordSource RecordSourceType

Cele mai importante propriet i ce pot fi configurate pentru coloanele dintr-o gril sunt : Proprietate ControlSource Sparse CurrentControl Descriere Datele ce vor fi afiate n coloan (cmp din tabele) Dac este .T. controalele grilei sunt afiate doar cnd celula respectivei coloane este selectat Stabilete care dintre controalele grilei este activ

Cadre de pagina Un cadru de pagin este un obiect container ce poate con ine mai multe pagini. La rndul lor, paginile pot con ine controale. Cele mai importante propriet i ce pot fi configurate pentru cadrele de pagin sunt : Proprietate Tabs TabStyle Descriere Indic dac fiele paginilor sunt vizibile sau nu Indic dac foile sunt toate de aceeai dimensiune i dac toate mpreun au l imea cadrului de pagin Num rul de pagini din cadrul de pagin

PageCount

4-98

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 4.4 Generatorul de rapoarte

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

Banda antet de pagina

Banda detaliu Banda subsol pagin

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

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

Data Grouping- duce la afiarea unei ferestre de dialog ce permite gruparea datelor din raport n func ie de anumite chei de grupare

4-100

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice ce sunt expresii formate din cmpuri ale tabelelor sau variabile definite. Pentru fiecare nou grup n raport apar dou benzi i anume Group Header n (antetul grupului de nivel n ) i Group Footer n (subsolul grupului de nivel n ) ; Variables se pot defini variabile necesare rul rii raportului sau afi rii unor anumite valori ; Default Font stabilete fontul implicit cu care se lucreaz n raport; Private Data Session - prin selectarea/deselectarea acestei op iuni se indica dac mediul de date folosit este privat sau nu; Quick Report duce la afiarea unei ferestre din care putem selecta : Titles dac dorim sau nu afiarea numelor de cmpuri; Add table to data environment dac ad ugarea tabelei la mediul de date; Run Report rularea raportului. Field Layout - modul de dispunere a cmpurilor n cadrul raportului (orizontal sau vertical ) ; Add Alias dac dorim sau nu prefixarea numelui cmpului cu cel al tabelei; dorim sau nu

Bara Report Controls con ine controalele necesare popularii benzilor raportului, i anume : Select selec ie obiecte

Etichet Cmp Elemente geometrice Imagine

folosit la introducerea textului afiarea cmpurilor din tabelele asociate pentru desenarea de linii, p trate, cercuri, etc, folosite pentru cosmetizarea raportului necesar afi rii de imagini grafice

4-101

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

Before Close Tables se pot efectua diverse calcule asupra datelor nainte de nchiderea tabelelor; After Close Tables - codul ce se efectueaz dup nchiderea tabelelor. Principalele propriet i ale mediului de date sunt : InitialSelectedAlias desemneaz tabela ce va fi deschisa ini ial; AutoOpenTables dac este .T. determin tabelelor specificate; AutoCloseTables- dac tabelelor specificate. deschiderea automat a a Close Tables se nchid efectiv tabelele;

este .T. determina nchiderea automat

Cmpurile unui raport (Fields) Cmpurile reprezint elementele variabile ale unui raport. Ele pot avea ca surs : un cmp din tabelele folosite;

4-102

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice o expresie format din cmpurile tabelelor din mediul de date caz n care expresia va fi evaluat de fiecare dat la rularea raportului pentru fiecare instan a benzii respective;

o variabil a raportului. Un cmp din raport se caracterizeaz prin : Sursa de date;

Formatul de afiare (caracter, numeric, dat calendaristic , aliniere) ; Func ia de calcul (sum , medie, num rare, etc) ;

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Reset page number to 1 on each group - pentru fiecare grup nou, numerotarea paginilor va ncepe de la 1. Reprint group header on each page - tip rete antetul grupului pe fiecare pagin , chiar dac nu ncepe un nou grup, imediat dup antetul de pagin .

Start group on new page when less than -ncepe grupul pe pagin nou cnd spa iul r mas pe pagina curent este mai mic dect valoarea indicat de proiectantul raportului. Rularea unui raport Comanda folosit este : REPO FORM <numeraport> Pentru previzualizarea raportului REPO FORM <numeraport> PREVIEW Pentru trimiterea listei direct la imprimant : REPO FORM <numeraport> TO PRINT Pentru salvarea listei direct ntr-un fiier de tip.txt REPO FORM <numefisier.txt> to <numefisier> Dac se dorete suprimarea afi rii listei pe ecran se va ad uga clauza Noconsole. De obicei comanda de rulare a raportului se introduce n metoda Click a butonului numit de exemplu Rulare Raport din programul de raportare. Programe de raportare n general, acelai raport poate fi folosit pentru mai multe tipuri de liste, datele de raportare diferind n func ie de anumite variabile ce pot fi setate. De exemplu, dac se dorete raportare unei situa ii a vnz rilor de medicamente dintr-o farmacie, se pot specifica o serie de parametri cum ar fi : anul, luna, intervalul (data de nceput i cea de sfrit), categoria de produse, etc. Etapele ce trebuiesc parcurse pentru realizarea raportului sunt urm toarele: Se construiete o form cu care se preiau de la utilizator variabilele necesare ( cele specificate anterior). Forma va trebui s con in n afar de cmpurile necesare prelu rii datelor i minim dou butoane pentru rularea raportului i nchiderea formei. Se efectueaz preluarea datelor din tabele n func ie de parametrii specifica i, adic se extrag datele, se grupeaz corespunz tor ntr-o tabel temporar , avnd grija ca numele cmpurilor s fie identice cu cele folosite n raport. Se d clic pe butonul de executare a raportului i se afieaz i verific lista.

4-104

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 4.5 Constructorul de meniuri

Meniul reprezint un ansamblu de op iuni pus la dispozi ia utilizatorului, op iuni la alegerea c rora sunt declanate diferite opera ii de prelucrare. Meniul apare n partea superioar a ferestrei unei aplica ii i are o structur standard, format dintr-o bara orizontal (submeniu orizontal) ce con ine mai multe op iuni. Fiecare op iune poate con ine un submeniu vertical, care va fi activat numai la alegerea op iunii respective. Proiectarea unui meniu const n specificarea elementelor componente (submeniuri i op iuni) i a caracteristicilor acestora (legate de aspect i comportament). Un meniu se construiete cu ajutorul constructorului de meniuri, care va genera un fiier de tip.mnx. Apoi se va genera meniul, ob inndu-se un fiier de tip.mnt. Obligatoriu, dup orice modificare efectuat n meniu, acesta va trebui generat din nou, altfel modificarea efectuat nu este luat n considera ie. Comanda de creare a unui meniu este : CREATE MENU <numemeniu> sau alegnd din meniul File op iunea New Meniu, se deschide o fereastr din care se alege op iunea : Shortcut dac se dorete construirea unui submeniu vertical; Modificarea unui meniu existent se face cu comanda : MODIFY MENU <numemeniu> sau alegnd din meniul File op iunea Open. Propriet ile generale ale unui meniu se stabilesc n fereastra de dialog General Options, ce se deschide la alegerea op iunii cu acelai nume a meniului View. Pozi ia noului meniu relativ la meniul standard al sistemului este stabilit prin intermediul butoanelor din sec iunea Location. Op iunile sunt : Replace Noul meniu l nlocuiete pe cel al sistemului; Append Noul meniu va fi ad ugat la cel al sistemului; Before Noul meniu va fi pozi ionat naintea op iunii din meniul sistem aleas din lista derulant ; Menu dac se dorete crearea unui meniu cu bar orizontal i submeniuri verticale;

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

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

Prima coloan con ine butonul de schimbare a pozi iei op iunii - prin tragerea cu mouse-ul ea poate fi deplasat n sus sau jos. n coloana Prompt se introduce textul explicativ al op iunii, text ca va fi afiat ca bar de meniu (ex : Ad ugare). Coloana Results cuprinde o list derulant ce con ine op iunile descrise mai jos, fiec reia dintre ele asociindu-se codul scris n coloana a patra, i anume : Command la alegerea acestei bare de meniu se va executa comanda specificat n coloana patru (de exemplu rularea unei forme cu comanda: do form ad ugare) ; Pad Name Se definete numele padului ; Submenu se va deschide un submeniu care trebuie configurat dup aceleai reguli; Procedure- se scrie procedura ce trebuie rulat la accesarea acestei bare de meniu; Coloana Options duce la deschiderea unei ferestre n care se pot face anumite set ri pentru respectiva bara de meniu, i anume : Key label : combina ia de taste, echivalent cu click cu mouse-ul pe op iunea respectiv , ce se determina prin ap sarea tastelor dorite; Key text textul suplimentar ce se va afia lng op iune indicnd combina ia de taste aleas ;

4-106

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

Comment se pot introduce texte explicative, pentru o mai buna n elegere a logicii programelor. Previzualizarea meniului se poate face n orice moment, chiar dac el nu a fost salvat, pentru verificarea codul scris i se realizeaz prin ap sarea butonului PREVIEW a submeniului Menu. n starea de previzualizare, meniul sistem este nlocuit cu cel n curs de editare. Ieirea din previzualizare se face prin ac ionarea butonului OK. Butoanele din sec iunea Item sunt folosite pentru ad ugarea de noi elemente (Insert i Insert Bar) sau pentru tergerea unor op iuni (Delete). Observa ii: scrierea caracterelor \< naintea unora dintre caracterele din irul din coloana Prompt determina ca acel caracter s fie folosit ca o tasta rapid de accesare a op iunii. Caracterul va ap rea ca fiind subliniat. scrierea caracteruli \ naintea textului din coloana Prompt determin ca op iunea respectiv s fie dezactivat , ea ap rnd pe ecran n culori terse. scrierea caracterelor \- n locul textului din coloana Prompt determin ca linia de meniu s fie considerat ca o bar delimitatoare ntre mai multe grupuri de op iuni ale aceluiai submeniu.

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

4-107

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Revenirea la meniul sistem se face cu comanda SET SYSMENU TO DEFAULT 4.6 Constructorul de proiecte

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

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

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

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

4-109

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

4.7

Exerciii:

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

4-110

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Capitolul 5 Limbajul SQL implementat n Oracle 5.1 Soluia complet Oracle

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

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

5-112

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Interac iunea SQL i SQL*Plus

SQL*Plus este un mediu care permite: Conectarea la SQL*Plus; Afiarea structurii unei tabele; Editarea instruc iunilor SQL; Executarea instruc iunilor SQL din SQL*Plus; Salvarea instruc iunilor SQL in fiiere; Executarea fiierelor salvate; nc rcarea comenzilor din fiier in buffer pentru editare; Executarea instruc iunilor SQL pentru a extrage, modifica, ad uga i terge date din baza de date; Formatarea, calcularea, stocarea i listarea rezultatele interog rilor sub forma de rapoarte; Crearea fiierelor de script pentru stocarea instruc iunilor SQL. Comenzi SQL*Plus Categorie Mediu Formatare Manipul ri de fiiere Execu ie Editare Interac iune Diverse Scop Afecteaz comportamentul general al instruc iunilor SQL pentru sesiunea respectiv Formateaz rezultatele interog rii Salveaz , nc rc i ruleaz fiiere de script Trimite instruc iuni SQL din bufferul SQL la serverul Oracle Modifica instruc iuni SQL in buffer Permite crearea i trimiterea variabilelor la instruc iuni SQL, afiarea variabilelor i listarea mesajelor pe ecran Are diferite comenzi pentru conectarea la baza de date, manipularea mediului SQL*Plus i afiarea coloanelor 5-113

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

Se completeaz : username, parola i baza de date Pentru conectarea ntr-un mediu de tip linie de comand urm toarea comand : se lanseaz

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

Comenzi SQL*Plus pentru fiiere


salveaz con inutul buferului SQL ntr-un fiier. scrie con inutul uni fiier n buffer SQL (extensia predefinit este.sql) ruleaz un fiier script la fel ca START lanseaz editorul i salveaz con inutul bufferului ntr-un fiier afiedt.buf lanseaz editorul pentru editarea con inutului unui fiier salvat

5-114

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice


SPO[OL] [filename]OFF | OUT EXIT stocheaz rezultatul unei interog ri ntr-un fiier. OFF nchide fiierul OUT nchide fiierul i l trimite la imprimanta sistem p r sete mediul SQL*Plus

5.3

Instruciuni SQL

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Tabelele folosite n acest carte sunt: EMPLOYEES , tabela care con ine detalii despre angaja i; DEPARTAMENTS, tabela care con ine detalii despre departamente; JOB_GRADES, tabela care con ine detalii despre salarii i trepte de salarizare: 5.4 Sintaxa de baz a instruciunilor SQL

Comanda SELECT extrage informa ii din bazele de date. Folosind comanda SELECT, se pot face urm toarele : SELECTIE (SELECTION): poate fi folosit pentru a alege liniile necesare din tabelele de date. Se pot folosi criterii diferite de selec ie. PROIECTARE (PROJECTION): poate fi folosit pentru a alege coloanele din tabele necesare n interogarea rezultat. Se pot alege oricte coloane de tabele. COMBINAREA (JOIN): poate fi folosit pentru a uni datele aflate n tabele diferite prin crearea unei leg turi ntre coloanele tabelelor de unde provin datele. Select - Sintaxa de baza SELECT [ DISTINCT ] {*, column [alias] , ..} FROM table ; SELECT pentru identificarea coloanelor FROM pentru identificarea tabelelor ntr-o form simpl , instruc iunea SELECT include urm toarele clauze : SELECT, care specific ce coloane vor fi afiate; FROM, care specific tabelele ce con in coloanele scrise n clauza SELECT. Din punct de vedere sintactic: SELECT este o list de una sau mai multe coloane; DISTINCT suprim duplicatele; * selecteaz toate coloanele; column numele coloanei/coloanelor; alias d coloanei selectate un alt nume; FROM specific tabela/tabelele care con ine/con in coloanele.

5-116

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice NOT : n aceast carte, cuvintele : cuvnt cheie, clauza , instruc iune vor fi folosite astfel: Un cuvnt cheie se refera la un element SQL individual. De exemplu, SELECT i FROM sunt cuvinte cheie. O clauz este o parte dintr-o instruc iune SQL.. De exemplu, SELECT employee_id, first_name,.. reprezint o clauz . O instruc iune este o combina ie de dou sau mai multe clauze i cuvinte cheie. De exemplu, SELECT * FROM employee este o instruc iune SQL.

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

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

5-117

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Exemplu : pentru selectarea tuturor coloanelor i liniilor dintr-un tabel scriem select * from departments; Se pot afia toate coloanele din tabela folosind cuvntul cheie SELECT urmat de un asterix (*). n exemplu, tabela departments con ine coloanele: DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID. Tabelul con ine linii pentru fiecare departament. Se pot afia toate coloanele din tabela scriind toate coloanele dup cuvntul cheie SELECT. Instruc iunea SQL de mai sus afieaz toate coloanele i toate liniile din tabela DEPARTMENTS. 5.5 Obiective: Descrierea obiectelor din baza de date; Crearea tabelelor; Descrierea tipurilor de date ce pot fi utilizate n momentul definirii specifica iilor pentru coloane; Modificarea structurii unei tabele; tergerea, redenumirea i trunchierea tabelelor. Crearea i gestionarea tabelelor

Obiectele bazei de date Obiect Table View Sequence Index Synonym Descriere Unitatea de baza pentru stocare compus din linii i coloane. Reprezentare logic tabele. a unor date dintr-una sau mai multe

Genereaz valori pentru chei primare. M rete viteza n cazul interog rilor. Nume alternative date obiectelor.

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

5-118

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Structura tabelelor in Oracle9i

DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID -------------------------------------------------------10 Administration 200 1700 20 Marketing 201 1800 30 Purchasing 114 1700 40 Human Resources 203 2400 50 Shipping 121 1500 60 IT 103 1400 70 Public Relations 204 2700 80 Sales 145 2500 90 Executive 100 1700 100 Finance 108 1700 110 Accounting 205 1700 Tabelele pot fi create n orice moment, chiar n momentul cnd utilizatorul folosete baza de date. Nu este obligatorie specificarea m rimii unei tabele. Este important de tiut ce spa iu va ocupa tabela dup un timp. Structura unei tabele poate fi modificat dinamic. Conven ii pentru denumirea tabelelor Numele trebuie sa nceap cu o liter ; Numele poate avea lungimea de 1-30 caractere; Caracterele permise sunt numai A-Z, a-z, 0-9, $ i #; Un utilizator nu poate avea n schema sa dou tabele cu nume identice; Numele tabelei nu poate fi un nume rezervat (de exemplu: select, create, define). Se folosesc nume descriptive pentru tabele sau alte obiecte din baza de date; Se folosesc aceleai nume pentru aceleai entit i din tabele diferite. De exemplu, coloana cu num rul departamentului este denumita DEPTNO att In tabela EMPLOYEES ct i n tabela DEPARTMENTS.

5-119

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

5.6

Comanda CREATE TABLE

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

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

SQL> create table departments


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

n baza de date Oracle exista dou tipuri de tabele i anume: Tabele utilizator ce reprezint o colec ie de tablele create i administrate de utilizator ce con in informa iile utilizatorilor; Dic ionarul de date ce reprezint o colec ie de tabele create i administrate de Oracle Server ce con in informa ii despre baza de date. 5-121

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 5.9 Tipul de data VARCHAR2(size) Tipuri de date Descriere Dat de tip caracter, de lungime variabil . (Trebuie specificat o lungime maxim - size, valoarea implicit este 1,maxima 4000) Dat de tip caracter de lungime fix . (Valoarea implicit este cea minim 1, maxima 2000) Num r cu p cifre i s cifre zecimale. (p poate lua valori ntre 1 i 38, s ntre 84 i 127) Dat de tip dat calendaristic cuprins ntre Ianuarie, 1 , 4712 B.C. i Decembrie, 31, 9999 A.D. Dat de tip caracter cu lungime variabil , pn gigabytes. Dat de pn la 4 gigabytes. Dat binar cu lungime specificat . Valoarea maxim este de 2000. Aceasta valoare trebuie specificat . Dat binar cu lungime de pn la 2 gigabytes. Dat binar cu lungime de pn la 4 gigabytes. 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. la 2

CHAR(size) NUMBER(p,s) DATE LONG CLOB RAW(size) LONG RAW BLOB BFILE

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

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

5-124

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

5-125

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Exemplu: INTERVAL '312' YEAR(3) indic un interval de 312 ani i 0 luni. INTERVAL '300' MONTH(3) indica un interval de 300 luni. INTERVAL '312-2' YEAR(3) TO MONTH indica 312 ani i 2 luni. Crearea unei tabele utiliznd o interogare Crea i o tabela i insera i linii combinnd comanda CREATE TABLE cu op iunea AS subquery; CREATE TABLE table [column (,column)] AS subquery ; Num rul coloanelor tabelei trebuie sa fie egal cu num rul coloanelor din subinterogare; Utiliznd op iunea AS subquery se creeaz tabela i insereaz nregistr rile furnizate de interogare. Sintaxa: - table numele tabelei; - column numele coloanei, valoarea implicit i constrngerile de tip; - subquery comanda SELECT care definete un set de nregistr ri ce trebuie inserate n tabela. Coloanele tabelei au numele specificate iar rndurile ce sunt inserate sunt cele rezultate din fraza SELECT din subinterogare. La definirea coloanelor se poate specifica doar numele coloanei i valoarea implicit . Dac se dorete specificarea coloanelor, num rul acestora trebuie sa fie egal cu num rul de coloane rezultat din subinterogare. Dac nu se specifica coloanele, numele coloanelor sunt identice cu cele date de subinterogare. Regulile de integritate nu sunt preluate de noua tabela.

5-126

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

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

5-127

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

5-128

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice


DEPT30 EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY HIRE_DATE ----------- -------------------- ------------------------- ---------- --------------------------114 Den Raphaely 11000 07-DEC-94 115 Alexander Khoo 3100 18-MAY-95 116 Shelli Baida 2900 24-DEC-97 117 Sigal Tobias 2800 24-JUL-97 118 Guy Himuro 2600 15-NOV-98 ad uga o nou coloana n 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 Noua coloa na JOB_ ID

tabela dept30

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

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Se poate converti o coloana de tip CHAR la una de tip VARCHAR2 sau invers dac aceasta con ine valori null sau dac nu se schimb l imea ; Schimbarea valorii predefinite pentru o coloan afecteaz numai inser rile ulterioare n tabela.

tergerea unei coloane EXEMPLU ALTER TABLE dept30 DROP COLUMN job_id; Table altered.

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

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

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

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

EXEMPLU SQL> DROP TABLE dept30; Table dropped.

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

5-131

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Observa ii: Toate datele sunt terse; Orice view sau sinonim asociat va r mne, dar va fi invalid; Orice tranzac ie n curs va fi finalizat ; Numai utilizatorul care a creat tabela sau cel care are privilegiul DROP ANY TABLE poate terge o tabel . 5.12 Modificarea numelui unui obiect Pentru a modifica numele unei tabele, view, secven e sau sinonim se folosete comanda RENAME . Sintaxa: RENAME old_name TO new_name; - old_name - new_name EXEMPLU SQL> RENAME departments TO departments_new; Table renamed. numele vechi al obiectului; numele nou al obiectului;

Observa ie: Numai proprietarul obiectului poate modifica numele obiectului.

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

5-132

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

TRUNCATE TABLE table;

Sintaxa: - table este numele tabelei. EXEMPLU SQL>TRUNCATE TABLE department; Table truncated.

Comanda TRUNCATE este mai rapida dect DELETE din urm toarele motive: TRUNCATE este o instruc iune de tip DDL i nu genereaz informa ii de tip rollback. Trunchierea unei tabele nu declaneaz triggerii tabelei. Dac tabela este de tip p rinte ntr-o rela ie de integritate referen ial nu pute i aplica comanda TRUNCATE. Trebuie mai nti sa dezactiva i constrngerea i apoi lansa i comanda.

5.14

Includerea constrngerilor

Ce fac constrngerile ? Constrngerile for eaz regulile la nivel de tabela. Constrngerile previn tergerea unei tabele sau a datelor din tabela dac exista dependen e.

Oracle lucreaz cu urm toarele tipuri de constrngeri: NOT NULL UNIQUE KEY PRIMARY KEY FOREIGN KEY CHECK

5-133

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Constrngerile de integritate a datelor Constrngere NOT NULL UNIQUE Key Descriere Specific faptul c aceast coloan nu poate con ine o valoare nul . Specific o coloan sau o combina ie de coloane a c ror valoare trebuie s fie unic pentru toate nregistr rile tabelei. Identific unic fiecare nregistrare Stabilete i for eaz o rela ie de tip cheie extern ntre coloan i o coloan dintr-o tabela referit . Specific o condi ie care trebuie s fie adev rat .

PRIMARY KEY FOREIGN KEY CHECK

Ghid pentru crearea constrngerilor Constrngerile trebuie sa aib un nume. Daca utilizatorul nu d acest nume, serverul Oracle va genera automat un nume utiliznd formatul SYS_Cn, unde n este un num r ntreg unic. Se poate crea o constrngere: - n timpul cre rii tabelei sau - dup ce tabela a fost creat Vizualizarea constrngerea se face doar n dic ionarul de date.

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

5-134

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice n sintaxa :


schema table DEFAULT expr column datatype column_constraint table_constraint acelai cu numele proprietarului numele tabelei specific valoarea implicit numele coloanei tipul de dat i lungimea constrngere de integritate ca parte a defini iei coloanei constrngere de integritate ca parte a defini iei tabelei

Exemplu: CREATE TABLE employees( Employee_id number(6), First_name varchar2(20), Job_id varchar2(10) NOT NULL, CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID)); De obicei constrngerile sunt create n acelai timp cu tabela dar ele pot fi ad ugate i dup crearea tabelei. Constrngerile pot fi definite la unul din urm toarele doua nivele: Constraint level Column Table Descriere Refer o singur coloan i poate defini orice tip de constrngere Refer una sau mai multe coloane i este definit separat de defini iile coloanelor n tabela: poate defini orice tip de constrngere exceptnd NOT NULL

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

5-135

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice n sintax : constraint_name constraint_type este numele constrngerii este tipul constrngerii

5.15 Constrngerea NOT NULL Constrngerea NOT NULL ne asigur c nu sunt permise n coloan valori null. Coloanele f r constrngerea NOT NULL pot con ine implicit valori null. EMPLOYEE_ID FIRST_NAME COMMIS SION_P CT DEPARTMENT_ID

7839 7698 7782 7566

KING BLAKE CLARK JONES

10 30 10 20

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

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

Constrngere NOT NULL

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

5-136

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice CREATE TABLE employees( Employee_id number(6), last_name varchar2(25) NOT NULL, salary number (8,2), commission_pct number(2,2), hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL, Nume dat de sistem

Nume dat de utilizator

Numele constrngerii poate fi specificat n timpul specific rii constrngerilor. EXEMPLU: hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL

5.16 Constrngerea UNIQUE KEY Constrngerea UNIQUE key EMPLOYEES EMPLOYEE_ID 100 101 102 103 LAST_NAME King Kochhar De Haan Hunold INSERT INTO
208 209 Smith Smith LSMITH LSMITH

EMAIL SKING NKOCHHAR LDEHAAN AHUNOLD

PERMIS Nu este permis exista deja

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

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

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

5-138

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

Exemplul definete o cheie primar dup coloana DEPARTMENT_ID a tabelei DEPTARTMENTS. Numele constrngerii este DEPT_ID_PK. CREATE TABLE departments (department_id NUMBER(4), department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL, manager_id NUMBER(6), location_id NUMBER(4), CONSTRAINT dept_id_pk PRIMARY KEY (department_id));

5.18

Constrngerea FOREIGN KEY

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

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

cu o valoare

PRIMARY KEY

DEPARTMENT _ID

DEPARTMENT_NAME
Administration Marketing

MANAGER_ID

10 20

200 201 FOREIGN KEY

EMPLOYEES EMPLOYEE_ID 100 101 102 103 200 201 LAST_NAME King Kochhar De Haan Hunold Ford Ford DEPARTMENT _ID 90 90 90 60 9 60

Nu este permis 9 nu exista

Observa ii: Cheile externe sunt bazate pe valorile datelor i sunt pointeri pur logici, nu fizici. Constrngerea de tip cheie extern coloan sau tabel . poate fi definit la nivel de

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

Exemplul de mai sus definete o constrngere de tip cheie externa n coloana DEPARTMENT_ID din tabela EMPLOYEES. Numele constrngerii este EMP_DEPT_FK.

5-140

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

Definete o condi ie pe care fiecare rnd trebuie sa o ndeplineasc . Expresii care nu sunt permise: Referiri la pseudocoloanele CURRVAL, NEXTVAL, LEVEL i ROWID. Apeluri la func iile SYSDATE, UID, USER i USERENV . Interog ri care fac referin e la alte valori din alte rnduri.

5-141

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 5.20 Adugarea unei constrngeri

, salary NUMBER (2) CONSTRAINT emp_salary_min CHECK (salary>0), Se poate ad uga o constrngere la tabelele existente folosind declara ia ALTER TABLE mpreun cu clauza ADD. n sintax : table este numele tabelei ALTER TABLE table ADD [CONSTRAINT constraint] type (column); constraint type column este numele constrngerii este tipul constrngerii este numele coloanei afectate de constrngere

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

5-142

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

unde:

table column constraint Aten ie:

este numele tabelei; este numele coloanei afectate de constrngere; este numele constrngerii.

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

Aplicarea op iunii CASCADE pentru a dezactiva constrngeri de integritate dependente.

5-143

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

clauza DISABLE se poate folosi att n func ia CREATE TABLE ct i n func ia ALTER TABLE. clauza CASCADE dependente. dezactiveaz constrngerile de integritate

Activarea unei constrngeri de integritate care este dezactivat clauza ENABLE n definirea tabelei.

5.23 Activarea constrngerilor

folosind

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

Se poate activa o constrngere f r a o terge sau a o recrea folosind func ia ALTER TABLE mpreuna cu clauza ENABLE. Sintaxa:

ALTER TABLE table ENABLE CONSTRAINT constraint; Unde: table este numele tabelei.

constraint este numele constrngerii. ALTER TABLE employees ENABLE CONSTRAINT emp_emp_id_pk; Table altered.

5-144

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

Daca se activeaz o constrngere de tip unic sau cheie primar , atunci este creat n mod automat un index de tip unic. Clauza ENABLE se poate folosi att n func ia CREATE TABLE ct i n func ia ALTER TABLE.

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

Dup crearea unei tabele, se poate confirma existen a sa prin folosirea comenzii DESCRIBE. Singura constrngere care poate fi verificat este constrngerea NOT NULL. Pentru a vedea toate constrngerile din tabel , este necesar interogarea tabelei USER_CONSTRAINTS. SELECT constraint_name, constraint_type, search_condition FROM user_cons_columns WHERE table_name=EMPLOYEES; Exemplul afieaz toate constrngerile tabelei EMPLOYEES.

5-145

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

5-146

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

5.24 Exerciii

1. Crea i tabelul DEPT bazat pe structura din tabelul urm tor. Salva i instruc iunea n scriptul p1.sql , executa i scriptul i verifica i. Column Name Datatype Length Id Number 7 Name Varchar2 25

2. Introduce i nregistr ri n tabela DEPT din tabela DEPARTMENT. Include i doar coloanele de care ave i nevoie. 3. Crea i tabela EMP bazata pe tabelul urm tor. Salva i instruc iunea ntr-un script p3.sql i apoi executa i scriptul. Verifica i existenta tabelei. Column Name Datatype Length ID Number 7 LAST_NAME Varchar2 25 FIRST_NAME Varchar2 25 DEPT_ID Number 7

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

5-147

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 12. Confirma i constrngerile ad ugate interognd tabela USER_CONSTRAINTS. Observa i numele i tipul constrngerilor. Salva i textul ntr-un fiier. CONSTRAINT_NAME DEPT_ID_PK EMP_ID_PK EMP_DEPT_ID_FK P P R C

13. Afia i numele i tipul obiectelor din dic ionarul USER_OBJECTS al tabelelor EMP i DEPT. Formata i coloanele pentru refolosirea lor. Observa i c a fost creat un nou tabel precum i un nou index. OBJECT_NAME DEPT DEPT_ID_PK EMP EMP_ID_PK OBJECT_TYPE TABLE INDEX TABLE INDEX

14. Modifica i tabela EMP. Ad uga i o coloana SALARY de tip NUMBER, precizie 7. 15. terge i coloana FIRST_NAME din tabela EMP. Confirma i modific rile efectuate prin verificarea descrierii tabelei. 16. Marca i ca fiind nefolosit coloana DEPT_ID din tabela EMP. Confirma i modific rile efectuate prin verificarea descrierii tabelei. 17. terge i toate coloanele nefolosite din tabela EMP. Confirma i modific rile efectuate prin verificarea descrierii tabelei.

5-148

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Capitolul 6 Expresii aritmetice. Operatori. Restric ionarea i sortarea datelor Instruc iunea SELECT poate fi folosit pentru a afia anumite coloane din tabela specificnd numele coloanelor, separate prin virgul . n clauzele SELECT se specific coloanele dorite, n ordinea de afiare dorit . Modul implicit de afiare a informaiilor este : Stnga date calendaristice i caractere (exemplu: coloanele ename i hiredate) Dreapta date numerice (exemplu: coloana sal) Textul este scris cu litere mari (uppercase) Numele de coloan pentru date calendaristice sau caractere poate fi trunchiat, dar numele de coloan pentru datele de tip numeric nu poate fi trunchiat. Nunele coloanelor sunt afiate implicit cu litere mari. Titlul coloanelor poate fi modificat folosind un alias. Folosirea alias-urilor va fi prezentat ntr-un capitol ulterior. 6.1 Expresii aritmetice Crearea expresiilor numerice i de date folosind operatori aritmetici modific felul n care se afieaz datele prin executarea de calcule. Expresiile aritmetice pot con ine nume de coloane, constante numerice i operatori aritmetici. Operatorii aritmetici disponibili n SQL se pot folosi n orice clauza SQL exceptnd clauza FROM. Operator + * / Exemplu: SELECT last_name, salary, salary+300 FROM employees; n exemplul dat s-a folosit operatorul adunare pentru a m ri salariile cu 300$ pentru to i angaja ii. Se afieaz noua coloan SALARY+300 . n urma adun rii coloana rezultat (SALARY+300) nu este o coloan nou n tabela EMPLOYEES; aceasta este vizibil doar la afiarea rezultatelor. Implicit, 6-149 Descriere Adunare Sc dere nmul ire mp r ire

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

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

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

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

6-151

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

Expresiile aritmetice care con in valoarea null sunt evaluate ca nule.

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

6-152

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

n exemplul de mai sus, angajatul KING nu primete comision. Deoarece coloana COMMISSION_PCT n expresia aritmetic este nul , rezultatul este null. 6.2 Definirea alias-urilor pentru coloane

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

6-153

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

Concateneaz coloanele sau irurile de caractere cu alte coloane; Este reprezentat de dou bare verticale (||); Rezult o coloan care este o expresie caracter.

Folosind operatorul de concatenare (||) se pot concatena coloane, expresii aritmetice sau valori constante pentru a crea expresii de tip caracter. Coloanele situate de o parte i de alta a operatorului sunt combinate pentru a face o singur coloan de ieire. 6-154

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Exemplu: SELECT last_name ||job_id as Employees FROM employees;

n exemplul de mai sus last_name i job_id sunt concatenate avnd aliasul Employees. Observa i c func ia angajatului i numele acestuia sunt combinate pentru a rezulta o singur coloana de ieire. Cuvntul cheie AS, folosit naintea numelui aliasului, face mai uor de citit instruc iunea SELECT. iruri de caractere Un literal este un caracter, o expresie sau un num r inclus n lista SELECT; Valorile literale pentru datele calendaristice i caractere trebuie incluse ntre ghilimele simple; Fiecare ir de caractere este afiat odat pentru fiecare rnd ntors. Exemplu: SELECT last_name || is a ||job_id as Employee Details FROM employees; Exemplul afieaz numele i meseriile tuturor angaja ilor. Coloana poart titlul Detaliile angajatului. Observa i spatiile dintre ghilimelele simple din instruc iunea SELECT care mbun t esc lizibilitatea ieirii.

6-155

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

Rnduri duplicate Implicit, interog rile afieaz duplicate. toate rndurile, incluznd rndurile

Exemplu: SELECT department_id FROM employees;

6-156

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

SQL*Plus va afia rezultatul interog rii f r a elimina rndurile duplicate dac nu se indic altfel. Exemplul de mai sus afieaz toate numerele de departamente din tabelul EMP. Eliminarea rndurilor duplicate se face folosind cuvntul cheie DISITINCT n clauza SELECT. Exemplu:

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

6.4

Se folosete comanda SQL*Plus: DESC[RIBE] tablename

6-157

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

Exemplu: DESCRIBE EMPLOYEES

Se afieaz informa ii despre structura tabelei EMPLOYEES. Null? indic dac o coloana trebuie sa con in date; NOT NULL indic faptul ca acea coloan trebuie s con in date. Type afieaz tipul de dat al coloanei. Tip de date
NUMBER(p,s) VARCHAR2(s) DATE CHAR(s)

Descriere
Valori numerice avnd un num r maxim de p cifre, unde s este num rul de cifre din dreapta virgulei ir de caractere de lungime variabila cu lungime maxima s Dat calendaristic ntre 1 ianuarie 4712 i.c. i 31 decembrie 9999 d.c. ir de caractere de lungime fix (s)

6.5

Restric ionarea i sortarea datelor

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Limitarea liniilor folosind o selec ie EMPLOYEES
EMPLOYEE_ID 100 101 102 103 EMPLOYEES EMPLOYEE_ID 100 101 102 LAST_NAME King Kochhar De Haan JOB_ID AD_PRES AD_VP AD_VP DEPARTMENT_ID 90 90 90 LAST_NAME King Kochhar De Haan Hunold JOB_ID AD_PRES AD_VP AD_VP IT_PROG DEPARTMENT _ID 90 90 90 90 60 returneaz to i angaja ii din departamentul 90

6.6

Clauza WHERE

SELECT [DISTINCT] {*, column [alias], } FROM table [WHERE condition(s)];

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

n exemplul de mai sus SELECT-ul returneaz numele i func ia tuturor angaja ilor din departamentul 90. iruri de caractere i date irurile de caractere i datele sunt incluse ntre apostrof; Valorile de tip caracter sunt case-sensitiv iar valorile de tip dat calendaristic sunt format-sensitive; Formatul implicit pentru dat calendaristic este DD-MON-YY Exemplu: SELECT last_name, job_id, department_id FROM employees WHERE last_name=Whalen;

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

6-160

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice NOT : schimbarea formatului implicit va fi explicat n alt capitolul. 6.7 Operatori de compara ie Operator = > >= < <= <> != Semnifica ie Egal cu Mai mare dect Mai mare sau egal Mai mic dect Mai mic sau egal Diferit de Diferit de dou

Operatorii de compara ie sunt folosi i n condi iile care compar expresii. Acetia sunt folosi i n clauza WHERE n urm torul format: Sintaxa: WHERE expresie operator valoare

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

6-161

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Al i operatori de compara ie Operator BETWEEN AND IN(lista) LIKE IS NULL Semnifica ie ntre dou valori (inclusiv) Potrivete orice valoare din list Potrivete un tip de caracter Este o valoare nul

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

6-162

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

6-163

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Simbol % _

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

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

6-164

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

6.8 Operator AND OR NOT

Operatori logici Semnifica ie

Returneaz TRUE dac ambele componente ale condi iei sunt adev rate Returneaz TRUE dac una din componentele condi iei este adev rat Returneaz TRUE dac condi ia este fals

6-165

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

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

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Tabela de adev r a operatorului OR


OR TRUE FALSE UNKNOWN TRUE TRUE TRUE TRUE FALSE TRUE FALSE UNKNOWN UNKNOWN TRUE UNKNOWN UNKNOWN

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

6-167

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Tabela de adev r a operatorului NOT NOT TRUE FALSE FALSE TRUE UNKNOWN UNKNOWN

Not : operatorul NOT poate fi folosit mpreun cu al i operatori SQL cum ar fi : BETWEEN, LIKE i NULL. WHERE job_id NOT n (AC_ACCOUNT,AD_VP) WHERE salary NOT BETWEEN 10000 AND 15000 WHERE last_name LIKE %A% WHERE commission_pct IS NOT NULL Reguli de preceden Ordinea evalu rii 1 2 3 4 5 6 7 8 Operator To i operatorii de compara ie Operatori de concatenare Condi ii de comparare IS [NOT] NULL, LIKE, [NOT] IN [NOT] BETWEEN NOT AND OR

Precedenta regulilor se poate schimba folosind paranteze. SELECT last_name,job_id,salary FROM EMPLOYEES WHERE job_id =SA_REP OR JOB_ID=AD_PRES AND SALARY>15000;

n exemplul de mai sus sunt dou condi ii ce trebuie ndeplinite i anume: Func ia trebuie s fie AD_PRES i salariul sa fie mai mare de 15000. Func ia trebuie s fie SA_REP. 6-168

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

n exemplul de mai sus sunt dou condi ii: Func ia trebuie s fie SA_REP sau AD_PRES ; Salariul trebuie s fie mai mare de 15000. De aceea SELECT-ul citete urm toarele: selecteaz linia dac angajatul este AD_PRES sau SA_REP i dac angajatul ctiga mai mult de 15000. 6.9 Clauza ORDER BY

Ordinea liniilor returnate de o interogare nu este predefinit . Clauza ORDER BY poate fi folosit pentru a sorta liniile. Dac este folosit clauza ORDER BY, ea trebuie scris ultima n fraza SELECT. Se poate specifica sortarea dup o expresie sau dup un alias. Sintaxa: SELECT expresie FROM table [WHERE condition(s)] [ORDER BY {coloana, expresie} ASC|DESC]; unde: ORDER BY ASC DESC specific ordinea n care sunt afiate liniile. ordoneaz liniile ascendent implicit. ordoneaz liniile descendent.

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

6-169

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

La folosirea clauzei ORDER BY valoarea implicit este cea ascendent . Valorile numerice sunt afiate ncepnd cu cea mai mica valoare de exemplu 1- 999. Datele sunt afiate ncepnd cu cea mai timpurie de exemplu 01JAN-92 naintea lui 01-JAN-95. Valorile tip caracter sunt afiate n ordine alfabetic de exemplu A naintea lui Z. Valorile nule sunt afiate ultimele pentru secven e ascendente i primele pentru secven e descendente.

Inversarea ordinii implicite n care sunt afiate liniile se face prin specificarea cuvntului cheie DESC dup numele coloanei n clauza ORDER BY. n exemplu rezultatele sunt sortate dup cea mai recent dat de angajare a salaria ilor.

6-170

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

Se poate folosi aliasul unei coloane n clauza ORDER BY. n exemplul de mai sus datele sunt sortate dup salariul anual.

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

6-171

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

6.10 Exerciii

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

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

6-173

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

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

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

Func ii de mai multe rnduri

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

Func iile de un singur: unde: Manipuleaz articole; Ac ioneaz asupra fiec rui rnd rezultat din interogare ; ntorc un singur rezultat pentru fiecare rnd; Pot modifica tipuri de date; Pot fi imbricate. nume_funcie (coloana | expresie, [arg1, arg2, ] ) nume_func ie coloana expresie arg1, arg2, este numele func iei este un nume de coloan din baza de date este orice ir de caractere sau expresie calculabil sunt argumentele utilizate de func ie

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Ac ioneaz asupra fiec rui rd ntors de interogare; ntorc o valoare pentru fiecare rnd; Pot ntoarce o dat a c rui tip este diferit de tipul argumentului; Este posibil sa atepte unul sau mai multe argumente; Se pot utiliza n SELECT, WHERE i ORDER BY. Se pot imbrica. Caractere Generale Funcii de un singur rnd Conversie Data calendaristic Numere

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

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

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

7-176

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 7.2 Func ii pentru caractere

Func iile de un singur rnd pentru caractere accept argumente de tip caracter i ntorc rezultate de tip caracter sau numeric. Func iile pentru caractere se pot mp r i n : Func ii de conversie a caracterelor din litere mari n litere mici. Func ii de manipulare a caracterelor
Func ie LOWER (expresie coloan) UPPER (expresie coloan) INITCAP (expresie coloan) Scop Face conversia caracterelor alfabetice n litere mici Face conversia caracterelor alfabetice n litere mari Face conversia pentru primul caracter din fiecare cuvnt n litera mare iar pentru restul caracterelor conversia se face n litere mici Concateneaz prima valoare de tip caracter cu a doua valoare de tip caracter. Aceasta func ie este echivalenta cu operatorul de concatenare ( || ). ntoarce un sir de caractere din cadrul valorii de tip caracter ncepnd cu pozi ia m i avnd lungimea n. Dac m este negativ atunci pozi ia de nceput a num r rii se consider a fi ultimul caracter din ir. Dac n este omis atunci func ia ntoarce toate caracterele de la pozi ia m pn la sfritul irului. ntoarce num rul de caractere dintr-o valoare de tip caracter. ntoarce pozi ia n cadrul valorii de tip caracter a caracterului specificat. Aliniaz valoarea de tip caracter la dreapta pe o lungime de n caractere. Permite eliminarea caracterelor de la nceputul, sfritul, ambelor. Trim _character este un literal, trebuie inclusa intre apostrof. Caut n search_string irul de caractere specificat prin text, i dac l g sete l nlocuiete cu valoarea din replacement_string.

CONCAT(expresie coloana1, (expresie coloana2)

SUBSTR(expresie coloana, m/,n/)

LENGTH(expresie coloana) INSTR(expresie coloana,m) LPAD (expresie |coloana, n, sir caractere) TRIM LENGTH(leading|trailing|both, trim_character, trim_source) REPLACE (text, search_string, replacement _string)

7-177

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Func ie LOWER (SQL Course) UPPER (SQL Course) INITCAP (SQL Course)

Rezultat sql course SQL COURSE Sql Course

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

Afia i num rul de ordine, numele i departamentul la care lucreaz pentru angajatul Higgins. SELECT employee_id, last_name, department_id FROM employees WHERE last_name=higgins; No rows selected. 7-178

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice SELECT employee_id, last_name, department_id FROM employees WHERE LOWER(last_name)=higgins;

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

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice LPAD ntoarce un sir de caractere rezultat prin inserarea valorii specificate n cel de-al treilea argument la stnga primului argument lungimea rezultatului avnd lungimea specificat de cel de-al doilea argument. Are un comportament similar cu func ia LPAD numai c inserarea celui de-al treilea argument se face la dreapta primului argument. SELECT employee_id,CONCAT(first_name,last_name) NAME, Job_id, LENGTH (last_name), INSTR(last_name,a)Contains a? FROM employees WHERE SUBSTR(job_id,4)=REP;

RPAD

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

SELECT employee_id,CONCAT(first_name,last_name) NAME, Job_id, LENGTH (last_name), INSTR(last_name,a)Contains a? FROM employees WHERE SUBSTR(last_name,-1,1)=n;

7-180

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 7.3 Func ii pentru valori numerice

ROUND Rotunjete valoarea cu un num r specificat de zecimale. ROUND (45.926,2) 45.93 TRUNC Trunchiaz valoarea TRUNC (45.926,2) 45.92 MOD ntoarce restul mp r irii MOD (1600,300) 100 Func iile pentru valori numerice accept valori numerice i ntorc valori numerice. Aceasta sec iune descrie o parte din aceste func ii: Func ie ROUND (coloana | expresie, n) Scop Rotunjete coloana, expresia sau valoarea la un num r cu n pozi ii la partea zecimal . Dac n este omis num rul rezultat din conversie nu are parte zecimal . Dac n este negativ este rotunjit num rul din partea stnga a punctului zecimal. Trunchiaz coloana, expresia sau valoarea la un num r cu n pozi ii la partea zecimal . Dac n este omis num rul rezultat din conversie nu are parte zecimal . Dac n este negativ este trunchiat num rul din partea stnga a punctului zecimal ctre zero. ntoarce restul mp r irii dintre m i n.

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

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Func ia ROUND poate fi utilizat asupra datelor calendaristice. NOT : DUAL este o tabela fictiv . Mai multe detalii despre acest aspect vor fi oferite mai trziu.

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

Func ia MOD ntoarce restul mp r irii dintre valoarea1 i valoarea2. Exemplul de mai sus calculeaz restul mp r irii dintre salar i 5000 pentru to i angaja ii care sunt agen i comerciali.

7-182

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 7.4 Utilizarea datelor calendaristice

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

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

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Opera ie data + num r data num r data data data + num r/24

Rezultat dat dat num r de zile dat

Descriere adun un num r de zile la o dat scade un num r de zile dintr-o dat scade o dat din cealalt adun un num r de ore la o dat

SELECT last_name, (SYSDATE-hire_date)/7 WEEKS FROM employees WHERE department_id = 90;

Exemplul de mai sus prezint o tabel cu numele angaja ilor din departamentul 90 i de perioada n care au fost angaja i exprimat n s pt mni. Pentru a afia perioada angaj rii n s pt mni se face diferen a ntre data curent (data SYSDATE) i data la care a fost angajat persoana i apoi se mparte rezultatul la 7. NOT : SYSDATE este o func ie SQL ce ntoarce data i timpul curent. Rezultatul pe care l ob ine i dac proba i exemplul poate s difere de rezultatul de mai sus. 7.5 Func ie MONTHS_BETWEEN ADD_MONTHS NEXT_DAY LAST_DAY ROUND TRUNC 7-184 Func ii pentru date calendaristice Descriere ntoarce num rul de luni dintre dou date calendaristice. Adun un num r de s pt mni la o dat calendaristic . ntoarce ziua ce urmeaz datei specificate Ultima zi a lunii. Rotunjete data calendaristic . Trunchiaz data calendaristic .

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Func iile pentru date calendaristice opereaz asupra datelor calendaristice de tip Oracle. Toate func iile pentru date ntorc o valoare de tip dat cu excep ia func iei MONTH_BETWEEN, care ntoarce o valoare numeric . MONTHS_BETWEEN (data1,data2): G sete num rul de luni dintre data1 i data2. Rezultatul poate fi pozitiv sau negativ. Dac data1 este mai trzie dect data2 atunci rezultatul este pozitiv. Dac data2 este mai trzie dect data1 atunci rezultatul este negativ. Partea nentreaga a rezultatului reprezint o parte din lun .

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Func iile ROUND i TRUNC pot fi utilizate att pentru numere ct i pentru date calendaristice. Atunci cnd sunt utilizate cu date calendaristice, acestea rotunjesc sau trunchiaz data innd cont de modelul specificat. Astfel se pot rotunji, de exemplu, date calendaristice spre cel mai apropiat an sau cea mai apropiat lun .

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

7-186

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 7.6 Func ii pentru conversia tipului de date Conversia tipului de date

Conversie implicita a tipului de date

Conversie explicita a tipului de date

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

7-187

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

Opera ia de atribuire are loc cu succes dac server-ul Oracle poate converti tipul de dat al sursei n tipul de dat al destina iei. n cazul evalu rii expresiilor, Oracle poate automat conversia: DIN VARCHAR2 sau CHAR (ir de caractere) VARCHAR2 sau CHAR (ir de caractere) IN NUMBER (valoare numeric ) DATE (dat calendaristic )

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

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

7-188

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Func ie TO_CHAR (numr|data calendaristica, [fmt]) TO_NUMBER (caracter) Scop Face conversia dintr-un num r sau o dat calendaristic ntr-un ir de caractere de tipul VARCHAR2 respectnd formatul fmt specificat. Face conversia dintr-un ir de caractere ce con ine cifre ntr-o valoare numeric . 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)

TO_DATE (caracter ,[fmt])

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

Utilizarea func iei TO_CHAR mpreun cu date calendaristice TO_CHAR (data calendaristica, fmt)

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

7-189

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Observa ii: Modelul de format trebuie inclus intre ghilimele simple i este case sensitive; Modelul de format poate include orice element valid al modelului de formatare pentru date calendaristice. Asigura i-v c valoarea este separat de modelul de formatare prin virgul ; Pentru numele zilelor i al lunilor se ad uga automat spatii goale la ieire ; Pentru a elimina spatiile i zerourile nesemnificative folosi i elementul pentru modul de umplere; Ave i posibilitatea de a redimensiona lungimea pe care se face afiarea pentru un cmp cu ajutorul comenzii SQL*Plus COLUMN. Lungimea implicit a coloanei rezultate este de 80 caractere. SELECT employee_id,TO_CHAR (hire_date, MM/YY) Month_Hired FROM emp WHERE ename=Higgins; Elementele ale modelului de formatare pentru date calendaristice YYYY YEAR MM MONTH DY DAY Anul afiat pe 4 digi i Anul n litere Luna scris cu dou cifre Numele lunii O abrevia ie a denumirii unei zile din s pt mna format din trei litere Denumirea completa a zilei

Exemple de elementele ale modelului de formatare: Element SCC sau CC YYYY sau SYYYY YYY sau YY sau Y Y,YYY 7-190 Secolul Anul Ultimele 3, 2 sau 1 cifre din an O virgula n cadrul anului Descriere

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice [YYY,[YY,[Y,] SYEAR sau YEAR BC sau AD B.C. sau A.D. Q MM MONTH MON RM WW sau W DDD sau DD sau D DAY DY J 4,3,2 sau o cifr din an conform standardului ISO Anul n litere Indicatorul B.C. sau A.D. Indicatorul B.C. sau A.D. Sfertul unui an Luna scris cu dou cifre Numele ntreg al lunii scris pe 9 caractere. Dac denumirea lunii nu ocup cele 9 caractere, spa iul r mas liber este automat umplut cu spatii O abrevia ie a denumirii unei luni format din trei litere Luna scris cu cifre romane S pt mna din an sau luna Ziua din an, lun sau s pt mn . Denumirea completa a zilei completat eventual cu spa ii pn la 9 caractere. O abrevia ie a denumirii unei zile formata din trei litere Num rul de zile de la data de 31 Decembrie 4713BC

Elemente ce formateaz timpul HH24:MI:SS AM 15:45:32 PM

Ad uga i iruri de caractere prin nchiderea acestora ntre ghilimele. DD of MONTH 12 of OCTOBER

Ad uga i sufixe pentru a scrie n litere un num r . ddspth Modele de formatare pentru timp Utiliza i elementele descrise mai jos atunci cnd dori i s afia i timpul ntr-un anumit format sau s folosi i litere n loc de cifre. fourteenth

7-191

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Element AM sau PM A.M. sau P.M. HH sau HH12 sau HH24 MI SS SSSSS Alte formate: Element /.. of the Specifica i sufixe : Element TH SP SPTH sau THSP

Descriere indicator de meridian indicator de meridian cu puncte ora minute (0-59) secunde (0-59) Num rul de secunde ncepnd cu miezul nop ii

Descriere Punctua ia este reprodus n rezultat. irul ncadrat ntre ghilimele este reprodus

Descriere Num r de ordine dat n cifre (de exemplu DDTH pentru 4TH) Num r scris n litere (de exemplu DDSP pentru FOUR) Num r de ordine scris n litere (de exemplu DDSPTH pentru FOURTH)

Utilizarea func iei TO_CHAR mpreuna cu date calendaristice SELECT last_name,TO_CHAR (hire_date, fmDD Month YYYY) HIRE_DATE FROM employees;

7-192

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

De remarcat este faptul c format specificat (INITCAP).

denumirea lunii respect

modelul pentru

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

7-193

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 9 0 $ L . , Reprezint un num r For eaz afiarea unei cifre 0 Semnul dolar Folosete simbolul local pentru moned Afieaz un punct Tip rete un indicator pentru mii

Atunci cnd se lucreaz cu valori numerice drept iruri de caractere trebuie s converti i acele numere n valori de tip caracter utiliznd func ia TO_CHAR, care face conversia dintre o valoare de tip NUMBER spre o valoare de tip VARCHAR2. Aceasta tehnic este folositoare n cadrul unei concaten ri. Elemente de formatare pentru numere Dac trebuie s converti i un num r ntr-o valoare de tip caracter pute i utiliza urm toarele elemente: Element
9 0 $ L . , MI PR EEEE V B

Descriere
Pozi ie numerica (num rul cifrelor de 9 determin lungimea pe care se face afiarea) Afieaz zerourile nesemnificative Semnul dolar Folosete simbolul local pentru moned Determin afiarea unui punct zecimal n pozi ia specificat . Determin afiarea unei virgule n pozi ia specificat . Determin afiarea semnului minus n partea dreapt (pentru valori negative) nchide ntre paranteze numerele negative NOT ie tiin ific (formatul impune existen a a patru litere E) nmul ire cu 10 de n ori (n = num rul de cifre de 9 de dup litera V) nlocuiete valorile de 0 cu blank

Exemplu
999999 099999 $999999 L999999 999999.99 999,999 999999MI 999999PR 99.999EEEE 9999V99 B9999.99

Rezultat
1234 001234 $1234 FF1234 1234.00 1,234 1234 <1234> 1.234E+03 123400 1234.00

7-194

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

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

7-195

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Formatul RR pentru date calendaristice Anul curent


1995 1995 2001 2001

Data specificata

Formatul RR

Formatul YY

Dac cele doua cifre ale anului curent sunt:

27-OCT-95 1995 1995 27-OCT-17 2017 1917 27-OCT-17 2017 2017 27-OCT-95 1995 2095 Dac cele doua cifre specificate ale anului sunt: 0-49 50-99 Data ntoars se Data ntoarsa se ncadreaz n 0ncadreaz n secolul secolul de dinaintea celui 49 curent curent 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 func ie de cei doi digi i specifica i n an i de ultimii doi digi i ai anului curent. Tabelul urm tor descrie comportamentul elementului RR. Anul curent 1994 1994 2001 Data specificata 27-OCT-95 27-OCT-17 27-OCT-17 Formatul RR 1995 2017 2017 Formatul YY 1995 1917 2017

7.7

Func ii diverse

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Sintaxa NVL (expr1, expr2) unde:expr1 este valoarea sau expresia surs care ar putea s con in o valoare nul . expr2 este valoarea int , valoarea spre care se face conversia Ave i posibilitatea de a utiliza func ia NVL mpreun cu orice tip de dat , dar tipul valorii ntoarse este de fiecare dat la fel cu tipul parametrului expr1. Conversii NVL pentru diferite tipuri de date Tip de data NUMBER DATE CHAR sau VARCHAR2 Exemplul de conversie NVL (coloana ce con ine o valoare de tip numeric, 9) NVL (coloana ce con ine o valoare de tip dat calendaristic , 01-JAN-95) NVL (coloana ce con ine o valoare de tip caracter,Unavariable)

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

Pentru a calcula compensa ia anual pentru to i angaja ii, trebuie s nmul i i salariul lunar cu 12 i apoi sa ad uga i comisionul. SELECT last_name, salary, NVL(commission_pct,0), (Salary*12)+(salary*12*commission_pct) AN_SAL FROM employees;

7-197

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

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

7-198

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

7-199

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

7-200

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

7-202

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

Func iile de un singur rnd se pot imbrica de cte ori dorim. Evaluarea func iilor imbricate ncepe de la nivelul cel mai adnc.

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

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

7-203

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

7.9

Exerciii

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

7-204

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Capitolul 8 Afiarea datelor din tabele multiple Obiective:

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

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

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

Pentru a se ajunge la rezultatul final tabelele EMPLOYEES i DEPARTMENTS trebuiesc legate astfel nct accesarea datelor sa se fac din ambele tabele.

8-205

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

8.1

Definirea JOIN-urilor

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

La scrierea unei expresii SELECT care leag tabele preceda i numele coloanei cu numele tabelului pentru claritate i pentru a mari viteza de acces la baza de date. Daca acelai nume de coloan apare n mai multe tabele numele coloanei trebuie prefixat cu numele tabelului. Pentru a al tura n tabele mpreun este nevoie de minim n-1 condi ii de join. Aadar, pentru a al tura 4 tabele, sunt necesare 3 condi ii de join. Aceast regul s-ar putea s nu se aplice dac tabelul are o cheie primar concatenat fiind astfel necesare mai multe coloane pentru a identifica in mod unic fiecare linie. Produsul Cartezian Un produs cartezian se formeaz atunci cnd: - o condi ie join este omis ; - o condi ie join este invalid ; - toate liniile din primul tabel sunt al turate la liniile din tabelul al doilea. 8-206

8.2

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

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

8-207

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Tipuri de Join-uri
Join uri specifice Oracle (8i i versiuni anterioare) Join-uri conforme cu SQL: 1999

Equijoin Non-equijoin Outer join Self join

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

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

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

8-208

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

8-209

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

Calificarea numelor de coloane ambigui Folosi i prefixele tabelelor pentru a califica numele coloanelor ce sunt comune mai multor tabele; mbun t i i performanta prin folosirea prefixelor de tabele; Distinge i coloanele care au nume identice n tabele diferite prin folosirea aliasurilor de coloane.

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

8-210

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

JOIN ce folosete mai mult de 2 tabele

Uneori trebuiesc al turate (join) mai mult de dou tabele. De exemplu, pentru a afia numele, numele departamentului i oraul pentru fiecare angajat trebuie efectuat un join ntre tabelele EMPLOYEES, DEPARTMENTS i LOCATIONS. 8-211

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

8.4

Non-echi-join JOB_GRADES
Salary 24000 17000 17000 9000 8000 5800 Grade A B C D E F Lowest_sal 1000 3000 6000 10000 15000 25000 Highest_sal 2999 5999 9999 14999 24999 40000

EMPLOYEES
Last_Name King Kochhar De Haan Hunold Ernst Mourgos

salarul din tabelul EMPLOYEES este cuprins ntre salarul minim i maxim din tabelul JOB_GRADES

8-212

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

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

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

8-213

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

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

8-214

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

8-215

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

8.6

Self Join

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

8-216

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

8-217

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 8.7 Definirea join-urilor folosind sintaxa SQL 1999 SELECT table1.column, table2.column FROM table1 [CROSS JOIN table2] | [NATURAL JOIN table2] | [JOIN table2 USING (column_name)] | [JOIN table2 ON (table1.column_name = table2.column_name)] | [LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name = table2.column_name)]; n sintax : table1.column - tabelul i coloana de unde se extrag datele; CROSS JOIN - returneaz produsul cartezian a celor dou tabele; NATURAL JOIN - face un join pe cele dou tabele pe baza unei coloane comune; JOIN table USING - column_name execut un echi-join bazat pe coloana specificat ; JOIN table ON table1.column_name = table2.column_name - execut un join bazat pe condi ia specificat n clauza ON.

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

8-218

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice SELECT last_name, department_name FROM employees, departments;

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

Not:

Cnd referi i coloana, oriunde n instruc iunea SQL, nu trebuie s folosi i numele tabelei sau aliasul. Clauzele NATURAL JOIN i USING sunt mutual exclusive

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

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

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

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

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

SELECT e.last_name emp, m.last_name mgr FROM employees e JOIN employees m ON (e.manager_id = m.employee_id);

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

8-222

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

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

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

8-223

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

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

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

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

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

8-225

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 8.8 Exerciii

1. Scrie i o interogare care sa afieze numele, num rul departamentului i numele departamentului pentru to i angaja ii.

2. Scrie i o interogare care s afieze meseriile distincte (jobs) i numele departamentului pentru to i angaja ii din departamentul 30. Include i i loca ia pentru departamentul 90.

3.

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

4. Afia i numele angajatului i numele departamentului pentru to i angaja ii care au un a in numele lor. Salva i tabelul SQL ntr-un fiier numit p4q4.sql.

8-226

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

4. Scrie i o interogare care afieaz numele, meseria, num rul departamentului i numele departamentului pentru to i angaja ii care lucreaz in Toronto.

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

8-227

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 6. Modifica i p4q6.sql pentru a afia to i angaja ii incluznd pe King care nu are manager.

7. Crea i o interogare care va afia pentru to i angaja ii numele angajatului, num rul departamentului i to i angaja ii care lucreaz n acelai departament (colegii lui). Denumi i ultima coloan Coleg. Ave i grija ca n interogare s nu apar un angajat coleg cu el nsui.

8. Afia i structura tabelului JOB_GRADEs. Crea i o interogare care va afia numele, meseria, numele departamentului, salariul i treapta de salarizare pentru to i angaja ii.

8-228

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

9. Crea i o interogare care afieaz numele i data angaj rii pentru lucr torii angaja i dup data de angajare a lui Davies.

10. Afia i toate numele angaja ilor i data angaj rii mpreun cu numele managerilor i data lor de angajare, pentru to i cei care au fost angaja i naintea managerilor lor. Eticheta i coloanele Employee, respectiv Emp, Hiredate, Manager, i Mgr Hiredate.

8-229

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

11. Crea i o interogare care afieaz numele angaja ilor i salariile indicate prin asteriscuri. Fiecare asterisc nseamn 100 $. Sorta i datele n ordinea descendent a salariilor. Eticheta i coloana EMPLOYEE_AND_THEIR_SALARIES.

EMPLOYEE_AND_THEIR_SALARIES KING ************************************************* FORD ******************************** SCOTT ******************************** JONES ******************************* BLAKE ****************************** CLARK ************************* ALLEN **************** TURNER *************** MILLER ************* MARTIN ************ WARD ************ ADAMS *********** JAMES ******** SMITH ******* 14 rows selected.

8-230

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Capitolul 9 Folosirea func iilor de grup Obiective: Identificarea func iilor de grup disponibile; Descrierea folosirii func iilor de grup; Gruparea datelor folosind clauza Group By; Includerea sau excluderea liniilor grupate folosind clauza HAVING . 9.1 Ce sunt func iile de GRUP ?

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

Spre deosebire de func iile de un singur rnd, func iile de grup opereaz pe seturi de rnduri pentru a da un singur rezultat unui grup. Aceste seturi pot fi ntregul tabel sau tabelul mp r it la rndul lui n grupuri. Func iile de grup sunt urm toarele : AVG COUNT MAX MIN STDDEV SUM VARIANCE Fiecare din func ii accept /primete un argument. Urm torul tabel identific op iunile pe care le pute i folosi n sintax . 9-231

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Func ie AVG([DISTINCT|ALL]n) Descriere Valoarea medie a lui n, ignornd valorile nule; Num rul de rnduri, unde expresia evalueaz altceva dect valori nule. Num r toate rndurile selectate folosind *, inclusiv duplicatele i rndurile cu valori nule; Valoarea maximal a expresiei, ignornd valorile nule; Valoarea minim a expresiei, ignornd valorile nule; Abaterea standard a lui n, ignornd valorile nule; Suma valorilor lui n, ignornd valorile nule; Varia ia lui n, ignornd valorile nule;

COUNT({*|[DISTINCT|ALL] expr})

MAX([DISTINCT|ALL]expr) MIN([DISTINCT|ALL]expr) STDDEV([DISTINCT|ALL]x) SUM([DISTINCT|ALL]n) VARIANCE([DISTINCT|ALL]x)

SELECT FROM [WHERE [ORDER BY

coloana, funcie_de_grup(coloana) tabela condiie] coloana ];

Sfaturi pentru folosirea func iilor de grup: DISTINCT face ca func ia s ia n considerare numai valorile distincte. ALL ia n considera ie fiecare valoare, inclusiv valorile duble. ALL este implicit i deci nu mai trebuie specificat.

Tipurile de date pentru argumente pot fi : CHAR, VARCHAR2, NUMBER sau DATE. Toate func iile de grup, cu excep ia COUNT(*) ignora valorile nule. Pentru a nlocui o valoare cu valori nule folosi i func ia NVL,NVL2 sau COALESCE.. Folosirea funciilor AVG, SUM, MIN, MAX

9.2

Func iile AVG sau SUM se pot folosi pentru date de tip numeric.

9-232

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary) FROM employees WHERE job_id LIKE '%REP%';

Func iile AVG, SUM, MIN i MAX se pot folosi pentru coloanele care pot stoca date numerice. Exemplul de mai sus afieaz media, maximul, minimul i suma salariilor lunare pentru to i vnz torii. Func iile MIN i MAX se pot folosi pentru orice tip de date. SELECT MIN(hire_date), MAX(hire_date) FROM employees;

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

9.3

Folosirea funciei COUNT

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

9-233

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Func ia COUNT are trei formate : COUNT(*) - ntoarce num rul de rnduri in tabel, incluznd rndurile duble i rndurile con innd valori nule; - ntoarce num rul rndurilor nenule din coloana identificat prin expr.; - ntoarce num rul rndurilor unice nenule din coloana identificat prin expr.

COUNT(expr) COUNT(DISTINCT expr)

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

Exemplu: Afia i num rul departamentelor din tabelul EMPLOYEES. SELECT COUNT(department_id) FROM employees;

Afia i num rul departamentelor distincte din tabelul EMPLOYEES. SELECT COUNT(DISTINCT department_id) FROM employees;

9.4

Funciile de grup i valorile Null

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

9-234

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Toate func iile grup, cu excep ia COUNT(*), ignor valorile nule din coloan . n exemplul de mai sus media este calculata doar pe baza rndurilor din tabel n care coloana COMMISSION_PCT con ine o valoare valid . Media este calculat ca sum a comisioanelor pl tite c tre to i angaja ii, mp r it la num rul angaja ilor care primesc comision. Func ia NVL for eaz func iile de grup s includ valori nule. SELECT AVG(NVL(commission_pct, 0)) FROM employees;

Func ia NVL for eaz func iile grup s includ valori nule. n exemplul de mai sus media este calculat pe baza tuturor rndurilor din tabel indiferent dac n coloana COMMISSION_PCT sunt stocate valori nule. Media este calculat ca un comision total pl tit tuturor angaja ilor, mp r it la num rul total al angaja ilor companiei. 9.5 Crearea grupurilor de date

Pn acum toate func iile grup au tratat tabelul ca fiind un larg grup de informa ii. Uneori ns tabelul trebuie mp r it n grupuri mai mici de informa ii. 9-235

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Aceasta se poate face folosind clauza GROUP BY. SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column]; n sintax :group by expresion specific determin bazele pentru gruparea rndurilor. coloanele ale c ror valori

Clauza GROUP BY se poate folosi pentru a mp r i rndurile din tabel n grupuri, lucru ce permite folosirea func iilor de grup pentru a ntoarce sumarul informa iei pentru fiecare grup.

Sfaturi Dac se include o func ie de grup ntr-o clauza SELECT nu se pot selecta rezultatele individuale dect dac coloana individual apare n clauza GROUP BY. Dac coloana respectiv nu este inclus n clauza Group By va fi generat un mesaj de eroare ; Clauza WHERE exclude rndurile nainte de a formarea grupurilor. Implicit, rndurile sunt sortate n ordinea ascendent a coloanelor incluse n lista GROUP BY. Se poate specifica o alt ordine folosind clauza ORDER BY.

Toate coloanele din lista SELECT care nu sunt func ii de grup trebuie s fie men ionate n clauza GROUP BY.

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

9-236

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Exemplul de mai sus afieaz num rul departamentului i media salariilor pentru fiecare departament. Iat cum este evaluat declara ia SELECT de mai sus, con innd o clauz GROUP BY : Clauza SELECT specific coloanele care s fie afiate, adic num rul departamentului i media tuturor salariilor din grupul specificat n clauza GROUP BY. Clauza FROM specific tabelul pe care baza de date trebuie s -l acceseze: tabelul EMPLOYEES. Clauza WHERE specific liniile ce trebuie incluse. Dac nu exist nici o clauz WHERE, implicit toate rndurile sunt incluse. Clauza GROUP BY specific modul de grupare pentru rnduri. Rndurile sunt grupate dup num rul departamentului, deci func ia AVG care este aplicat coloanei salariilor va calcula media salariilor pentru fiecare departament. Coloanele GROUP BY care nu sunt in lista SELECT: SELECT AVG(salary) FROM employees GROUP BY department_id;

Coloana specificat n clauza GROUP BY nu trebuie sa fie obligatoriu men ionat n clauza SELECT. De exemplu, declara ia SELECT de mai sus afieaz media salariilor pentru fiecare departament f r s afieze num rul departamentului respectiv. Totui, f r num rul departamentului, rezultatele nu afieaz datele n mod semnificativ. 9-237

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Se poate folosi func ia de grupare, n exemplu avg(sal), n clauza ORDER BY. SELECT department_id, AVG(salary) FROM employees GROUP BY department_id ORDER BY AVG(salary);

9.6

Gruparea datelor dup mai multe coloane

Grupuri n grupuri Cteodat sunt necesare rezultate pentru grupuri formate din subgrupuri. Exemplul de mai sus arat un raport care afieaz totalul salariilor ce au fost pl tite pentru fiecare nume de func ie, din fiecare departament. Tabelul EMPLOYEES este grupat mai nti dup num rul departamentului i apoi aceast grupare se detaliaz dup numele func iei. De exemplu, doi func ionari din departamentul 20 sunt grupa i mpreun i se afieaz un singur rezultat ( salariul total ).

9-238

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice SELECT department_id dept_id, job_id, SUM(salary) FROM employees GROUP BY department_id, job_id;

Pentru o ob ine rezultatele finale pentru grupuri i subgrupuri trebuiesc indicate mai multe coloane n clauza GROUP BY. Ordinea implicit de ordonare a rezultatelor poate fi determinat prin ordinea de scriere a coloanelor din clauza GROUP BY. Iat cum se evalueaz declara ia SELECT de mai sus, care con ine o clauza GROUP BY : Clauza SELECT specific coloanele ce trebuie afiate: - Num rul departamentului din tabelul EMPLOYEES; - Numele func iei din tabelul EMPLOYEES; - Suma tuturor salariilor din grupul specificat n clauza GROUP BY. Clauza FROM specific tabelul pe care baza de date trebuie s -l acceseze : tabelul EMPLOYEES; Clauza GROUP BY specific cum trebuie grupate rndurile : - Rndurile se grupeaz mai nti dup num rul departamentului. - Apoi, din grupurile formate dup num rul departamentului, se grupeaz rndurile dup numele func iei. Deci func ia SUM este aplicat coloanei salariilor pentru toate numele de func ii din fiecare grup format dup num rul departamentului.

9-239

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Interogri ilegale n folosirea funciilor de grup

9.7

Orice coloan sau expresie din lista SELECT care nu este o func ie de grup trebuie sa fie specificat n clauza GROUP BY.

SELECT department_id, COUNT(last_name) FROM employees; Exemplul de mai sus genereaz eroarea: SELECT department_id, COUNT(last_name) * ERROR at line 1: ORA-00937: not a single-group group function Column missing Ori de cate ori se folosete o combina ie de coloane individuale (department_id) i func ii grup (COUNT(last_name)) n aceeai declara ie SELECT, trebuie inclus o declara ie (GROUP BY ) care s specifice coloanele individuale (in acest caz department_id). Dac clauza GROUP BY lipsete, atunci apare mesajul de eroare not a single-group function i un asterisc (*) care indic coloana greit . Eroarea de mai sus se repar ad ugnd clauza (GROUP BY). SELECT department_id, count(last_name) FROM employees GROUP BY department_id;

Orice coloan sau expresie din lista SELECT care nu este o func ie de grup trebuie s fie specificat n clauza GROUP BY.

9-240

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Nu pute i grupurilor. folosi clauza WHERE pentru restric ionarea

Folosi i clauza HAVING pentru restric ionarea grupurilor. Nu pute i folosi func ii de grup n clauza WHERE.

SELECT department_id, AVG(salary) FROM employees WHERE AVG(salary) > 8000 GROUP BY department_id; WHERE AVG(salary) > 8000 * ERROR at line 3: ORA-00934: group function is not allowed here Clauza WHERE nu poate fi folosit pentru a restric iona datele ce intra n componen a grupurilor. Declara ia SELECT de mai sus genereaz o eroare deoarece se folosete clauza WHERE pentru a restric iona afiarea mediei salariilor din acele departamente care au un salariu mediu mai mare de 8000 $. Eroarea de mai sus poate fi corectat prin folosirea clauzei HAVING pentru restric ionarea datelor dup formarea grupurilor. SELECT department_id, AVG(salary) FROM employees HAVING AVG(salary) > 8000 GROUP BY department_id;

9-241

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 9.8 Excluderea rezultatelor obinute folosind clauza Group

n acelai mod n care se folosete clauza WHERE pentru restric ionarea rndurile selectate se poate folosi clauza HAVING pentru restric ionarea datelor rezultate din grupuri. Pentru a afla salariul maxim pentru fiecare departament, doar pentru departamentele care au salariul maxim mai mare de 10.000$, sunt necesare urm toarele: 1. G sirea salariul mediu pentru fiecare departament grupnd dup num rul departamentului. 2. Restric ionarea grupurilor la acele departamente ce au salariu maxim mai mare de 10.000 $. Excluderea rezultatelor date de Group BY : Clauza HAVING Folosirea clauzei HAVING pentru restric ionarea datelor grupurilor presupune ca : - Rndurile sa fie grupate. - Clauza GROUP BY sa fie aplicat . - Grupurile care ndeplinesc condi ia din clauza HAVING sa fie afiate. SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column]; In sintax , group condition restric ioneaz grupurile de rnduri raportate la acele grupuri a c ror condi ie specificata este TRUE ( adev rat ). 9-242

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Clauza HAVING poate fi folosit pentru a specifica care grupuri trebuiesc afiate. De aceea, mai nti se restric ioneaz grupurile pe baza informa iilor totale i apoi se exclud cele ce nu corespund condi iilor din clauza HAVING. Serverul Oracle desf oar urm torii pai la folosirea clauzei HAVING : Se grupeaz rndurile; Func ia de grup se aplica grupului; Se afieaz grupurile care ndeplinesc criteriul din clauza HAVING. Clauza HAVING poate precede clauza GROUP BY, dar este recomandat scrierea mai nti a clauzei GROUP BY deoarece este mai logic. Grupurile sunt formate i func iile grup sunt calculate nainte de aplicarea clauzei HAVING pentru grupurile din lista SELECT. SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary)>10000;

Exemplul de mai sus afieaz num rul departamentului i salariul maxim pentru acele departamente la care salariul minim este mai mare de 10.000 $. Se poate folosi clauza GROUP BY f r a se folosi o func ie de grup n lista SELECT. Dac se restric ioneaz rndurile n baza unei func ii de grup, este obligatoriu necesar o clauza GROUP BY i o clauza HAVING. Exemplul de mai jos afieaz numerele departamentelor i salariul mediu la acele departamente la care salariul minim este mai mare de 10.000 $. SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING max(salary)>10000; 9-243

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Exemplul de mai jos afieaz numele func iei i totalul salariului lunar pentru fiecare nume de func ie, cu un total al statului de plata dep ind 13.000 $. Exemplul exclude vnz torii i sorteaz lista dup salariul lunar total. SELECT job_id, SUM(salary) PAYROLL FROM employees WHERE job_id NOT LIKE '%REP%' GROUP BY job_id HAVING SUM(salary) > 13000 ORDER BY SUM(salary);

9.9

Imbricarea funciilor de grup

Afiarea valorii maxime a salariului mediu. SELECT MAX(AVG(salary)) FROM employees GROUP BY department_id;

Func iile de grup pot fi imbricate pe oricte nivele de adncime. Exemplul de mai sus afieaz salariul mediu maxim. 9.10 GROUP BY cu operatorii ROLLUP i CUBE Obiective: Folosirea operatorului ROLLUP pentru a ob ine subtotaluri; Folosirea operatorului CUBE pentru a ob ine valori de intersec ie; Folosirea func iei GROUPING pentru identificarea valorilor rndurilor create de ROLLUP sau CUBE; Folosirea GROUPING SETS pentru a ob ine un singur set de date. 9-244

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Operatorii ROLLUP i CUBE trebuie specifica i n cadrul clauzei GROUP BY. Gruparea cu ROLLUP duce la ob inerea unei set de rezultate ce con ine pe lng valorile pentru rndurile grupate n mod obinuit i rndurile pentru subtotal. Gruparea cu folosirea operatorului CUBE duce la gruparea rndurilor selectate pe baza valorilor tuturor combina iilor posibile ale expresiilor specificate i returneaz un singur rnd cu informa ii totale pentru fiecare grup. Se poate folosi operatorul CUBE pentru a ob ine rnduri de tip cross-tabulation. Observa ii: La folosirea operatorilor ROLLUP i CUBE trebuie s v asigura i c acele coloane ce sunt dup clauza GROUP BY au sens, ca exist o rela ionare real ntre ele. n caz contrar operatorii vor da rezultate irelevante. Operatorii ROLLUP i CUBE sunt disponibili ncepnd cu versiunea Oracle8i. 9.11 Operatorul ROLLUP SELECT [column,] group_function(column)... FROM table [WHERE condition] [GROUP BY [ROLLUP] group_by_expression] [HAVING having_expression]; [ORDER BY column]; ROLLUP este o extensie a clauzei GROUP BY. Folosirea operatorului ROLLUP duce la ob inerea unor rezultate cumulative cum ar fi subtotalurile. ROLLUP poate fi folosit n scrierea rapoartelor, graficelor, etc. pentru a ob ine elemente de statistic i totaluri din seturile de rezultate. Operatorul ROLLUP creeaz grupuri prin micarea ntr-o direc ie, de la stnga la dreapta, de-a lungul listei de coloane specificate n clauza GROUP BY dup care aplic func ia de agregare acestor grup ri. Observa ii: Pentru a produce subtotaluri cu n dimensiuni, unde n este num rul de coloane specificat n clauza GROUP BY f r a folosi operatorul ROLLUP, trebuie unite, folosind operatorul UNION ALL n+1 fraze SELECT. Acest lucru face ca execu ia interog rii sa fie ineficient deoarece fiecare fraza SELECT necesit un acces la tabel. Operatorul ROLLUP ob ine aceste rezultate cu un singur acces la tabel, motiv pentru care folosirea operatorului este foarte eficient atunci cnd sunt 9-245

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice implicate multe coloane n producerea subtotalurilor. EXEMPLU SELECT department_id, job_id,sum(salary) FROM employees WHERE department_id < 60 GROUP BY ROLLUP(department_id, job_id)

n exemplul de mai sus se afieaz : Salariul total pentru fiecare JOB_ID din fiecare departament pentru acele departamente a c ror ID este mai mic de 60, n conformitate cu gruparea pe departamente specificat n clauza GROUP BY (eticheta 1) Operatorul ROLLUP afieaz : o o Salariul total pentru acele departamente care au ID-ul mai mic de 60 (eticheta 2); Salariul total pentru toate departamentele care au ID-ul mai mic de 60, n func ie de job_ID (eticheta 3);

Toate rndurile etichetate cu 1 sunt rnduri normale iar cele indicate cu 2 i 3 sunt rnduri supratotalizatoare. Operatorul ROLLUP creeaz subtotaluri care se desf oar ncepnd de la nivelul cel mai detaliat pn la un total general, n func ie de criteriile de grupare specificate n clauza GROUP BY. Se calculeaz mai nti valorile totale standard pentru grupul specificat n clauza GROUP BY (n exemplu, suma salariilor pe fiecare func ie n cadrul departamentului), apoi se creeaz n mod progresiv subtotalul de nivel nalt, mutndu-se de la dreapta la stnga n cadrul listei de valori de la clauza GROUP BY (n exemplu, este calculat mai nti suma salariilor pe fiecare departament urmat de suma salariilor pentru toate departamentele). Dac pentru operatorul ROLLUP din clauza GROUP BY sunt specificate 9-246

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice n coloane, rezultatul opera iei va avea n + 1 grupuri (in exemplu 2 + 1 = 3 grupuri). Rndurile bazate pe prima expresie din cele n specificate se numesc rnduri obinuite iar celelalte se numesc rnduri supratotalizatoare. 9.12 Operatorul CUBE SELECT [column,] group_function(column)... FROM table [WHERE condition] [GROUP BY [CUBE] group_by_expression] [HAVING having_expression]; [ORDER BY column]; Operatorul CUBE este un comutator suplimentar al clauzei GROUP BY dintr-o fraza SELECT. Operatorul CUBE poate fi folosit mpreuna cu toate func iile de grup inclusiv AVG, SUM, MAX, MIN i COUNT. El este folosit pentru a ob ine seturi de rezultate care sunt n mod obinuit folosite n rapoartele de tip cross-tab. Pe cnd ROLLUP duce la ob inerea doar a unei frac iuni din num rul total de combina ii posibile pentru subtotaluri, CUBE produce subtotaluri pentru toate combina iile posibile ale grup rii specificate n clauza GROUP BY precum i un total general. Operatorul CUBE este folosit mpreun cu o func ie de grup pentru a general rnduri suplimentare ntr-un set de rezultate. Coloanele incluse n clauza GROUP BY sunt referite ncruciat n vederea gener rii unui superset de grupuri. Func ia de grup specificat n list este aplicat acelor grupuri pentru a produce valori de total pentru rnduri suplimentare supratotalizatoare. Num rul grupurilor suplimentare din setul de rezultate este dat de num rul de coloane incluse n clauza GROUP BY. De fapt, orice combina ie posibil a coloanelor sau expresiilor men ionate n clauza GROUP BY este folosit pentru a produce supratotaluri. Dac n clauza GROUP BY sunt n coloane sau expresii, vor fi 2n combina ii de supratotaluri posibile. Matematic, aceste combina ii formeaz un cub ndimensional, motiv pentru care operatorul este numit astfel. Prin folosirea aplica iilor sau elementelor de programare, aceste valori supratotalizatoare pot fi nc rcate n grafice care convertesc datele n elemente vizuale.

9-247

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Exemplu: SELECT department_id, job_id, SUM(salary) FROM employees WHERE department_id < 60 GROUP BY CUBE (department_id, job_id); n exemplul de mai sus rezultatul interog rii se interpreteaz astfel: Salariul total pentru fiecare func ie din cadrul departamentului (pentru acele departamente ce au ID-ul mai mic de 50) este afiat de clauza GROUP BY (eticheta 1); Salariul total pentru acele departamente ce au ID-ul mai mic de 50 (eticheta 2); Salariul total pentru fiecare func ie indiferent de departament (eticheta 3); Salariul total pentru acele departamente ce au ID-ul mai mic de 50, indiferent

de func ie (eticheta 4). n exemplu, toate rndurile etichetate cu 1 sunt rnduri obinuite, toate rndurile etichetate cu 2 i 4 sunt rnduri totalizatoare iar rndurile etichetate cu 3 sunt rnduri ce con in valori ncruciate. Operatorul CUBE a efectuat i opera ia pe care un operator de tip ROLLUP ar fi executat-o pentru a afia subtotalurile i salariul total pentru acele departamente a c ror ID este mai mic, indiferent de valoarea din coloana JOB_ID. Suplimentar operatorul CUBE afieaz salariul total pentru fiecare func ie, indiferent de departament. Not : Similar cu operatorul ROLLUP, ce genereaz subtotaluri pe n dimensiuni (unde n este num rul de coloane din clauza GROUP BY), 9-248

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice dac nu s-ar folosi operatorul CUBE ar fi fost necesare 2n fraze SELECT care sa fie legate cu UNION ALL. Astfel, o ieire cu 3 dimensiuni ar necesita 23 = 8 fraze SELECT care s fie unite cu UNION ALL. 9.13 Funcia GROUPING Func ia GROUPING poate fi folosit mpreun cu operatorul CUBE sau ROLLUP. Prin folosirea ei se pot crea grupuri care s formeze subtotaluri ntrun rnd i se pot deosebi valorile de NULL stocate de valorile de NULL create de ROLLUP sau CUBE. Func ia ntoarce valoarea 0 sau 1. SELECT [column,] group_function(column).., GROUPING(expr) FROM table [WHERE condition] [GROUP BY [ROLLUP][CUBE] group_by_expression] [HAVING having_expression]; [ORDER BY column]; Func ia GROUPING poate fi folosit mpreun cu operatorul CUBE sau ROLLUP pentru a ajuta la n elegerea modalit ii de ob inere a valorilor de total. Func ia GROUPING folosete o singur coloan drept argument. Valoarea pentru expr din sintaxa trebuie s se potriveasc cu una din expresiile scrise clauza GROUP BY. Func ia ntoarce valoarea 0 sau 1. Valorile ntoarse de func ia GROUPING sunt folositoare pentru a: Determina nivelul de totalizare pentru un anumit subtotal, adic grupul sau grupurile pe care se bazeaz subtotalul; Identific dac o valoare de NULL din coloana unui rnd dintr-un set de rezultate indica: valoare de NULL din tabela de baza (NULL stocat); valoare de NULL creat de ROLLUP/CUBE (ca rezultat a unei func ii de grup asupra acelei expresii ). Valoare 0 returnat de func ia GROUPING bazat pe o expresie indic urm toarele: Expresia a intrat n calcul unei valori totale. Valoarea NULL din expresia coloanei este o valoare stocat de NULL. Valoare 1 returnat de func ia GROUPING bazat pe o expresie indic urm toarele: Expresia nu a intrat in calcul unei valori totale. Valoarea NULL din expresia coloanei este o valoare creat de ROLLUP sau CUBE ca rezultat al grup rii. 9-249

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

EXEMPLU: SELECT department_id DEPTID, job_id JOB, SUM(salary), FROM employees WHERE department_id < 50 GROUP BY ROLLUP(department_id, job_id); GROUPING(department_id) GRP_DEPT,GROUPING(job_id) GRP_JOB

n exemplul de mai sus avem in primul rnd valoarea nsumat a salariilor i anume 4400. Aceast valoare este salariul total pentru job_ID=AD_ASST din departamentul 10. Pentru a calcula aceast valoare total , trebuie luate n considera ie att coloana DEPARTMENT_ID ct i JOB_ID. Astfel, valoare 0 este ntoars att pentru expresia GROUPING(department_id) ct i pentru GROUPING(job_id). Luam acum n discu ie valoarea total 4400 din cel de-al doilea rnd. Aceast valoare este salariul total pentru departamentul 10 i a fost calculat lund n considerare coloana DEPARTMENT_ID; astfel valoarea 0 a fost returnat de GROUPING(department_id). Deoarece coloana JOB_ID nu a fost luat n considerare n calculul acestei valori, GROUPING(job_id) returneaz valoarea 1. Rezultate similare se pot observa n rndul al cincilea. Observa i valoare 23400 din ultimul rnd ce reprezint salariul total pentru toate func iile i pentru acele departamente a c ror num r este mai mic de 50. Pentru a calcula aceast valoare total nu au fost avute n vedere nici coloana DEPARTMENT_ID nici JOB_ID. Astfel este returnat valoarea 1 pentru expresia GROUPING(department_id) i pentru GROUPING(job_id). 9.14 GROUPING SETS GROUPING SETS reprezint o extensie a clauzei GROUP BY care permite specificarea unei grup ri multiple a datelor favoriznd astfel o sumare eficient i astfel facilitnd analiza datelor la folosirea mai multe dimensiuni. 9-250

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Serverul Oracle calculeaz toate grup rile specificate n clauza GROUPING SETS i combin rezultatele grupurilor individuale cu o opera ie de tip UNION ALL. Eficien a Grouping set este datorat : este necesar doar o singur citire a datelor din tabelul de baza; nu este necesar scrierea unei expresii complexe de tip UNION ; cu ct sunt mai multe elemente n GROUPING SETS cu att crete beneficiul performan ei dat de instruc iune .

o o o

Pentru a specifica diverse tipuri de grup ri (care pot include operatori de tip ROLLUP sau CUBE) este necesar doar o singur instruc iune SELECT care poate fi scris mpreuna cu GROUPING SETS n locul unor fraze SELECT multiple combinate cu operatorul UNION ALL. De exemplu se poate scrie: SELECT department_id, job_id, manager_id, AVG(salary) FROM employees GROUP BY GROUPING SETS ((department_id, job_id, manager_id), (department_id, manager_id),(job_id, manager_id)); Instruc iunea calculeaz suma pentru urm toarele grupuri : (department_id, job_id, manager_id), (department_id, manager_id) i (job_id, manager_id). n lipsa acestei facilita i oferite de Oracle9i ar fi trebuit scrise mai multe instruc iuni SELECT combinate cu operatorul UNION ALL O abordare care folosete multe interog ri este ineficient deoarece necesit multiple citiri ale datelor. Compara i instruc iunea precedent cu alternativa : SELECT department_id, job_id, manager_id, AVG(salary) FROM employees GROUP BY CUBE(department_id, job_id, manager_id); Instruc iunea precedent calculeaz toate cele 8 (2 *2 *2) grupuri doar prin unica grupare : (department_id, job_id, manager_id), (department_id, manager_id) si (job_id, manager_id) care intereseaz .

9-251

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice O alt alternativ este instruc iunea urm toare: SELECT department_id, job_id, manager_id, AVG(salary) FROM employees GROUP BY department_id, job_id, manager_id UNION ALL SELECT department_id, NULL, manager_id, AVG(salary) FROM employees GROUP BY department_id, manager_id UNION ALL SELECT NULL, job_id, manager_id, AVG(salary) FROM employees GROUP BY job_id, manager_id; Aceast instruc iune necesit trei citiri ale tabelei de baz i este deci ineficient . CUBE i ROLLUP pot fi gndi i ca grouping sets cu o semantic specific (echivalen a din tabelul de mai jos)

Exemplu SELECT department_id, job_id, manager_id,avg(salary) FROM employees GROUP BY GROUPING SETS ((department_id,job_id), (job_id,manager_id));

9-252

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Interogarea din exemplu calculeaz suma pentru dou grupuri. Tabelul este mp r it n urm toarele grupuri: Department_ID, Job_ID; Job_ID, Manager_ID. Este calculat media salariilor pentru fiecare dintre aceste grupuri, iar seturile de rezultate sunt afiate pentru fiecare grup. n lista rezultatelor, grupul marcat cu 1 poate fi interpretat astfel: Media salariilor pentru to i angaja ii ce au job_ID=AD_ASST din departamentul 10 este 4400. Media salariilor pentru to i angaja ii ce au job_ID=MK_MAN din departamentul 20 este 13000. Media salariilor pentru to i angaja ii ce au job_ID= MK_REP din departamentul 20 este 6000. Media salariilor pentru to i angaja ii ce au job_ID=ST_CLERK din departamentul 50 este 2925 i aa mai departe

n lista rezultatelor, grupul marcat cu 2 poate fi interpretat astfel: Media salariilor pentru to i angaja ii ce au job_ID=MK_MAN, ca au ca sef persoana cu manager_ID=100 este 13000. Media salariilor pentru to i angaja ii ce au job_ID=MK_REP, ca au ca sef persoana cu manager_ID=201 este 6000 i aa mai departe. SELECT department_id, job_id, NULL as manager_id, AVG(salary) as AVGSAL FROM employees GROUP BY department_id, job_id UNION ALL SELECT NULL, job_id, manager_id, avg(salary) as AVGSAL FROM employees GROUP BY job_id, manager_id; n lipsa unui element de optimizare care s caute n blocurile interog rii pentru a genera un plan de execu ie, interogarea de mai sus necesit scanarea dubl a tabelei EMPLOYEES, lucru ce este foarte ineficient, motiv pentru care se recomand folosirea instruc iunii GROUPING SETS.

Exemplul de mai sus poate fi scris dup cum urmeaz :

9-253

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 9.15 Composite Columns O coloan compus este o colec ie de coloane care sunt tratate unitar n momentul efectu rii calculelor pentru grupuri. Pentru a specifica o coloana compus n clauza GROUP BY trebuie s scrie i aceste coloane n paranteze astfel nct severul Oracle s poat recunoate aceste coloane ca o unitate atunci cnd execut calculele pentru clauzele ROLLUP sau CUBE, de exemplu: ROLLUP (a, (b, c), d) unde (b,c) formeaz o coloan compus care este tratat unitar. n general folosirea coloanelor compuse este util la scrierea instruc iunilor ROLLUP, CUBE sau GROUPING SETS. Dac folosi i coloane compuse pentru instruc iunile ROLLUP sau CUBE nseamn ca dori i sa trece i peste anumite nivele de nsumare (b,c). De exemplu GROUP BY ROLLUP (a, (b, c)) este echivalent cu: GROUP BY a, b, c UNION ALL GROUP BY a UNION ALL GROUP BY () Aici (b, c) sunt tratate ca o unitate iar rollup nu va fi aplicat pentru (b, c). Este ca i cum a i folosi un alias, de exemplu z, pentru (b, c), i expresia GROUP BY se reduce la GROUP BY ROLLUP(a, z). NOT : GROUP BY( ) este de obicei o clauz tipic pentru instruc iunea SELECT cu valori de null pentru a i b i doar o func ie de grup. Se folosete in special pentru calcularea unui total general. SELECT NULL, NULL, aggregate_col FROM <table_name> GROUP BY ( ); Compara i sintaxa de forma, GROUP BY ROLLUP(a, b, c) cu : GROUP BY a, b, c UNION ALL GROUP BY a, b UNION ALL GROUP BY a UNION ALL GROUP BY ().

9-254

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Similar, GROUP BY CUBE((a, b), c) ar fi echivalent cu : GROUP BY a, b, c UNION ALL GROUP BY a, b UNION ALL GROUP BY c UNION ALL GROUP By () Tabelul urm tor ilustreaz diferen a dintre folosirea coloanelor compuse i specifica iile pentru GROUP BY .

EXEMPLU: SELECT department_id, job_id, manager_id, SUM(salary) FROM employees GROUP BY ROLLUP( department_id,(job_id, manager_id)); Consider m exemplul: SELECT department_id, job_id,manager_id, SUM(salary) FROM employees GROUP BY ROLLUP( department_id,job_id, manager_id); Interogarea presupune calcularea de c tre serverul Oracle Server a valorilor pentru urm toarelor grupuri : 1. (department_id, job_id, manager_id); 2. (department_id, job_id); 3. (department_id); 4. ( ). 9-255

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Daca sunte i interesa i n gruparea dup liniile (1), (3) i (4) din exemplul de mai sus, nu pute i limita calculul acestor grupuri f r a folosi coloane compuse. Folosirea coloanelor compuse d posibilitatea de a trata coloanele JOB_ID i MANAGER_ID unitar atunci cnd se executa ROLLUP. Coloanele incluse n paranteze sunt tratate unitar la execu ia instruc iunilor ROLLUP i CUBE, lucru ilustrat n figur . Scriind coloanele JOB_ID i MANAGER_ID n paranteze, indicam serverului Oracle faptul c trebuie s trateze coloanele JOB_ID i MANAGER_ID unitar, drept coloan compus . Exemplul calculeaz grupurile : (department_id, job_id, manager_id); (department_id); ( ). si afieaz urm toarele :

Salariul total pe fiecare departament (eticheta 1) Salariul total pe fiecare departament, job_ID i manager (eticheta 2) Totalul general (eticheta 3) Exemplul de mai sus poate fi scris i astfel : SELECT department_id, job_id, manager_id, SUM(salary) FROM employees GROUP BY department_id,job_id, manager_id UNION ALL SELECT department_id, TO_CHAR(NULL),TO_NUMBER(NULL), SUM(salary) FROM employees GROUP BY department_id UNION ALL 9-256

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice SELECT TO_NUMBER(NULL), TO_CHAR(NULL),TO_NUMBER(NULL),SUM(salary) FROM employees GROUP BY (); n absenta unui element de optimizare care s studieze interogarea i s creeze un plan de execu ie a interog rii, interogarea de mai sus necesita trei scan ri ale tabelei de baza, EMPLOYEES, lucru ce este ineficient. De aceea se recomand folosirea coloanelor compuse. 9.16 Concatenated Groupings Grup rile concatenate ofer o solu ie concis de a genera combina ii utile de grupuri. Pentru a specifica seturi de grup ri concatenate trebuie sa separa i set rile de grupuri multiple i opera iile de tip ROLLUP i CUBE prin virgule astfel nct serverul Oracle s le combine ntr-o singura clauza GROUP BY. Rezultatul este intersec ia valorilor grupurilor din fiecare set de grup ri. EXEMPLU GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d) Exemplul precedent definete urm toarele grupuri: (a, c), (a, d), (b, c), (b, d) Concatenarea seturilor de grup ri este foarte folositoare deoarece : uureaz scrierea instruc iunii: nu trebuie s enumera i, prin scriere manual , toate grupurile ; folosirea aplica iei: SQL-ul general de aplica ii OLAP include deseori concatenarea seturilor de grupare, pentru fiecare set de grupare definind seturile de grupare necesare pentru dimensionare. EXEMPLU: SELECT department_id, job_id, manager_id, SUM(salary) FROM employees GROUP BY department_id,ROLLUP(job_id),CUBE(manager_id);

9-257

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Din exemplul de mai sus rezult formarea urm toarelor grupuri : (department_id, manager_id, job_id ); (department_id, manager_id); (department_id, job_id); (department_id). Se calculeaz salariul total pentru fiecare grup, exemplul afind urm toarele : Salariul total pentru fiecare department, job ID, manager (eticheta 1); Salariul total pentru fiecare department, manager ID (eticheta 2); Salariul total pentru fiecare department, job ID (eticheta 3); Salariul total pentru fiecare department (eticheta 4). Pentru o n elegere mai uoar , detaliile pentru departamentul 10 sunt eviden iate n figura de mai sus.

9-258

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 9.17 Exerciii asupra mai multor rnduri i produc un

1. Func iile de grup ac ioneaz rezultat. (adev rat/fals).

2. Func iile de grup includ valoarea null n calcule (adev rat/fals). 3. Clauza WHERE restric ioneaz rndurile anterior includerii acestora n grupurile de calcul (adev rat/fals). 4. Afia i cel mai mare salar, cel mai mic salar, suma i media salariului pentru to i angaja ii. Eticheta i coloanele cu Maxim, Minim, Suma i Media. Rotunji i rezultatele (f r zecimale). Salva i instruc iunea in fiierul p4.sql.

5. Modifica i p4.sql astfel nct s afieze aceleai informa ii pentru fiecare tip de meserie. Salva i modific rile in p5.sql.

9-259

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 6. Scrie i o interogare pentru afiarea num rului de angajai cu aceeai meserie.

7. Determina i num rul managerilor f r s -i lista i (doar num rul lor). Eticheta i coloana Nr. Manageri.(Folosi i coloana Manager_ID).

8. Scrie i o interogare care s afieze diferen a dintre salariile cele mai mari i cele mai mici. Eticheta i coloana Diferen a.

9. Afia i num rul managerului i salariul celui mai prost pl tit angajat pentru acel manager. Exclude i pe cei care nu au manager. Exclude i grupurile care au salariul minim mai mic dect 1600$. Sorta i rezultatele in ordine descresc toare dup salar.

9-260

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 10. Scrie i o interogare care s afieze numele departamentului, localitatea, num rul de angajai i salariul mediu al angaja ilor din acel departament. Eticheta i coloanele Dname, Loc, No of People i Salary. Vezi exemplul.

11. Scrie i o interogare care afieaz num rul total de angajai i num rul total de angaja i care au fost angaja i n anii 1995,1996,1997 i 1998. Eticheta i coloanele corespunz tor. Vezi exemplul.

12. Afia i meseria, suma salariilor pentru meseria respectiv din cadrul departamentelor 20, 50, 80, 90 precum i salariul total pentru acea meserie pentru toate departamentele. Eticheta i coloanele corespunz tor. Vezi exemplul.

9-261

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 13. Scrie i o interogare care sa afieze urm toarele informa ii pentru acei angajai a c ror manager_ID este mai mic de 120: Manager_ID; Job_ID i salariul total pentru fiecare job_ID pentru angaja ii care au acelai sef; Salariul total pe care efii trebuie sa-l pl teasc angaja ilor ; Salariul total pe care efii trebuie sa-l pl teasc angaja ilor, indiferent de job_ID.

9-262

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 14. Observa i rezultatele de la punctul 13. Scrie i o interogare folosind func ii de grupare pentru a determina dac valorile de NULL din coloanele corespunz toare expresiilor GROUP BY sunt cauzate de opera ia ROLLUP.

9-263

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 15. Scrie i o interogare care s afieze urm toarele informa ii despre angaja ii a c ror manager_ID este mai mic de 120 : Manager_ID; Func ia i salariul total pentru fiecare func ie pentru angaja ii care au acelai sef; Salariul total al angaja ilor ce au acelai sef ; Salariul total pe fiecare func ie, indiferent de sef; Salariul total indiferent de func ii. 16. Observa i rezultatele interog rii de la punctul 15. Scrie i o interogare care s foloseasc func iile de grupare pentru a determina dac valorile de NULL din coloanele corespunz toare clauzei GROUP BY sunt date de operatorul CUBE.

17. Scrie i o interogare, folosind GROUPING SETS, pentru a afia urm toarele grupuri: - department_id, manager_id, job_id; - department_id, job_id; - manager_id, job_id. Interogarea trebuie s grupuri. calculeze suma salariilor pentru fiecare dintre aceste

9-264

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Capitolul 10 Obiective:

Subinterogari

Descrierea tipurilor de probleme pe care le pot rezolva subinterogarile; Definirea subinterogarilor; Enumerarea tipurilor de subinterog ri; Scrierea subinterogarilor de un singur rnd i a celor de mai multe rnduri.

n acest capitol se vor studia caracteristici mai avansate ale instruc iunii SELECT cum ar fi scrierea subinterogarilor n clauza WHERE a altei instruc iuni SQL n scopul ob inerii de valori bazate pe o valoare necunoscut a unei condi ii.

Cine primete un salariu mai mare dect cel al lui Jones ?

Cerere principal Ce angajat are un salariu mai mare dect Jones ? Subinterogare Care este salariul lui Jones ?

10.1

Folosirea unei subinterog ri pentru a rezolva o problema

S presupunem c se dorete scrierea unei interog ri pentru a afla cine ctig un salariu mai mare dect salariul lui Jones. Pentru rezolvarea acestei probleme este nevoie de dou interog ri: o interogare pentru a afla ce salariu ctig Jones i o a doua pentru a determina cine ctig mai mult dect aceast sum . Problema poate fi rezolvat combinnd aceste dou interog ri, integrnd una din cereri n cealalt . 10-265

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice O cerere inclus sau o subinterogare returneaz o valoare care va fi folosit de c tre interogarea exterioar sau principal . Folosirea unei subinterog ri este echivalent execut rii a dou cereri secven iale i folosirii rezultatului primei cereri ca valoare de c utare pentru cea de a dou cerere. SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table); Subinterogarea (cererea intern ) se execut o singur dat , naintea interog rii principale. Rezultatul subinterog rii este utilizat de c tre cererea principal (cererea extern ). O subinterogare reprezint o instruc iune SELECT care este inclus ntro clauz apar innd altei instruc iuni SELECT. Prin utilizarea subinterogarilor se pot construi instruc iuni mai puternice pornind de la instruc iuni simple. Acestea pot fi foarte folositoare n cazurile n care se dorete selectarea unor rnduri dintr-un tabel folosind o condi ie care depinde de datele din tabelul propriu-zis. Subinterogarile pot fi plasate in urm toarele clauze SQL: WHERE HAVING FROM n sintaxa mai sus prezentat expr operator implic operatori de compara ie: >, = sau IN. unul din urm torii

Operatorii de comparare se mpart n dou clase: operatori pentru subinterog ri de un singur rnd: >=, <, <>, <= operatori pentru subinterog ri de mai multe rnduri: IN, ANY, ALL. Subinterogarea este deseori referit ca fiind o instruc iune SELECT inclus , sub-SELECT sau instruc iune SELECT intern . n general, subinterogarea se execut prima, iar rezultatul este folosit pentru a finaliza condi ia de cerere pentru interogarea principal sau extern .

10-266

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice SELECT last_name FROM employees WHERE salary > (SELECT salary FROM employees WHERE last_name = 'Abel');

n figura anterioar , cererea intern determin salariul angajatului cu numele Abel. Cererea extern preia rezultatul cererii interne i l folosete pentru a afia to i angaja ii care au salariul mai mare dect aceast sum . Reguli n utilzarea subinterog rilor

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

Subinterog rile folosesc dou clase de operatori de comparare: operatori single-row i operatori multiple-row. 10.2 Tipuri de subinterog ri

10-267

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Single-row : cereri care returneaz doar un rnd din instruc iunea SELECT intern ; Multiple-row : cereri care returneaz mai mult de un rnd din instruc iunea SELECT intern .

10.3

Subinterogari single-row

O subinterogare single-row este acea subinterogare care returneaz un singur rnd din instruc iunea SELECT intern . Acest tip de subinterogare folosete un operator single-row. Exemplu: SELECT last_name, job_id FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141);

Afiarea angaja ilor care lucreaz pe acelai post (au aceeai meserie) ca i angajatul care are num rul de marc 141. Executarea unei subinterog ri single-row:

10-268

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice O instruc iune SELECT poate fi considerat ca un bloc de cereri. Exemplul de mai sus afieaz angaja ii a c ror func ie este aceeai cu cea a angajatului cu num rul 141 i a c ror salariu este mai mare dect cel al angajatului 143. Exemplul este format din 3 blocuri de cereri: o cerere exterioar i dou cereri interne. Blocurile de cereri interne sunt executate primele, producnd rezultatele: FUNC IONAR (ST_CLERK), respectiv 2600. Apoi este procesat blocul de cereri exterior care folosete valorile returnate de c tre cererile interne pentru a finaliza propriile condi ii de c utare. Ambele cereri interne returneaz valori singulare (FUNCTIONAR i 2600), astfel ca aceast instruc iune SQL este denumit subinterogare singlerow. Interog rile exterioare i incluse pot prelua datele din tabele diferite.

10.4 Utilizarea func iilor de grup ntr-o subinterogare SELECT last_name, job_id, salary FROM employees WHERE salary = (SELECT MIN(salary) FROM employees);

n interogarea principal pot fi afiate date prin utilizarea unei func ii de grup folosind o subinterogare care sa returneze un singur rnd. Subinterogarea se va plasa ntre paranteze, dup operatorul de comparare. Exemplul din figura precedent afieaz numele, func ia i salariul tuturor angaja ilor al c ror salariu este egal cu salariul minim. Func ia MIN (func ie de grup) returneaz o singur valoare (i anume 2500), care este folosit de c tre interogarea principal . Clauza HAVING n subinterogare Server-ul Oracle execut mai nti subinterogarile. Server-ul Oracle returneaz rezultatele c tre clauza HAVING a interog rii principale.

10-269

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 50);

Subinterogarile pot fi folosite nu numai n clauza WHERE ci i n clauza HAVING. Server-ul Oracle execut subinterogarea returnnd rezultatul c tre clauza HAVING a subinterog rii principale. Instruc iunea SQL prezentat n figura de mai sus are ca scop final afiarea tuturor departamentelor la nivelul c rora salariul minim are o valoare mai mare dect valoarea salariului minim din cadrul departamentului 50. Exemplu: Se cere s se g seasc func ia avnd cel mai sc zut salariu mediu. SELECT job_id, AVG(salary) FROM employees GROUP BY job_id HAVING AVG(salary) = (SELECT MIN(AVG(salary)) FROM employees GROUP BY job_id); 10.5 Erori ce pot apare la folosirea subinterog rilor

10-270

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice O eroare obinuit la folosirea subinterog rilor o reprezint returnarea a mai mult de un rnd de c tre o subinterogare dorit a fi de tip single-row. n instruc iunea SQL din exemplul anterior, subinterogarea con ine o clauz GROUP BY dup num rul departamentului (department_ID), care implic selectarea mai multor rnduri, cte unul pentru fiecare grup g sit. n acest caz, rezultatul subinterog rii va fi: 4400, 6000, 2500, 4200, 7000, 17000 i 8300. Interogarea extern preia rezultatele subinterog rii i le folosete n clauza WHERE. Clauza WHERE con ine operatorul egal ( = ), operator de comparare single-row, care ateapt o singur valoare n partea sa dreapt . Operatorul = nu poate accepta mai mult de o valoare primit de la subinterogare i astfel este generat eroarea. Pentru a corecta eroarea, operatorul (=) trebuie nlocuit cu operatorul IN.

O problem obinuit legat de subinterog ri o constituie posibilitatea neselect rii nici unui rnd de c tre interogarea inclus . n ceea ce privete instruc iunea SQL de mai sus, subinterogarea con ine o clauz WHERE (ename = Haas). Se presupune c inten ia este de a selecta angajatul cu numele Haas. Instruc iunea pare a fi corect , dar la execu ie nu se selecteaz nici un rnd. Problema este ortografierea greit a cuvntului Haas. Nu exist nici un angajat cu numele de Haas. Astfel, subinterogarea nu va selecta nici un rnd. Interogarea extern preia rezultatul subinterog rii (null, n acest caz) i folosete acest rezultat n propria-i clauza WHERE. Interogarea extern nu g sete nici un angajat avnd cmpul referitor la func ie de valoare nul i astfel nu returneaz nici un rnd.

10-271

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

10.6

Subinterogari multiple-row

Selecteaz mai mult de un rnd Folosesc operatori multiple-row de comparare Operator IN ANY ALL Semnifica ie Egal cu oricare din elementele listei Compar valoarea cu fiecare valoare returnat de subinterogare luat separat Compar valoarea cu toate valorile returnate de subinterogare

Subinterog rile care returneaz mai mult de un rnd se numesc subinterog ri multiple-row. n cazul subinterog rilor multiple-row se folosesc operatori multiple-row n locul celor single-row. Operatorul multiple-row necesit una sau mai multe valori. SELECT last_name, salary, department_id FROM employees WHERE salary IN (SELECT MIN(salary) FROM employees GROUP BY department_id); Se cere s se selecteze angaja ii care ctig un salariu egal cu salariul minim la nivel de departament. Interogarea intern va fi prima executat producnd un r spuns. Blocul cererii externe este apoi procesat i se folosesc valorile returnate de c tre interogarea inclus pentru finalizarea propriei condi ii de c utare. De fapt, interogarea principal este privit din perspectiva server-ului Oracle astfel: SELECT last_name, salary, department_id FROM employees WHERE salary IN (2500, 4200, 4400, 6000, 7000, 8300, 8600, 1 7000);

10-272

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 10.7 Utilizarea operatorului ANY n subinterogarile multiple-row

Operatorul ANY compar o valoare cu fiecare valoare returnat de subinterogare. Exemplul de mai sus afieaz angaja ii ale c ror salarii sunt mai mici dect al oric rui programator (IT_PROG) dar care nu sunt programatori. Salariul maxim pe care l ctig un programator este $9000. Instruc iunea SQL afieaz to i angaja ii care nu sunt programatori dar ctig mai pu in de $9000. < ANY > ANY = ANY nseamn mai mic dect maxim. nseamn mai mare dect minim. este echivalent cu operatorul IN.

10.8

Utilizarea operatorului ALL n subinterog rile multiple-row

10-273

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Operatorul ALL compar o valoare cu toate valorile returnate de o subinterogare. Exemplul de mai sus afieaz to i angaja ii ale c ror salarii sunt mai mici dect al oric rui programator (IT_PROG) dar care nu sunt programatori. Cel mai mic salariu al vreunui programator este $4200, aa c interogarea va selecta acei angajai ale c ror salarii sunt mai mici dect $4200. > ALL < ALL nseamn mai mare dect maxim nseamn mai mic dect minim

Operatorul NOT poate fi folosit mpreun cu operatorii IN, ANY i ALL. 10.9 Returnarea valorilor nule n rezultatul subinterog rii

SELECT emp.last_name FROM employees emp WHERE emp.employee_id NOT IN (SELECT mgr.manager_id FROM employees mgr); Comanda SQL de mai sus afieaz to i angaja ii care nu au nici un subordonat. Logic, acesta interogare SQL ar trebui sa returneze 12 linii dar nu se returneaz nici una. Una din valorile returnate de interogare este o valoare de null i prin urmare ntreaga interogare nu returneaz nici o linie. Motivul este c toate aceste condi ii care compar rezultatul unei valori cu null transform rezultatul n null. Cnd exist valori de null n rezultatul subinterog rii, nu folosi i operatorul NOT IN. Operatorul NOT IN este echivalent cu <>ALL. Trebuie s ave i n vedere c valorile nulle ale rezultatului subinterog rii nu vor constitui o problem dac folosi i operatorul IN. Operatorul IN este echivalent cu operatorul ANY. De exemplu, pentru afiarea angaja ilor care nu au subordona i, folosi i urm toarea exprimare SQL: SELECT last_name FROM employees WHERE employee_id NOT IN (SELECT manager_id FROM employees WHERE manager_id IS NOT NULL);

10-274

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 10.10 Subinterogari de coloane multiple Pn acum am scris subinterog ri ce returnau una sau mai multe linii dar care comparau valorile pentru o singur coloan n clauza WHERE sau HAVING a instruc iunii SELECT. Dac se dorete compararea uneia sau a mai multor coloane, la scrierea condi iilor pentru clauza WHERE trebuie folosi i operatorii logici. Folosirea subinterog rilor de coloane multiple ofer posibilitatea mbin rii condi iilor din dou clauze WHERE n una singur . SELECT column, column,... FROM table WHERE (column, column,...) IN (SELECT column, column,... FROM table WHERE condition); Afia i numele, num rul departamentului, salariul i comisionul oric rui angajat a c rui salariu i comision se potrivesc cu salariul i comisionul oric rui angajat din departamentul 30. Exemplul de mai sus folosete o subinterogare de coloane multiple (care returneaz mai mult de o coloan ) pentru a compara sariul i comisionul. 10.11 Compararea coloanelor (pereche i nepereche) Compararea coloanelor ntr-o subinterogare de coloane multiple poate fi f cut n dou moduri: pereche sau nepereche. n exemplul urm tor, clauza WHERE con ine o compara ie pereche. Fiecare linie returnat de comanda SELECT trebuie s aib aceeai valoare att n coloana MANAGER_ID ct i n coloana DEPARTMENT_ID cu cele ale angajatului cu num rul 178 sau 174. n cazul unei compara ii nepereche, fiecare valoare a coloanelor din clauza WHERE a interog rii principale va fi comparat n mod individual cu valorile multiple returnate de subinterogare. Coloanele individuale pot s se potriveasc cu orice valoare returnat de subinterogare. Toate rndurile afiate trebuie s satisfac , n mod colectiv, toate condi iile multiple din interogarea principal . Un exemplu de compara ie nepereche este dat mai jos.

10-275

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Compara ie pereche SELECT employee_id, manager_id, department_id FROM employees WHERE (manager_id, department_id) IN (SELECT manager_id, department_id FROM employees WHERE employee_id IN (178,174)) AND employee_id NOT IN (178,174);

Compara ie nepereche

SELECT employee_id, manager_id, department_id FROM employees WHERE manager_id IN (SELECT manager_id FROM employees WHERE employee_id IN (174,141)) AND department_id IN (SELECT department_id FROM employees WHERE employee_id IN (174,141)) AND employee_id NOT IN(174,141);

10.12 Folosirea unei subinterog ri n clauza FROM Se poate folosi o subinterogare i n clauza FROM a instruc iunii SELECT. Exemplul urm tor afieaz numele angaja ilor, salariul, num rul departamentului i media salariilor pentru to i angaja ii care ctig mai mult 10-276

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice dect salariul mediu din departamentul n care lucreaz . Exemplu SELECT a.last_name, a.salary, a.department_id, b.salavg FROM employees a, (SELECT department_id, AVG(salary) salavg FROM employees GROUP BY department_id) b WHERE a.department_id = b.department_id AND a.salary > b.salavg;

10.13 Expresii scalare returnate de subinterog ri O expresie scalar returnat de o subinterogare este o subinterogare care returneaz valoarea exact a unei coloane aferent unui singur rnd. n Oracle8i subinterog rile scalare erau suportate doar n cteva cazuri similare cum ar fi: instruc iunea SELECT ( clauza FROM, WHERE); listele de valori din instruc iunea INSERT . n Oracle9i, subinterog rile scalare pot fi folosite n : Condi ii i expresii ce fac parte din instruc iuni ca DECODE i CASE; Toate clauzele SELECT cu excep ia GROUP BY; n partea stng a unui operator n clauza SET i WHERE a unei instruc iuni UPDATE. Subinterog rile de mai multe coloane scrise pentru a compara dou sau mai multe coloane, n scrierea c rora se folosesc la clauza WHERE condi ii compuse i operatori logici, nu sunt calificate ca subinterog ri scalare. 10-277

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Valoarea expresiilor scalare ale subinterog rii este valoarea elementului returnat de subinterogare. Dac subinterogarea nu ntoarce nici un rnd, valoarea expresiei scalare este NULL. Dac subinterogarea ntoarce mai mult de un rnd, serverul Oracle returneaz o eroare. Expresiile scalare date de subinterog ri nu sunt valide n urm toarele cazuri: ca valori implicite pentru coloane i expresii pentru clustere; n clauza RETURNING a unei instruc iuni DML ; ca baz a unei func ii de baz pentru index; n clauza GROUP BY, constrngeri CHECK, condi ii pentru WHEN; clauza HAVING; in clauzele START WITH i CONNECT BY; n instruc iuni care nu sunt n leg tur cu interog ri, cum ar fi CREATE PROFILE. Exemplu

Primul exemplu de mai sus demonstreaz faptul c subinterog rile scalare pot fi folosite n expresii de tip CASE. Subinterogarea returneaz valoarea 20, care este IDul departamentului pentru care location ID este 1800. Expresia CASE din interogarea principal folosete rezultatul subinterog rii pentru a afia employee ID, last name, i valoarea Canada sau USA, n func ie de num rul departamentului, dac acesta este sau nu 20. Rezultatul exemplului este urm torul :

10-278

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Cel de al doilea exemplu ordoneaz rezultatele n func ie de DEPARTMENT_NAME prin potrivirea valorilor pentru DEPARTMENT_ID din tabela EMPLOYEES cu valorile pentru DEPARTMENT_ID din tabela DEPARTMENTS. Aceast comparare este f cut prin folosirea subinterog rii scalare din clauza ORDER BY. Rezultatul este afiat mai jos.

Acest exemplu folosete o subinterogare corelat . ntr-o subinterogare corelat , subinterogarea refer o coloan dintr-o tabel referit n subinterogarea principal . 10.14 Subinterogri corelate Subinterog rile corelate sunt folosite pentru procesare rnd cu rnd. Fiecare subinterogare este executat odat pentru fiecare rnd al interog rii principale.

10-279

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice


Extrage rndul candidat din interogarea principal

Execut subinterogarea folosind valoarea din rndul candidat

Folosete valoarea subinterog rii pentru califica sau descalifica rndul candidat

Serverul Oracle execut o subinterogare corelat atunci cnd o subinterogare refer o coloan dintr-un tabel referit n interogarea principal . O subinterogare corelat este evaluat de fiecare dat pentru fiecare rnd procesat de interogarea principal . Interogarea principal poate fi o instruc iune SELECT, UPDATE sau DELETE. Subinterog ri imbricate versus subinterog ri corelate ntr-o subinterogare imbricat normal , interogarea SELECT interioar este executat mai nti odat , valoarea ntoars fiind folosit de interogarea principal . O subinterogare corelat este executat odat pentru fiecare rnd candidat dat de interogarea principal . Cu alte cuvinte, subinterogarea este condus de interogarea principal . Executarea subinterog rii imbricate Se execut mai nti subinterogarea i este returnat o valoare; Se execut odat interogarea principal folosind valoarea dat de subinterogare.

Executarea subinterog rii corelate 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.

10-280

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice SELECT column1, column2,... FROM table1 WHERE column1 operator (SELECT colum1, column2 FROM table2 WHERE expr1 = outer.expr2); Operatorii ANY i ALL pot fi folosi i n subinterog ri corelate.

Exemplu: G si i to i angaja ii care ctig mai mult dect salariul mediu din departamentul n care lucreaz . SELECT last_name, salary, department_id FROM employees outer WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = outer.department_id); n acest caz subinterogarea coreleaz salariul mediu din fiecare departament cu salariul fiec rui angajat. Deoarece att interogarea principal ct i subinterogarea folosesc tabela EMPLOYEES n clauza FROM, acesteia i se atribuie un alias n interogarea principal , nu doar pentru claritatea citirii ci i datorit faptului c f r acest alias interogarea nu ar func iona corect, deoarece subinterogarea nu ar putea s fac diferen a dintre coloana din interogarea principal i cea din subinterogare. Exemplu: Afia i datele angaja ilor care i-au schimbat func ia de cel pu in dou ori. SELECT e.employee_id, last_name,e.job_id FROM employees e WHERE 2 <= (SELECT COUNT(*) FROM job_history WHERE employee_id = e.employee_id);

10-281

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Serverul Oracle evalueaz subinterogarea corelat astfel: Selecteaz un rnd din tabele specificat n interogarea principal , adic un rnd candidat. Memoreaz valoarea din rndul candidat pentru coloana referit n subinterogare (n exemplu, coloana este E.EMPLOYEE_ID.) Execut subinterogarea cu condi ia dat de valoarea rndului candidat din interogarea principal (n exemplu, func ia de grup COUNT(*) este evaluat pe baza valorii coloanei E.EMPLOYEE_ID ob inut la punctul 2). Evalueaz clauza WHERE a interog rii principale pe baza rezultatului dat de subinterogare ob inut n pasul 3. Acest lucru determin dac rndul candidat va fi selectat pentru afiare sau nu. (n exemplu, num rul de schimb ri ale func iei pentru un salariat, evaluat de subinterogare este comparat cu acel 2 din clauza WHERE a interog rii principale. Dac condi ia este ndeplinit de acel angajat, rndul respectiv, este afiat.) Procedura se repet pentru urm toarele rnduri candidate pn la finalul tabelei.

10.15 Folosirea operatorului EXISTS Operatorul EXISTS verific existen a unei valori n setul de rezultate al unei subinterog ri. Dac subinterogarea ntoarce un rnd atunci: Condi ia de c utare nu mai continu n interogarea principal ; Condi ia este marcat ca fiind TRUE. Dac subinterogarea nu ntoarce niciun rnd atunci: Condi ia este marcat ca fiind FALSE; Condi ia de c utare continu n interogarea principal .

n instruc iunile SELECT imbricate sunt accepta i to i operatorii logici. Suplimentar se poate folosi operatorul EXISTS. Acest operator este folosit n mod frecvent n subinterog rile corelate pentru a testa dac o valoare returnat de interogarea principal exist sau nu n setul de rezultate dat de interogarea secundar . Dac subinterogarea ntoarce cel pu in un rnd, operatorul ntoarce valoarea TRUE. Dac valoarea nu exist , ntoarce FALSE. n acest sens operatorul NOT EXISTS testeaz dac o valoare g sit de interogarea principal este sau nu parte a setului de rezultate dat de subinterogare.

10-282

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Exemplu: G si i angajatul care are cel pu in un subaltern. SELECT employee_id, last_name, job_id, department_id FROM employees outer WHERE EXISTS ( SELECT 'X' FROM employees WHERE manager_id = outer.employee_id);

Operatorul EXISTS asigur asupra faptului c reg sirea datelor n subinterogare nu continu atunci cnd s-a g sit cel pu in un rnd care s satisfac condi ia: WHERE manager_id = outer.employee_id. De notat faptul c subinterogarea nu trebuie s ntoarc o coloan anume aa c poate fi aleas o constant . Din punctul de vedere al performan ei este mai rapid selectarea unei constante. Avnd coloana EMPLOYEE_ID n clauza SELECT a subinterog rii ar trebui parcurs tabela pentru aceast coloan . Prin nlocuirea ei cu constanta X, sau oricare alta, performan ele se mbun t esc, acesta fiind un mod eficient de folosire a operatorului IN. Operatorul IN poate fi folosit ca modalitate alternativ pentru operatorul EXISTS, aa cum demonstreaz exemplul de mai jos: SELECT employee_id,last_name,job_id,department_id FROM employees WHERE employee_id IN (SELECT manager_id FROM employees WHERE manager_id IS NOT NULL);

10-283

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

10.16 Folosirea operatorului NOT EXISTS Exemplu : Afia i toate departamentele ce nu au angaja i. SELECT department_id, department_name FROM departments d WHERE NOT EXISTS (SELECT 'X' FROM employees WHERE department_id = d.department_id);

Se poate folosi o construc ie de tip NOT IN drept alternativ operatorul NOT EXISTS, aa cum arat exemplul de mai jos. SELECT department_id, department_name FROM departments WHERE department_id NOT IN (SELECT department_id FROM employees);

pentru

Dealtfel NOT IN evalueaz FALSE dac oricare membru al setului este o valoare de NULL. Cu att mai mult interogarea nu va returna niciun rnd chiar dac sunt rnduri n tabel care s satisfac condi ia din clauza WHERE.

10.17 Clauza WITH Folosind clauza WITH pute i defini un bloc pentru interogare nainte de a l folosi n aceasta. Clauza WITH (cunoscut formal ca subquery_factoring_clause) permite refolosirea aceluiai bloc ntr-o instruc iune SELECT atunci cnd apare de mai multe ori ntr-o interogare complex . n mod particular acest lucru este folositor atunci cnd exist multe referin e la acelai bloc i sunt multe join-uri i calcule. Folosind clauza WITH, pute i refolosi aceeai interogare atunci cnd costul evalu rii blocului interog rii este mare i apare de mai multe ori ntr-o interogare complex . Folosind clauza WITH serverul Oracle reg sete rezultatele unui bloc i le stocheaz n spa iul de memorie temporar . Acest lucru duce la creterea performan elor, beneficiile fiind: interogarea devine uor de citit; clauza este evaluat o singur dat chiar dac apare de mai multe ori n interogare.

10-284

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Exemplu: scrie i o interogare, folosind clauza WITH, care s afieze numele departamentului i salariile totale pentru acele departamente n care salariul total este mai mare dect media salariilor pe departamente. Problema ar putea necesita calcule intermediare i anume: Calculul salariului total pentru fiecare departament i stocarea rezultatelor folosind clauza WITH. Calculul mediei salariale pe departamente i stocarea rezultatului folosind clauza WITH. Compararea salariului total calculat la pasul unu cu media calculat n pasul doi. Dac salariul total pentru un departament anume este mai mare dect media salariilor pe departamente, se afieaz numele departamentului i salariul total pe acel departament.

Interogarea de mai sus creeaz un bloc numit DEPT_COSTS i altul numit AVG_COST pe care le folosete apoi n interogarea principal . Intern, clauza WITH clause este rezolvat fie printr-un view in-line sau printr-o tabel temporar . Elementele de optimizare sunt cele care decid n func ie de costurile sau beneficiile de moment ale stoc rii temporare a datelor la folosirea acestei clauze.

10-285

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Not : Subinterogarea din clauza FROM a unei instruc iuni SELECT se numete i in-line view. Clauza WITH se folosete numai la instruc iuni SELECT. Numele interog rii este vizibil tuturor elementelor WITH ale blocurilor subinterog rilor (inclusiv subinterog rilor acestora) definite dup acestea i blocului principal n sine (incluznd subinterog rile). Atunci cnd numele interog rii este identic cu cel al unei tabele existente parserul caut de la interior spre exterior, numele blocului precednd numele tabelei. Clauza WITH poate suporta mai mult de o interogare, fiecare interogare fiind separat de o virgul . 10.18 Interogri ierahice Obiective: Interpretarea conceptului de interogare ierarhic ; Crearea unui raport cu structur arborescent ; Formatarea datelor ierahice; Excluderea unor ramuri din structura arborescent . pe o rela ie

Folosind interog ri ierarhice pute i reg si date bazndu-v ierarhic natural , creat ntre rndurile dintr-un tabel.

O baz de date rela ional nu stocheaz nregistr rile n mod ierarhic. Dealtfel, acolo unde exist o rela ie ierarhic ntre rndurile dintr-un singur tabel, pute i construi o ierarhie folosind procesul numit parcurgerea arborelui. O interogare ierarhic este o metod de afiare a ramurilor unui arbore n ordine. Imagina i-v o familie n care cei mai vrstnici membri se afl aproape de baza trunchiului arborelui iar cei mai tineri membri reprezint ramurile arborelui. Ramurile pot avea alte ramuri i aa mai departe. O interogare ierarhic este posibil atunci cnd exist o rela ie ntre rndurile tabelului. De exemplu, pute i observa n tabelul Employees c cei ce au job_ID-urile egale cu AD_VP, ST_MAN, SA_MAN i MK_MAN sunt direct subordona i preedintelui companiei. tim acest lucru deoarece coloana MANAGER_ID pentru aceste nregistr ri are valoarea 100, care este de fapt valoarea coloanei employee_ID pentru preedintele companiei (AD_PRES).

10-286

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Not : interog rile ierarhice pot fi folosite n diverse cazuri cum ar fi: genealogia uman (arborele genealogic al unei familii), managementul companiilor (managementul ierarhic), produc ie (asamblarea componentelor ntr-un produs finit), cercetarea evolu iei (dezvoltarea speciilor) i cercetare tiin ific . Structura natural a arborelui

Tabelul EMPLOYEES are o structur arborescent construit n func ie de subordonarea angaja ilor fa de efii lor. Ierarhia poate fi creat prin cercetarea valorilor echivalente din coloanele EMPLOYEE_ID i MANAGER_ID. Aceast rela ie poate fi folosit folosind un self-join pe acest tabel. Coloana MANAGER_ID con ine num rul de marc al efului respectivului angajat. Rela ia p rinte-copil a unei structuri ierarhice v permite s controla i: Direc ia n care se parcurge arborele; Punctul din cadrul ierarhiei de la care se pleac . NOT : Figura de mai sus prezint modul de organizare ierarhic al angaja ilor din tabelul EMPLOYEES.

Interog ri ierarhice SELECT [LEVEL], column, expr... FROM table [WHERE condition(s)] [START WITH condition(s)] [CONNECT BY PRIOR condition(s)]; WHERE condition: expr comparison_operator expr 10-287

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Interog rile ierarhice pot fi identificate prin prezen a clauzelor CONNECT BY i START WITH. n sintax : SELECT LEVEL este o instruc iune SELECT standard. pentru fiecare rnd returnat de o interogare ierarhic , pseudocoloana LEVEL ntoarce 1 pentru un rnd r d cin , 2 pentru un copil al unei r d cini, etc. specific tabelul sau vederea ce con ine coloanele. Acestea pot fi selectate doar dintr-un singur tabel. restric ioneaz rndurile date de interogare f r a afecta alte rnduri ale ierarhiei. este compararea cu o expresie. specific rndurile r d cin ale arborelui, adic punctul de plecare. Aceast clauz este obligatorie pentru o interogare ierarhic adev rat .

FROM table WHERE Condition START WITH

CONNECT BY specific coloanele care con in elementele ce definesc PRIOR rows rela ia dintre p rinte i copil. Aceast clauz este obligatorie pentru o interogare ierarhic . Instruc iunea SELECT nu poate con ine un join sau o interogare bazat pe un view care con ine un join. 10.19 Parcurgerea arborelui punctul de start Se specific condi iile ce trebuiesc ndeplinite; Se poate folosi n conjunc ie cu orice alt condi ie valid . START WITH column1 = value De exemplu, pentru tabela EMPLOYEES, s se parcurg arborele ncepnd cu angajatul al c rui nume este Kochhar. ...START WITH last_name = 'Kochhar' Clauza START WITH precizeaz rndurile ce vor fi folosite ca baz a arborelui. Aceast clauz poate fi folosit n conjunc ie cu orice alt clauz valid . Exemple: Folosind tabela EMPLOYEES, preedintele companiei. ncepe i cu King care este

10-288

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice ... START WITH manager_id IS NULL Folosind tabela EMPLOYEES, ncepe i cu angajatul Kochhar. Condi ia pus n clauza START WITH poate con ine o subinterogare. ... START WITH employee_id = (SELECT employee_id FROM employees WHERE last_name = 'Kochhar') Dac se omite clauza START WITH, parcurgerea arborelui are la baz toate rndurile din tabel, acestea fiind luate n considerare drept puncte de pornire. Dac este folosit o clauz WHERE, parcurgerea arborelui ncepe de la toate rndurile care satisfac condi ia WHERE, ceea ce nu reflect o ierarhie real . NOT : Clauzele CONNECT BY PRIOR i START WITH nu sunt ANSI SQL standard. CONNECT BY PRIOR column1 = column2 Parcurgerea tabelei EMPLOYEES de sus n jos CONNECT BY PRIOR column1 = column2 ... CONNECT BY PRIOR employee_id = manager_id

Direc ia de parcurgere arborelui De sus n jos De jos n sus Column1 = Cheia p rinte Column2 = Cheia copil Column1 = Cheia copil Column2 = Cheia p rinte

Direc ia de parcurgere a arborelui, fie c este de la p rinte la copil sau de la copil la p rinte, este determinat de modul de scriere al coloanelor n clauza CONNECT BY PRIOR. Operatorul PRIOR se refer la rndul p rinte. Pentru a determina un copil pentru un rnd p rinte, serverul Oracle evalueaz expresia PRIOR pentru rndul p rinte i cealalt expresie pentru fiecare rnd din tabel. Rndurile pentru care condi ia este ndeplinit sunt copii pentru p rinte. Serverul Oracle selecteaz ntotdeauna copii prin evaluarea condi iei CONNECT BY din punctul de vedere al ndeplinirii cerin ei legate de rndul p rinte.

10-289

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Exemplu: defini i o rela ie ierarhic parcurgnd tabelul EMPLOYEES de sus n jos, astfel nct valoarea pentru EMPLOYEE_ID din rndul p rinte s fie egal cu cea pentru MANAGER_ID din rndul copil. ... CONNECT BY PRIOR employee_id = manager_id Pentru a parcurge tabela de jos n sus condi ia devine : ... CONNECT BY PRIOR manager_id = employee_id Operatorul PRIOR nu necesit cod, n mod special, imediat dup CONNECT BY. De exemplu expresia din exemplul de mai sus poate fi scris i sub forma de mai jos, rezultatul fiind acelai. ... CONNECT BY employee_id = PRIOR manager_id Aten ie : Clauza CONNECT BY nu poate con ine o subinterogare.

Parcurgerea arborelui de jos n sus SELECT employee_id, last_name, job_id, manager_id FROM employees START WITH employee_id = 101 CONNECT BY PRIOR manager_id = employee_id;

Exemplul afieaz lista efilor ncepnd cu angajatul al c rui ID este 101. n urm torul exemplu, valorile pentru EMPLOYEE_ID sunt evaluate pentru rndul p rinte i MANAGER_ID iar valorile salariilor sunt evaluate pentru rndurile copil. Operatorul PRIOR este aplicat doar asupra valorilor din coloana EMPLOYEE_ID. ... CONNECT BY PRIOR employee_id = manager_id AND salary > 15000; Pentru a fi calificat drept rnd copil, acel rnd trebuie s aib valoarea din coloana MANAGER_ID egal cu valoarea coloanei EMPLOYEE_ID din rndul 10-290

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice p rinte i trebuie s aib salariul mai mare de $15,000. Parcurgerea arborelui de sus n jos SELECT last_name||' reports to '|| PRIOR last_name "Walk Top Down" FROM employees START WITH last_name = 'King' CONNECT BY PRIOR employee_id = manager_id;

Folosirea pesudocoloanei LEVEL pentru clasificarea rndurilor

Pute i afia n mod explicit rangul sau nivelul unui rnd n ierarhie folosind pseudocolana LEVEL. Aceasta va face ca raportul dvs. s fie mult mai explicit. Locurile unde 10-291

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice una sau mai multe ramuri se despart dintr-o ramur mare sunt numite noduri iar locul unde o ramur ia sfrit se numete frunz sau frunza nodului. Diagrama de mai sus prezint nodurile unui arbore ntors precum i valorile pentru fiecare nivel. De exemplu, angajatul Higgens este i p rinte i copil pe cnd angajatul Davies este doar un copil i o frunz . Not : un nod rdcin este nodul de cel mai nalt nivel dintr-un arbore inversat. Un nod copil este un nod care nu este r d cin . Un nod p rinte este un nod care are copii. Un nod frunz este orice nod care nu are copiii. Num rule nivelelor ce este returnat de o interogare ierarhic poate fi limitat de memoria disponibil . n exemplu, King este r d cina sau nodul p rinte (LEVEL = 1). Kochhar, De Hann, Mourgos, Zlotkey, Hartstein, Higgens i Hunold sunt copii i deasemeni p rin i (LEVEL = 2). Whalen, Rajs, Davies, Matos, Vargas, Gietz, Ernst, Lorentz, Abel, Taylor, Grant i Goyal sunt copii i frunze (LEVEL = 3 i LEVEL = 4). Valorile pseudocoloanei LEVEL sunt: Nod r d cin ; Copil al unui nod r d cin ; Copil al unui copil , etc. Formatarea rapoartelor ierarhice folosind LEVEL i LPAD Crea i un raport care s afieze nivelele de management ale companiei ncepnd de la nivelul cel mai nalt i identifica i fiecare nivel de subordonare. COLUMN org_chart FORMAT A12 SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2) -2,'_') AS org_chart FROM employees START WITH last_name='King' CONNECT BY PRIOR employee_id=manager_id Se asigneaz nodurilor arborelui cte un num r de nivel folosind func ia LPAD mpreun cu pseudocoloana LEVEL pentru a afia un raport ierarhic sub forma unui arbore identat.

LPAD(char1,n [,char2]) ntoarce char1, aliniat la stnga pe lungime de n


n exemplul de mai sus :

LPAD(last_name,LENGTH(last_name)+(LEVEL*2)-2,'_') definete formatul de afiare.


10-292

caractere folosind secven a de caractere din char2. Argumentul n reprezint lungimea total a valorii returnate aa cum este afiat pe ecran.

char1 este LAST_NAME , n este lungimea total a valorii returnate, adic lungimea lui LAST_NAME +(LEVEL*2)-2 iar char2 este '_'. Cu alte cuvinte i se spune motorului SQL s scrie la stnga valorii LAST_NAME attea caractere '_' cte sunt date de valoarea lui LENGTH(last_name)+(LEVEL*2)- 2. Pentru King, LEVEL = 1 deci (2 * 1)-2 = 22 = 0, aadar King nu va avea niciun caracter '_' i este afiat n coloana 1. Pentru Kochhar, LEVEL = 2 deci (2 * 2)-2 = 4-2 = 2 aadar Kochhar va avea 2 caractere '_' i este afiat identat. Celelalte rnduri sunt afiate dup acelai principiu.

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

T ierea ramurilor Folosi i clauza WHERE pentru a elimina un nod. WHERE last_name != 'Higgins' Folosi i clauza CONNECT BY pentru a elimina o ramur . CONNECT BY PRIOR employee_id = manager_id AND last_name != Higgins'

Pute i folosi clauzele WHERE i CONNECT BY pentru a t ia arborele; acesta nseamn c pute i controla care noduri i rnduri vor fi afiate. Predicatul pe care l folosi i ac ioneaz ca o condi ie Boolean .

10-293

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Exemplu: Pornind de la r d cin , parcurge i arborele de sus n jos i elimina i angajatul Higgins din rezultat procesnd ns rndurile copil. SELECT department_id, employee_id,last_name, job_id, salary FROM employees WHERE last_name != 'Higgins' START WITH manager_id IS NULL CONNECT BY PRIOR employee_id = manager_id; Pornind de la r d cin , parcurge i arborele de sus n jos i elimina i angajatul Higgins din rezultat i toate rndurile copil. SELECT department_id, employee_id,last_name, job_id, salary FROM employees START WITH manager_id IS NULL CONNECT BY PRIOR employee_id = manager_id AND last_name != 'Higgins';

10-294

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 10.20 Exerci ii

1. Scrie i o interogare care s afieze numele angajatului i data angaj rii pentru to i angaja ii din acelai departament ca Zlotkey, excluznd-ul pe Zlotkey.

2. Scrie i o interogare pentru a afia num rul angajatului i numele s u pentru to i angaja ii care ctig mai mult dect salariul mediu. Sorta i rezultatele n ordinea descresc toare a salariului.

3. Scrie i o interogare care s afieze num rul i numele angajatului pentru to i cei care lucreaz ntr-un departament care de ine cel pu in un angajat al

c rui nume con ine litera u . Salva i instruc iunea ntr-un fiier denumit pq3.sql. 4. Afia i numele angajatului, num rul departamentului i func ia pe care lucreaz acesta pentru to i angaja ii al c ror ID de departament este 1700. 10-295

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

5. Afia i numele i salariul tuturor angaja ilor subordona i lui King.

6. Afia i num rul departamentului, numele i func ia tuturor angaja ilor din departamentul numit Executive.

7. Modifica i pq3.sql pentru a afia num rul, numele i salariul tuturor angaja ilor care ctig mai mult dect salariul mediu i totodat lucreaz ntr-un departament care de ine cel pu in un angajat ce con ine n numele sau litera u . Salva i fiierul ca pq7.sql. Executa i interogarea din nou.

8. Scrie i o interogare care s afieze numele, num rul departamentului i salariul oric rui angajat al c rui num r de departament i salariu s se potriveasc cu num rul departamentului i salariul oric rui angajat care ctig comision.

10-296

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 9. Afia i numele, numele departamentului i salariul oric rui angajat al c rui salariu i comision se potrivesc cu salariul i comisionul oric rui angajat care lucreaz n location ID=1700.

10. Scrie i o interogare care s afieze numele, data angaj rii i salariul pentru to i angaja ii care au acelai salariu i comision ca al lui Kochhar, exclusiv Kochhar.

11. Scrie i o interogare care s afieze angaja ii care ctig un salariu mai mare ca al oric rui angajat cu JOB_ID = 'SA_MAN'. Afia i salariile ordonat de la cel mai mare la cel mai mic.

12. Afia i coloanele employee_ ID, last_ name i department_ID pentru acei angaja i care locuiesc n orae a c ror nume ncepe cu T.

13. Scrie i o interogare care s afieze to i angaja ii care ctig mai mult dect salariul mediu din departamentul lor. Afia i coloanele last_name, salary, department_ID i media salarial pentru departament. Ordona i datele dup salariul mediu. Folosi i alias-uri pentru coloanele returnate de interogare, dup exemplul de mai jos. 10-297

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

14. Afia i to i angaja ii ce nu sunt supervisors. a. Folosi i operatorul NOT EXISTS.

b. Se poate folosi operatorul NOT IN ? Cum, sau de ce nu ? 15. Scrie i o interogare care s afieze numele angaja ilor care ctig pu in dect media salarial din departamentul lor. mai

16. Scrie i o interogare care s afieze numele angaja ilor care au unul sau mai 10-298

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice mul i colegi de departament care s angajare mai trzii. aib salarii mai mari i date de

17. Scrie i o interogare care s afieze coloanele employee _ID, last_name i department_name pentru to i angaja ii. Folosi i n instruc iunea SELECT o subinterogare scalar pentru a g si numele departamentului.

18. Scrie i o interogare care s afieze numele de departament pentru acele departamente al c ror cost total cu salariile este peste 1/8 din costul total cu salariile al ntregii companii. Folosi i clauza WITH. Numi i interogarea SUMMARY. DEPARTMENT_NAME DEPT_TOTAL ------------------------------ ---------Executive 58000 Sales 37100

10-299

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 19. Privi i rezultatele de mai jos. Sunt acestea rezultate n urma proces rii unei subinterog ri ierarhice ? Explica i r spunsul dat.

10-300

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 20. Afia i structura organiza ional a departamentului lui Mourgos specificnd numele de familie, salariul i id-ul departamentului.

21. Crea i un raport care s afieze ierarhia managerilor pentru angajatul Lorentz. Afia i mai nti pe eful s u direct.

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

23. Afia i structura organizatoric a companiei afind ierarhia managerial . ncepe i cu persoanele de la nivelul superior, exclude i to i angaja ii ce au job_ ID egal cu IT_PROG i exclude i-l pe De Haan i to i subordona ii lui.

10-301

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Capitolul 11 Instruc iuni pentru Manipularea Datelor

Obiective: Descrierea fiec rei comenzi DML(Data Manipulation Language); Inserarea de nregistr ri ntr-un tabel (INSERT); Actualizarea nregistr rilor dintr-un tabel (UPDATE); tergerea nregistr rilor dintr-un tabel (DELETE): Al turarea rndurilor unei tabele (MERGE): Controlul tranzac iilor (COMMIT, SAVEPOINT i ROLLBACK). O comand DML este executat atunci cnd: - Se ad uga noi nregistr ri n tabel ; - Se modifica nregistr rile existente ntr-o tabel ; - Se terg nregistr ri existente dintr-o tabel . O tranzac ie const unitate logic de lucru. dintr-o colec ie de comenzi DML care formeaz o

Limbajul de manipulare a datelor (DML) este partea de baza a SQL. Cnd se dorete ad ugarea, modificarea sau tergerea datelor dintr-o baza de date, se execut o comand DML. O colec ie de comenzi DML care formeaz o unitate logic de lucru se numete tranzacie. Exemplu: Considera i o baz de date din domeniul bancar. Atunci cnd un client al b ncii dorete s transfere bani dintr-un depozit ntr-un cont curent, tranzac ia ar putea consta n 3 opera ii separate: sc derea sumei din depozit, creterea sumei din contul curent, nregistrarea tranzac iei n jurnalul de tranzac ii. Serverul Oracle trebuie s garanteze c toate cele 3 comenzi SQL sunt executate n aa fel nct sa men in echilibrul necesar ntre conturi. Atunci cnd, din anumite cauze, una dintre comenzile tranzac iei de mai sus nu se execut , atunci celelalte comenzi ale tranzac iei trebuie s fie anulate. Ad ugarea unei noi nregistr ri ntr-un tabel. Imaginea de mai jos ilustreaz ad ugarea unui nou departament n tabelul DEPARTMENTS.

11-302

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

11.1 Introducerea datelor-comanda INSERT Folosind comanda INSERT se pot ad uga noi nregistr ri ntr-un tabel. INSERT INTO table [(column [, column...])] VALUES (value [, value...]); n descrierea sintaxei: tabel este numele tabelului din baza de date. coloana este numele coloanei din tabelul respectiv. valoare este valoarea corespunz toare coloanei. Not : Folosind aceast sintax pentru comanda INSERT se adaug numai cte un rnd odat la un tabel. La inserarea unei noi nregistr ri con innd valori pentru fiecare coloan , valorile se dau n ordinea prestabilit a coloanelor din tabel, precizarea coloanelor fiind op ional . INSERT INTO departments(department_id, department_name, manager_id, location_id) VALUES (70, 'Public Relations', 100, 1700);

11-303

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice DESCRIBE departments

Pentru claritate, preciza i lista coloanelor n sintaxa INSERT. ncadra i ntre ghilimele simple doar irurile de caractere i datele calendaristice nu i valorile numerice. Inserarea de nregistr ri cu valori de NULL Metoda implicit : Omiterea coloanei din list . INSERT INTO departments (department_id, department_name ) VALUES (30, 'Purchasing'); Metoda explicit : Specificarea cuvntului cheie NULL n lista de la clauza VALUES. Specifica i irul vid () n lista VALUES (numai pentru iruri de caractere i pentru valori de tip dat calendaristic ). INSERT INTO departments VALUES (100, 'Finance', NULL, NULL); Asigura i-v c pentru coloana vizat este permis valoarea NULL. Serverul Oracle aplic automat toate constrngerile de integritate, de domeniu i tip pentru date. Orice coloan care nu este specificat explicit n list , va primi o valoare nul n noua nregistrare. Erorile uzuale ce apar la introducerea datelor sunt : Lipsa unei valori obligatoriu a fi introdus pentru o coloan ce nu admite valori de NULL ; Valori multiple care ncalc constrngerea de unicitate; Valori care duc la nc lcarea constrngerii de tip cheie str in ; Valori care duc la nc lcarea constrngerii de tip CHECK ; Tip de data eronat; Valoare mai mare dect maxima admis pentru acea coloan .

11-304

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Inserarea unor valori speciale Func ia SYSDATE furnizeaz data i timpul curent. INSERT INTO EMPLOYEES (EMPLOYEE_id,first_name, last_name,email, phone_number,hire_date, job_id, salary,commission_pct, manager_id,department_id) VALUES (113,'Louis', 'Popp','LPOPP', '515.124.4567', SYSDATE, 'AC_ACCOUNT', 6900,NULL, 205, 100); Exemplul de mai sus nregistreaz informa ia pentru angajatul Popp n tabela EMPLOYEES. Pentru a introduce data i ora curent n cmpul HIREDATE este folosit func ia SYSDATE. Se poate de asemeni folosi func ia USER la introducerea de valori ntr-un tabel. Func ia USER furnizeaz numele utilizatorului curent. Verificarea datelor ad ugate n tabel: SELECT EMPLOYEE_id, last_name, job_id, hire_date, commission _pct FROM EMPLOYEES WHERE EMPLOYEE_id = 113;

Inserarea unor valori specifice de tip dat calendaristic Exemplu: Ad ugarea unui nou angajat INSERT INTO EMPLOYEES VALUES (114,'Den', 'Raphealy','DRAPHEAL', '515.127.4561', TO_DATE ('FEB 3, 1999', 'MON DD, YYYY'), 'AC_ACCOUNT', 11000, NULL, 100, 30); Formatul DD-MON-YY este de obicei folosit pentru a insera o valoare de tip dat calendaristic . Cu acest format, secolul este implicit cel curent. Deoarece data con ine de asemenea informa ii despre timp, ora implicit este 00:00:00. Dac o dat calendaristic necesit specificarea altui secol sau or , trebuie folosit func ia TO_DATE. n exemplu se nregistreaz informa ia despre angajatul Raphealy n tabela EMPLOYEES. Cmpul HIREDATE primete valoarea February 3, 1999. Inserarea de valori folosind variabile de substitu ie Se poate scrie o comand INSERT care s permit utilizatorului s 11-305

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice adauge valori n mod interactiv folosind variabilele de substitu ie SQL*Plus. De exemplu, se introduc informa iile pentru un nou departament n tabelul DEPARTMENTS. Num rul departamentului, numele i loca ia sunt cerute interactiv utilizatorului. Pentru valori de tip dat calendaristic sau ir de caractere, ampersandul (&) i numele variabilei sunt ncadrate de ghilimele simple (apostrof). INSERT INTO departments (department_id, department_name, location_id) VALUES (&department_id, '&department_name',&location);

Crearea unui script Un script este un fiier cu extensia sql n care sunt memorate instruc iuni. Comenzile, care pot sa con in i variabile de substitu ie, pot fi salvate ntr-un fiier. Acesta poate fi executat i la fiecare execu ie sunt cerute valori noi pentru variabile. La execu ia comenzii SQL*Plus ACCEPT, valorile date variabilelor pot fi diferite, deci se poate folosi acelai script pentru a introduce valori diverse n tabel . ACCEPT expr PROMPT textul specificat Comanda ACCEPT memoreaz valoarea introdus variabila expr iar PROMPT afieaz textul specificat. de utilizator n

ACCEPT department_id PROMPT 'Introducei numrul departamentului:' ACCEPT department_name PROMPT 'Introducei numele departamentului:' ACCEPT location_id PROMPT 'Introducei oraul:' INSERT INTO departments (department_id, department_name, location_id) VALUES (&department_id, '&department_name',&location); Parametrul de substitu ie SQL*Plus nu trebuie precedat de & cnd este referit ntr-o comanda ACCEPT. Pentru a continua o comanda SQL*PLUS pe linia urm toare se folosete caracterul -. Copierea nregistr rilor dintr-un alt tabel folosind comanda INSERT cu o subinterogare 11-306

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Comanda INSERT poate fi folosit pentru a adaug nregistr ri ntr-un tabel, valorile pentru cmpuri fiind extrase dintr-un tabel existent. Pentru aceasta se folosete n locul clauzei VALUES o subinterogare. INSERT INTO sales_reps(id, name, salary, commission_pct) SELECT EMPLOYEE_id, last_name, salary, commission_pct FROM EMPLOYEES WHERE job_id LIKE '%REP%'; 4 rows created. INSERT INTO tabel [ coloana ( , coloana ) ] Subinterogare; unde: tabel este numele tabelului din baza de date coloana este numele coloanei din tabelul n care se face inserarea. subinterogare este subinterogarea care returneaz nregistr rile n tabel. Num rul i tipul cmpurilor (coloanelor) din lista specificat n comanda INSERT trebuie s corespund num rului i tipului valorilor din subinterogare. Folosirea subinterogarilor n comanda INSERT INSERT INTO (SELECT employee_id,last_name,email,hire_date,job_id,salary, department_id FROM employees WHERE department_id = 50) VALUES (99999, 'Taylor', 'DTAYLOR', TO_DATE('07-JUN-99', 'DD-MON-RR'),'ST_CLERK', 5000, 50); 1 row created. n cadrul comenzii INSERT se poate folosi o subinterogare n locul numelui tabelului. Instruc iunea SELECT a subinterog rii trebuie s aib acelai num r de coloane ca i cel din clauza VALUES. Pentru ca INSERT s fie executat satisf c tor trebuie s ine i cont de toate regulile care se aplic asupra coloanelor din tabelul de baz . De exemplu, nu pute i introduce valori duplicat sau nu este permis lipsa unei valori pentru o coloan care este obligatoriu NOT NULL.

11-307

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

11.2 Modificarea datelor - comanda UPDATE

Figura de mai sus arat modificarea num rului departamentului pentru cei din departamentul 60 n 30. nregistr rile existente pot fi modificate folosind comanda UPDATE.

UPDATE table SET column = value [, column = value,...] [WHERE condition]; n sintaxa de mai sus: tabel este numele tabelului; coloana este numele coloanei din tabelul n care se face modificarea; Valoare este noua valoare sau o subinterogare ce produce noua valoare pentru coloana ce se modific ; Condiie identific nregistr rile care trebuie modificate i este alc tuita din expresii, nume de coloane, constante, subinterog ri i operatori de comparare. Folosind comanda UPDATE se pot modifica simultan valorile pentru unul sau mai multe rnduri din tabel . Pute i avea confirmarea execut rii opera iei de modificare prin interogarea 11-308

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice tabelului, afind rndurile modificate. NOT : n general, folosi i cheia primara pentru a identifica o singur nregistrare. Folosirea altor coloane poate determina modificarea mai multor nregistr ri. De exemplu, identificarea unei singure nregistr ri n tabelul EMPLOYEES prin nume poate fi periculoas , deoarece pot exista mai mul i angaja i cu acelai nume. Comanda UPDATE modific anumite nregistr ri dac este specificat clauza WHERE. Exemplul urm tor transfer angajatul cu num rul 113 n departamentul 70. UPDATE employees SET department_id = 70 WHERE employee_id = 113; 1 row updated. Dac omite i clauza WHERE, sunt modificate toate nregistr rile dintr-un tabel. UPDATE copy_emp SET department_id = 110; 22 rows updated.

Actualizarea nregistr rilor folosind subinterog ri dup mai multe cmpuri n clauza SET a unei comenzi UPDATE pot fi implementate subinterog ri dup mai multe cmpuri. UPDATE table SET column = (SELECT column FROM table WHERE condition) [ , column = (SELECT column FROM table WHERE condition)] [WHERE condition ] ; Modific pentru angajatul cu num rul 114 func ia i salariul astfel nct ele s coincid cu cele ale angajatului num rul 205.

11-309

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice UPDATE employees SET job_id = (SELECT job_id FROM employees WHERE employee_id = 205), salary = (SELECT salary FROM employees WHERE employee_id = 205) WHERE employee_id = 114; 1 row updated.

Actualizarea nregistr rilor folosind valori dintr-un alt tabel Exemplul de mai jos arat cum se pot folosi subinterog ri n comenzi UPDATE pentru a actualiza nregistr rile dintr-un tabel pe baza valorilor din alt tabel. UPDATE copy_emp SET department_id = (SELECT department_id FROM employees WHERE employee_id = 100) WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 200); 1 row updated.

nc lcarea constrngerii de integritate UPDATE employees SET department_id = 55 WHERE department_id = 110; Dac ncerca i s atribui i unui cmp o valoare care este legat de o constrngere de integritate, va rezulta o eroare. n exemplul de mai sus, departamentul cu num rul 55 nu exista n tabelul p rinte, DEPARTMENTS, i astfel ve i ob ine eroarea parent key violation ORA02291 aa cum se arata mai jos. UPDATE employees * ERROR at line 1: ORA-02291: integrity constraint (HR.EMP_DEPT_FK) violated-parent key not found NOT : Constrngerile de integritate asigur faptul c datele ader la un set predefinit de reguli. Un capitol urm tor va dezvolta acest subiect mai pe larg.

11-310

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 11.3 tergerea datelor - comanda DELETE Folosind comanda DELETE se pot terge nregistr ri dintr-un tabel. DELETE [FROM] table [WHERE condition]; n sintaxa: tabel este numele tabelei. Condiie identific nregistr rile care trebuie terse i este alc tuit din expresii, nume de coloane, constante, subinterog ri i operatori de comparare. Se pot terge doar anumite nregistr ri prin specificarea clauzei WHERE n comanda DELETE. Exemplul de mai jos arat cum se procedeaz pentru a terge departamentul 'Finance' din tabelul DEPARTMENTS. V pute i asigura c tergerea s-a f cut corect, ncercnd afiarea rndurilor terse printr-un SELECT. DELETE FROM departments WHERE department_name = 'Finance'; 1 row deleted. SELECT * FROM departments WHERE department_name = 'Finance'; no rows selected. DELETE FROM copy_emp; Dac se omite clauza WHERE se vor terge toate rndurile din tabela. tergerea nregistr rilor folosind valori dintr-un alt tabel Folosi i subinterog ri n comanda DELETE pentru a terge nregistr rile dintr-un tabel pe baza valorilor din alt tabel. DELETE FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name LIKE '%Public%'); 1 row deleted. 11-311

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Pute i folosi subinterog ri pentru a terge nregistr ri dintr-un tabel, folosind informa iile din alt tabel. Exemplul de mai sus terge to i angaja ii care sunt n departamentul ce con ine n numele sau irul 'Public'. Subinterogarea caut n tabela DEPARTMENTS num rul de departament pentru 'Public', apoi furnizeaz num rul de departament interog rii principale, care terge nregistr ri din EMPLOYEES pe baza acestuia.

nc lcarea constrngerii de integritate Dac ncerca i tergerea unei nregistr ri care con ine un cmp cu o valoare legat de o constrngere de integritate, ve i ob ine o eroare. n exemplul de mai jos se ncearc tergerea departamentului cu num rul 60 din tabelul DEPARTMENTS. tergerea provoac o eroare deoarece num rul de departament este folosit ca i cheie extern n tabelul EMPLOYEES. Dac nregistrarea p rinte pe care ncerca i s o terge i are nregistr ri copil, atunci ve i primi un mesaj de eroare: child record found violation ORA-02292. DELETE FROM departments WHERE department_id = 60; DELETE FROM departments * ERROR at line 1: ORA-02292: integrity constraint (HR.EMP_DEPT_FK) violated-child record found Nu pute i terge o nregistrare care con ine o cheie primar folosit ca cheie extern n alt tabel.

Folosirea sintagmei WITH CHECK OPTION n instruc iuni de tip DML n exemplul de mai jos se folosete o subinterogare pentru a identifica tabelul i coloanele pentru instruc iunea DML. Sintagma WITH CHECK OPTION mpiedic schimbarea rndurilor care nu sunt n subinterogare. INSERT INTO (SELECT employee_id, last_name, email,hire_date, job_id, salary FROM employees WHERE department_id = 50 WITH CHECK OPTION) VALUES (99998, 'Smith', 'JSMITH',TO_DATE('07-JUN-99', 'DD- MON-RR'),'ST_CLERK', 5000); 11-312

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice INSERT INTO * ERROR at line 1: ORA-01402: view WITH CHECK OPTION where-clause violation Specifica i WITH CHECK OPTION pentru a indica faptul c , dac se folosete o subinterogare n locul numelui tabelului ntr-o instruc iune de tip INSERT, UPDATE sau DELETE nu sunt permise nici un fel de schimb ri asupra rndurilor care nu sunt n subinterogare. n exemplu este folosit sintagma WITH CHECK OPTION. Subinterogarea identific rndurile care sunt n departamentul 50, dar department_ID nu este n lista de la SELECT deci nu este prev zut o valoare pentru department_id n lista clauzei VALUES. nserarea acestui rnd, care are pentru department_ID valoarea null, ar duce la nserarea unei valori care nu este n subinterogare. Folosirea op iunii DEFAULT explicit Folosind op iune DEFAULT explicit pute i s folosi i cuvntul cheie DEFAULT drept valoare pentru o coloan acolo unde aceasta este necesar . Introducerea acestei op iuni a fost f cut n scopul alinierii la cerin ele standardului SQL: 1999. Ea permite utilizatorului s controleze locul i timpul la care op iunea DEFAULT va fi aplicat datelor. Op iunea DEFAULT explicit poate fi folosit n instruc iunile INSERT i UPDATE pentru a identifica o valoare implicit pentru coloan . Dac nu exist o valoare implicit se va folosi valoarea NULL. DEFAULT cu INSERT INSERT INTO departments (department_id, department_name, manager_id) VALUES (300, 'Engineering', DEFAULT); DEFAULT cu UPDATE UPDATE departments SET manager_id = DEFAULT WHERE department_id = 10; n primul exemplu, instruc iunea INSERT folosete o valoare implicit pentru coloana MANAGER_ID. Dac nu este definit nicio valoare implicit pentru aceast coloana se va insera o valoare de NULL. Cel de-al doilea exemplu folosete instruc iunea UPDATE pentru a atribui coloanei MANAGER_ID valoarea implicit pentru cei din departamentul 10. 11-313

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Dac nu este definit o valoare implicit , valoarea pentru coloana MANAGER_ID va fi NULL. Valoarea implicit pentru o coloan se specific n momentul cre ri tabelei.

11.4 Instruciunea MERGE Prevede posibilitatea de a introduce sau modifica datele din tabel n mod condi ionat; Execut un UPDATE dac rndul exist i un INSERT dac este un rnd nou; Previne scrierea mai multor instruc iuni UPDATE ; Este uor de folosit i duce la creterea performantelor: Este folositoare n aplica ii ce gestioneaz volum mare de date.

SQL a fost extins n vederea introducerii instruc iunii MERGE. Folosind aceasta instruc iune se pot modifica sau insera rnduri ntr-o tabel n mod condi ionat ceea ce previne scrierea mai multor instruc iuni UPDATE. Decizia de a modifica sau introduce rnduri n tabela inta se bazeaz pe clauza condi ional ON. Deoarece instruc iunea MERGE combin instruc iunile INSERT i UPDATE, trebuie s ave i drepturi pentru modificarea sau ad ugarea de rnduri n tabela int i dreptul de a selecta datele din tabela surs . Instruc iunea MERGE este determinist . Nu pute i s face i UPDATE de mai multe ori asupra aceluiai rnd din tabela folosind aceeai instruc iune MERGE. O abordare alternativ ar fi folosirea buclelor PL/SQL i mai multe instruc iuni DML. Instruc iunea MERGE este dealtfel uor de folosit i mult mai simplu de scris fiind o singur instruc iune de tip SQL. Instruc iunea MERGE este potrivit pentru unele aplica ii de tip warehousing. De exemplu, ntr-o asemenea aplica ie s-ar putea s fi i nevoi i s lucra i cu date ce provin din mai multe surse, unele dintre ele putnd fi duplicate. Folosind instruc iunea MERGE pute i ad uga sau modifica rndurile n mod condi ionat.

11-314

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice MERGE INTO table_name AS table_alias USING (table|view|sub_query) AS alias ON (join condition) WHEN MATCHED THEN UPDATE SET col1 = col_val1, col2 = col2_val WHEN NOT MATCHED THEN INSERT (column_list) VALUES (column_values); n sintaxa : INTO specific tabela inta pe care se face UPDATE sau INSERT ; USING identific sursa datelor ce vor fi modificate sau inserate; poate fi o tabel , view sau subinterogare ; ON clauz condi ional pe baza c reia MERGE execut fie modificarea fie inserarea datelor ; WHEN MATCHED d instruc iuni serverului asupra felului n care s Sau r spund la rezultatul condi iei de join. WHEN NOT MATCHED MERGE INTO copy_emp AS c USING employees e ON (c.employee_id = e.employee_id) WHEN MATCHED THEN UPDATE SET c.first_name = e.first_name, c.last_name = e.last_name, ... c.department_id = e.department_id WHEN NOT MATCHED THEN INSERT VALUES(e.employee_id, e.first_name, e.last_name, e.email, e.phone_number, e.hire_date, e.job_id, e.salary, e.commission_pct, e.manager_id, e.department_id); n exemplul de mai sus este evaluat condi ia c.employee_id = e.employee_id. Deoarece tabela COPY_EMP nu are nregistr ri, condi ia returneaz false deci se execut clauza WHEN NOT MATCHED iar instruc iunea MERGE insereaz rndurile din tabela EMPLOYEES n tabela COPY_EMP. Dac tabela COPY_EMP ar con ine rnduri care ar avea n coloana employee_ID valori egale cu cele din tabela EMPLOYEES, aceste rnduri din tabela COPY_EMP ar fi modificate pentru a con ine valori identice cu cele din tabela EMPLOYEES. 11-315

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 11.5 Tranzacii

Tranzac iile constau dintr-un grup format din urm toarele comenzi: Comenzi DML care duc la o schimbare consistent a datelor; O comanda DDL; O comanda DCL.

Serverul Oracle asigur consisten a datelor pe baza tranzac iilor. Tranzac iile ofer mai mult flexibilitate i control la modific ri aduse datelor i asigur consisten a datelor n eventuala c dere a sistemului sau n cazul unei erori a procesului utilizator. Tranzac iile constau din comenzi DML care realizeaz o schimbare consistenta asupra datelor. De exemplu, un transfer de fonduri ntre dou conturi ar trebui sa includ modificarea debitului unui cont i creditului celuilalt cont cu aceeai sum de bani. Ambele ac iuni ar trebui fie s reueasc mpreun , fie sa eueze mpreun . Opera ia de creditare nu ar trebui sa poat fi efectuata f r ca cea de debitare sa fie executat cu succes. Tipuri de tranzac ii: Tip Limbaj de manipulare a datelor (DML) Limbaj de definire a datelor (DDL) Limbaj de control al datelor (DCL) Descriere Consta din orice num r de comenzi DML pe care serverul Oracle le trateaz ca o singur entitate sau unitate logic de lucru. Const dintr-o singur comand DDL

Const dintr-o singur comand DCL

Tranzac ii n baze de date: ncep odat cu execu ia primei comenzi SQL executabile; Se termin la apari ia unuia dintre urm toarele evenimente: - COMMIT sau ROLLBACK; - Execu ia unei comenzi DDL sau DCL ( automatic commit); - Deconectarea utilizatorului; - C derea sistemului.

Dup ce se ncheie o tranzac ie, urm toarea tranzac ie va ncepe automat la prima comanda SQL executabila ntlnit . Rezultatele unei comenzi 11-316

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice DDL sau DCL sunt salvate automat (automat commit) motiv pentru care tranzac ia se ncheie n mod implicit. Avantajele comenzilor COMMIT i ROLLBACK: Asigur consisten a datelor; Ofer posibilitatea revederii schimb rilor f cute nainte de a le salva; Grupeaz opera ii rela ionate logic. Controlul tranzac iilor

Comenzi pentru controlul explicit al tranzac iilor Pute i controla logica tranzac iilor folosind comenzile; COMMIT,SAVEPOINT i ROLLBACK. Controlul tranzac iilor INSERT COMMIT UPDATE Savepoint A INSERT DELETE Savepoint B

ROLLBACK to Savepoint B

ROLLBACK to Savepoint A

ROLLBACK

11-317

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Comanda COMMIT

Descriere ncheie actuala tranzac ie f cnd ca toate modific rile s devin permanente (salveaz modific rile) Marcheaz un punct de ntoarcere (savepoint) n cadrul tranzac iei curente Comanda ROLLBACK ncheie tranzac ia curent , pierzndu-se toate modific rile temporare (pending changes) asupra datelor. ROLLBACK TO SAVEPOINT name terge savepoint-ul i toate schimb rile de dup el (temporare).

SAVEPOINT nume

ROLLBACK [TO SAVEPOINT name]

Not : SAVEPOINT nu este ANSI standard SQL. UPDATE... SAVEPOINT update_done; Savepoint created. INSERT... ROLLBACK TO update_done; Rollback complete. Procesarea implicit a tranzac iilor Un commit (salvarea modific rilor) automat are loc n urm toarele circumstan e: Este dat o comanda DDL; Este dat o comanda DCL; O p r sire normal a mediului SQL*Plus, f r a da explicit o comand COMMIT sau ROLLBACK. Un rollback automat are loc n condi iile unei termin ri anormale a sesiunii SQL*Plus sau n cazul unei 'c deri' de sistem. Stare Commit automat Circumstan e Comanda DDL sau DCL Ieire normal din SQL*Plus, f r o comand COMMIT sau ROLLBACK explicit Terminare anormal a SQL*Plus sau c dere sistem

Rollback automat

11-318

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Not : n SQL*Plus mai este disponibil i o a treia comand . Comanda SQL*Plus AUTOCOMMIT poate fi setat ON sau OFF. Dac este setat pe ON, fiecare comand DML individual duce la salvarea modific rilor, imediat ce este executat . Nu se mai poate reveni la situa ia dinainte (un rollback nu mai este posibil). Dac este setat pe OFF, COMMIT poate fi dat explicit. De asemeni, COMMIT este executat odat cu o comanda DDL sau la ieirea din SQL*Plus. C derile sistemului: Cnd o tranzac ie este ntrerupt de o c dere a sistemului, ntreaga tranzac ie este automat pierdut (este 'rolled back'). Aceasta mpiedic ca eroarea s determine schimb ri nedorite asupra datelor i reface starea bazelor din momentul ultimului COMMIT (explicit sau implicit). Astfel, SQL*Plus p streaz integritatea tabelelor (bazelor de date).

Salvarea modific rilor Fiecare modificare efectuat n timpul tranzac iei este temporar pn la apari ia unui 'commit' (pn la 'salvarea' tranzac iei).

Starea datelor nainte de un COMMIT sau ROLLBACK Opera iile de manipulare a datelor afecteaz ini ial buffer-ul bazei de date; de aceea, starea ini ial a datelor poate fi ref cut . Utilizatorul curent poate urm ri schimb rile f cute prin interogarea tabelelor. Al i utilizatori nu pot vedea modific rile f cute de utilizatorul curent. Serverul Oracle instituie o consisten la citire pentru a se asigura c fiecare utilizator vede datele aa cum existau ele n momentul ultimei salv ri. nregistr rile afectate sunt protejate (locked); al i utilizatori nu pot face modific ri asupra lor. Starea datelor dup COMMIT Modific rile asupra datelor din baza de date devin permanente. Starea anterioar a datelor nu mai poate fi ref cut . To i utilizatorii pot vedea rezultatele. nregistr rile protejate (locked) sunt deblocate pentru modificare i pot fi schimbate de al i utilizatori. Toate savepoint-urile sunt terse. 11-319

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Exemplu : Facei modificrile:


DELETE FROM employees WHERE employee_id = 99999; 1 row deleted. INSERT INTO departments VALUES (290, 'Corporate Tax', NULL, 1700); 1 row inserted. Salva i modific rile COMMIT; Commit complete. Exemplul de mai sus terge din tabelul EMPLOYEES rndul ce are employee_id egal cu 99999 i apoi introduce n tabela DEPARTMENTS un rnd nou. Prin folosirea comenzii COMMIT modific rile devin permanente. Starea datelor dup ROLLBACK Pentru a anula modific rile temporare f cute folosi i comanda ROLLBACK. Modific rile aduse datelor sunt pierdute. Starea anterioar a datelor este ref cut . Protec ia asupra nregistr rilor implicate este ridicat . Exemplu: ncercnd s terge i o nregistrare din tabelul TEST, pute i terge accidental ntreg tabelul. Pute i corecta greeala, iar apoi s da i comenzile corecte i s salva i modific rile. DELETE FROM test; 25,000 rows deleted. ROLLBACK; Rollback complete. DELETE FROM test WHERE id = 10 1 row deleted. SELECT * FROM test WHERE id = 100; No rows selected. COMMIT; Commit complete. Anularea modific rilor pana la un savepoint Pute i crea un marcaj n cadrul tranzac iei curente folosind comanda SAVEPOINT. Astfel, tranzac ia poate fi mp r it n sec iuni mai mici. Pute i apoi anula modific rile temporare pn la acel marcaj folosind comanda ROLLBACK TO SAVEPOINT. Dac crea i un al doilea savepoint cu acelai nume ca unul anterior, 11-320

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice savepoint-ul anterior este ters. Rollback la nivel de comand Se poate anula o parte din tranzac ie printr-un rollback implicit dac este detectat o eroare la execu ia unei comenzi. Dac o singur comanda DML eueaz n timpul execu iei unei tranzac ii, efectul ei este anulat printr-un rollback la nivel de comand , dar schimb rile f cute de comenzile DML anterioare n tranzac ie nu vor fi anulate. Ele pot fi salvate (commited) sau anulate (rolled back) n mod explicit de c tre utilizator. Oracle execut o comanda COMMIT implicit nainte i dup orice comanda DDL. Deci, chiar dac comanda DDL nu se execut cu succes, nu pute i anula comenzile anterioare pentru c serverul a executat un commit (a salvat modific rile). Este bine ca tranzac iile s fie explicit finalizate prin executarea unei comenzi COMMIT sau ROLLBACK. 11.6 Consistena la citire Consistenta la citire garanteaz o vedere consistent datelor n fiecare moment. Schimb rile f cute de un utilizator nu intr n conflict cu schimb rile realizate de un altul. Asigur c , pentru aceleai date: - Cei care citesc datele nu trebuie s i atepte pe cei care le modific ; - Cei care modific datele s nu trebuie s i atepte pe cei care le citesc.

Utilizatorii bazei de date acceseaz tabelele din baza n dou moduri: - Opera ii de citire (comanda SELECT); - Opera ii de scriere (comenzile INSERT, UPDATE, DELETE). Consisten a la citire este necesar pentru ca: - Cei care citesc/modific datele s aib o vedere consistent a datelor; - Cei care citesc datele s nu vad datele care sunt n curs de modificare; - Cei care modific datele s aib siguran a c schimb rile n baza de date se fac n mod consistent; - Schimb rile f cute de un utilizator s nu intre n conflict sau s afecteze schimb rile f cute de un altul. Scopul consisten ei la citire este s asigure c fiecare utilizator vede datele n starea n care erau la ultima salvare, nainte s nceap o opera ie DML. 11-321

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Consisten a la citire este implementat n mod automat. Este p strat o copie par ial a bazei de date n segmente rollback.

Cnd se realizeaz o opera ie de ad ugare, actualizare sau tergere asupra bazei de date, serverul Oracle scrie o copie a datelor dinainte de modificare ntr-un segment rollback. To i utilizatorii, cu excep ia celui care a ini iat modificarea, v d baza de date n starea de dinaintea nceperii modific rii; ei vad datele din segmentul rollback. nainte ca schimb rile s fie salvate n baza de date, numai utilizatorul care modific datele vede baza de date modificat , to i ceilal i v znd datele din segmentul rollback. Aceasta garanteaz c utilizatorii citesc consistent datele care nu sufer schimb ri chiar n acel moment. Cnd o comand DML este salvat , schimbarea f cut n baza de date devine vizibil oricui execut o comanda SELECT. Spa iul ocupat de 'vechile' date din segmentul rollback este eliberat pentru a fi reutilizat. Dac tranzac ia este anulat , schimb rile sunt la rndul lor anulate. Versiunea original mai veche a datelor din segmentul rollback este scris napoi n tabel. To i utilizatorii v d baza de date aa cum era nainte de a ncepe tranzac ia.

Protec ia la scriere (locking) Protec ia Oracle: Previne interac iunile destructive ntre tranzac ii concurente; Nu necesit ac iuni din partea utilizatorului; Folosete n mod automat cel mai mic nivel de restric ionare; Este valabil pe durata unei tranzac ii. Exista dou modalit i de protec ie : Exclusiv i Partajat . Protec iile (locking) sunt mecanisme care previn interac iunea destructiv ntre tranzac ii ce acceseaz aceeai resurs : fie un obiect utilizator (de exemplu tabele sau nregistr ri), fie obiecte sistem care nu sunt vizibile utilizatorilor (de exemplu structuri de date partajate i nregistr ri "data dictionary").

11-322

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Cum protejeaz Oracle datele Protejarea unei baze de date Oracle este automatizat n ntregime i nu necesit ac iuni din partea utilizatorului. Implicit, protejarea are loc pentru toate comenzile SQL cu excep ia lui SELECT. Mecanismul implicit de protec ie n Oracle folosete n mod automat cel mai mic nivel aplicabil de restric ionare, furniznd astfel cel mai mare grad de concuren existent, precum i integritatea maxima a datelor. Oracle permite i protejarea manual a datelor de ctre utilizator. Oracle folosete dou moduri de protec ie ntr-o baz de date multiutilizator. Mod de protec ie exclusiv (exclusiv lock) Descriere mpiedic partajarea unei resurse. Prima tranzac ie care blocheaz resursa n mod exclusiv este singura tranzac ie care poate modifica resursa pn cnd protec ia exclusiv este anulat . Permite partajarea resursei. Mai mul i utilizatori care citesc datele le pot folosi n comun prin crearea unor protec ii partajate ce mpiedic accesul concurent pentru scriere (care necesit o protec ie exclusiv ). Mai multe tranzac ii pot ob ine protec ii partajate pentru aceeai resurs .

partajat (share lock)

11.7 Correlated UPDATE n cazul instruc iunii UPDATE se poate folosi o subinterogare corelat pentru a modifica rndurile dintr-un tabele pe baza valorilor dintr-un alt tabel. UPDATE table1 alias1 SET column = (SELECT expression FROM table2 alias2 WHERE alias1.column = alias2.column); ALTER TABLE employees ADD(department_name VARCHAR2(14)); UPDATE employees e SET department_name = (SELECT department_name FROM departments d WHERE e.department_id = d.department_id); 11-323

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Exemplul de mai sus ad ug o coloana la tabelul EMPLOYEES pentru numele departamentului i apoi introduce valori n aceast coloana folosind un UPDATE corelat. Folosi i o comanda UPDATE corelat pentru a modifica rndurile din tabela EMPLOYEES pe baza valorilor din tabela REWARDS. UPDATE EMPLOYEES SET salary = (SELECT EMPLOYEES.salary + rewards.pay_raise FROM rewards WHERE EMPLOYEE_id = EMPLOYEES.EMPLOYEE_id AND payraise_date = (SELECT MAX(payraise_date) FROM rewards WHERE EMPLOYEE_id = EMPLOYEES.EMPLOYEE_id)) WHERE EMPLOYEES.EMPLOYEE_id IN (SELECT EMPLOYEE_id FROM rewards); Acest exemplu folosete tabela REWARDS care are coloanele EMPLOYEE_ID, PAY_RAISE i PAYRAISE_DATE. De fiecare dat cnd un angajat primete o cretere de salariu se nregistreaz n aceast tabel un rnd ce con ine valoarea pentru EMPLOYEE_ ID, valoarea creterii salariale i data la care a fost executat . Tabela REWARDS poate con ine mai multe rnduri care s aib aceeai valoare pentru cmpul EMPLOYEE_ID. Coloana PAYRAISE_DATE are menirea de a identifica cea mai recent cretere salarial primit de un angajat. n exemplu, coloana SALARY din tabela EMPLOYEES este actualizat astfel nct s reflecte ultima cretere salarial primit de un angajat. Acest lucru se realizeaz prin ad ugarea la salariul actual a m ririi de salariu corespunz toare din tabela REWARDS.

11.8 Correlated DELETE DELETE FROM table1 alias1 WHERE column operator (SELECT expression FROM table2 alias2 WHERE alias1.column = alias2.column); n cazul unei instruc iuni DELETE se poate folosi o subinterogare corelat pentru a terge acele rnduri care exist i ntr-o alt tabel . 11-324

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice De exemplu, dac decide i ca n tabela JOB_HISTORY s p stra i doar ultimele patru nregistr ri pentru un angajat, atunci cnd un angajat se transfer pe o a cincea func ie, ve i terge cel mai vechi rnd din tabel privitor la angajatul n discu ie prin c utarea valorii MIN(START_DATE). Exemplul ilustreaz rezolvarea acestei probleme folosind un DELETE corelat. DELETE FROM job_history JH WHERE EMPLOYEE_id = (SELECT EMPLOYEE_id FROM EMPLOYEES E WHERE JH.EMPLOYEE_id = E.EMPLOYEE_id AND START_DATE = (SELECT MIN(start_date) FROM job_history JH WHERE JH.EMPLOYEE_id = E.EMPLOYEE_id) AND 5 > (SELECT COUNT(*) FROM job_history JH WHERE JH.EMPLOYEE_id = E.EMPLOYEE_id GROUP BY EMPLOYEE_ID HAVING COUNT(*) >= 4)); Folosi i o subinterogare corelat pentru a terge doar acele rnduri din tabela EMPLOYEES care exist i n tabela EMPLOYEES_HISTORY. DELETE FROM EMPLOYEES E WHERE EMPLOYEE_id = (SELECT EMPLOYEE_id FROM EMPLOYEES_history WHERE EMPLOYEE_id = E.EMPLOYEE_id); n acest exemplu se folosesc dou tabele: Tabela EMPLOYEES care con ine detalii despre to i angaja ii; Tabela EMPLOYEES_HISTORY care con ine detalii despre func iile anterior de inute de angaja i, aa c ar fi o greeal dac aceleai nregistr ri despre un angajat ar exista n ambele tabele. Instruc iunile Multitable INSERT Instruc iunea INSERTSELECT poate fi folosit pentru a introduce rnduri n mai multe tabele ca parte a unei singure instruc iuni DML. Instruc iunea Multitable INSERT poate fi folosit n sistemele de tip data warehousing pentru a transfera date de la una sau mai multe surse opera ionale c tre un set de tabele int . Instruc iunea Multitable INSERT ofer o mbun t ire semnificativ performan elor din urm toarele puncte de vedere: 11-325 a

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice o singur instruc iune DML versus multiple instruc iuni INSERT.. SELECT ; o singur instruc iune DML versus o procedur care s execute mai multe instruc iuni INSERT folosind sintaxa IF...THEN. ntr-o instruc iune multitable INSERT insera i n una sau mai multe tabele rndurile calculate derivate din rndurile returnate n urma evalu rii datelor furnizate de o subinterogare. Instruc iunea multitable INSERT poate juca un rol deosebit de folositor ntr-un scenariu pentru data warehouse. Presupunem c trebuie s nc rca i n mod regulat datele n baza pentru a facilita analiza afacerii. Pentru a face asta trebuie s extrage i datele din unul sau mai multe sisteme opera ionale i s le copia i n depozitul de date. Procesul de extragere a datelor din surse i aducerea lor n depozit se numete de ETL (Extraction, Transformation, and Loading). n timpul extragerii, datele necesare trebuie identificate i extrase din mai multe surse diferite cum ar fi sisteme de baze de date i aplica ii. Dup extragere, datele trebuie transportate fizic c tre sistemul int sau un sistem intermediar pentru a fi procesate. n func ie de modul ales pentru transport pot fi executate unele transform ri n timpul acestui proces. De exemplu, o instruc iune SQL care acceseaz direct o inta la distanta printr-un gateway poate concatena doua coloane ca parte a instruc iunii SELECT. Odat ce datele sunt nc rcate n baza Oracle9i transformarea lor poate fi f cut folosind opera ii SQL. Instruc iunea multitable INSERT este una dintre tehnicile implementate n Oracle9i pentru transformarea datelor. Instruc iunea Multitable INSERTS ofer beneficiile date de instruc iunea INSERT... SELECT atunci cnd sunt folosite mai multe tabele drept inta. nainte de Oracle9i trebuia s folosi i mai multe instruc iuni independente de tipul INSERT... SELECT pentru a procesa aceeai data surs de mai multe ori, timpul aferent i munca necesara fiind indubitabil mai mari. Fiecare nregistrare dintr-un ir de intrare, cum ar fi o tabel nonrela ional poate fi acum convertit n mai multe nregistr ri pentru mai multe tabele rela ionale. Oracle 9i introduce urm toarele tipuri de instruc iuni multitable INSERT : Unconditional INSERT (INSERT necondi ionat); Conditional ALL INSERT (Insearea tutore datelor n mod condi ionat); Conditional FIRST INSERT (Primul INSERT condi ionat); Pivoting INSERT (INSERT condus). Trebuie s folosi i diferite clauze pentru a indica tipul de INSERT ce va fi executat.

11-326

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice INSERT [ALL] [conditional_insert_clause] [insert_into_clause values_clause] (subquery) conditional_insert_clause[ALL] [FIRST] [WHEN condition THEN] [insert_into_clause values_clause] [ELSE] [insert_into_clause values_clause] Sintaxa de mai sus red formatul generic pentru instruc iunea multitable INSERT. Unconditional INSERT clauza ALL Specifica i clauza ALL urmat de mai multe clauze insert_into pentru a executa un insert necondi ional n mai multe tabele. Serverul Oracle execut fiecare clauza INSERT odat pentru fiecare rnd returnat de subinterogare. Conditional INSERT: conditional_insert_clause Specifica i clauza pentru conditional_insert_clause n vederea execut rii unui insert condi ionat. Serverul Oracle filtreaz fiecare clauz insert_into_clause c utnd coresponden a cu condi ia de la clauza WHEN care determin execu ia ei. O singur instruc iune multitable insert poate con ine pn la 127 clauze WHEN. Conditional INSERT: ALL Dac specifica i ALL, serverul Oracle evalueaz fiecare clauza WHEN cu privire la rezultatul evalu rii altor clauze WHEN. Pentru fiecare clauza WHEN a c rei condi ie este evaluat ca fiind adev rat serverul Oracle execut lista corespunz toare din instruc iunea INSERT. Conditional FIRST: INSERT Dac specifica i FIRST, serverul Oracle evalueaz fiecare clauza WHEN n ordinea n care sunt scrise n instruc iune. Dac primul WHEN este evaluat ca fiind adev rat, serverul Oracle execut clauza INTO corespunz toare, n caz contrar trecnd peste urm toarea clauz WHEN pentru acel rnd. Conditional INSERT: clauza ELSE Pentru un anumit rnd, dac nici o clauza WHEN nu este evaluat ca fiind adev rat : dac specifica i clauza ELSE, serverul Oracle execut lista de la clauza INTO asociat clauzei ELSE. dac nu specifica i clauza ELSE, serverul Oracle nu execut nici o ac iune pentru acel rnd.

11-327

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Restric ii pentru instruc iunea Multitable INSERT Instruc iunea multitable insert poate fi executat numai asupra tabelelor nu i asupra view-urilor sau tabelelor la distan (remote table); Nu pute i specifica o expresie format dintr-o colec ie de tabele cnd folosi i instruc iunea multitable insert; La folosirea instruc iunii multitable insert nu pot fi specificate mai mult de 999 tabele int , lund n calcul toate clauzele insert_into.

Exemplu: Unconditional INSERT ALL Selecta i valorile pentru EMPLOYEE_ID, HIRE_DATE, SALARY i MANAGER_ID din tabela EMPLOYEES pentru acei angaja i care au EMPLOYEE_ID> 200. Insera i valorile n tabela SAL_HISTORY i n tabela MGR_HISTORY folosind un INSERT multitabel. INSERT ALL INTO sal_history VALUES (EMPLOYEESID, HIREDATE, SAL) INTO mgr_history VALUES (EMPLOYEESID, MGR, SAL) SELECT EMPLOYEE_id EMPLOYEESID, hire_date HIREDATE, salary SAL, manager_id MGR FROM EMPLOYEES WHERE EMPLOYEE_id > 200; n exemplu se insereaz rnduri att n tabela SAL_HISTORY ct i n tabela MGR_HISTORY tables. Instruc iunea SELECT extrage datele din tabela EMPLOYEES, coloanele EMPLOYEE_ID, hire_date, salary i manager_ID pentru acei angaja i a c ror EMPLOYEE_ID este mai mare de 200. Aceste valori sunt inserate n tabela SAL_HISTORY i n tabela MGR_HISTORY. Acest INSERT este necondi ionat deoarece ulterior nu se aplica restric ii asupra rndurilor extrase de instruc iunea SELECT. Toate rndurile reg site de instruc iunea SELECT statement sunt inserate n cele dou tabele, respectiv SAL_HISTORY i MGR_HISTORY. Clauza VALUES de la instruc iunea INSERT specific coloanele ce vor fi inserate n tabele. Fiecare rnd returnat de instruc iunea SELECT duce la dou inser ri, una n tabela SAL_HISTORY i alta n tabela MGR_HISTORY. n total au fost inserate 8 rnduri n cele dou tabele. 11-328

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Exemplu-Conditional INSERT ALL Selecta i valorile coloanelor EMPLOYEE_ID, HIRE_DATE, SALARY i MANAGER_ID din tabela EMPLOYEES pentru acei angaja i a c ror id este mai mare 200. Dac SALARY este mai mare de 10,000, insera i aceste valori n tabela SAL_HISTORY folosind o instruc iune multitable INSERT condi ional . Dac valoarea pentru MANAGER_ID este mai mare de 200 atunci insera i aceste valori n tabela MGR_HISTORY folosind o instruc iune multitable INSERT condi ional . INSERT ALL WHEN SAL > 10000 THEN INTO sal_history VALUES(EMPID,HIREDATE,SAL) WHEN MGR > 200 THEN INTO mgr_history VALUES(EMPID,MGR,SAL) SELECT employee_id EMPID,hire_date HIREDATE , salary SAL , manager_id MGR FROM employees WHERE employee_id > 200; 4 rows created. Exemplul este similar cu cel anterior deoarece se introduc date n dou tabele i anume SAL_HISTORY i MGR_HISTORY. Instruc iunea SELECT extrage din tabela EMPLOYEES datele despre angaja ii (ID, hire date, salary, and manager_ID) a c ror employee_ID este mai mare dect 200. Valorile coloanelor employee_ID, hire_date i salary sunt inserate n tabela SAL_HISTORY iar cele din coloanele employee_ID, manager_ID i salary sunt inserate n tabela MGR_HISTORY. Aceast instruc iune INSERT este referit ca conditional ALL INSERT deoarece sunt aplicate restric ii dup extragerea rndurilor de c tre instruc iunea SELECT. Numai acele rnduri care au valoarea din coloana SAL mai mare de 10000 sunt inserate n tabela SAL_HISTORY i similar, numai acele rnduri care au valoarea din coloana MGR mai mare de 200 sunt inserate n tabela MGR_HISTORY. Fa de exemplul precedent, de aceast dat sunt inserate numai patru rnduri n cele dou tabele SAL_HISTORY i MGR_HISTORY.

11-329

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Conditional FIRST INSERT INSERT FIRST WHEN SAL > 25000 THEN INTO special_sal VALUES(DEPARTMENTSID, SAL) WHEN HIREDATE like ('%00%') THEN INTO hiredate_history_00 VALUES(DEPARTMENTSID,HIREDATE) WHEN HIREDATE like ('%99%') THEN INTO hiredate_history_99 VALUES(DEPARTMENTSID, HIREDATE) ELSE INTO hiredate_history VALUES(DEPARTMENTSID, HIREDATE) SELECT department_id DEPARTMENTSID, SUM(salary) SAL, MAX(hire_date) HIREDATE FROM EMPLOYEES GROUP BY department_id; n exemplu instruc iunea SELECT extrage valorile pentru coloanele department_ID, salariul total i valoarea maxim pentru hire_date pentru fiecare departament din tabela EMPLOYEES. Aceasta instruc iune INSERT este referit ca conditional FIRST INSERT, deoarece atunci cnd salariul total este mai mare de 25,000 apare o excep ie. Expresia condi ional WHEN ALL > 25000 este prima evaluat . Dac salariul total pentru un departament este mai mare de 25,000 atunci articolul este inserat n tabela SPECIAL_SAL n func ie de valoarea coloanei hire_date. Dac prima clauz WHEN este evaluat ca fiind True, serverul Oracle execut clauza corespondent INTO i trece peste urm toarele clauze WHEN pentru acest rnd. Pentru rndurile care nu satisfac condi ia WHEN SAL > 25000, restul condi iilor sunt evaluate ca fiind o instruc iune de tip conditional INSERT i rndurile date de SELECT sunt inserate n tabela HIREDATE_HISTORY_00 sau HIREDATE_HISTORY_99 sau HIREDATE_HISTORY n func ie de valoarea din coloana HIREDATE. Se execut 8 inser ri n tabelele SPECIAL_SAL, HIREDATE_HISTORY_00, HIREDATE_HISTORY_99 i HIREDATE_HISTORY.

Pivoting INSERT Presupunem c primi i un set de date despre vnz ri dintr-o baz de date nerela ional , SALES_SOURCE_DATA in urm torul format : EMPLOYEE_ID, WEEK_ID, SALES_MON, SALES_TUE, SALES_WED, 11-330

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice SALES_THUR, SALES_FRI i dori i s p stra i aceste nregistr ri n tabela SALES_INFO ntr-un format rela ionat cum ar fi : EMPLOYEE_ID, WEEK, SALES. Folosind o instruc iune de tip pivoting INSERT, transforma i setul de date primit n formatul de date rela ional dorit.

Pivotarea este opera ia prin care crea i o transformare astfel nct fiecare nregistrare din orice ir de intrare, cum ar fi o baz de date care nu este rela ionat , trebuie s fie convertit n mai multe nregistr ri pentru o baz de date rela ionat . Pentru a solu iona acesta problem trebuie s construi i o transformare astfel nct fiecare nregistrare din tabela original din baza de date nerela ionat , SALES_SOURCE_DATA, s fie convertit n cinci nregistr ri pentru tabela SALES_INFO din baza de date rela ionat . Aceast opera ie este numit de obicei pivoting. INSERT ALL INTO sales_info VALUES (EMPLOYEE_id,week_id,sales_MON) INTO sales_info VALUES (EMPLOYEE_id,week_id,sales_TUE) INTO sales_info VALUES (EMPLOYEE_id,week_id,sales_WED) INTO sales_info VALUES (EMPLOYEE_id,week_id,sales_THUR) INTO sales_info VALUES (EMPLOYEE_id,week_id, sales_FRI) SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE, sales_WED, sales_THUR,sales_FRI FROM sales_source_data;

DESC SALES_SOURCE_DATA

SELECT * FROM SALES_SOURCE_DATA;

11-331

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice DESC SALES_INFO

SELECT * FROM sales_info;

11-332

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

11.9 Exerciii

1. Crea i tabela MY_EMPLOYEE care are urm toarele coloane : id, last_name, first_name, userid, salary. Insera i date n tabelul MY_EMPLOYEE. 2. Descrie i structura tabelului MY_EMPLOYEE pentru a identifica numele cmpurilor. 3. Ad uga i prima nregistrare a tabelului din exemplul de mai jos. Nu folosi i lista coloanelor n clauza INSERT. ID 1 2 3 4 5 LAST_NAME Patel Dancs Biri Newman Ropeburn FIRST_NAME Ralph Betty Ben Chad Audry USERID rpatel bdancs bbiri cnewman aropebur SALARY 795 860 1100 750 1550

4. Introduce i n tabelul MY_EMPLOYEE i al doilea rnd de date din exemplul de mai sus. De data aceasta, specifica i coloanele explicit n clauza INSERT. 5. Verifica i dac au fost ad ugate n tabel. 6. Crea i un script numit load_EMPLOYEES.sql pentru a insera nregistr ri n mod interactiv n tabelul MY_EMPLOYEE. Cere i utilizatorului prenumele (FIRST_NAME), numele de familie (LAST_NAME) i salariul fiec rui angajat. Concatena i prima liter a prenumelui i primele 7 caractere ale numelui de familie pentru a crea userid. 7. Insera i urm toarele dou nregistr ri n tabel, prin intermediul scriptului creat. 8. Verifica i ad ug rile. 9. Salva i modific rile. MY_EMPLOYEE. terge i i modifica i date n tabelul

10. Modifica i numele de familie al angajatului cu ID = 3 n Drexler. 11. Modifica i salariul la 1000 pentru to i cei cu salariul mai mic dect 900. 11-333

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 12. Verifica i modific rile f cute. 13. terge i-o pe Betty Dancs din tabelul MY_EMPLOYEE. 14. Verifica i modific rile. 15. Salva i toate modific rile temporare. Controla i tranzac iile de date asupra tabelului MY_EMPLOYEE. 16. Insera i n tabel ultima nregistrare rulnd scriptul creat la punctul 6. 17. Verifica i ad ugarea. 18. Marca i un savepoint n cadrul tranzac iei. 19. terge i toate nregistr rile din tabel. 20. Verifica i c tabelul este gol. 21. Anula i cea mai recent opera ie DELETE f r anterior. a anula i INSERT-ul

22. Verifica i c rndul nou este intact. Salva i ad ugarea, f cnd-o permanent . 23. Crea i tabelul sal_history, tabelul mgr_history i tabelul special_sal cu structurile de mai jos: sal_history

mgr_history

special_sal

11-334

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 24. a. Scrie i o interogare care s execute urm toarele: S afieze EMPLOYEE_ID, hire date, salary, i manager_ID pentru acei angaja i pentru care EMPLOYEE_ID este mai mic de 125 (din tabela EMPLOYEES). Dac salariul este mai mare de 20,000, insera i datele despre angaja i (EMPLOYEE_ ID i salary) n tabela SPECIAL_SAL. Insera i valorile pentru EMPLOYEE_ID, hire_date , salary n tabela SAL_HISTORY. Insera i valorile pentru EMPLOYEE_ID, manager_ID i salary n tabela MGR_HISTORY

b. Afia i rndurile din tabela SPECIAL_SAL.

c. Afia i rndurile din tabela SAL_HISTORY.

d. Afia i rndurile din tabela MGR_HISTORY.

11-335

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice 25. a. Crea i tabela sales_source_data cu structura de mai jos i introduce i cteva datele prezentate n figur .

b. Crea i tabela sales_info cu structura de mai jos:

c. Scrie i o interogare care s afieze EMPLOYEE_ID, week_ID i vnz rile din fiecare zi a s pt mnii (din tabela SALES_SOURCE_DATA). Construi i o transformare astfel nct fiecare rnd din tabela SALES_SOURCE_DATA s fie convertit n mai multe nregistr ri pentru tabela SALES_INFO i afia i datele ob inute.

11-336

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Capitolul 12 Anexa 1

Structura tabelelor folosite n carte i datele standard con inute de acestea Tabela COUNTRIES DESCRIBE countries

SELECT * FROM countries;

Tabela DEPARTMENTS DESCRIBE departments

12-337

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice SELECT * FROM departments;

Tabela EMPLOYEES DESCRIBE employees

12-338

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice SELECT * FROM employees;

Tabela JOBS DESCRIBE jobs

12-339

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

SELECT * FROM jobs;

Tabela JOB_GRADES DESCRIBE job_grades

SELECT * FROM job_grades;

12-340

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice

Tabela JOB_HISTORY DESCRIBE job_history

SELECT * FROM job_history;

12-341

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Tabela LOCATIONS DESCRIBE locations

SELECT * FROM locations;

Tabela REGIONS DESCRIBE regions

SELECT * FROM regions;

12-342

Facultatea de Automatic i Calculatoare Iai Baze de date lucrri practice Bibliografie

1. Nancy Greenberg, Priya Nathan, Introduction to SQL Student Guide Volume 1 and 2, Oracle Corporation, 2001; 2. Visual FoxPro ; 3. C. Botez, D. Arot ri ei, I. Crlig, D. Buzea, Baze de date Lucr ri de laborator, Editura Medex 2005, ISBN: 973-86741-0-7 4. A.Silberschatz, H.F. Korth, S.Sudarshan, Database System Concepts, Fourth Edition, McGraw-Hill Higher Education, ISBN: 0-07-112268-0,2002.

12-343

Vous aimerez peut-être aussi