Baze de Date

March 26, 2017 | Author: Mihai Placinta | Category: N/A
Share Embed Donate


Short Description

Download Baze de Date...

Description

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice CUPRINS CAPITOLUL 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7

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

CAPITOLUL 2 2.1 2.2 2.3 2.4 2.5 2.6 2.7

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

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

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

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

Indexarea tabelelor............................................................................ 3-46 Rela ionarea tabelelor ....................................................................... 3-50 Integritatea referen ial ...................................................................... 3-53 Func ii. Variabile de memorie. Macrosubstitu ia ............................... 3-54 Crearea şi modificarea programelor.................................................. 3-57 Programare structurat . Proceduri. ................................................... 3-58 Comenzi de intrare/ieşire................................................................... 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 Iaşi Baze de date – lucrări 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 fişiere.................................................... 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 constrângerilor ............................................................... 5-133 Constrângerea NOT NULL .............................................................. 5-136 Constrângerea UNIQUE KEY ......................................................... 5-137 Constrângerea PRIMARY KEY ....................................................... 5-139 Constrângerea FOREIGN KEY ....................................................... 5-139 Constrângerea CHECK ................................................................... 5-141 Ad ugarea unei constrângeri .......................................................... 5-142 Ştergerea unei constrângeri ............................................................ 5-143 Dezactivarea constrângerilor........................................................... 5-143 Activarea constrângerilor................................................................. 5-144 Exerci ii ............................................................................................ 5-147

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

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

CAPITOLUL 7 7.1 7.2 7.3 7.4 1-2

FUNC II DE UN SINGUR RÂND .................................. 7-174

Func ii de un singur rând ................................................................. 7-175 Func ii pentru caractere................................................................... 7-177 Func ii pentru valori numerice ......................................................... 7-181 Utilizarea datelor calendaristice ...................................................... 7-183

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice 7.5 7.6 7.7 7.8 7.9

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

CAPITOLUL 8 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8

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

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

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

CAPITOLUL 10 10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9

AFIŞAREA DATELOR DIN TABELE MULTIPLE......... 8-205

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

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

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

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice 10.10 10.11 10.12 10.13 10.14 10.15 10.16 10.17 10.18 10.19 10.20

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

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

INSTRUC IUNI PENTRU MANIPULAREA DATELOR.... 11-

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

CAPITOLUL 12

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

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

1-4

12-343

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 fişierele clasice (de tip ASCII, binare, etc.) putem aminti redundan a minim a informa iilor, accesul mai uşor 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, deşi 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, existând totuşi 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 Iaşi Baze de date – lucrări 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 fişier special numit Dicţionarul 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 ataşeaz un limbaj de interogare. Utilitarele de întreţinere 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 cunoaşterea 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 aplicaţii. 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 funcţiile unui sistem de gestiune a bazelor de date

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

1-6

asigurarea independenţei datelor. Independen a datelor poate fi definit drept “imunitatea” programelor de aplica ii la schimbarea structurii de memorare şi /sau a strategiei de acces. Independen a

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

• • •





datelor trebuie urm rit atât la nivel fizic cât şi la nivel logic. Independenţa fizică asigur modificarea datelor şi a tehnicilor fizice de memorare, f r rescrierea programelor de aplica ii. Independenţa logică ofer posibilitatea ad ug rii de noi articole sau extinderea structurii globale f r a necesita rescrierea programelor; asigurarea integrităţii 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 redundanţe minime şi controlate a datelor prin definirea unui element de structur , cu o cantitate cât mai mic de date, evitându-se în acelaşi timp ambiguitatea; asigurarea unor facilităţi 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 cunoaşterea structurii întregii baze de date; existen a unor limbaje performante de interogare etc.; asigurarea partajării datelor, adic asigurarea accesului mai multor utilizatori la aceleaşi date pe baza unor criterii de prioritate şi dezvoltarea unor aplica ii f r a se modifica structura bazei de date; asigurarea securităţii datelor prin intermediul unor canale corespunz toare şi definirea unor restric ii de autorizare la accesarea datelor.

Plecând 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 numeşte 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 Iaşi Baze de date – lucrări 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 diverşi utilizatori, literatura de specialitate oferind mai multe clasific ri sau grup ri. Dintre acestea prezent m în continuare doar câteva 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 defineşte 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 acelaşi 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 precizând necesarul şi disponibilitatea datelor; - programatorii de aplicaţii şi utilizatorii finali care comunic cu SGBD-ul prin intermediul limbajului de manipulare sau a limbajului de interogare.

1.3

Evoluţia şi clasificarea sistemelor de gestiune a bazelor de date

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

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice de gestiune a bazelor de date, care sintetic pot fi prezentate în trei genera ii. Prima genera ie este situat în timp la sfârşitul 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 rândul lor. Modelul reţea încearc s înl ture lipsurile modelului precedent, propunând o structur de date mai bogat pe baza leg turilor posibile şi conducând la construirea unei re ele între acestea. Genera ia a doua, situat în timp la sfârşitul 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 decât 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 utilizând 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 aceeaşi 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 “moştenire”. Sistemele funcţionale 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 exprimând 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 Iaşi Baze de date – lucrări 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 decât cele clasice precum: imagini, fotografii, muzic , sunete etc. Sistemele din aceast categorie, care se comercializeaz deja, permit organizarea de “birouri f r hârtie”, propunând 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 câtorva 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 cât 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 utilizând limbaje de nivel înalt propriu sistemului de calcul pe 1-10

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 reţea; • relaţionale; • obiectuale; • obiectual-relaţionale. Din punct de vedere a modului de localizare a bazelor de date SGBD-urile sunt: • centralizate, care presupun ca datele s fie concentrate într-un singur loc pe un server, ca surs unic de informare şi/sau raportare (VisualFoxPro, Access, etc.); • distribuite, care presupun ca datele s fie repartizate geografic în mai multe puncte în func ie de locul lor de producere, cu posibilitatea acces rii datelor din orice punct definit (Oracle, IBM DB2, Informix). La ora actual datorit prolifer rii prelucr rilor în re ea de calculatoare tot mai multe SGBD-uri dispun de o component de gestiune distribuit a datelor.

1.4

Conceptul de bază de date relaţională

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 fişierele simple de date. Apoi DBMS-urile au devenit foarte populare pentru uşurin a în utilizare şi flexibilitatea lor. Componentele modelului rela ional sunt: 1-11

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice • Colec ie de obiecte şi rela ii care stocheaz date;

• Un set de operatori care ac ioneaz produce alte rela ii;

asupra rela iilor pentru a

• Reguli de integritate a datelor pentru consisten

şi acurate e.

Definirea unei baze de date rela ionale O baza de date rela ional foloseşte 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 Iaşi Baze de date – lucrări practice

ANGAJAT #* număr * nume o meseria

asignat la compus din

DEPARTAMENT #* număr * nume o localitate

Scenariu: “ … se asigneaz unul sau mai mul i angaja i la un departament …” “… câteva 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 mân constant. De aceea structurile de date tind s r mân 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 uşor 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 acelaşi tip (cu aceleaşi 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 serveşte 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 Iaşi Baze de date – lucrări practice 1.5

Terminologie specifică bazelor de date relaţionale

O baza de date relaţională 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 rând sau o tuplă reprezint informa ia necesar pentru un angajat specificat. Fiecare rând din tabel trebuie identificat de o cheie primară, care nu permite rânduri duplicate. Ordinea rândurilor 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 câmp poate fi g sit la intersec ia dintre un rând şi o coloană. Poate con ine o singur valoare.



Câmpurile 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 acelaşi 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 Iaşi Baze de date – lucrări practice • •

Con ine o colec ie de tabele f r pointeri fizici; Foloseşte 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 . Câteva 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 Manager’s 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 ; • când 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; • Moşteneşte atribute şi cod; • Ascunde date, cod şi atribute; • Interac ioneaz cu alte obiecte; • Recunoaşte diferite obiecte f r analiz ; • Interpreteaz aceeaşi 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 decât alt tip de obiect (object type metadata); • Obiectele pot moşteni 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 Iaşi Baze de date – lucrări practice • Recunoaşterea diferitelor tipuri de lucruri şi comportamentul lor f r analiza lor; • Folosirea aceleaşi cereri pentru a invoca diferite implement ri ale aceleaşi ac iuni pentru dou obiecte diferite (polymorphism); 1.6

Sisteme de gestiune a bazelor de date relaţionale î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 câştigat 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 Iaşi Baze de date – lucrări 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 rând 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, aducând o r spândire 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 eşte mecanismele de blocare care, începând 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 declanşatoarele (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 creşterii complexit ii structurii datelor. Practic, începând cu aceast versiune, Oracle a devenit o baz de date obiectual-rela ional , fiind permis stocarea în baza de date atât a structurilor tabelare cât ş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 Iaşi Baze de date – lucrări 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 fişiere. Datele pot fi stocate pe calculatoare diferite, gestionate de sisteme de operare diferite, având î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 bazându-se practic pe cluster. Aşa cum s-a procedat cu resursele de stocare la fel se utilizeaz în comun şi resursele de procesare, aplicându-se principiile echilibr rii înc rc rii (load balancing în englez ).

1.7

Sisteme de gestiune a bazelor de date relaţionale în FoxPro.

Ap rând ca urmaş a lui DBASE III şi dotat astfel încât 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 fişiere; • 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 Iaşi Baze de date – lucrări practice Versiunea 2.0 (anul 1991) • compatibilitate sporit cu DBase IV (modul SQL incorporat, indecşi compuşi); • 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 maşini cu procesor 8088 şi 80286) şi extins (pentru maşini cu procesor 80386 şi mai puternice). Versiunea 2.5 pentru DOS (anul 1993, după preluarea de către 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 Iaşi Baze de date – lucrări 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 fişierele 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 rândurilor 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 convergând de-a lungul ultimilor 8 ani c tre Microsoft SQL Server; • solu ie compatibil .NET cuprinzând şi servicii Web XML; 1-20

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 Iaşi Baze de date – lucrări 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 uşurin datele, folosind interfa a utilizator; • • • • • • • •

FoxPro lucreaz cu urm toarele elemente de baz : fişier de date: colec ie de informa ii organizate matricial; fişier index: colec ie de informa ii auxiliare asociate unui fişier 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 afişare şi/sau de introducere a informa iilor într-un fişier de date; raport : forma de afişare a informa iilor dintr-un fişier de date la ecran, imprimant sau fişier, având la baza principiul benzilor; interogare: fişier de date virtual, ob inut din unul sau mai multe fişiere de date fizice, interconectate între ele pe baza unor rela ii; program: colec ie de instruc iuni FoxPro ordonate conform unui algoritm ce urm reşte, în general, prelucrarea informa iilor din unul sau mai multe fişiere; aplica ie: program special ce integreaz elementele FoxPro care au ca scop realizarea unui grup de opera ii unitare; proiect: fişier de date special ce integreaz elementele FoxPro care au ca scop realizarea unui grup de opera ii unitare şi care se foloseşte pentru generarea de aplica ii şi programe (tip EXE).

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

Fişierele de date FoxPro au o organizare special ilustrat urm toare.

2-22

în figura

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice ANTET FIŞIER zona în care se p streaz informa iile despre structura fişierului şi anume: num rul de câmpuri (coloane) din fişier, num rul de articole, data şi ora ultimei actualiz ri. Pentru fiecare câmp se re in: numele, tipul, lungimea, informa ii de index. COLOAN ARTICOL CÂMP

Se disting dou p r i importante în acest fişier: zona propriu-zis de informa ii împ r it în rânduri numite articole şi coloane de câmpuri şi antet fişier în care se p streaz informa iile de organizare a zonei propriu-zise.

ARTICOL: por iune elementar a fişierului la care utilizatorul are acces la un moment dat; articolul este format din mai multe câmpuri. CÂMP: unitatea elementar de memorare în fişier ce se reg seşte la intersec ia dintre un articol şi o coloan . COLOANA: toate câmpurile dintr-un fişier ce se caracterizeaz prin acelaşi nume, tip, lungime şi se afl în articole diferite.

Fişier index Unui fişier de date FoxPro i se pot asocia unul sau mai multe fişiere index cu scopul de a permite reg sirea rapid a articolelor în func ie de cheile realizate pe baza unor câmpuri sau combina ii de câmpuri. Organizarea fişierului index este prezentat în figura urm toare:

2-23

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice ANTET INDEX

1 2 i` n` Valoare cheie (ordonat )

Num r de ordine articol în fişier

Valoare cheie: valorile câmpurilor sau combina iilor de câmpuri din fişierul de date ordonate cresc tor sau descresc tor, dup op iune; Nr. ordine articol în fişier: numerele de ordine ale articolelor din fişier. Cu alte cuvinte un fişier 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 fişierul de date asociat. Avantajul c ut rii în fişierul de date printr-un fişier 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 fişierul de date devine de asemenea simpl şi uşoar . În sistemul FoxPro, începând cu versiunea 2.0 s-a introdus un nou tip de fişier index şi anume fişierul multiindex compact (CDX). Fişierul multiindex se aseam n cu cel monoindex numai ca are mai multe perechi de coloane valoare cheie-nr. ordine articol în fişier. Perechile de coloane valoare cheie şi nr. ordine articol au nume unic relativ la fişier şi poarta numele de index (tag). Macheta – Crearea şi gestionarea unei machete are la baz un program special care realizeaz opera ii de afişare şi/sau opera ii de între inere a fişierelor de date, realizând astfel o interfa între utilizator şi sistemul FoxPro. Avantajul folosirii machetelor const , în primul rând, î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 afişare sau de tip rire a informa iilor din fişierele de date. Un raport con ine mai multe benzi pentru o grupare lizibil a informa iilor. Avantajul folosirii rapoartelor const , în primul rând, în existen a unui editor specializat în crearea şi 2-24

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice modificarea acestora, în care este suficient s definim informa iile (text utilizator şi câmpuri) care se vizualizeaz în fiecare banda pentru ca afişarea/tip rirea informa iilor s aib loc în forma dorit . Interogarea (Query) – Reprezint un fişier de date virtual ce înglobeaz date din mai multe fişiere fizice de date prin stabilirea de rela ii între câmpurile de acelaşi tip. Se permite de asemenea filtrarea informa iilor (câmpuri şi/sau articole) din oricare din fişierele 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 fişier virtual fa de unul fizic echivalent, precum şi din între inerea uşoar 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 fişier de date special, integrator de obiecte FoxPro, care se foloseşte 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 fişier 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 fişierelor DOS-System, Filer, calculator, etc. ).

2-25

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice 2.2

Tipuri de date în FoxPro, operatori, funcţii

Un tip de dat reprezint o caracteristic a datelor prin care se stabileşte 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 câmpului numeric este limitata la 20 cifre (semnul şi punctul zecimal ocupa câte o cifra !). Se foloseşte pentru a stoca valori numerice în câmpurile 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 câmp 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 foloseşte 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 când folosim valori întregi, mai mari de 9999. • Tipul monetar (Currency) – se foloseşte la memorarea valorilor exprimate în bani. Zona de memorie alocat are 8 octe i. O valoare de acest tip se declar prin introducerea în fa a valorii numerice a simbolului monetar ($).Exemplu A=$500.47

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

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

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Operatori rela ionali Mai mic decât < Mai mare decât > Egal = Diferit de , # , != Mai mic sau egal cu = Comanda de control pentru afişarea valorilor cu un anumit num r de zecimale este : SET DECIMALS TO Efect: determin num rul minim de cifre zecimale ce sunt afişate în cazul în care nu se specific un format explicit de afişare. Implicit acest număr este 2. Exemplu : ? 5/11 SET DECIMALS TO 4; ? 5/11 Funcţii aplicabile tipului de dată numeric Func ii referitoare la semnul datelor numerice: returneaz valoarea absoluta a unei expresii numerice SIGN() returneaz un num r indicând 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() trunchiaz rezultatul unei expresii numerice la partea întreag ROUND ( < expN1>, ) returneaz num rul expN1 rotunjit la num rul de zecimale date de expN2. Daca expN2 este negativ, se rotunjeşte la zero CEILING() returneaz cel mai apropiat întreg mai mare sau egal ca num rul expn FLOOR() returneaz cel mai apropiat întreg mai mic sau egal ca num rul expn ABS()

2-27

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

Func ii matematice elementare: returneaz rezultatul ridic rii constantei "e" la puterea dat ca parametru LOG() returneaz logaritmul natural / zecimal pentru num rul specificat SQRT() returneaz valoarea radicalului din num rul (pozitiv) specificat MOD ( , ) returneaz un întreg, restul împ r irii la . Semnul rezultatului este cel al . EXP()

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 foloseşte 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 foloseşte pentru a stoca valori în câmpurile de tip logic ale tabelelor din baze de date, pentru a stoca valorile returnate de func ii, variabile de tip logic sau alte expresii logice.

(,) ! , NOT AND OR

Operator logic Grupeaz expresiile Nega ie logic ŞI logic SAU logic

Exemplu : ? NOT (1=3) .T. ? (13) .T. ? 6

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.) putând fi utiliza i în compararea a dou expresii de acelaşi 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! ‘ Funcţii pentru tipul de dată caracter returneaz o valoare numeric ce indic LEN (, ) caracter sau dintr-un câmp memo AT (,/) celui de-al doilea. Indicele primului caracter dintr-un şir este 1. LEFT (,/, )

RIGHT (,/, )

SUBSTR (,/, ,) LOWER() UPPER() LTRIM ()/RTRIM () TRIM () CHR () MAX (,) MIN (,) SPACE () LIKE (,)

- dac este zero, returneaz şirul vid - dac este mai mare decât , se returneaz în întregime extrage şi returneaz un şir de caractere compus din ultimele caractere ale - dac este zero sau mai mic ca zero, returneaz şirul vid - dac este mai mare decât < expC>, se returneaz în întregime extrage şi returneaz din expC un subşir de caractere ce începe în pozi ia specificat de lungimea indicat de converteşte literele mari în litere mici converteşte literele mici în litere mari şterge spa iile de la stânga/ dreapta unui şir de caractere şi returneaz rezultatul şterge spatiile de la sfârşitul unui şir de caractere şi returneaz rezultatul converteşte o expresie numeric într-una de tip caracter returneaz maximul/minimul dintre dou expresii de tip caracter genereaz un şir de caractere compus din spa ii compara cele dou şiruri de caractere returnând .T. sau .F.

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

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 fişiere executabile, imagini, sunet. Singura limitare este dat de dimensiunea spa iului liber pe disc. Utilizarea câmpurilor 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 câmp caracter cu lungimea 70 doar pentru explica iile care apar în câteva înregistr ri). Informa iile din câmpul memo nu sunt memorate în acelaşi fişier cu restul câmpurilor. O tabel ce con ine un câmp memo are asociat un fişier 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 eşte viteza de depozitare a datelor. Pentru stabilirea dimensiunii blocurilor dintr-un câmp 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 Iaşi Baze de date – lucrări practice bloc, care asigur fişierului memo.

o eficien

mai mare în ceea ce priveşte 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 acelaşi nivel se execut de la stânga la dreapta. Pentru modificarea ordinii opera iilor se pot folosi parantezele rotunde. 2.3

Funcţii pentru conversii între tipuri de date

Din num r în şir de caractere converteşte un num r expN într-un şir STR ([,] de caractere, returnând un şir de [,]) caractere. indic num rul total de caractere al şirului creat, iar indic num rul de zecimale Din şir de caractere în num r converteşte un şir de caractere într-un VAL () num r, returnând rezultatul. Num rul de zecimale este cel dat de SET DECIMALS Din şir de caractere în dat converteşte o dat de intrare tip şir de CTOD ()/{ 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 Iaşi Baze de date – lucrări practice Din dat în şir de caractere converteşte o dat de intrare de tip DTOC ()/{ 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 foloseşte aşa numitele “zone de lucru” (în num r de 255) pentru manipularea fişierelor 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 fişierele de date lansate la un moment dat vor ac iona asupra fişierului deschis în zona curent activ . La deschiderea unui fişier 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 | unde : = num rul zonei de lucru activate; = şir de caractere ce reprezint aliasul tabelei. Observa ii: dac eN=0 se selecteaz prima zon de lucru neocupat . Deschiderea unui fişier (tabel) de date se face folosind comanda : USE [|?][IN ][AGAIN] [INDEX | [ORDER[||[TAG] OF] [ASCENDING|DESCENDING]]]] [ALIAS ][EXCLUSIVE][SHARED][NOUPDATE]

Clauze: AGAIN – deschiderea aceluiaşi fişier î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 Iaşi Baze de date – lucrări practice ALIAS – aliasul atribuit de utilizator fişierului de date. Prin specificarea numelui fişierului de date acesta se deschide în zona de lucru curent (dac nu se specific zona de lucru). Dac se deschide un fişier de date într-o zona de lucru în care s-a deschis anterior un alt fişier, atunci fişierul anterior deschis se închide automat. Închiderea unui fişier (tabel) de date se face folosind comanda : USE Deschiderea unei baze de date se face folosind comanda : OPEN DATABASE [ | ?] Închiderea unei baze de date se face folosind comanda : CLOSE DATABASES (închide toate fişierele de date şi index asociate deschise) CLOSE ALL (închide şi ferestrele activate anterior) 2.5

Construirea bazelor de date relaţionale. 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 fişier special numit dicţionar 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 citeşte mai întâi dicţionarul de date datele şi apoi, cunoscându-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 (fişier.dbf) sau vederi. Construirea unei tabele simple CREATE TABLE|DBF dbf_name> (< fname1>[([,])[,...]]) Clauze: = numele tabelei create (tabelul este deschis într-o zona de lucru nou 2-36

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice , = numele câmpurilor din noul tabel creat; - un caracter ce indica tipul datei pentru câmpul respectiv; C D N L M

n n -

d -

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

ALTE COMENZI

Modificarea structurii unei tabele de date active se face prin comanda: MODIFY STRUCTURE Vizualizarea structurii unei baze de date: DISPLAY STRUCTURE [IN |][TO PRINTER [PROMPT] LIST STRUCTURE[NOCONSOLE][TO PRINTER |TO FILE] O alta metod de creare a fişierelor de date din fişiere înrudite o reprezint comanda: COPY STRUCTURE TO [FIELDS [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 fişier intermediar, folosind comenzile: COPY STRUCTURE EXTENDED TO [FIELDS | FIELDS LIKE | FIELDS EXCEPT ] şi respectiv: CREATE [] FROM [] Pentru detalii urm ri i Help-ul. Crearea unei baze de date Pentru a crea o baza de date folosi i comanda: CREATE database sau, din meniul File, alege i op iunea New şi Database, dup care ap sa i butonul New File, ceea ce conduce la afişarea pe ecran a unei ferestre în care 2-37

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 câmpuri 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 câmpurile acestora - Unei tabele i se poate ataşa un nume lung de maxim 128 caractere, care conduce la o mai buna lizibilitate. Aceast regul este valabil şi pentru numele câmpurilor 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 întâi ca fiind una simpl şi apoi a fost inclus într-o baz de date, odat definite numele lungi pentru câmpurile acesteia, cele vechi (de maxim 10 caractere) nu mai pot fi folosite. Comentarii şi observaţii referitoare la tabelele legate şi la câmpurile componente Deşi comentarea tabelelor şi a câmpurilor 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 uşoar documentare ulterioar sau pentru o mai bun în elegere a modului de concepere.

2-38

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Formatul de afişare şi citire a câmpurilor tabelelor legate Pentru fiecare câmp se poate specifica un format de afişare implicit, care s serveasc la formatarea datelor atunci când aceste vor fi afişate (de exemplu când se foloseşte comanda browse). Formatul de afişare reprezint un şir de caractere format dintr-o serie de coduri, în func ie de care sistemul stabileşte modul de prezentare a datelor respective. De exemplu, un format de afişare de tipul 999.99 desemneaz o valoare numerica afişat cu 3 cifre în fa a punctului zecimal şi dou dup acesta (vezi clauza Picture). Valorile implicite ale câmpurilor Pentru fiecare câmp 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 acelaşi tip ca şi câmpul. 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 câmp Pentru un câmp al unei tabele legate se poate preciza o expresie logic care se evalueaz în momentul schimb rii valorii câmpului. Dac valoarea expresiei este adev rat , se consider c valoarea introdus este corect , dac nu se afişeaz 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 câmpul 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, constând î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 declanşeaz dup cea la nivel de câmp, dar înaintea secven elor de cod asociate evenimentelor de manipulare a tabelei. Secvenţe 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 Iaşi Baze de date – lucrări 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 declanşeaz dup valid rile la nivel de câmp şi la nivel de înregistrare. 2.6

Comenzi pentru vizualizarea şi modificarea datelor din tabele

EDIT [FIELDS ][][FOR ][WHILE ] [FONT [,]][STYLE ][FREEZE ] [KEY [,] [NOAPPEND] [NOCLEAR] [NODELETE] [NOEDIT | NOMODIFY] EDIT este comanda ce permite afişarea şi modificarea con inutului unui articol al tabelei sau al unui fişier creat cu CREATE QUERY/VIEW −

− − − −



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



NOEDIT împiedica modificarea datelor;



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



NODELETE împiedica marcarea pentru ştergere; indic cu al câtelea articol s se înceap editarea; BROWSE [FIELDS ][FONT [,]] [STYLE ][FOR ][FORMAT][FREEZE ][KEY [, ]]|NOINIT][LOCK ] [NOAPPEND][NOCLEAR] [NODELETE] [NOEDIT|NOMODIFY] [NOLINK][NOMENU][TITLE ][VALID [:F] [ERROR ]][WHEN ] [WIDTH ] [[WINDOW ][IN [WINDOW] [COLOR SCHEME | COLOR ]

2-40

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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; câmpurile calculate sunt accesibile doar la citire; afişarea se face sub forma de tablou, în ordinea câmpurilor din tabel sau a celor specificate în FIELDS, clauzele Font şi Style determinând tipul şi dimensiunea literelor ;



comanda este asem n toare cu EDIT;



FREEZE permite men inerea cursorului în acelaşi câmp al tabelei ;





WIDTH limiteaz dimensiunea coloanelor pentru câmpurile caracter; WINDOW activeaz o fereastra în care se va afişa tabelul; FIELDS permite alegerea câmpurilor şi a ordinii de afişare; APPEND FROM |? [FIELDS | FIELDS LIKE | FIELDS EXCEPT ] [FOR ][[TYPE] [DELIMITED [WITH TAB | WITH

APPEND permite ad ugarea unuia sau mai multor articole din fişierul surs specificat la sfârşitul tabelei active. −

− − − −





se pot adaug date şi din fişiere de alt tip, nu doar din DBF. Dac sursa şi destina ia sunt DBF, se copie doar câmpurile comune celor dou tabele ; dac SET DELETED este OFF se copie şi articolele marcate pentru ştergere (dar nu şi marcajul) ; dac un câmp din surs este mai mare decât omologul sau din destina ie, datele de tip caracter în exces se pierd iar cele numerice sunt înlocuite de asteriscuri; dac structurile celor dou fişiere nu corespund se afişeaz mesajul “ 0 row(s) inserted”. Coloanele ce nu apar în tabel sunt ignorate; dac nu se indica TYPE se presupune ca este un fişier surs tip dbf; se pot importa date din fişiere 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 Iaşi Baze de date – lucrări 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 [FIELDS | FIELDS LIKE | FIELDS EXCEPT ] [][FOR ] [WHILE ][NOOPTIMIZE][TYPE]DIF|MOD|SYLK|WK1|WKS|WR1| WRK|XLS]

EXPORT transfer datele dintr-un fişier în altul, de alt tip (implicit fişierul se consider a fi de tip.dbf) DELETE [] [FOR ] [WHILE ] [NOOPTIMIZE] DELETE marcheaz pentru ştergere articolele specificate din tabel. Implicit se marcheaz articolul curent. − ştergerea este logic , articolele putând 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 [] [FOR ] [WHILE ] [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 fişierele index deschise sunt automat reindexate. ZAP ZAP elimin toate articolele din tabel . Toate fişierele index deschise sunt automat reindexate. 2-42

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice SET SAFETY ON / OFF Dac este ON, implicit se previne pierderea articolelor dac se comanda crearea unui fişier cu acelaşi 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 WITH [ADDITIVE] [, WITH [ADDITIVE]]..[] [FOR ] [WHILE ] REPLACE schimb con inutul câmpurilor 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 câmpurile memo şi înseamn ad ugarea la vechiul con inut, f r ca acesta s se piard . Dac se doreşte înlocuirea în câmpul care este cheie primar nu trebuie folosite op iunile SCOPE/ FOR /WHILE. SORT TO ON [/A|/D][/C][,[/A|/D][/C]...] [ASCENDING|DESCENDING][][FOR ][WHILE ][FIELDS |FIELDS LIKE |FIELDS EXCEPT ][NOOPTIMIZE] SORT creeaz o nou tabel , în care articolele din tabela activ sunt sortate în ordinea câmpurilor specificate. − nu se pot face sort ri dup câmpuri 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 câmp în parte; − fişierul rezultat trebuie sa fie diferit ce cel de origine, şi s nu fie deschis; − dac exist deja un fişier cu numele indicat se va scrie peste acesta.

2-43

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

2.7

Exerciţii

1. Afişa i data curent în diferite formate (prezentate în tabelul din carte). Afla i câte zile sunt pân în anul 2010. 2. Afla i în ce zi cade 1 ianuarie a anului viitor şi a câta zi din s pt mân 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 câmp 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 câmp Num Char Char Memo Char Char Date Char Memo Num Num Num Num Char

Lungime câmp 4 25 25 15 15 15 15 15 15 15 25

Folosi i comanda COPY STRUCTURE EXTENDED TO şi crea i fişierul STRU_AGD. Consulta i con inutul noului fişier. Ş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 Iaşi Baze de date – lucrări practice FROM Stru_Agd. 7. Deschide i simultan doua tabele în doua zone de lucru diferite. Închide i toate tabelele şi ieşi i din Fox. 8. Crea i tabelele de mai jos, cu indecşii 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 rând fiecare index şi vizualiza i datele. Ce schimb ri apar? Şterge i unul dintre indecşii asocia i tabelei. Vizualiza i datele! Care este efectul?

2-45

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 câmp al tabelei sau o expresie rezultat din combinarea mai multor câmpuri. 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 stabileşte în func ie de rezultatul ob inut. Prin indexare se construieşte un fişier special, numit fişier 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. Fişierele index ce pot fi asociate unei tabele pot fi: •

• •

fişiere index simple (extensia IDX) con in o singura cheie de indexare; fişiere index simple compacte (extensia IDX)- care utilizeaz tehnologia de compresie dinamic de la indecşii compuşi (vezi mai jos !!) ; fişiere index compuse (extensia CDX)- care memoreaz chei de indexare (etichete, tag-uri) într-un singur fişier 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 indecşi pentru aceeaşi tabela în acelaşi fişier de index. La deschiderea unei tabele indexate este necesar doar deschiderea fişierului de index asociat, care con ine toate informa iile despre to i indecşii. Utilizarea indecşilor se poate face prin specificarea indexului care s dea

3-46

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice ordinea dorit . La un moment dat doar unul dintre indecşi poate fi activ şi acest index se numeşte index activ. To i indecşii asocia i unei tabele sunt memora i în acelaşi fişier, care are acelaşi nume ca şi tabela dar cu extensia “cdx”. Fiec rui index dintr-un fişier de index i se atribuie un nume (eticheta index), nume prin care se face referirea în comenzile de prelucrare. Indecşii pot fi de mai multe tipuri, şi anume : •

• • •

normali (Regular) – care construiesc pentru fiecare înregistrare din tabela câte o înregistrare în fişierul 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 aceleaşi valori ale cheii de indexare, numai prima dintre acestea va fi disponibil , restul neap rând în tabel (deşi 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 câmpuri (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 când se creeaz o rela ie între tabela respectiv şi o alt tabela din baza de date.

Crearea indecşilor Î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 fişierul de index pentru câmpul respectiv, cu acelaşi nume ca şi câmpul, criteriul de ordonare fiind câmpul respectiv. Ordinea cresc toare sau descresc toare este dat de tipul s ge ii. Comanda de indexare este: INDEX ON TO |TAG [OF ][FOR ][COMPACT] [ASCENDING|DESCENDING] [UNIQUE] [ADDITIVE] - cheia de indexare care con ine câmpuri ale tabelei dar nu şi câmpuri memo. Clauza FOR permite limitarea înregistr rilor ce vor putea fi accesate prin fişierul index la cele care îndeplinesc condi ia . 3-47

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Clauza COMPACT permite crearea fişierelor index simple compacte. Fişierele 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 indecşi compuşi. Clauza UNIQUE permite, în cazul în care sunt mai multe înregistr ri cu aceeaşi cheie de indexare, accesarea numai a primei înregistr ri din tabel , la celelalte neavând acces. Clauza ADDITIVE (nu are sens la indecşii compuşi structurali) permite ca la crearea unui nou index, cel activ sa nu fie închis, ceea ce se întâmpl automat în absen a clauzei. Comanda se foloseşte astfel pentru crearea celor 2 tipuri de index: - index simplu: INDEX ON TO [FOR ][COMPACT][UNIQUE] [ADDITIVE] - index compus: INDEX ON TAG [OF ] [ASCENDING | DESCENDING] [UNIQUE] [FOR ] Comanda de deschidere a unei tabele împreun asociate va ar ta astfel:

cu fişierele INDEX

USE [|?][INDEX |?[ORDER [| |[TAG][OF ][ASCENDING| DESCENDING]]]] În urma acestei comenzi se va deschide tabela împreun cu lista de fişiere index (separate prin virgul ) care sunt deja create cu comanda INDEX. Extensia fişierelor index nu trebuie precizat , decât dac sunt 2 fişiere cu acelaşi nume şi extensie diferit . Clauza ORDER permite stabilirea fişierului indexul simplu activ sau eticheta dintr-un fişier index compus ce va deveni activ . este num rul de ordine al fişierului index simplu sau al etichetei din fişierul index compus. Sunt num rate mai întâi fişierele index simple din list , apoi etichetele apar inând indexului compus structural şi, în ultimul rând, etichetele apar inând altor indecşi compuşi nestructurali. Daca =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 indecşi asocia i:

3-48

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 fişiere index simple sau compuse, pentru a schimba indexul (eticheta) activ( ) se foloseşte comanda: SET ORDER TO [||[TAG][OF ][IN |][ASCENDING|DESCENDING]] CDX([,|]) Actualizare indecşi Actualizarea indecşilor 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 expuşi unor astfel de probleme sunt indecşii compuşi structurali, care sunt deschişi odat cu tabela asociat . Şi aceştia 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 indecşi DELETE TAG [OF ] [, [OF ]]... sau DELETE TAG ALL [OF ] Comanda permite ştergerea etichetelor dintr-un index compus fie structural, fie specificat de clauza OF. Clauza ALL permite ştergerea tuturor etichetelor, caz în care fişierul index compus specificat este şters de pe disc.

3-49

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Reg sirea rapid a datelor În afara de afişarea datelor într-o anumit ordine, indecşii prezint şi avantajul major de reg sire rapid a datelor. C utarea rapid se face cu comanda: SEEK 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

Relaţionarea tabelelor

O baz de date rela ional reprezint o baz de date în care tabelele (fişierele de date -.DBF) sunt organizate şi accesate prin intermediul rela iilor. O rela ie este o leg tur între fişiere de date, leg tur care permite accesarea informa iilor din mai multe fişiere (nu numai cea din zona curent ). Leg tura reprezint condi ia de asociere între fişierele de date, şi este materializat printr-un câmp comun fişierelor 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 putând fi redus la doua rela ii şi anume: una de tip mai multe – la – una şi alta de tip una – la – mai multe prin intermediul unei tabele suplimentare intercalat între cele dou . Din punct de vedere al momentului definirii rela iilor dintre tabele, exist :

3-50

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice •

Rela ii temporare sau dinamice, care se creeaz prin comenzi în timpul rul rii programelor şi sunt disponibile numai în timpul rul rii acestora; • Rela ii permanente, ce se creeaz în faza de proiectare a bazei de date şi sunt deschise automat de c tre sistem odat cu deschiderea bazei de date; Pentru crearea rela iilor permanente între dou tabele este necesar ca: • Tabela p rinte s fi indexat cu un index candidat sau primar; • Tabela copil s fie indexat cu orice fel de index ; • Indecşii 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 relaţii 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 aceeaşi valoare a cheii primare. Presupunând 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 fişierul TR, prin intermediul câmpului NR_AGENT şi nu prin intermediul câmpurilor NUME şi PRENUME. Deci se poate stabili o rela ie între cele dou tabele prin intermediul câmpului NR_AGENT, care apar ine celor 2 fişiere. Acest lucru se poate efectua prin comanda : SET RELATION TO [ INTO | [, INTO |...]...[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 sau alias , toate aceste tabele fiind deschise în zone de lucru diferite. Cheia rela iei este stabilit prin care corespunde unui câmp (sau la mai multe câmpuri) din tabela p rinte. Cheia relaţiei 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. Bineîn eles c ini ial se evalueaz şi dac sunt g site înregistr rile corespunz toare în tabela copil, pointer-ul va fi mutat în consecin , altfel va ajunge la sfârşitul tabelei şi deci EOF() pentru zona de lucru respectiva va fi .T. 3-51

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 întâmpla când 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 [ [,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 aceeaşi cheie cu înregistrarea din p rinte.

Pentru ştergerea rela iilor dintre tabele se va folosi comanda: SET RELATION OFF INTO | care şterge rela ia dintre tabela curent şi tabela copil specificat prin num r - sau alias -. 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 părinte BROW USE TR ORDER tag AG_I în 0 && Tabelul copil SELE TR BROW SELECT AG && Selectare tabel părinte 3-52

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice SET RELATION TO nr_agent INTO TR && Stabilirea relaţiei SET SKIP TO TR && Tipul relaţiei este ‘One-to-many’ WAIT WINDOW 'Afişarea TRANZACTIILOR efectuate de fiecare AGENT' BROWSE FIELDS AG.NR_AGENT :H='Nr.Id.',AG.NUME :H='Nume', ; AG.PRENUME :H='Prenume', TR.NR_TRANZ

3.3

Integritatea referenţială

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 când 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 atât înregistr rile din tabela copil cât ş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 atât înregistr rile din tabela copil cât şi cele din tabela p rinte conform noii valori a cheii rela iei. 3-53

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 frânta 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 câte 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

Funcţii. Variabile de memorie. Macrosubstituţia

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 aceluiaşi tablou pot fi tipuri diferite. Crearea unei variabile sau modificarea valorii acesteia se face prin operatorul de atribuire: = sau prin comanda STORE TO

3-54

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice • •







se evalueaz expresia , ob inându-se o valoare de un anumit tip; se caut în memorie variabila cu numele şi, dac se g seşte, se înlocuieşte vechiul con inut al acesteia cu valoarea expresiei; dac nu se g seşte variabila respectiv , FoxPro creeaz una nou cu numele , î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 foloseşte 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 (câmp al unei baze de date, denumire fişier). 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 fişier doriţi sa lucraţi ? ‘ 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 - variabilele din list se declar publice PRIVATE - variabilele din list se declar ca fiind locale Ştergerea variabilelor de memorie se face cu comanda : RELESE RELEASE ALL [LIKE /EXCEPT ]

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. Afişarea de informa ii despre con inutul memoriei FOX se face folosind comanda :

3-55

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice LIST / DISPLAY MEMORY [TO PRINTER / TO FILE ] care determin afişarea variabilelor de memorie şi utilizator existente, tipul şi valoarea lor. Diferen a între LIST şi DISPLAY este c la aceasta din urm se aşteapt ap sarea unei taste dup umplerea unui ecran cu informa ii. Se poate face redirectarea informa iilor c tre imprimant sau c tre un fişier. Instruc iuni de tip SCATTER/GATHER SCATTER [FIELDS lista câmpuri] [MEMO]TO | TO 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 câmpurile specificate în list . Se pot prelua date şi din câmpuri tip memo dac este prev zuta clauza MEMO, altfel aceste câmpuri 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 acelaşi nume şi tip cu câmpurile bazei de date care îns sunt precedate de calificatorul "m." GATHER FROM | MEMVAR FIELDS ][MEMO] Comanda permite scrierea valorilor dintr-un masiv sau set de variabile de memorie în câmpurile înregistr rii curente din tabela activ . Clauzele FIELDS şi MEMO au aceeaşi 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 Modalitatea de transmitere a parametrilor este aceeaşi cu cea prezentat la proceduri. Scrierea codului se încheie obligatoriu cu RETURN . Dup execu ia func iei, FOX returneaz programului apelant valoarea calculat de func ie. 3-56

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Exemplu: crea i un fişier TEST.prg cu urm torul con inut: PROCEDURE TEST PARAMETERS X,Y, suma,produs suma=adunare(x,y) produs=înmulţire(x,y) RETURN FUNCTION ADUNARE PARAMETERS x, y RETURN x+y FUNCTION înmulţire 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) ? înmulţire (5, 6) SET PROCEDURE TO TEST ? înmulţire (3, 3) 3.5

Crearea şi modificarea programelor

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



se concepe algoritmul de rezolvare a problemei propuse; se transpune algoritmul într-un şir de instruc iuni ce reprezint programul;

chiar

se introduce programul într-un fişier; se compileaz programul; 3-57

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 afişa î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 decât pentru cunoaşterea 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 rânduri, caz în care linia curent se încheie cu caracterul ‘;’. În cadrul unei linii se pot introduce şi comentarii specificate de caracterele: ‘*’, ‘&&’ sau comanda : NOTE / * [...]

3.6

Programare structurată. Proceduri.

Apelarea, transmiterea parametrilor, revenirea, compilarea Un program reprezint o succesiune de instruc iuni realizat în conformitate cu regulile limbajului de programare folosit, care rezolv o anumit problem . Un program FOX este scris pe disc într-un fişier. Când se doreşte execu ia lui, fişierul este compilat şi apoi rulat. Execu ia unui program se realizeaz cu comanda DO având sintaxa : DO [WITH ] [IN ] Aceasta comand execut instruc iunile con inute în fişierul . Dac nu are prev zut extensia, atunci se vor c uta pe disc urm toarele fişiere, în aceast ordine: − .EXE - program executabil − .APP - aplica ie − .FXP - forma compilat a programului − .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 fişier care necesit ca parametri 3-58

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice externi numele fişierului şi ordinea sort rii. La execu ia comenzii DO parametrii sunt transmişi c tre program prin lista de parametri a clauzei WITH. Aceast list poate con ine expresii, constante, câmpuri 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 când se întâlneşte sfârşitul fişierului; • când se întâlneşte 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 creşte, 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, apelându-le din diverse puncte de program, cu diverse valori ale parametrilor. Scrierea unei proceduri începe cu : PROCEDURE şi se încheie obligatoriu cu RETURN. Procedurile şi func iile unui program se introduc, de regul , dup ultima instruc iune a programului, în acelaşi fişier cu acesta. Acestea pot fi introduse şi în fişiere separate care vor fi asociate programului apelant prin comanda: SET PROCEDURE TO [] Aceast comand asociaz programului curent în execu ie, fişierul 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 ; locale (private), ce nu pot fi accesate decât în procedura curent şi în cele subordonate acesteia PRIVATE . 3-59

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 [ / TO MASTER /TO ] Instruc iunea returneaz controlul programului apelant sau la prompter. TO MASTER permite revenirea în programul apelant de cel mai înalt nivel. TO permite revenirea în procedura activ indicat la sfârşitul unei func ii şi întoarcerea unui rezultat. 3.7

Comenzi de intrare/ieşire ? /?? [ ][PICTURE ][FUNCTION ] [AT ]

Comanda afişeaz valoarea pentru una sau mai multe expresii separate prin virgul .? produce afişarea pe linia urm toare in timp ce ?? afişeaz pe linia curent . 3-60

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Dac SET PRINT este ON ieşirea comenzii este dirijat c tre imprimant . PICURE şi FUNCTION formateaz afişarea ieşirii ( vezi @.....SAY....GET) iar AT stabileşte coloana în care sa se fac afişarea. ACCEPT TO Afişeaz (eventual) mesajul , 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 [] [TO ] Afişeaz un mesaj care implicit este “Press any key to continue....” şi care aşteapt ap sarea unei taste (op ional memorate în variabila de memorie specificat ). Comanda @ SAY... GET creeaz intrare/ ieşire.

formate particulare pentru

@ SAY [FUNCTION ] [PICTURE ] [SIZE , ][FONT [, B ? "Primul Număr Este Mai Mare " ELSE ? "Al Doilea Număr Este Mai Mare Sau Numerele Sunt Egale" ENDIF IF B0 ? A,':',B,'=',A/B ENDIF IIF( , , ) − Returneaz rezultatul primei expresii dac este adev rat condi ia, respectiv rezultatul celei de-a doua condi ii pentru fals. − şi trebuie sa fie de acelaşi tip. 3-66

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 câmpuri; c utarea în câteva tabele o anumitor informa ii şi returnarea rezultatele într-o anumit ordine;

Interogare obişnuit î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 afişarea 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 afişeaz întreg con inutul tabelei. Semnul (*) transmite comanda de a returna toate coloanele din tabelul descris în clauza FROM. Dac se doreşte afişarea coloanelor în alt ordine putem specifica dup clauza SELECT numele câmpurilor dorite separate prin virgul şi spa iu. SELECT SALAR, NUME FROM PERSONAL 3-67

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Dac se doreşte afişarea unic a anumitor valori se foloseşte clauza DISTINCT. SELECT DISTINCT SALAR FROM PERSONAL Dac se doreşte afişarea doar a anumitor coloane, acestea se vor specifica în clauza SELECT. SELECT SALAR FROM PERSONAL Clauza WHERE WHERE 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 decât 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([,]])[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 Iaşi Baze de date – lucrări 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 Iaşi 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 cunoaşteri 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, când programul este corect scris dar nu func ioneaz aşa cum dorim . La rularea unui program, apari ia unei erori de sintax determin întreruperea execu iei şi afişarea unui mesaj de eroare, indicând tipul erorii şi 3-69

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice cerând utilizatorului luarea unei decizii astfel : Cancel - Întreruperea implicit a programului şi revenire în prompter; Suspend - Suspendarea execu iei programului; Ignore - Continuarea execu iei, ignorând 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 întâi 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 câte o instruc iune, dar când aceasta este un apel c tre o rutin , acesta este executat în întregime, într-un singur pas; • cu STEP se execut câte o instruc iune, dar când aceasta este un apel câtre 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 pân 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, când 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, pân 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 cându-se o pauz stabilit de utilizator.

3-70

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 deplasându-ne pe bara separatoare cu TAB , pozi ionându-ne cu ajutorul s ge ilor şi ap sând 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 greşeala 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, alegând 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 Iaşi Baze de date – lucrări practice doreşte î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 câmpuri frecvent utilizate. Selecta i câmpurile dorite şi ele vor fi incluse în noul tabel. Pute i modifica numele câmpurilor, 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 afişeaz ecranul pentru introducerea datelor ;

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

Form Wizard •



• Modify structure of table – modifica structura tabelului.

v ajut s crea i un ecran pentru a gestiona informa iile din tabela dvs. la acest tip de Wizard se afişeaz mai întâi 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 ataşate etichete text sau imagini explicative. în caseta 2 alege i câmpurile ce dori i s fie incluse în ecran. Un câmp 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 câmpurile din lista. Înl turarea unui câmp 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 foloseşte la selectarea stilului ecranului şi a butoanelor declanşatoare. Caseta 5 va permite s stabili i un titlu care va fi plasat în partea superioar a noului ecran şi tipul de salvare: • Save form for later use – salveaz întrebuin are ulterioar ;

ecranul pentru o

• Save and run form – salveaz şi ruleaz ecranul; 3-72

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice • Modify form with design tools – modific instrumentele de proiectare .

ecranul cu

Report Wizard •

La acest tip de Wizard se afişeaz mai întâi 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 pân la trei nivele de grupare şi op ional calculeaz totaluri par iale şi generale pentru câmpurile numerice;

• Multi Column Report Wizard – v raport cu maxim trei coloane; •

asist

la crearea unui

• Report Wizard - raport .

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

3-73

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

3.12 Exerciţii

1.

2.

Folosind tabelele create în lucr rile anterioare, introduce i date în fiecare tabel, afişa i structurile tabelei, testa i pe rând fiecare comand prezentat mai sus. Având unul dintre fişierele create la lucr rile anterioare: −



− −



crea i o copie (folosind instruc iunea COPY...) ; crea i un index (CDX) ; compara i fişierul DBF dup crearea indexului cu copia fişierului original; şterge i (DEL) fişierul index; da i comanda USE cu fişierul DBF pentru care a i creat indexul.

3.

Da i comanda PACK (f r s fie marcat pentru ştergere vreun articol) pentru unul din fişierele DBF. Urm ri i lungimea fişierului înainte şi dup executarea comenzii.

4.

Pentru fişierul agen i, crea i urm toarele indexuri şi afişa i con inutul tabelei cu fiecare index dintre : − nume+prenume, − nume+num r de identificare (marca) , − nume+data naşterii – descresc tor, − nume+data angaj rii +salar (descresc tor)

5.

Scrie i procedurile pentru marcarea la ştergere, în tabela cu agen ii firmei, a urm toarele articole: agen ii având acelaşi nume, agen ii ce au numele asem n tor cu unul introdus de la tastatura.

6.

Testa i comenzile REINDEX şi PACK

7.

Folosind unul dintre fişierele existente, testa i comanda ZAP în ambele variante, pentru SET SAFETY ON şi OFF

8.

Folosind baza de date Biblioteca creat în lucrarea anterioar : •



• 9.

stabili i rela iile dintre tabele. stabili i regulile de integritate referen ial . închide i şi redeschide i baza de date. Verifica i dac stabilite anterior sunt prezente.

rela iile

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

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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, ieşiri) 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 oraşul Iaşi, 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 Programs -> Oracle for Windows NT -> SQL*Plus sau Start -> Programs -> Oracle -> Application Development -> SQL*Plus

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

se lanseaz

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

Comenzi SQL*Plus pentru fişiere

SAVE filename

salveaz con inutul buferului SQL într-un fişier.

GET filename

scrie con inutul uni fişier în buffer SQL (extensia predefinit este.sql)

START filename

ruleaz un fişier script

@ filename

la fel ca START

ED[IT]

lanseaz editorul şi salveaz con inutul bufferului într-un fişier afiedt.buf

ED[IT] filename

lanseaz editorul pentru editarea con inutului unui fişier salvat

5-114

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice SPO[OL] [filename]OFF | OUT

stocheaz rezultatul unei interog ri într-un fişier. OFF închide fişierul OUT închide fişierul şi îl trimite la imprimanta sistem

EXIT

p r seşte mediul SQL*Plus

5.3

Instrucţiuni SQL

Extragere de date SELECT Limbajul de manipulare a datelor (DML – Data Manipulation Language) (introduce rânduri 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). Atât ANSI cat şi ISO au acceptat SQL ca limbajul standard pentru baze de date rela ionale. 5-115

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 instrucţiunilor 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 oricâte 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 afişate; 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 Iaşi Baze de date – lucrări practice NOT : În aceast carte, cuvintele : “cuvânt cheie”, “clauza” , “instruc iune” vor fi folosite astfel: • • •

Un “cuvânt 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 Utilizând urm toarele reguli se pot construi instruc iuni valide, uşor de citit şi de editat: •







• •

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

de

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





• •

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

5-117

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Exemplu : pentru selectarea tuturor coloanelor şi liniilor dintr-un tabel scriem select * from departments; Se pot afişa toate coloanele din tabela folosind cuvântul 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 afişa toate coloanele din tabela scriind toate coloanele dup cuvântul cheie SELECT. Instruc iunea SQL de mai sus afişeaz toate coloanele şi toate liniile din tabela DEPARTMENTS. 5.5

Crearea şi gestionarea tabelelor

Obiective: • • •

• •

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

Obiectele bazei de date Obiect

Descriere

Table

Unitatea de baza pentru stocare compus din linii şi coloane.

View

Reprezentare logic tabele.

Sequence

Genereaz valori pentru chei primare.

Index

M reşte viteza în cazul interog rilor.

Synonym

Nume alternative date obiectelor.

a unor date dintr-una sau mai multe

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

5-118

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 când utilizatorul foloseşte 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 aceleaşi nume pentru aceleaşi entit i din tabele diferite. De exemplu, coloana cu num rul departamentului este denumita DEPTNO atât In tabela EMPLOYEES cât şi în tabela DEPARTMENTS.

5-119

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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, indecşi, 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 acelaşi tip cu cel al coloanei.

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Unei coloane i se poate asigna o valoare implicit utilizând 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 acelaşi 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 Iaşi Baze de date – lucrări 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 obişnuit, utilizatorii acceseaz vederile din dic ionarul de date pentru c informa iile sunt prezentate într-o forma uşor 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, constrângerile şi informa ii legate de audit. În dic ionarul de date exist patru categorii de view-uri, fiecare dintre ele având 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 putând 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 dicţionarului de date

Afişarea numelor tabelelor (coloana table_name) unui utilizator, precum şi alte informa ii legate de aceste tabele: SQL> select * from user_tables; Afişarea tipurilor de obiecte ale unui utilizator: SQL> select distinct object_type from user_objects; Afişarea tabelelor, view-urilor, sinonimelor şi secven elor unui utilizator: SQL> select * from user_catalog; Pute i interoga dic ionarul de date pentru a afişa 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 Iaşi Baze de date – lucrări practice 5.9

Tipuri de date

Tipul de data

Descriere

VARCHAR2(size)

Dat de tip caracter, de lungime variabil . (Trebuie specificat o lungime maxim - size, valoarea implicit este 1,maxima 4000)

CHAR(size)

Dat de tip caracter de lungime fix . (Valoarea implicit este cea minim 1, maxima 2000)

NUMBER(p,s)

Num r cu p cifre şi s cifre zecimale. (p poate lua valori între 1 şi 38, s între 84 şi 127)

DATE

Dat de tip dat calendaristic cuprins între Ianuarie, 1 , 4712 B.C. şi Decembrie, 31, 9999 A.D.

LONG

Dat de tip caracter cu lungime variabil , pân gigabytes.

CLOB

Dat de pân la 4 gigabytes.

RAW(size)

Dat binar cu lungime specificat . Valoarea maxim este de 2000. Aceasta valoare trebuie specificat .

LONG RAW

Dat binar cu lungime de pân la 2 gigabytes.

BLOB

Dat binar cu lungime de pân la 4 gigabytes.

BFILE

Dat binar stocat într-un fişier extern, lungime maxim de pân la 4 gigabytes.

la 2

NOT • • •



coloana de tip LONG nu este copiat atunci când la crearea tabelei se foloseşte 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 constrângeri asupra unei coloane de tip LONG.

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

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 rânduri în tabela NEW_EMPLOYEES . Ieşirile arata diferen a de afişare dintre o valoare de tip de dat DATE, care este afişata î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 afişarea timpului pentru zona geografica. Afişarea 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 acelaşi 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 Iaşi Baze de date – lucrări practice TIMESTAMP WITH LOCAL TIME ZONE este o alt variant pentru TIMESTAMP care include afişarea 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 când se ini iaz o sesiune local serverul returneaz data în formatul ce afişeaz 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. Afişarea 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 câmpurile 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 afişa anul, implicit 2. Restric ie Prima valoare trebuie s fie semnificativ mai mare decât cea de-a doua. De exemplu: INTERVAL '0-1'MONTH TO YEAR nu este valid .

5-125

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 utilizând o interogare Crea i o tabela şi insera i linii combinând 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; Utilizând op iunea AS subquery se creeaz tabela şi insereaz înregistr rile furnizate de interogare. Sintaxa: - table numele tabelei; - column numele coloanei, valoarea implicit şi constrângerile de tip; - subquery comanda SELECT care defineşte un set de înregistr ri ce trebuie inserate în tabela. •









Coloanele tabelei au numele specificate iar rândurile 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 doreşte 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 Iaşi Baze de date – lucrări 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 doreşte modificarea structurii unei tabele. Se pot ad uga noi coloane utilizând clauza ADD, modifica coloane existente sau defini valori implicite pentru coloane utilizând clauza MODIFY, şterge coloane folosind clauza DROP.

5-127

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 Iaşi Baze de date – lucrări practice DEPT30 EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY HIRE_DATE ----------- -------------------- ------------------------- ---------- --------------------------114 Den Raphaely 11000 07-DEC-94 115 Alexander Khoo 3100 18-MAY-95 116 Shelli Baida 2900 24-DEC-97 117 Sigal Tobias 2800 24-JUL-97 118 Guy Himuro 2600 15-NOV-98 ad uga o nou coloana în

Noua coloa na JOB_ ID

tabela dept30

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

Modificarea unei coloane Se pot modifica specifica iile coloanelor utilizând 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 micşora l imea unei coloane dac aceasta con ine numai valori nule sau dac tabela nu are rânduri; Se poate schimba tipul de dat dac coloana con ine numai valori null; 5-129

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 încât ele s poat fi şterse atunci când resursele sistemului devin critice. Prin specificarea acestei clauze nu se şterg efectiv coloanele din fiecare rând 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 afişa 5-130

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice numele şi tipul de dat pentru coloanele marcate astfel. Pute i ad uga tabelei o nou coloan cu acelaşi 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 când se doreşte 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. Când se aplic comanda DROP unei tabele, baza de date pierde toate înregistr rile din tabel , împreun cu indecşii asocia i acesteia. Comanda este ireversibilă.

5-131

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

Observa ii: • • • •

Toate datele sunt şterse; Orice view sau sinonim asociat va r mâne, 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 foloseşte comanda RENAME . Sintaxa: RENAME old_name TO new_name; - old_name - new_name

numele vechi al obiectului; numele nou al obiectului;

EXEMPLU SQL> RENAME departments TO departments_new; Table renamed.

Observa ie: Numai proprietarul obiectului poate modifica numele obiectului.

5.13 Trunchierea unei tabele Comanda şterge toate înregistr rile din tabela specificat , eliberând spa iul folosit de tabel . Operaţiunea este ireversibilă. Comanda DELETE şterge înregistr rile din tabel , dar nu elibereaz spa iu de stocare (f când astfel posibila readucerea înregistr rilor prin comanda ROLLBACK).

5-132

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

TRUNCATE TABLE table;

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

Comanda TRUNCATE este mai rapida decât 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 declanşeaz 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 întâi sa dezactiva i constrângerea şi apoi lansa i comanda.

5.14

Includerea constrângerilor

Ce fac constrângerile ? •



Constrângerile for eaz regulile la nivel de tabela. Constrângerile previn ştergerea unei tabele sau a datelor din tabela dac exista dependen e.

Oracle lucreaz cu urm toarele tipuri de constrângeri: -

NOT NULL

-

UNIQUE KEY

-

PRIMARY KEY

-

FOREIGN KEY

-

CHECK

5-133

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Constrângerile de integritate a datelor Constrângere

Descriere

NOT NULL

Specific faptul c aceast coloan nu poate con ine o valoare nul .

UNIQUE Key

Specific o coloan sau o combina ie de coloane a c ror valoare trebuie s fie unic pentru toate înregistr rile tabelei.

PRIMARY KEY

Identific unic fiecare înregistrare

FOREIGN KEY

Stabileşte şi for eaz o rela ie de tip cheie extern între coloan şi o coloan dintr-o tabela referit .

CHECK

Specific o condi ie care trebuie s fie adev rat .

Ghid pentru crearea constrângerilor • • •

Constrângerile trebuie sa aib un nume. Daca utilizatorul nu d acest nume, serverul Oracle va genera automat un nume utilizând formatul SYS_Cn, unde n este un num r întreg unic. Se poate crea o constrângere: - în timpul cre rii tabelei sau - dup ce tabela a fost creat Vizualizarea constrângerea se face doar în dic ionarul de date.

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

5-134

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice În sintaxa : schema

acelaşi cu numele proprietarului

table

numele tabelei

DEFAULT expr

specific valoarea implicit

column

numele coloanei

datatype

tipul de dat şi lungimea

column_constraint

constrângere de integritate ca parte a defini iei coloanei

table_constraint

constrângere 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 constrângerile sunt create în acelaşi timp cu tabela dar ele pot fi ad ugate şi dup crearea tabelei. Constrângerile pot fi definite la unul din urm toarele doua nivele: Constraint level

Descriere

Column

Refer o singur coloan şi poate defini orice tip de constrângere

Table

Refer una sau mai multe coloane şi este definit separat de defini iile coloanelor în tabela: poate defini orice tip de constrângere exceptând NOT NULL

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

5-135

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice În sintax : constraint_name

este numele constrângerii

constraint_type

este tipul constrângerii

5.15 Constrângerea NOT NULL Constrângerea NOT NULL ne asigur c nu sunt permise în coloan valori null. Coloanele f r constrângerea NOT NULL pot con ine implicit valori null. EMPLOYEE_ID

FIRST_NAME



COMMIS SION_P CT

7839

KING

10

7698

BLAKE

30

7782

CLARK

10

7566

JONES

20

DEPARTMENT_ID

… Constrângere NOT NULL (nici o înregistrare nu poate con ine o valoare NULL pe aceasta coloana)

Absen a constrângerii NOT NULL (orice înregistrare poate con ine null pentru aceasta coloan )

Constrângere NOT NULL

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

5-136

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 constrângerii poate fi specificat în timpul specific rii constrângerilor. EXEMPLU: hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL

5.16 Constrângerea UNIQUE KEY Constrângerea UNIQUE key EMPLOYEES EMPLOYEE_ID

LAST_NAME

EMAIL

100

King

SKING

101

Kochhar

NKOCHHAR

102

De Haan

LDEHAAN

103

Hunold

AHUNOLD

INSERT INTO 208

Smith

LSMITH

209

Smith

LSMITH

PERMIS Nu este permis – exista deja

O constrângere 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 constrângerea. Coloana (setul de coloane) inclus în defini ia cheii unice se numeşte cheie unică. Dac cheia unic con ine mai multe coloane se 5-137

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice numeşte cheie unică compusă. Constrângerea cheie unic permite introducerea de valori null dac nu a fost definit o constrângere NOT NULL pentru acea coloan . De fapt, orice num r de înregistr ri pot include valori null în coloane f r constrângerea NOT NULL. O valoare null într-o coloan (sau în toate coloanele unei chei unice compuse) satisface întotdeauna o constrângere 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) Constrângerea cheie unica (unique key) poate fi definit la nivel de tabel sau coloan .

În exemplu se aplic constrângerea de tip cheie unica coloanei EMAIL din tabela EMPLOYEES. Numele constrângerii este EMP_EMAIL_UK. Not : O cheie unica compus este creat utilizând defini ia la nivel de tabel . Serverul Oracle for eaz implicit constrângerea de cheie unic creând un index unic dup cheia unic .

5-138

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice 5.17 Constrângerea PRIMARY KEY Pentru fiecare tabel poate fi creata doar o cheie primar . Constrângerea de tip cheie primar este format dintr-o coloana sau set de coloane care identific în mod unic fiecare înregistrare din tabel . Aceasta constrângere 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 constrângere în care cheia primara este format din dou coloane ar putea fi constrângerea pe coloanele serie şi nr_buletin. Mai multe persoane pot avea aceeaşi serie de buletin dar nu pot avea acelaşi num rul de buletin. Acelaşi num r de buletin poate sa apar la mai multe persoane, dar difer seria şi în acelaşi timp serie sau nr_buletin nu pot avea valori nule. Not : • •



Constrângerea de tip cheie primare poate fi definită la nivel de coloană sau tabelă. O cheie primară compusă este creată utilizând definiţia la nivel de tabelă. Un index unic este automat creat pentru o coloan cheie primar .

Exemplul defineşte o cheie primar dup coloana DEPARTMENT_ID a tabelei DEPTARTMENTS. Numele constrângerii 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

Constrângerea FOREIGN KEY

Cheia externa sau constrângerea de integritate referenţială, desemneaz o coloan sau o combina ie de coloane în func ie de cheia extern şi stabileşte o rela ie cu o cheie primar sau o cheie unic în aceeaşi 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 Iaşi Baze de date – lucrări practice Valoarea unei chei externe trebuie sa se potriveasc existent în tabela p rinte sau sa fie NULL. Constrângerea FOREIGN key

DEPARTMENT

PRIMARY KEY

cu o valoare

DEPARTMENT _ID

DEPARTMENT_NAME

MANAGER_ID

10

Administration

200

20

Marketing

201

EMPLOYEES EMPLOYEE_ID

LAST_NAME

DEPARTMENT _ID

100

King

90

101

Kochhar

90

102

De Haan

90

103

Hunold

60

200

Ford

9

201

Ford

60

FOREIGN KEY

Nu este permis 9 nu exista

Observa ii: • • •

Cheile externe sunt bazate pe valorile datelor şi sunt pointeri pur logici, nu fizici. Constrângerea 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 defineşte o constrângere de tip cheie externa în coloana DEPARTMENT_ID din tabela EMPLOYEES. Numele constrângerii este EMP_DEPT_FK.

5-140

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 constrângerii FOREIGN KEY Constrângerile externe sunt definite în tabela copil şi tabela care con ine coloana referit este tabela p rinte. Constrângerile externe sunt definite folosind combina ii ale urm toarelor cuvinte: FOREIGN KEY- Defineşte coloana în tabela copil la nivelul constrângerii 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. Când rândul din tabela p rinte este şters, rândurile independente din tabela copil sunt deasemeni şterse. F r op iunea ON DELETE CASCADE, rândul din tabela p rinte nu va putea fi şters dac este referit în tabela copil. ON DELETE SET NULL – converteşte valoarea cheii str ine pe NULL atunci când valoarea corespunz toare din tabela p rinte este ştearsa. 5.19

Constrângerea CHECK

Defineşte o condi ie pe care fiecare rând 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 rânduri.

5-141

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice 5.20 Adăugarea unei constrângeri

…, salary NUMBER (2) CONSTRAINT emp_salary_min CHECK (salary>0),… Se poate ad uga o constrângere 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 constrângerii este tipul constrângerii este numele coloanei afectate de constrângere

Denumirea constrângerii este op ional şi totuşi ea este recomandat . Daca nu da i nume constrângerilor, sistemul va genera automat un nume. • Se poate ad uga, şterge, activa, dezactiva o constrângere, dar nu se poate modifica structura acesteia. • Se poate ad uga o constrângere 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 rânduri, deoarece nu se pot specifica date pentru rândurile existente în acelaşi timp în care ad ugam noi coloane. Exemplul de mai jos creeaz o constrângere de tip extern în tabela employees. Constrângerea 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 Iaşi Baze de date – lucrări practice 5.21 Ştergerea unei constrângeri Exemplu : Ştergerea constrângerii manager din tabela EMPLOYEES. ALTER TABLE employees DROP CONSTRAINT emp_manager_fk; Table altered. Ştergerea constrângerii de tip cheie primara din tabela EMPLOYEES. Pentru a şterge a constrângerea trebuie identificat numele constrângerii, pe care îl pute i afla accesând USER_CONSTRAINS şi USER_CONS_COLUMNS. Apoi se foloseşte func ia ALTER TABLE împreun cu clauza DROP. Op iunea CASCADE din clauza DROP are ca efect şi eliminarea tuturor constrângerilor dependente. ALTER TABLE employees DROP PRIMARY KEY CASCADE; Table altered. Sintaxa: ALTER TABLE table DROP PRIMARY KEY | UNIQUE (column)| CONSTRAINT constraint [CASCADE};

unde:

table

este numele tabelei;

column

este numele coloanei afectate de constrângere;

constraint

este numele constrângerii.

Aten ie: Când se şterge o constrângere 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 constrângerilor • Executarea clauzei DISABLE din func ia ALTER TABLE pentru a dezactiva o constrângere de integritate.

• Aplicarea op iunii CASCADE pentru a dezactiva constrângeri de integritate dependente.

5-143

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

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

table

este numele tabelei.

constraint

este numele constrângerii.

clauza DISABLE se poate folosi atât în func ia CREATE TABLE cât şi în func ia ALTER TABLE. clauza CASCADE dependente.

dezactiveaz

constrângerile

de

integritate

5.23 Activarea constrângerilor

• Activarea unei constrângeri de integritate care este dezactivat clauza ENABLE în definirea tabelei.

folosind

• Un index de tip unic sau de tip cheie primar este automat creat dac se activeaz constrângerile UNIQUE sau PRIMARY KEY.

Se poate activa o constrângere 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 constrângerii. ALTER TABLE employees ENABLE CONSTRAINT emp_emp_id_pk; Table altered.

5-144

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

Aten ie: • Daca se activeaz o constrângere, constrângerea este aplicat tuturor datelor din tabel . Toate datele din tabel trebuie sa îndeplineasc condi iile din constrângere.

• Daca se activeaz o constrângere de tip unic sau cheie primar , atunci este creat în mod automat un index de tip unic. • Clauza ENABLE se poate folosi atât în func ia CREATE TABLE cât şi în func ia ALTER TABLE.

Vizualizarea constrângerilor Vizualizarea constrângerilor se poate face prin interogarea tabelei USER_CONSTRAINTS pentru a putea afla toate numele şi defini iile constrângerilor.

Dup crearea unei tabele, se poate confirma existen a sa prin folosirea comenzii DESCRIBE. Singura constrângere care poate fi verificat este constrângerea NOT NULL. Pentru a vedea toate constrângerile din tabel , este necesar interogarea tabelei USER_CONSTRAINTS. SELECT constraint_name, constraint_type, search_condition FROM user_cons_columns WHERE table_name=’EMPLOYEES’; Exemplul afişeaz toate constrângerile tabelei EMPLOYEES.

5-145

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice NOT : Constrângerilor care nu primesc un nume de la posesorul tabelei li se atribuie automat de c tre sistem un nume. La numirea tipului de constrângere, 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 constrângerea NULL este de fapt o constrângere de tip CHECK. Vizualizarea coloanelor asociate constrângerilor Vizualizarea coloanelor asociate cu numele constrângerilor se face folosind USER_CONS_COLUMNS. Aceasta vizualizare este util mai ales în cazul constrângerilor 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 Iaşi Baze de date – lucrări practice

5.24 Exerciţii

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

Id

Name

Datatype

Number

Varchar2

Length

7

25

2. Introduce i înregistr ri în tabela DEPT din tabela DEPARTMENT. Include i doar coloanele de care ave i nevoie. 3. Crea i tabela EMP bazata pe tabelul urm tor. Salva i instruc iunea într-un script p3.sql şi apoi executa i scriptul. Verifica i existenta tabelei. Column Name

ID

LAST_NAME

FIRST_NAME

DEPT_ID

Datatype

Number

Varchar2

Varchar2

Number

Length

7

25

25

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, incluzând 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 constrângere de tip PRIMARY KEY la tabela EMP folosind coloana ID. Constrângerea trebuie sa fie activata la creare. 10. Crea i o constrângere PRIMARY KEY în tabela DEPT folosind coloana ID. Constrângerea 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 Iaşi Baze de date – lucrări practice 12. Confirma i constrângerile ad ugate interogând tabela USER_CONSTRAINTS. Observa i numele şi tipul constrângerilor. Salva i textul într-un fişier. CONSTRAINT_NAME DEPT_ID_PK

C P

EMP_ID_PK

P

EMP_DEPT_ID_FK

R

13. Afişa i numele şi tipul obiectelor din dic ionarul USER_OBJECTS al tabelelor EMP şi DEPT. Formata i coloanele pentru refolosirea lor. Observa i c a fost creat un nou tabel precum şi un nou index. OBJECT_NAME

OBJECT_TYPE

DEPT

TABLE

DEPT_ID_PK

INDEX

EMP

TABLE

EMP_ID_PK

INDEX

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

5-148

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Capitolul 6 Expresii aritmetice. Operatori. Restric ionarea şi sortarea datelor Instruc iunea SELECT poate fi folosit pentru a afişa anumite coloane din tabela specificând numele coloanelor, separate prin virgul . În clauzele SELECT se specific coloanele dorite, în ordinea de afişare dorit . Modul implicit de afişare a informaţiilor este : • Stânga – 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 afişate 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 afişeaz 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 exceptând clauza FROM. Operator + * /

Descriere Adunare Sc dere Înmul ire Împ r ire

Exemplu: SELECT last_name, salary, salary+300 FROM employees; În exemplul dat s-a folosit operatorul adunare pentru a m ri salariile cu 300$ pentru to i angaja ii. Se afişeaz 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 afişarea rezultatelor. Implicit, 6-149

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 aceeaşi prioritate sunt evalua i de la stânga 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 aceeaşi prioritate, evaluarea se va face de la stânga 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 afişate câmpurile 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 Iaşi Baze de date – lucrări 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 afişate 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 aceeaşi cu zero sau spa iu.

sau

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

6-151

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

Dac o linie nu are date pentru o coloan anume, aceasta valoare se numeşte nul . Valoarea null este nedisponibil , neatribuit , necunoscut sau inaplicabil . Valoarea null nu este aceeaşi 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 câştiga comision iar al ii nu - coloana COMMISSION_PCT din tabela EMPLOYEES. Valoarea vid reprezint un fapt în sine. Trebuie subliniat faptul ca vânz 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 Iaşi Baze de date – lucrări practice

În exemplul de mai sus, angajatul KING nu primeşte 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 cuvântul cheie AS intre numele coloanei şi alias; • Aliasurile necesita doua ghilimele ( “ ” / dac con in spatii, caractere speciale sau au importanta literele mari (mici). La afişarea rezultatului unei interog ri SQL* Plus foloseşte î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 Iaşi Baze de date – lucrări practice

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

Primul exemplu afişeaz numele şi comisionul lunar al tuturor angaja ilor. Cuvântul cheie AS a fost folosit înainte de alias. Rezultatul interog rii trebuie s fie acelaşi indiferent dac cuvântul 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 afişarea s-a f cut cu litere mari. Deci, implicit capul de coloana apare cu litere mari. În cel de-al doilea exemplu afişam numele şi salariul anual al angaja ilor. Deoarece Annual Salary implic folosirea spa iului, aliasul trebuie scris între ghilimele. Astfel va fi afişat 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 ieşire. 6-154

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Exemplu: SELECT last_name ||job_id as ’Employees’ FROM employees;

În exemplul de mai sus last_name şi job_id sunt concatenate având aliasul Employees. Observa i c func ia angajatului şi numele acestuia sunt combinate pentru a rezulta o singur coloana de ieşire. Cuvântul cheie AS, folosit înaintea numelui aliasului, face mai uşor 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 afişat odat pentru fiecare rând întors. Exemplu: SELECT last_name ||’ is a ‘||job_id as “Employee Details” FROM employees;

Exemplul afişeaz 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 ieşirii.

6-155

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

În exemplul urm tor, numele şi salariul fiec rui angajat este concatenat cu un literal pentru a da rândurilor mai mult în eles. SELECT last_name ||’:1 Month salary = ‘||salary Monthly FROM employees;

Rânduri duplicate Implicit, interog rile afişeaz duplicate.

toate rândurile, incluzând rândurile

Exemplu: SELECT department_id FROM employees;

6-156

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

SQL*Plus va afişa rezultatul interog rii f r a elimina rândurile duplicate dac nu se indic altfel. Exemplul de mai sus afişeaz toate numerele de departamente din tabelul EMP. Eliminarea rândurilor duplicate se face folosind cuvântul cheie DISITINCT în clauza SELECT. Exemplu:

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

6.4

Afişarea structurii unei tabele

Se foloseşte comanda SQL*Plus: DESC[RIBE] tablename

6-157

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice unde tablename este numele unei tabele existente, a unei vizualiz ri sau a unui sinonim accesibil utilizatorului.

Exemplu: DESCRIBE EMPLOYEES

Se afişeaz 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 afişeaz tipul de dat al coloanei. Tip de date

Descriere

NUMBER(p,s)

Valori numerice având un num r maxim de p cifre, unde s este num rul de cifre din dreapta virgulei

VARCHAR2(s)

Şir de caractere de lungime variabila cu lungime maxima s

DATE

Dat calendaristic între 1 ianuarie 4712 i.c. şi 31 decembrie 9999 d.c.

CHAR(s)

Şir de caractere de lungime fix (s)

6.5

Restric ionarea şi sortarea datelor

La citirea datelor dintr-o baza de date s-ar putea sa fie necesar reducerea num rului de linii afişate sau specificarea ordinii în care acestea s fie afişate. În exemplul de mai jos se doreşte afişarea 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 Iaşi Baze de date – lucrări practice Limitarea liniilor folosind o selec ie EMPLOYEES …

DEPARTMENT _ID

EMPLOYEE_ID

LAST_NAME

JOB_ID

100

King

AD_PRES

90

101

Kochhar

AD_VP

90

102

De Haan

AD_VP

90

103

Hunold

IT_PROG

90



“… returneaz to i angaja ii din departamentul 90”

60 EMPLOYEES EMPLOYEE_ID

… DEPARTMENT_ID

LAST_NAME

JOB_ID

100

King

AD_PRES

90

101

Kochhar

AD_VP

90

102

De Haan

AD_VP

90

6.6

Clauza WHERE

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

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

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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, reprezentând secol, an, luna, zi, ore, minute şi secunde. Afişarea implicit a datei este DD-MON-YY.

6-160

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice NOT : schimbarea formatului implicit va fi explicat în alt capitolul. 6.7 Operatori de compara ie Operator = > >= < =1500 WHERE ename=’SMITH’ Folosirea operatorilor de compara ie SELECT last_name, 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 câştig 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 câştiga mai mult de 10000 va fi selectat. 6-166

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 afişate 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 Iaşi Baze de date – lucrări 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 Iaşi Baze de date – lucrări practice De aceea SELECT-ul se citeşte dup cum urmeaz : “Selecteaz linia dac un angajat este AD_PRES şi câştiga 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 citeşte urm toarele: selecteaz linia dac angajatul este AD_PRES sau SA_REP şi dac angajatul câştiga 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 afişate 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 afişeze liniile în aceeaşi ordine, pentru aceeaşi interogare, de dou ori. Folosi i clauza ORDER BY pentru a afişa liniile într-o ordine specific .

6-169

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 afişate începând cu cea mai mica valoare – de exemplu 1- 999. Datele sunt afişate începând cu cea mai timpurie – de exemplu 01JAN-92 înaintea lui 01-JAN-95. Valorile tip caracter sunt afişate în ordine alfabetic – de exemplu A înaintea lui Z. Valorile nule sunt afişate ultimele pentru secven e ascendente şi primele pentru secven e descendente.

Inversarea ordinii implicite în care sunt afişate liniile se face prin specificarea cuvântului 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 Iaşi Baze de date – lucrări 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 doreşte schimbarea ordinii afiş rii unei coloane se specific DESC dup numele coloanei respective. Exemplu: Sa se afişeze numele şi salariul tuturor angaja ilor. Rezultatele s se afişeze 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 Iaşi Baze de date – lucrări practice

6.10 Exerciţii

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 câteva erori. Identifica i-le. SELECT first_name, salary x 12 ANNUAL SALARY FROM EMPLOYEES; 6. Afişa i structura tabelei DEPARTMENTS şi con inutul ei. 7. Afişa i structura tabelei EMPLOYEES. Crea i o interogare care sa afişeze numele angajatului, meseria, data angaj rii şi num rul angajatului. Salva i instruc iunea într-un fişier abc.sql. 8. Rula i interogarea din fişierul abc.sql. 9. Afişa i meseriile distincte din tabela EMPLOYEES. 10. Înc rca i fişierul abc.sql în bufferul SQL. Redenumi i numele coloanelor cu: EMPLOYEES#, Job, Hire Date şi apoi rula i interogarea. 11. Afişa i numele concatenat cu meseria, separate de virgula şi un spa iu şi numi i coloana EMPLOYEES -JOB and Title. 12. Afişa i datele din tabela EMPLOYEES. Separa i fiecare coloan cu o virgul şi numi i coloana THE_OUTPUT. 13. Afişa i numele şi salariul angaja ilor care câştiga mai mult de 28500$. Salva i instruc iunea SQL într-un fişier p1.sql şi apoi rula i-l. 14. Afişa i numele angajatului cu marca 201 şi num rul departamentului în care lucreaz . 15. Modifica i p1.sql astfel încât sa afişa i numele şi salariul tuturor angaja ilor a c ror salarii nu intr în intervalul 15000$ şi 28500$. Salva i instruc iunea în fişierul p3.sql şi apoi rula i-l. 16. Afişa i numele, meseria şi data de început pentru cei care s-au angajat între 20.02.1985 şi 1.05.1992. Afişarea va fi f cut în ordinea cresc toare a datei de angajare. 17. Afişa i numele angaja ilor şi numerele de departament ale celor care 6-172

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice lucreaz în departamentele 10 şi 30; ordona i alfabetic dup nume. 18. Modifica i fişierul p3.sql şi afişa i numele şi salariul celor care câştiga mai mult de 15000$ şi sunt în departamentele 10 sau 30. Redenumi i coloanele Angajat şi Salar Lunar. Salva i modific rile în fişierul p6.sql şi apoi rula i-l. 19. Afişa i numele şi data angaj rii pentru cei care au fost angaja i în anul 1995. 20. Afişa i numele şi meseria pentru angaja ii care nu au manager. 21. Afişa 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. Afişa i numele angaja ilor care au a treia liter a numelui ‘A’. 23. Afişa 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. Afişa i numele, meseria şi salariul pentru to i cei care sunt func ionari sau analişti iar salariul lor nu este egal cu 10000$ sau 30000$ sau 50000$. 25. Modifica i p6.sql şi afişa i numele, salariul şi comisionul pentru to i angaja ii care au comisionul mai mare decât salariul m rit cu 10%. Salva i modific rile în fişierul p13.sql şi apoi rula i-l.

6-173

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Capitolul 7 Func ii de un singur rând 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 atât de func iile de un singur rând pentru caractere, numere şi date calendaristice cât ş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 ieşirii pentru grupuri de rânduri; • Stabilirea unui format pentru date calendaristice şi numere atunci când 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 rând Exista dou tipuri distincte de func ii: • Func ii de un singur rând • Func ii de mai multe rânduri 7-174

Func ii de mai multe rânduri

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Func ii de un singur rând Aceste func ii ac ioneaz doar asupra unui singur rând şi întorc un rezultat pentru fiecare rând. Exist mai multe tipuri de func ii de un singur rând. Acest capitol se ocupa de urm toarele tipuri: Caracter, Num r, Data calendaristic , Conversie. Func ii de mai multe rânduri Aceste func ii ac ioneaz asupra unor grupuri de rânduri şi întorc un rezultat pentru fiecare grup. Pentru mai multe detalii consultaţi lucrarea: Oracle Server SQL Reference. Release 9i pentru o listă completă a funcţiilor disponibile împreună cu sintaxa aferentă. 7.1

Func ii de un singur rând

Func iile de un singur: • • • • • unde:

Manipuleaz articole; Ac ioneaz asupra fiec rui rând rezultat din interogare ; Întorc un singur rezultat pentru fiecare rând; Pot modifica tipuri de date; Pot fi imbricate. nume_funcţie (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 rând sunt utilizate pentru a manipula date. Ele accept unul sau mai multe argumente şi întorc o singur valoare pentru fiecare rând 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 rând 7-175

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice • • • • •

Ac ioneaz asupra fiec rui râd întors de interogare; Întorc o valoare pentru fiecare rând; Pot întoarce o dat a c rui tip este diferit de tipul argumentului; Este posibil sa aştepte unul sau mai multe argumente; Se pot utiliza în SELECT, WHERE şi ORDER BY. Se pot imbrica. Caractere Generale

Numere Funcţii de un singur rând Data calendaristică

Conversie

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

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

7-176

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

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice 7.2

Func ii pentru caractere

Func iile de un singur rând pentru caractere accept argumente de tip caracter şi întorc rezultate de tip caracter sau numeric. Func iile pentru caractere se pot împ r i în : • Func ii de conversie a caracterelor din litere mari în litere mici. • Func ii de manipulare a caracterelor Func ie

Scop

LOWER (expresie coloană)

Face conversia caracterelor alfabetice în litere mici

UPPER (expresie coloană)

Face conversia caracterelor alfabetice în litere mari

INITCAP (expresie coloană)

Face conversia pentru primul caracter din fiecare cuvânt în litera mare iar pentru restul caracterelor conversia se face în litere mici

CONCAT(expresie coloana1, (expresie coloana2)

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

SUBSTR(expresie coloana, m/,n/)

Întoarce un sir de caractere din cadrul valorii de tip caracter începând cu pozi ia m şi având 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 pân la sfârşitul şirului.

LENGTH(expresie coloana)

Întoarce num rul de caractere dintr-o valoare de tip caracter.

INSTR(expresie coloana,m)

Întoarce pozi ia în cadrul valorii de tip caracter a caracterului specificat.

LPAD (expresie |coloana, n,’ sir caractere’)

Aliniaz valoarea de tip caracter la dreapta pe o lungime de n caractere.

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

Permite eliminarea caracterelor de la începutul, sfârşitul, ambelor. Trim _character este un literal, trebuie inclusa intre apostrof.

REPLACE (text, search_string, replacement _string)

Caut în search_string şirul de caractere specificat prin text, şi dac îl g seşte îl înlocuieşte cu valoarea din replacement_string.

7-177

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

Func ie

Rezultat

LOWER (‘SQL Course’)

sql course

UPPER (‘SQL Course’)

SQL COURSE

INITCAP (‘SQL Course’)

Sql Course

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

Afişa 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 Iaşi Baze de date – lucrări 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 afişeaz nimic. Clauza WHERE din cea de-a doua instruc iune SQL face mai întâi 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 scrişi 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 acelaşi. … WHERE (last_name)=’Higgins’ Numele angajatului din partea dreapta a compara iei este scris cu capitalizare adic aşa cum apare în tabela. Pentru a afişa 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 seşte pozi ia caracterului specificat. 7-179

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice LPAD

Întoarce un sir de caractere rezultat prin inserarea valorii specificate în cel de-al treilea argument la stânga primului argument lungimea rezultatului având lungimea specificat de cel de-al doilea argument.

RPAD

Are un comportament similar cu func ia LPAD numai c inserarea celui de-al treilea argument se face la dreapta primului argument. SELECT employee_id,CONCAT(first_name,last_name) NAME, Job_id, LENGTH (last_name), INSTR(last_name,’a’)”Contains ’a’? ” FROM employees WHERE SUBSTR(job_id,4)=’REP’;

Exemplul de mai sus afişeaz 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 vânz tor. Modifica i exemplul de mai sus astfel încât instruc iunea SQL s afişeze 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 Iaşi Baze de date – lucrări practice 7.3

Func ii pentru valori numerice

ROUND Rotunjeşte valoarea cu un num r specificat de zecimale. ROUND (45.926,2) å 45.93 TRUNC Trunchiaz valoarea TRUNC (45.926,2) å 45.92 MOD Întoarce restul împ r irii MOD (1600,300) å 100 Func iile pentru valori numerice accept valori numerice şi întorc valori numerice. Aceasta sec iune descrie o parte din aceste func ii: Func ie ROUND (coloana | expresie, n)

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

Scop Rotunjeşte 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 stânga 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 stânga a punctului zecimal câtre zero. Întoarce restul împ r irii dintre m şi n.

Utilizarea func iei ROUND SELECT ROUND(45.923,2), ROUND(45.923,0),ROUND(45.923,-1) FROM DUAL; ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1) --------------- -------------- ----------------------------------------------45.92 46 50 Func ia ROUND rotunjeşte 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 stânga punctului zecimal. 7-181

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 târziu.

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 Iaşi Baze de date – lucrări 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 afişa data curenta selectând SYSDATE dintr-o tabel . Tabela pe care o folosi i r mâne la latitudinea dumneavoastr . Se poate folosi pentru afişarea 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 rând cu valoarea X. Tabela DUAL este folositoare atunci când 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: afişarea 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 utilizând 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 Iaşi Baze de date – lucrări practice

Opera ie data + num r

Rezultat dat

Descriere adun un num r de zile la o dat

data – num r

dat

scade un num r de zile dintr-o dat

data – data

num r de zile

scade o dat din cealalt

data + num r/24

dat

adun un num r de ore la o dat

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

Exemplul de mai sus prezint o tabel cu numele angaja ilor din departamentul 90 şi de perioada în care au fost angaja i exprimat în s pt mâni. Pentru a afişa perioada angaj rii în s pt mâni se face diferen a între data curent (data SYSDATE) şi data la care a fost angajat persoana şi apoi se împarte rezultatul la 7. NOT : SYSDATE este o func ie SQL ce întoarce data şi timpul curent. Rezultatul pe care îl ob ine i dac proba i exemplul poate s difere de rezultatul de mai sus. 7.5

Func ii pentru date calendaristice

Func ie

Descriere

MONTHS_BETWEEN

Întoarce num rul de luni dintre dou date calendaristice.

ADD_MONTHS

Adun un num r de s pt mâni la o dat calendaristic .

NEXT_DAY

Întoarce ziua ce urmeaz datei specificate

LAST_DAY

Ultima zi a lunii.

ROUND

Rotunjeşte data calendaristic .

TRUNC

Trunchiaz data calendaristic .

7-184

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 seşte num rul de luni dintre data1 şi data2. Rezultatul poate fi pozitiv sau negativ. −



Dac data1 este mai târzie decât data2 atunci rezultatul este pozitiv. Dac data2 este mai târzie decât data1 atunci rezultatul este negativ. Partea neîntreaga 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 mâna, care urmeaz datei “data”. LAST_DAY(data): Determin data calendaristic a ultimei zile specificate, din s pt mâna, 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 târziu î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, afişa 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 Iaşi Baze de date – lucrări practice

Func iile ROUND şi TRUNC pot fi utilizate atât pentru numere cât şi pentru date calendaristice. Atunci când sunt utilizate cu date calendaristice, acestea rotunjesc sau trunchiaz data inând 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. Afişa 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 Iaşi Baze de date – lucrări 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 lâng tipurile de date din Oracle, coloanele tabelelor dintr-o baza de date Oracle pot fi definite utilizând 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 deşi în mod normal ar trebui sa primeasc alte tipuri. Acest lucru se întâmpla atunci când server-ul Oracle poate face automat conversia în tipul de date pe care îl aşteapt . 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 târziu. Conversiile de date explicite se fac utilizând 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 ieşirea. NOT : Deşi se fac conversii de date în mod implicit atunci când 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 Iaşi Baze de date – lucrări 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 Iaşi Baze de date – lucrări practice

Func ie TO_CHAR (număr|data calendaristica, [‘fmt’])

Scop Face conversia dintr-un num r sau o dat calendaristic într-un şir de caractere de tipul VARCHAR2 respectând formatul fmt specificat.

TO_NUMBER (caracter)

Face conversia dintr-un şir de caractere ce con ine cifre într-o valoare numeric .

TO_DATE (caracter ,[‘fmt’])

Face conversia dint-un şir de caractere ce reprezint o data într-o valoare de tip DATE respectând formatul fmt specificat. (Dac fmt este omis, formatul implicit este DD-MON-YY)

NOT : Lista prezentat mai sus reprezint un subset din func iile disponibile pentru conversii. Pentru mai multe detalii consultaţi 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 afişarea datei calendaristice într-un anumit format. Pân acum toate datele calendaristice au fost afişate respectând 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 Iaşi Baze de date – lucrări 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 ieşire ; 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 afişarea pentru un câmp cu ajutorul comenzii SQL*Plus COLUMN. Lungimea implicit a coloanei rezultate este de 80 caractere.











SELECT employee_id,TO_CHAR (hire_date, ‘MM/YY’) Month_Hired FROM emp WHERE ename=’Higgins’; Elementele ale modelului de formatare pentru date calendaristice YYYY

Anul afişat pe 4 digi i

YEAR

Anul în litere

MM

Luna scris cu dou cifre

MONTH

Numele lunii

DY

O abrevia ie a denumirii unei zile din s pt mâna format din trei litere

DAY

Denumirea completa a zilei

Exemple de elementele ale modelului de formatare: Element

Descriere

SCC sau CC

Secolul

YYYY sau SYYYY

Anul

YYY sau YY sau Y

Ultimele 3, 2 sau 1 cifre din an

Y,YYY

O virgula în cadrul anului

7-190

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice [YYY,[YY,[Y,]

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

SYEAR sau YEAR

Anul în litere

BC sau AD

Indicatorul B.C. sau A.D.

B.C. sau A.D.

Indicatorul B.C. sau A.D.

Q

Sfertul unui an

MM

Luna scris cu dou cifre

MONTH

Numele întreg al lunii scris pe 9 caractere. Dac denumirea lunii nu ocup cele 9 caractere, spa iul r mas liber este automat umplut cu spatii

MON

O abrevia ie a denumirii unei luni format din trei litere

RM

Luna scris cu cifre romane

WW sau W

S pt mâna din an sau luna

DDD sau DD sau D

Ziua din an, lun sau s pt mân .

DAY

Denumirea completa a zilei completat eventual cu spa ii pân la 9 caractere.

DY

O abrevia ie a denumirii unei zile formata din trei litere

J

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

Elemente ce formateaz timpul HH24:MI:SS AM

15:45:32 PM

Ad uga i şiruri de caractere prin închiderea acestora între ghilimele. DD “of” MONTH

12 of OCTOBER

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

fourteenth

Modele de formatare pentru timp Utiliza i elementele descrise mai jos atunci când dori i s afişa i timpul într-un anumit format sau s folosi i litere în loc de cifre.

7-191

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

Element

Descriere

AM sau PM

indicator de meridian

A.M. sau P.M.

indicator de meridian cu puncte

HH sau HH12 sau HH24

ora

MI

minute (0-59)

SS

secunde (0-59)

SSSSS

Num rul de secunde începând cu miezul nop ii

Alte formate: Element

Descriere

/..

Punctua ia este reprodus în rezultat.

“of the”

Şirul încadrat între ghilimele este reprodus

Specifica i sufixe : Element

Descriere

TH

Num r de ordine dat în cifre (de exemplu DDTH pentru 4TH)

SP

Num r scris în litere (de exemplu DDSP pentru FOUR)

SPTH sau THSP

Num r de ordine scris în litere (de exemplu DDSPTH pentru FOURTH)

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

7-192

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

Exemplul de mai sus prezint o modalitate de a afişa numele şi data angaj rii pentru fiecare angajat.( De remarcat este formatul în care se afişeaz data.) Modifica i exemplul de mai sus astfel încât 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 afişa 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 Iaşi Baze de date – lucrări practice 9

Reprezint un num r

0

For eaz afişarea unei cifre 0

$

Semnul dolar

L

Foloseşte simbolul local pentru moned

.

Afişeaz un punct

,

Tip reşte un indicator pentru mii

Atunci când se lucreaz cu valori numerice drept şiruri de caractere trebuie s converti i acele numere în valori de tip caracter utilizând func ia TO_CHAR, care face conversia dintre o valoare de tip NUMBER spre o valoare de tip VARCHAR2. Aceasta tehnic este folositoare în cadrul unei concaten ri. Elemente de formatare pentru numere Dac trebuie s converti i un num r într-o valoare de tip caracter pute i utiliza urm toarele elemente: Element

Descriere

Exemplu

Rezultat

9

Pozi ie numerica (num rul cifrelor de 9 determin lungimea pe care se face afişarea)

999999

1234

0

Afişeaz zerourile nesemnificative

099999

001234

$

Semnul dolar

$999999

$1234

L

Foloseşte simbolul local pentru moned

L999999

FF1234

.

Determin afişarea unui punct zecimal în pozi ia specificat .

999999.99

1234.00

,

Determin afişarea unei virgule în pozi ia specificat .

999,999

1,234

MI

Determin afişarea semnului minus în partea dreapt (pentru valori negative)

999999MI

1234 -

PR

Închide între paranteze numerele negative

999999PR



EEEE

NOT ie ştiin ific (formatul impune existen a a patru litere E)

99.999EEEE

1.234E+03

V

Înmul ire cu 10 de n ori (n = num rul de cifre de 9 de dup litera V)

9999V99

123400

B

Înlocuieşte valorile de 0 cu blank

B9999.99

1234.00

7-194

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice SELECT TO_CHAR(sal,'$99,999') SALARY FROM emp WHERE last_name= 'Ernst';

Observa ii: Server-ul Oracle afişeaz semnul (#) în locul valorii numerice a c rei num r cifre a dep şit valoarea specificat prin model. Server-ul Oracle rotunjeşte valoarea zecimal stocat ca o valoare cu un num r de zecimale furnizat de câtre 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 acelaşi num r de caractere ca şi modelul corespunz tor din format. Exemplu: Afişa 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 Iaşi Baze de date – lucrări practice

Formatul RR pentru date calendaristice Anul curent

Data specificata

1995 1995 2001 2001

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

Dac cele doua cifre ale anului curent sunt:

50 99

Formatul RR

Data întoars se încadreaz în secolul de dup secolul curent

Formatul YY

Data întoars se încadreaz in secolul curent

Formatul RR pentru date calendaristice este similar cu elementul YY, dar permite specificarea de secole diferite. Exist posibilitatea folosirii elementului pentru formatarea datelor RR în locul elementului YY şi astfel secolul valorii returnate variaz în func ie de cei doi digi i specifica i în an şi de ultimii doi digi i ai anului curent. Tabelul urm tor descrie comportamentul elementului RR. Anul curent

Data specificata

Formatul RR

1994 1994 2001

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

1995 2017 2017

7.7

Formatul YY 1995 1917 2017

Func ii diverse

Func ia NVL • Converteşte 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 Iaşi Baze de date – lucrări 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 Iaşi Baze de date – lucrări 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 întâlneşte 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 Iaşi Baze de date – lucrări 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 converteşte 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 acelaşi 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 Iaşi Baze de date – lucrări 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 uneşte 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 Iaşi Baze de date – lucrări 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 acelaşi 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 vânz torilor cu 20%. Pentru celelalte func ii salariul r mâne neschimbat. 7-201

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 Iaşi Baze de date – lucrări 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 . Aceeaşi 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 rând se pot imbrica de câte ori dorim. Evaluarea func iilor imbricate începe de la nivelul cel mai adânc.

Func iile de un singur rând se pot imbrica de câte 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 afişeaz acele persoane care nu au superior. Evaluarea instruc iunii SQL se realizeaz în doi paşi. • 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 înlocuieşte 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 Iaşi Baze de date – lucrări practice

7.9

Exerciţii

1. Scrie i o interogare care sa afişeze data curent . Denumi i coloana Date. 2. Afişa 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 fişier numit p3q2.sql. 3. Rula i programul salvat anterior. 4. Modifica i programul salvat în fişierul p3q2.sql astfel încât acesta s adauge o coloana în care ve i trece diferen a dintre salariul nou şi cel vechi. Denumi i coloana Creştere. Rula i noul program. 5. Afişa i numele angajatului, data angaj rii, data când se recalculeaz salariul, care este prima luni dup 6 luni de servici. Denumi i coloana REVIEW. Formata i afişarea datei astfel încât s arate similar cu exemplul de mai jos: Sunday, the Seventh of September, 1981 6. Pentru fiecare angajat afişa 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 afişaj pentru fiecare angajat: câştig lunar dar ar dori . Denumi i coloana Salariul de vis. Exemplu: KING câştiga $5000 lunar dar ar dori $15000. 8. Scrie i o interogare care s afişeze numele şi salariul pentru to i angaja ii. Afişa i valoarea salariului pe 15 caractere aliniat la dreapta iar spa iul r mas la stânga sa fie umplut cu caracterul $. Denumi i coloana SALARIU. 9. Scrie i o interogare care sa afişeze 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. Afişa i numele, data angaj rii şi ziua din s pt mâna în care angajatul a început lucrul. Denumi i coloana ZI. Ordona i rezultatul dup câmpurile coloanei ZI începând cu Monday (Luni). 11.Scrie i o interogare care sa afişeze 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 Iaşi Baze de date – lucrări practice

Capitolul 8 Afişarea 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 însuşi.

Câteodat este necesar afişarea datelor ce provin din mai multe tabele. În exemplul de mai sus rezultatul afişeaz 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 încât accesarea datelor sa se fac din ambele tabele.

8-205

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

8.1

Definirea JOIN-urilor

În vederea afiş rii de date ce provin din mai multe tabele ale bazei de date se foloseşte 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 afişa 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 când acelaşi 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 acelaşi 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. Aşadar, pentru a al tura 4 tabele, sunt necesare 3 condi ii de join. Aceast regul s-ar putea s nu se aplice dac tabelul are o cheie primar concatenat fiind astfel necesare mai multe coloane pentru a identifica in mod unic fiecare linie.





8.2

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

8-206

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Pentru a evita un produs cartezian trebuie s include i întotdeauna într-o clauza WHERE o condi ie de join valid . Când o condi ie join este invalid sau este complet omis , rezultatul este un produs cartezian în care vor fi afişate 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 când se doreşte î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 afişeaz 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, generând astfel un tabel de ieşire ce are 160 de rânduri.

8-207

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 însemnând 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 Iaşi Baze de date – lucrări 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 afişa 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 Iaşi Baze de date – lucrări 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. Aşa 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 Iaşi Baze de date – lucrări 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 cât sunt mai scurte, cu atât 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 foloseşte mai mult de 2 tabele

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

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 decât num rul de tabele scrise în clauza FROM. De exemplu, dac num rul tabelelor este ‚n’, num rul condi iilor de join din clauza WHERE trebuie sa fie ,n-1’.

8.4

Non-echi-join

EMPLOYEES Last_Name

JOB_GRADES Salary

Grade

Lowest_sal

Highest_sal

King

24000

A

1000

2999

Kochhar

17000

B

3000

5999

De Haan

17000

C

6000

9999

Hunold

9000

D

10000

14999

Ernst

8000

E

15000

24999

Mourgos

5800

F

25000

40000

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

8-212

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 decât 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 când 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 câştiga mai pu in decât cea mai mic valoare din coloana LOWEST_SAL sau mai mult decât cea mai mare valoare con inut în coloana HIGHEST_SAL.

8-213

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Observa ie: Se pot folosi şi al i operatori, cum ar fi =, dar este mai simplu de folosit BETWEEN. Când se foloseşte BETWEEN trebuie specificat mai întâi 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 Iaşi Baze de date – lucrări 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 lâng 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 Iaşi Baze de date – lucrări practice

Exemplul afişeaz numele angajatului, num rul şi numele pentru toate departamentele. Departamentul Contracting, care nu are nici un angajat este de asemenea afişat. 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 însuşi. 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 uitându-va în coloana Last_name; o G si i num rul managerului pentru Whalen uitându-va în coloana Manager_ID. Num rul managerului lui Whalen este 101. o G si i numele managerului cu EMPLOYEE_ID egal cu 101 uitându-v în coloana LAST_NAME. Num rul angajatului Kochhar este 101 deci Kochhar este managerul lui Whalen.

8-216

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 seşte 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 acelaşi 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 Iaşi Baze de date – lucrări 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 acelaşi rezultat dat de exemplul urm tor:

8-218

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 acelaşi nume. La execu ie se selecteaz rândurile din cele dou tabele ce au valori egale în toatele coloanele comune. Dac coloanele ce au acelaşi 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. Începând 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 acelaşi nume şi acelaşi 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 acelaşi nume în ambele tabele. Dac ar fi fost şi alte coloane care sa aib acelaşi 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 rândurile afişate 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 Iaşi Baze de date – lucrări practice

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

Notă:





Când 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 Iaşi Baze de date – lucrări practice Aceeaşi restric ie se aplica şi la NATURAL JOIN. Aşadar coloanele ce au acelaşi 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 afişa 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 acelaşi nume. Pentru a specifica condi ii arbitrare sau coloanele pe care se face join-ul se foloseşte clauza ON. Clauza ON separ condi ia de join de alte condi ii de c utare şi face codul mai uşor 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 acelaşi nume. 8-221

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 stânga 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 Iaşi Baze de date – lucrări 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 rând comun este un inner join. • Un join între dou tabele ce returneaz atât rezultatele unui inner join cât şi rândurile ce nu se potrivesc cu tabela din stânga (sau dreapta ) este un outer join la stânga (sau dreapta). • Un join între doua tabele ce returneaz atât rezultatul unui inner join cât ş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 Iaşi Baze de date – lucrări practice

Acest exemplu afişeaz toate rândurile din tabela EMPLOYEES, care este tabele din stânga, 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 afişeaz toate rândurile 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 Iaşi Baze de date – lucrări 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 afişeaz toate rândurile din tabela EMPLOYEES chiar dac nu exist nici o coresponden cu datele din tabela DEPARTMENTS Deasemeni sunt afişate toate rândurile 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 aşa 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 Iaşi Baze de date – lucrări practice 8.8

Exerciţii

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

2. Scrie i o interogare care s afişeze 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 afişeaz numele angajatului, numele departamentului, loca ia şi oraşul tuturor angaja ilor care câştiga un comision.

4. Afişa i numele angajatului şi numele departamentului pentru to i angaja ii care au un „a” in numele lor. Salva i tabelul SQL într-un fişier numit p4q4.sql.

8-226

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

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

5. Afişa 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 fişier numit p4q6.sql.

8-227

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice 6. Modifica i p4q6.sql pentru a afişa to i angaja ii incluzând pe King care nu are manager.

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

8. Afişa i structura tabelului JOB_GRADEs. Crea i o interogare care va afişa numele, meseria, numele departamentului, salariul şi treapta de salarizare pentru to i angaja ii.

8-228

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

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

10. Afişa 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 Iaşi Baze de date – lucrări practice

11. Crea i o interogare care afişeaz 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 Iaşi Baze de date – lucrări 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 rând, func iile de grup opereaz pe seturi de rânduri pentru a da un singur rezultat unui grup. Aceste seturi pot fi întregul tabel sau tabelul împ r it la rândul lui în grupuri. Func iile de grup sunt urm toarele : • AVG • COUNT • MAX • MIN • STDDEV • SUM • VARIANCE Fiecare din func ii accept /primeşte un argument. Urm torul tabel identific op iunile pe care le pute i folosi în sintax . 9-231

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Func ie AVG([DISTINCT|ALL]n)

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

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

SELECT FROM [WHERE [ORDER BY

Descriere Valoarea medie a lui ’’n’’, ignorând valorile nule; Num rul de rânduri, unde expresia evalueaz altceva decât valori nule. Num r toate rândurile selectate folosind *, inclusiv duplicatele şi rândurile cu valori nule; Valoarea maximal a expresiei, ignorând valorile nule; Valoarea minim a expresiei, ignorând valorile nule; Abaterea standard a lui ’’n’’, ignorând valorile nule; Suma valorilor lui ’’n’’, ignorând valorile nule; Varia ia lui ’’n’’, ignorând valorile nule;

coloana, funcţie_de_grup(coloana) tabela condiţie] coloana ];

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

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

9.2

Folosirea funcţiilor AVG, SUM, MIN, MAX

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

9-232

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 afişeaz media, maximul, minimul şi suma salariilor lunare pentru to i vânz 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 afişeaz 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 funcţiei 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 Iaşi Baze de date – lucrări practice Func ia COUNT are trei formate : •

COUNT(*)



COUNT(expr)



COUNT(DISTINCT expr)

- întoarce num rul de rânduri in tabel, incluzând rândurile duble şi rândurile con inând valori nule; - întoarce num rul rândurilor nenule din coloana identificat prin expr.; - întoarce num rul rândurilor unice nenule din coloana identificat prin expr.

Exemplul de mai jos afişeaz num rul angaja ilor din departamentul 80 care pot sa câştige un comision. SELECT COUNT(commission_pct) FROM employees WHERE department_id = 80;

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

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

9.4

Funcţiile 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 Iaşi Baze de date – lucrări 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 rândurilor 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 rândurilor 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

Pân 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 Iaşi Baze de date – lucrări 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 rândurilor.

coloanele ale c ror valori

Clauza GROUP BY se poate folosi pentru a împ r i rândurile 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 decât 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 rândurile înainte de a formarea grupurilor. Implicit, rândurile 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 Iaşi Baze de date – lucrări practice

Exemplul de mai sus afişeaz num rul departamentului şi media salariilor pentru fiecare departament. Iat cum este evaluat declara ia SELECT de mai sus, con inând o clauz GROUP BY : •







Clauza SELECT specific coloanele care s fie afişate, 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 rândurile sunt incluse. Clauza GROUP BY specific modul de grupare pentru rânduri. Rândurile 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 afişeaz media salariilor pentru fiecare departament f r s afişeze num rul departamentului respectiv. Totuşi, f r num rul departamentului, rezultatele nu afişeaz datele în mod semnificativ. 9-237

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 Câteodat sunt necesare rezultate pentru grupuri formate din subgrupuri. Exemplul de mai sus arat un raport care afişeaz totalul salariilor ce au fost pl tite pentru fiecare nume de func ie, din fiecare departament. Tabelul EMPLOYEES este grupat mai întâi 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 afişeaz un singur rezultat ( salariul total ).

9-238

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 afişate: - 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 rândurile : - Rândurile se grupeaz mai întâi dup num rul departamentului. - Apoi, din grupurile formate dup num rul departamentului, se grupeaz rândurile 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 Iaşi Baze de date – lucrări practice

9.7

Interogări ilegale în folosirea funcţiilor de grup

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

SELECT department_id, COUNT(last_name) FROM employees; Exemplul de mai sus genereaz eroarea: SELECT department_id, COUNT(last_name) * ERROR at line 1: ORA-00937: not a single-group group function Column missing Ori de cate ori se foloseşte o combina ie de coloane individuale (department_id) şi func ii grup (COUNT(last_name)) în aceeaşi declara ie SELECT, trebuie inclus o declara ie (GROUP BY ) care s specifice coloanele individuale (in acest caz department_id). Dac clauza GROUP BY lipseşte, atunci apare mesajul de eroare ’’not a single-group function’’ şi un asterisc (*) care indic coloana greşit . Eroarea de mai sus se repar ad ugând 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 Iaşi Baze de date – lucrări 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 foloseşte clauza WHERE pentru a restric iona afişarea 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 Iaşi Baze de date – lucrări practice 9.8

Excluderea rezultatelor obţinute folosind clauza Group

În acelaşi mod în care se foloseşte clauza WHERE pentru restric ionarea rândurile 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 grupând 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 : - Rândurile sa fie grupate. - Clauza GROUP BY sa fie aplicat . - Grupurile care îndeplinesc condi ia din clauza HAVING sa fie afişate. 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 rânduri raportate la acele grupuri a c ror condi ie specificata este TRUE ( adev rat ). 9-242

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Clauza HAVING poate fi folosit pentru a specifica care grupuri trebuiesc afişate. De aceea, mai întâi 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 paşi la folosirea clauzei HAVING : • Se grupeaz rândurile; • Func ia de grup se aplica grupului; • Se afişeaz grupurile care îndeplinesc criteriul din clauza HAVING. Clauza HAVING poate precede clauza GROUP BY, dar este recomandat scrierea mai întâi 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 afişeaz 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 rândurile în baza unei func ii de grup, este obligatoriu necesar o clauza GROUP BY şi o clauza HAVING. Exemplul de mai jos afişeaz 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 Iaşi Baze de date – lucrări practice

Exemplul de mai jos afişeaz 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 vânz 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 funcţiilor de grup

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

Func iile de grup pot fi imbricate pe oricâte nivele de adâncime. Exemplul de mai sus afişeaz 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 rândurilor create de ROLLUP sau CUBE; • Folosirea GROUPING SETS pentru a ob ine un singur set de date. 9-244

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 lâng valorile pentru rândurile grupate în mod obişnuit şi rândurile pentru subtotal. Gruparea cu folosirea operatorului CUBE duce la gruparea rândurilor selectate pe baza valorilor tuturor combina iilor posibile ale expresiilor specificate şi returneaz un singur rând cu informa ii totale pentru fiecare grup. Se poate folosi operatorul CUBE pentru a ob ine rânduri 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 începând 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 mişcarea într-o direc ie, de la stânga 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 când sunt 9-245

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 afişeaz : 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 afişeaz : o

Salariul total pentru acele departamente care au ID-ul mai mic de 60 (eticheta 2);

o

Salariul total pentru toate departamentele care au ID-ul mai mic de 60, în func ie de job_ID (eticheta 3);

Toate rândurile etichetate cu 1 sunt rânduri „normale” iar cele indicate cu 2 şi 3 sunt rânduri „supratotalizatoare”. Operatorul ROLLUP creeaz subtotaluri care se desf şoar începând de la nivelul cel mai detaliat pân la un total general, în func ie de criteriile de grupare specificate în clauza GROUP BY. Se calculeaz mai întâi 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, mutându-se de la dreapta la stânga în cadrul listei de valori de la clauza GROUP BY (în exemplu, este calculat mai întâi 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 Iaşi Baze de date – lucrări practice n coloane, rezultatul opera iei va avea n + 1 grupuri (in exemplu 2 + 1 = 3 grupuri). Rândurile bazate pe prima expresie din cele n specificate se numesc rânduri „obişnuite” iar celelalte se numesc rânduri „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 obişnuit folosite în rapoartele de tip „cross-tab”. Pe când 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 rânduri suplimentare într-un set de rezultate. Coloanele incluse în clauza GROUP BY sunt referite încrucişat î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 rânduri 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 Iaşi Baze de date – lucrări 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 afişat 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 rândurile etichetate cu 1 sunt rânduri obişnuite, toate rândurile etichetate cu 2 şi 4 sunt rânduri totalizatoare iar rândurile etichetate cu 3 sunt rânduri ce con in valori „încrucişate”. Operatorul CUBE a efectuat şi opera ia pe care un operator de tip ROLLUP ar fi executat-o pentru a afişa subtotalurile şi salariul total pentru acele departamente a c ror ID este mai mic, indiferent de valoarea din coloana JOB_ID. Suplimentar operatorul CUBE afişeaz 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 Iaşi Baze de date – lucrări practice dac nu s-ar folosi operatorul CUBE ar fi fost necesare 2n fraze SELECT care sa fie legate cu UNION ALL. Astfel, o ieşire cu 3 dimensiuni ar necesita 23 = 8 fraze SELECT care s fie unite cu UNION ALL.

9.13 Funcţia 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 rând ş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 foloseşte 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 rând 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 Iaşi Baze de date – lucrări 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 rând 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 atât coloana DEPARTMENT_ID cât şi JOB_ID. Astfel, valoare 0 este întoars atât pentru expresia GROUPING(department_id) cât şi pentru GROUPING(job_id). Luam acum în discu ie valoarea total 4400 din cel de-al doilea rând. Aceast valoare este salariul total pentru departamentul 10 şi a fost calculat luând î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 rândul al cincilea. Observa i valoare 23400 din ultimul rând 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 favorizând astfel o sumare eficient şi astfel facilitând analiza datelor la folosirea mai multe dimensiuni. 9-250

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Serverul Oracle calculeaz toate grup rile specificate în clauza GROUPING SETS şi combin rezultatele grupurilor individuale cu o opera ie de tip UNION ALL.

o o o

Eficien a Grouping set este datorat : este necesar doar o singur citire a datelor din tabelul de baza; nu este necesar scrierea unei expresii complexe de tip UNION ; cu cât sunt mai multe elemente în GROUPING SETS cu atât creşte beneficiul performan ei dat de instruc iune .

Pentru a specifica diverse tipuri de grup ri (care pot include operatori de tip ROLLUP sau CUBE) este necesar doar o singur instruc iune SELECT care poate fi scris împreuna cu GROUPING SETS în locul unor fraze SELECT multiple combinate cu operatorul UNION ALL. De exemplu se poate scrie: SELECT department_id, job_id, manager_id, AVG(salary) FROM employees GROUP BY GROUPING SETS ((department_id, job_id, manager_id), (department_id, manager_id),(job_id, manager_id)); Instruc iunea calculeaz suma pentru urm toarele grupuri : (department_id, job_id, manager_id), (department_id, manager_id) şi (job_id, manager_id). În lipsa acestei facilita i oferite de Oracle9i ar fi trebuit scrise mai multe instruc iuni SELECT combinate cu operatorul UNION ALL O abordare care foloseşte 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 Iaşi Baze de date – lucrări 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 gândi 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 Iaşi Baze de date – lucrări 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 afişate 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 aşa 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 aşa mai departe.

Exemplul de mai sus poate fi scris dup cum urmeaz : SELECT department_id, job_id, NULL as manager_id, AVG(salary) as AVGSAL FROM employees GROUP BY department_id, job_id UNION ALL SELECT NULL, job_id, manager_id, avg(salary) as AVGSAL FROM employees GROUP BY job_id, manager_id; În lipsa unui element de optimizare care s caute în blocurile interog rii pentru a genera un plan de execu ie, interogarea de mai sus necesit scanarea dubl a tabelei EMPLOYEES, lucru ce este foarte ineficient, motiv pentru care se recomand folosirea instruc iunii GROUPING SETS.

9-253

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 încât severul Oracle s poat recunoaşte aceste coloane ca o unitate atunci când 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 foloseşte in special pentru calcularea unui total general.

SELECT NULL, NULL, aggregate_col FROM 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 Iaşi Baze de date – lucrări 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 Iaşi Baze de date – lucrări 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 când 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 afişeaz 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 Iaşi Baze de date – lucrări 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 încât 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 defineşte urm toarele grupuri: (a, c), (a, d), (b, c), (b, d) Concatenarea seturilor de grup ri este foarte folositoare deoarece : • uşureaz 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 Iaşi Baze de date – lucrări 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 afişând 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 uşoar , detaliile pentru departamentul 10 sunt eviden iate în figura de mai sus.

9-258

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

9.17 Exerciţii

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

asupra mai multor rânduri şi produc un

2. Func iile de grup includ valoarea null în calcule (adev rat/fals). 3. Clauza WHERE restric ioneaz rândurile anterior includerii acestora în grupurile de calcul (adev rat/fals). 4. Afişa 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 fişierul p4.sql.

5. Modifica i p4.sql astfel încât s afişeze aceleaşi informa ii pentru fiecare tip de meserie. Salva i modific rile in p5.sql.

9-259

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice 6. Scrie i o interogare pentru afişarea num rului de angajai cu aceeaşi 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 afişeze diferen a dintre salariile cele mai mari şi cele mai mici. Eticheta i coloana Diferen a.

9. Afişa 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 decât 1600$. Sorta i rezultatele in ordine descresc toare dup salar.

9-260

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice 10. Scrie i o interogare care s afişeze 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 afişeaz 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. Afişa 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 Iaşi Baze de date – lucrări practice 13. Scrie i o interogare care sa afişeze 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 acelaşi 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 Iaşi Baze de date – lucrări 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 Iaşi Baze de date – lucrări practice 15. Scrie i o interogare care s afişeze 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 acelaşi sef; Salariul total al angaja ilor ce au acelaşi 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 afişa urm toarele grupuri: - department_id, manager_id, job_id; - department_id, job_id; - manager_id, job_id. Interogarea trebuie s grupuri.

9-264

calculeze suma salariilor pentru fiecare dintre aceste

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

Capitolul 10

Subinterogari

Obiective: • • • •

Descrierea tipurilor de probleme pe care le pot rezolva subinterogarile; Definirea subinterogarilor; Enumerarea tipurilor de subinterog ri; Scrierea subinterogarilor de un singur rând şi a celor de mai multe rânduri.

Î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 primeşte un salariu mai mare decât cel al lui Jones ? ”

Cerere principal “ Ce angajat are un salariu mai mare decât Jones ? “ Subinterogare “ Care este salariul lui Jones ? “

10.1

Folosirea unei subinterog ri pentru a rezolva o problema

S presupunem c se doreşte scrierea unei interog ri pentru a afla cine câştig un salariu mai mare decât salariul lui Jones. Pentru rezolvarea acestei probleme este nevoie de dou interog ri: o interogare pentru a afla ce salariu câştig Jones şi o a doua pentru a determina cine câştig mai mult decât aceast sum . Problema poate fi rezolvat combinând aceste dou interog ri, integrând una din cereri în cealalt . 10-265

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 inând 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 doreşte selectarea unor rânduri 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 rând: >=, (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 returnând rezultatul c tre clauza HAVING a subinterog rii principale. Instruc iunea SQL prezentat în figura de mai sus are ca scop final afişarea tuturor departamentelor la nivelul c rora salariul minim are o valoare mai mare decât valoarea salariului minim din cadrul departamentului 50. Exemplu: Se cere s se g seasc func ia având 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 Iaşi Baze de date – lucrări practice O eroare obişnuit la folosirea subinterog rilor o reprezint returnarea a mai mult de un rând 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 rânduri, câte 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 foloseşte în clauza WHERE. Clauza WHERE con ine operatorul egal ( = ), operator de comparare single-row, care aşteapt 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 obişnuit legat de subinterog ri o constituie posibilitatea neselect rii nici unui rând de c tre interogarea inclus . În ceea ce priveşte 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 rând. Problema este ortografierea greşit a cuvântului Haas. Nu exist nici un angajat cu numele de Haas. Astfel, subinterogarea nu va selecta nici un rând. Interogarea extern preia rezultatul subinterog rii (null, în acest caz) şi foloseşte acest rezultat în propria-i clauza WHERE. Interogarea extern nu g seşte nici un angajat având câmpul referitor la func ie de valoare nul şi astfel nu returneaz nici un rând.

10-271

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

10.6 • •

Subinterogari multiple-row

Selecteaz mai mult de un rând 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 rând 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 câştig un salariu egal cu salariul minim la nivel de departament. Interogarea intern va fi prima executat producând 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 Iaşi Baze de date – lucrări 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 afişeaz angaja ii ale c ror salarii sunt mai mici decât al oric rui programator (IT_PROG) dar care nu sunt programatori. Salariul maxim pe care îl câştig un programator este $9000. Instruc iunea SQL afişeaz to i angaja ii care nu sunt programatori dar câştig mai pu in de $9000. < ANY > ANY = ANY

10.8

înseamn mai mic decât maxim. înseamn mai mare decât minim. este echivalent cu operatorul IN.

Utilizarea operatorului ALL în subinterog rile multiple-row

10-273

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Operatorul ALL compar o valoare cu toate valorile returnate de o subinterogare. Exemplul de mai sus afişeaz to i angaja ii ale c ror salarii sunt mai mici decât al oric rui programator (IT_PROG) dar care nu sunt programatori. Cel mai mic salariu al vreunui programator este $4200, aşa c interogarea va selecta acei angajai ale c ror salarii sunt mai mici decât $4200. > ALL < ALL

înseamn mai mare decât maxim înseamn mai mic decât 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 afişeaz 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. Când 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 afişarea 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 Iaşi Baze de date – lucrări practice

10.10 Subinterogari de coloane multiple Pân 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 doreşte 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); Afişa 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 foloseşte 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 aceeaşi valoare atât în coloana MANAGER_ID cât ş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 rândurile afişate 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 Iaşi Baze de date – lucrări 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 afişeaz numele angaja ilor, salariul, num rul departamentului şi media salariilor pentru to i angaja ii care câştig mai mult 10-276

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice decât 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 rând. În Oracle8i subinterog rile scalare erau suportate doar în câteva 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 stâng 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 Iaşi Baze de date – lucrări practice Valoarea expresiilor scalare ale subinterog rii este valoarea elementului returnat de subinterogare. Dac subinterogarea nu întoarce nici un rând, valoarea expresiei scalare este NULL. Dac subinterogarea întoarce mai mult de un rând, 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, constrângeri 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 ID–ul departamentului pentru care location ID este 1800. Expresia CASE din interogarea principal foloseşte rezultatul subinterog rii pentru a afişa 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 Iaşi Baze de date – lucrări 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 afişat mai jos.

Acest exemplu foloseşte o subinterogare corelat . Într-o subinterogare corelat , subinterogarea refer o coloan dintr-o tabel referit în subinterogarea principal . 10.14 Subinterogări corelate Subinterog rile corelate sunt folosite pentru procesare rând cu rând. Fiecare subinterogare este executat odat pentru fiecare rând al interog rii principale.

10-279

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Extrage rândul candidat din interogarea principal

Execut subinterogarea folosind valoarea din rândul candidat

Foloseşte valoarea subinterog rii pentru califica sau descalifica rândul candidat

Serverul Oracle execut o subinterogare corelat atunci când o subinterogare refer o coloan dintr-un tabel referit în interogarea principal . O subinterogare corelat este evaluat de fiecare dat pentru fiecare rând 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 întâi odat , valoarea întoars fiind folosit de interogarea principal . O subinterogare corelat este executat odat pentru fiecare rând candidat dat de interogarea principal . Cu alte cuvinte, subinterogarea este condus de interogarea principal . Executarea subinterog rii imbricate • •

Se execut mai întâi subinterogarea şi este returnat o valoare; Se execut odat interogarea principal folosind valoarea dat de subinterogare.

Executarea subinterog rii corelate • • • •

10-280

Se ia un rând candidat, dat de interogarea principal ; Se execut subinterogarea folosind valoarea din rândul candidat; Se foloseşte valoarea dat de subinterogare pentru a califica sau descalifica rândul candidat; Se repet procedura pân la epuizarea rândurilor candidat.

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 câştig mai mult decât 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 atât interogarea principal cât ş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: Afişa 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 15000; Pentru a fi calificat drept rând copil, acel rând trebuie s aib valoarea din coloana MANAGER_ID egal cu valoarea coloanei EMPLOYEE_ID din rândul 10-290

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 rândurilor

Pute i afişa în mod explicit rangul sau nivelul unui rând î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 Iaşi Baze de date – lucrări practice una sau mai multe ramuri se despart dintr-o ramur mare sunt numite noduri iar locul unde o ramur ia sfârşit se numeşte 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 când angajatul Davies este doar un copil şi o frunz . Not : un nod rădăcină 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 afişeze nivelele de management ale companiei începând 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 câte un num r de nivel folosind func ia LPAD împreun cu pseudocoloana LEVEL pentru a afişa un raport ierarhic sub forma unui arbore identat.

• LPAD(char1,n [,char2]) întoarce char1, aliniat la stânga pe lungime de n În exemplul de mai sus :

caractere folosind secven a de caractere din char2. Argumentul n reprezint lungimea total a valorii returnate aşa cum este afişat pe ecran.

• LPAD(last_name,LENGTH(last_name)+(LEVEL*2)-2,'_') defineşte formatul de afişare. 10-292

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice • char1 este LAST_NAME , n este lungimea total a valorii returnate, adic lungimea lui LAST_NAME +(LEVEL*2)-2 iar char2 este '_'. Cu alte cuvinte i se spune motorului SQL s scrie la stânga valorii LAST_NAME atâtea caractere '_' câte sunt date de valoarea lui LENGTH(last_name)+(LEVEL*2)- 2. Pentru King, LEVEL = 1 deci (2 * 1)-2 = 22 = 0, aşadar King nu va avea niciun caracter '_' şi este afişat în coloana 1. Pentru Kochhar, LEVEL = 2 deci (2 * 2)-2 = 4-2 = 2 aşadar Kochhar va avea 2 caractere '_' şi este afişat identat. Celelalte rânduri sunt afişate dup acelaşi principiu.

T ierea ramurilor Folosi i clauza WHERE pentru a elimina un nod.

Folosi i clauza CONNECT BY pentru a elimina o ramur .

WHERE last_name != 'Higgins'

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

Pute i folosi clauzele WHERE şi CONNECT BY pentru a t ia arborele; acesta înseamn c pute i controla care noduri şi rânduri vor fi afişate. Predicatul pe care îl folosi i ac ioneaz ca o condi ie Boolean .

10-293

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Exemplu: Pornind de la r d cin , parcurge i arborele de sus în jos şi elimina i angajatul Higgins din rezultat procesând îns rândurile 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 rândurile 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 Iaşi Baze de date – lucrări practice

10.20

Exerci ii

1. Scrie i o interogare care s afişeze numele angajatului şi data angaj rii pentru to i angaja ii din acelaşi departament ca Zlotkey, excluzând-ul pe Zlotkey.

2. Scrie i o interogare pentru a afişa num rul angajatului şi numele s u pentru to i angaja ii care câştig mai mult decât salariul mediu. Sorta i rezultatele în ordinea descresc toare a salariului.

3. Scrie i o interogare care s afişeze 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 fişier denumit pq3.sql. 4.

Afişa 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 Iaşi Baze de date – lucrări practice

5. Afişa i numele şi salariul tuturor angaja ilor subordona i lui King.

6. Afişa i num rul departamentului, numele şi func ia tuturor angaja ilor din departamentul numit „Executive”.

7. Modifica i pq3.sql pentru a afişa num rul, numele şi salariul tuturor angaja ilor care câştig mai mult decât 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 fişierul ca pq7.sql. Executa i interogarea din nou.

8. Scrie i o interogare care s afişeze 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 câştig comision.

10-296

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice 9. Afişa 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 afişeze numele, data angaj rii şi salariul pentru to i angaja ii care au acelaşi salariu şi comision ca al lui Kochhar, exclusiv Kochhar.

11. Scrie i o interogare care s afişeze angaja ii care câştig un salariu mai mare ca al oric rui angajat cu JOB_ID = 'SA_MAN'. Afişa i salariile ordonat de la cel mai mare la cel mai mic.

12. Afişa i coloanele employee_ ID, last_ name şi department_ID pentru acei angaja i care locuiesc în oraşe a c ror nume începe cu T.

13. Scrie i o interogare care s afişeze to i angaja ii care câştig mai mult decât salariul mediu din departamentul lor. Afişa 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 Iaşi Baze de date – lucrări practice

14. Afişa 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 afişeze numele angaja ilor care câştig pu in decât media salarial din departamentul lor.

mai

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

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice mul i colegi de departament care s angajare mai târzii.

aib

salarii mai mari şi date de

17. Scrie i o interogare care s afişeze 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 afişeze 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 Iaşi Baze de date – lucrări 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 Iaşi Baze de date – lucrări practice 20. Afişa i structura organiza ional a departamentului lui Mourgos specificând numele de familie, salariul şi id-ul departamentului.

21. Crea i un raport care s afişeze ierarhia managerilor pentru angajatul Lorentz. Afişa i mai întâi pe şeful s u direct.

22. Crea i un raport identat care s afişeze ierarhia managerial începând de la angajatul cu numele Kochhar. Afişa i coloanele last_name, manager_ ID şi department_ID. Da i aliasuri coloanelor ca în exemplu.

23. Afişa i structura organizatoric a companiei afişând 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 Iaşi Baze de date – lucrări 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 rândurilor unei tabele (MERGE): • Controlul tranzac iilor (COMMIT, SAVEPOINT şi ROLLBACK). O comand DML este executat atunci când: - 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. Când se doreşte 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 numeşte tranzacţie. Exemplu: Considera i o baz de date din domeniul bancar. Atunci când un client al b ncii doreşte 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, creşterea 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 aşa fel încât sa men in echilibrul necesar între conturi. Atunci când, 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 Iaşi Baze de date – lucrări 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 câte un rând odat la un tabel. La inserarea unei noi înregistr ri con inând 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 Iaşi Baze de date – lucrări 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 cuvântului 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 constrângerile 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 constrângerea de unicitate; Valori care duc la înc lcarea constrângerii de tip cheie str in ; Valori care duc la înc lcarea constrângerii de tip CHECK ; Tip de data eronat; Valoare mai mare decât maxima admis pentru acea coloan .

11-304

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 câmpul 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. Câmpul HIREDATE primeşte 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 Iaşi Baze de date – lucrări 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 fişier 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 fişier. 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 acelaşi script pentru a introduce valori diverse în tabel . ACCEPT expr PROMPT ’textul specificat’ Comanda ACCEPT memoreaz valoarea introdus variabila expr iar PROMPT afişeaz ’textul specificat’.

de utilizator în

ACCEPT department_id PROMPT 'Introduceţi numărul departamentului:' ACCEPT department_name PROMPT 'Introduceţi numele departamentului:' ACCEPT location_id PROMPT 'Introduceţi oraşul:' 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 & când este referit într-o comanda ACCEPT. Pentru a continua o comanda SQL*PLUS pe linia urm toare se foloseşte caracterul -. Copierea înregistr rilor dintr-un alt tabel folosind comanda INSERT cu o subinterogare 11-306

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Comanda INSERT poate fi folosit pentru a adaug înregistr ri într-un tabel, valorile pentru câmpuri fiind extrase dintr-un tabel existent. Pentru aceasta se foloseşte î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 câmpurilor (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 acelaşi 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 Iaşi Baze de date – lucrări 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 ; Condiţie 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 rânduri din tabel . Pute i avea confirmarea execut rii opera iei de modificare prin interogarea 11-308

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice tabelului, afişând rândurile 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 acelaşi 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 câmpuri În clauza SET a unei comenzi UPDATE pot fi implementate subinterog ri dup mai multe câmpuri. 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 încât ele s coincid cu cele ale angajatului num rul 205.

11-309

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 constrângerii de integritate UPDATE employees SET department_id = 55 WHERE department_id = 110; Dac încerca i s atribui i unui câmp o valoare care este legat de o constrângere 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 aşa 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 : Constrângerile 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 Iaşi Baze de date – lucrări 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. Condiţie 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, încercând afişarea rândurilor ş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 rândurile 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 Iaşi Baze de date – lucrări 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 constrângerii de integritate Dac încerca i ştergerea unei înregistr ri care con ine un câmp cu o valoare legat de o constrângere 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 foloseşte o subinterogare pentru a identifica tabelul şi coloanele pentru instruc iunea DML. Sintagma WITH CHECK OPTION împiedic schimbarea rândurilor 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 Iaşi Baze de date – lucrări 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 foloseşte 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 rândurilor care nu sunt în subinterogare. În exemplu este folosit sintagma WITH CHECK OPTION. Subinterogarea identific rândurile 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 rând, 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 cuvântul 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 foloseşte 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 foloseşte instruc iunea UPDATE pentru a atribui coloanei MANAGER_ID valoarea implicit pentru cei din departamentul 10. 11-313

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 Instrucţiunea MERGE •



• • •

Prevede posibilitatea de a introduce sau modifica datele din tabel în mod condi ionat; Execut un UPDATE dac rândul exist şi un INSERT dac este un rând nou; Previne scrierea mai multor instruc iuni UPDATE ; Este uşor de folosit şi duce la creşterea 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 rânduri într-o tabel în mod condi ionat ceea ce previne scrierea mai multor instruc iuni UPDATE. Decizia de a modifica sau introduce rânduri î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 rânduri î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 aceluiaşi rând din tabela folosind aceeaşi instruc iune MERGE. O abordare alternativ ar fi folosirea buclelor PL/SQL şi mai multe instruc iuni DML. Instruc iunea MERGE este dealtfel uşor 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 putând fi duplicate. Folosind instruc iunea MERGE pute i ad uga sau modifica rândurile în mod condi ionat.

11-314

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 rândurile din tabela EMPLOYEES în tabela COPY_EMP. Dac tabela COPY_EMP ar con ine rânduri care ar avea în coloana employee_ID valori egale cu cele din tabela EMPLOYEES, aceste rânduri 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 Iaşi Baze de date – lucrări practice 11.5

Tranzacţii

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 aceeaşi sum de bani. Ambele ac iuni ar trebui fie s reuşeasc împreun , fie sa eşueze împreun . Opera ia de creditare nu ar trebui sa poat fi efectuata f r ca cea de debitare sa fie executat cu succes. Tipuri de tranzac ii: Tip

Descriere

Limbaj de manipulare a datelor (DML)

Consta din orice num r de comenzi DML pe care serverul Oracle le trateaz ca o singur entitate sau unitate logic de lucru.

Limbaj de definire a datelor (DDL)

Const dintr-o singur comand DDL

Limbaj de control al datelor (DCL)

Const dintr-o singur comand DCL

Tranzac ii în baze de date: •



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

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

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

Comenzi pentru controlul explicit al tranzac iilor Pute i controla logica tranzac iilor folosind comenzile; COMMIT,SAVEPOINT şi ROLLBACK. Controlul tranzac iilor INSERT COMMIT

UPDATE

INSERT

DELETE

Savepoint A

Savepoint B

ROLLBACK to Savepoint B

ROLLBACK to Savepoint A

ROLLBACK

11-317

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

Comanda

Descriere

COMMIT

Încheie actuala tranzac ie f când ca toate modific rile s devin permanente (salveaz modific rile)

SAVEPOINT nume

Marcheaz un punct de întoarcere (savepoint) în cadrul tranzac iei curente

ROLLBACK [TO SAVEPOINT name]

Comanda ROLLBACK încheie tranzac ia curent , pierzându-se toate modific rile temporare (pending changes) asupra datelor. ROLLBACK TO SAVEPOINT name şterge savepoint-ul şi toate schimb rile de dup el (temporare).

Not : SAVEPOINT nu este ANSI standard SQL. UPDATE... SAVEPOINT update_done; Savepoint created. INSERT... ROLLBACK TO update_done; Rollback complete. Procesarea implicit a tranzac iilor Un commit (salvarea modific rilor) automat are loc în urm toarele circumstan e: • Este dat o comanda DDL; • Este dat o comanda DCL; • O p r sire normal a mediului SQL*Plus, f r a da explicit o comand COMMIT sau ROLLBACK. Un rollback automat are loc în condi iile unei termin ri anormale a sesiunii SQL*Plus sau în cazul unei 'c deri' de sistem. Stare

Circumstan e

Commit automat

Comanda DDL sau DCL Ieşire normal din SQL*Plus, f r o comand COMMIT sau ROLLBACK explicit

Rollback automat

Terminare anormal a SQL*Plus sau c dere sistem

11-318

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 ieşirea din SQL*Plus. C derile sistemului: Când 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 pân la apari ia unui 'commit' (pân 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 aşa 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 Iaşi Baze de date – lucrări practice

Exemplu : Faceţi modificările: 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 rândul ce are employee_id egal cu 99999 şi apoi introduce în tabela DEPARTMENTS un rând 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: Încercând s şterge i o înregistrare din tabelul TEST, pute i şterge accidental întreg tabelul. Pute i corecta greşeala, 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 pân la acel marcaj folosind comanda ROLLBACK TO SAVEPOINT. Dac crea i un al doilea savepoint cu acelaşi nume ca unul anterior, 11-320

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 eşueaz î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 Consistenţa 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 aceleaşi date: - Cei care citesc datele nu trebuie s îi aştepte pe cei care le modific ; - Cei care modific datele s nu trebuie s îi aştepte 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 Iaşi Baze de date – lucrări practice

Consisten a la citire este implementat în mod automat. Este p strat o copie par ial a bazei de date în segmente rollback.

Când 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 zând datele din segmentul rollback. Aceasta garanteaz c utilizatorii citesc consistent datele care nu sufer schimb ri chiar în acel moment. Când 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 rândul lor anulate. Versiunea original mai veche a datelor din segmentul rollback este scris înapoi în tabel. To i utilizatorii v d baza de date aşa 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; • Foloseşte î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 aceeaşi 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 Iaşi Baze de date – lucrări 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 foloseşte în mod automat cel mai mic nivel aplicabil de restric ionare, furnizând astfel cel mai mare grad de concuren existent, precum şi integritatea maxima a datelor. Oracle permite şi protejarea manual a datelor de câtre utilizator. Oracle foloseşte dou moduri de protec ie într-o baz de date multiutilizator. Mod de protec ie exclusiv (exclusiv lock)

partajat (share lock)

Descriere Împiedic partajarea unei resurse. Prima tranzac ie care blocheaz resursa în mod exclusiv este singura tranzac ie care poate modifica resursa pân când 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 aceeaşi resurs .

11.7 Correlated UPDATE În cazul instruc iunii UPDATE se poate folosi o subinterogare corelat pentru a modifica rândurile 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 Iaşi Baze de date – lucrări 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 rândurile 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 foloseşte tabela REWARDS care are coloanele EMPLOYEE_ID, PAY_RAISE şi PAYRAISE_DATE. De fiecare dat când un angajat primeşte o creştere de salariu se înregistreaz în aceast tabel un rând ce con ine valoarea pentru EMPLOYEE_ ID, valoarea creşterii salariale şi data la care a fost executat . Tabela REWARDS poate con ine mai multe rânduri care s aib aceeaşi valoare pentru câmpul EMPLOYEE_ID. Coloana PAYRAISE_DATE are menirea de a identifica cea mai recent creştere salarial primit de un angajat. În exemplu, coloana SALARY din tabela EMPLOYEES este actualizat astfel încât s reflecte ultima creştere 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 rânduri care exist şi într-o alt tabel . 11-324

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice De exemplu, dac decide i ca în tabela JOB_HISTORY s p stra i doar ultimele patru înregistr ri pentru un angajat, atunci când un angajat se transfer pe o a cincea func ie, ve i şterge cel mai vechi rând 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 rânduri 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, aşa c ar fi o greşeal dac aceleaşi înregistr ri despre un angajat ar exista în ambele tabele. Instruc iunile Multitable INSERT Instruc iunea INSERT…SELECT poate fi folosit pentru a introduce rânduri î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 Iaşi Baze de date – lucrări 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 rândurile calculate derivate din rândurile 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 numeşte 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 când 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 aceeaşi 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 Iaşi Baze de date – lucrări 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 rând 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 utând coresponden a cu condi ia de la clauza WHEN care determin execu ia ei. O singur instruc iune multitable insert poate con ine pân 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 trecând peste urm toarea clauz WHEN pentru acel rând. Conditional INSERT: clauza ELSE Pentru un anumit rând, 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 rând.

11-327

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 când folosi i instruc iunea multitable insert; La folosirea instruc iunii multitable insert nu pot fi specificate mai mult de 999 tabele int , luând î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 rânduri atât în tabela SAL_HISTORY cât ş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 rândurilor extrase de instruc iunea SELECT. Toate rândurile 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 rând 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 rânduri în cele dou tabele. 11-328

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 decât 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 rândurilor de c tre instruc iunea SELECT. Numai acele rânduri care au valoarea din coloana SAL mai mare de 10000 sunt inserate în tabela SAL_HISTORY şi similar, numai acele rânduri 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 rânduri în cele dou tabele SAL_HISTORY şi MGR_HISTORY.

11-329

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 când 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 rând. Pentru rândurile care nu satisfac condi ia WHEN SAL > 25000, restul condi iilor sunt evaluate ca fiind o instruc iune de tip „conditional INSERT” şi rândurile 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 vânz 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 Iaşi Baze de date – lucrări 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 încât 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 încât 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 Iaşi Baze de date – lucrări practice DESC SALES_INFO

SELECT * FROM sales_info;

11-332

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

11.9 Exerciţii

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 câmpurilor. 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 rând 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 decât 900. 11-333

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 rulând 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 rândul nou este intact. Salva i ad ugarea, f când-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 Iaşi Baze de date – lucrări practice 24. a. Scrie i o interogare care s execute urm toarele: •







S afişeze 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. Afişa i rândurile din tabela SPECIAL_SAL.

c. Afişa i rândurile din tabela SAL_HISTORY.

d. Afişa i rândurile din tabela MGR_HISTORY.

11-335

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice 25. a. Crea i tabela sales_source_data cu structura de mai jos şi introduce i câteva datele prezentate în figur .

b. Crea i tabela sales_info cu structura de mai jos:

c. Scrie i o interogare care s afişeze EMPLOYEE_ID, week_ID şi vânz rile din fiecare zi a s pt mânii (din tabela SALES_SOURCE_DATA). Construi i o transformare astfel încât fiecare rând din tabela SALES_SOURCE_DATA s fie convertit în mai multe înregistr ri pentru tabela SALES_INFO şi afişa i datele ob inute.

11-336

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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 Iaşi Baze de date – lucrări practice SELECT * FROM departments;

Tabela EMPLOYEES DESCRIBE employees

12-338

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice SELECT * FROM employees;

Tabela JOBS DESCRIBE jobs

12-339

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

SELECT * FROM jobs;

Tabela JOB_GRADES DESCRIBE job_grades

SELECT * FROM job_grades;

12-340

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice

Tabela JOB_HISTORY DESCRIBE job_history

SELECT * FROM job_history;

12-341

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări practice Tabela LOCATIONS DESCRIBE locations

SELECT * FROM locations;

Tabela REGIONS DESCRIBE regions

SELECT * FROM regions;

12-342

Facultatea de Automatică şi Calculatoare Iaşi Baze de date – lucrări 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. Cârlig, 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

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF