Sunteți pe pagina 1din 218

CAPITOLUL 1.

TEORIA BAZELOR DE DATE RELAIONALE


1.1. MODELUL RELAIONAL Modelul relaional a fost propus de ctre IBM i a revoluionat reprezentarea datelor fcnd trecerea la generaia a doua de baze de date. Modelul este simplu, are o solid fundamentare teoretic fiind bazat pe teoria seturilor (ansamblurilor) i pe logica matematic. Pot fi reprezentate toate tipurile de structuri de date de mare complexitate, din diferite domenii de activitate. Modelul relaional este definit prin: structura de date, operatorii care acioneaz asupra structurii i restriciile de integritate. 1) Conceptele utilizate pentru definirea structurii de date sunt: domeniul, tabela (relaia), atributul, tuplul, cheia i schema tabelei. Domeniu este un ansamblu de valori caracterizat printr-un nume. El poate fi explicit sau implicit. Tabela/relaia este un subansamblu al produsului cartezian al mai multor domenii, caracterizat printr-un nume, prin care se definesc atributele ce aparin aceleai clase de entiti. Atributul este coloana unei tabele, caracterizat printr-un nume. Cheia este un atribut sau un ansamblu de atribute care au rolul de a identifica un tuplu dintr-o tabel. Tipuri de chei: primare/alternate, simple/comune, externe. Tuplul este linia dintr-o tabel i nu are nume. Ordinea liniilor (tupluri) i coloanelor (atribute) dintr-o tabel nu trebuie s prezinte nici-o importan. Schema tabelei este format din numele tabelei, urmat ntre paranteze rotunde de lista atributelor, iar pentru fiecare atribut se precizeaz domeniul asociat. Schema bazei de date poate fi reprezentat printr-o diagram de structur n care sunt puse n eviden i legturile dintre tabele. Definirea legturilor dintre tabele se face logic construind asocieri ntre tabele cu ajutorul unor atribute de legtur. Atributele implicate n realizarea legturilor se gsesc fie n tabelele asociate, fie n tabele distincte construite special pentru legturi. Atributul din tabela iniial se numete cheie extern iar cel din tabela final este cheie primar. Legturile posibile sunt 1:1, 1:m, m:n. Potenial, orice tabel se poate lega cu orice tabel, dup orice atribute.

Legturile se stabilesc la momentul descrierii datelor prin limbaje de descriere a datelor (LDD), cu ajutorul restriciilor de integritate. Practic, se stabilesc i legturi dinamice la momentul execuiei. 2) Operatorii modelului relaional sunt operatorii din algebra relaional i operatorii din calculul relaional. Algebra relaional este o colecie de operaii formale aplicate asupra tabelelor (relaiilor), i a fost conceput de E.F.Codd. Operaiile sunt aplicate n expresiile algebrice relaionale care sunt cereri de regsire. Acestea sunt compuse din operatorii relaionali i operanzi. Operanzii sunt ntotdeauna tabele (una sau mai multe). Rezultatul evalurii unei expresii relaionale este format dintr-o singur tabel. Algebra relaional are cel puin puterea de regsire a calcului relaional. O expresie din calculul relaional se poate transforma ntr-una echivalent din algebra relaional i invers. Codd a introdus ase operatori de baz (reuniunea, diferena, produsul cartezian, selecia, proiecia, jonciunea) i doi operatori derivai (intersecia i diviziunea). Ulterior au fost introdui i ali operatori derivai (speciali). n acest context, operatorii din algebra relaional pot fi grupai n dou categorii: pe mulimi i speciali. Operatori pe mulimi (R1, R2, R3 sunt relaii (tabele)) sunt: Reuniunea. R3 = R1 R2, unde R3 va conine tupluri din R1 sau R2 luate o singur dat; Diferena. R3 = R1 \ R2, unde R3 va conine tupluri din R1 care nu se regsesc n R2; Produsul cartezian. R3 = R1 R2, unde R3 va conine tupluri construite din perechi (x1x2), cu x1R1 i x2R2; Intersecia. R3 = R1 R2, unde R3 va conine tupluri care se gsesc n R1 i R2 n acelai timp, etc. Operatori relaionali speciali sunt: Selecia. Din R1 se obine o subtabel R2, care va conine o submulime din tuplurile iniiale din R1 ce satisfac un predicat (o condiie). Numrul de atribute din R2 este egal cu numrul de atribute din R1. Numrul de tupluri din R2 este mai mic dect numrul de tupluri din R1. Proiecia. Din R1 se obine o subtabel R2, care va conine o submulime din atributele iniiale din R1 i fr tupluri duplicate. Numrul de atribute din R2 este mai mic dect numrul de atribute din R1. Jonciunea este o derivaie a produsului cartezian, ce presupune utilizarea unui calificator care s permit compararea valorilor

unor atribute din R1 i R2, iar rezultatul n R3. R1 i R2 trebuie s aib unul sau mai multe atribute comune care au valori comune. Algebra relaional este prin definiie neprocedural (descriptiv), iar calculul relaional permite o manier de cutare mixt (procedural/neprocedural). Calculul relaional se bazeaz pe calculul predicatelor de ordinul nti (domeniu al logicii) i a fost propus de E.F. Codd. Predicatul este o relaie care se stabilete ntre anumite elemente i care poate fi confirmat sau nu. Predicatul de ordinul 1 este o relaie care are drept argumente variabile care nu sunt predicate. Variabila poate fi de tip tuplu (valorile sunt dintr-un tuplu al unei tabele) sau domeniu (valorile sunt dintr-un domeniu al unei tabele). Cuantificatorii (operatorii) utilizai n calculul relaional sunt: universal () i existenial (). Construcia de baz n calculul relaional este expresia relaional de calcul tuplu sau domeniu (funcie de tipul variabilei utilizate). Expresia relaional de calcul este format din: operaia de efectuat, variabile (tuplu respectiv domeniu), condiii (de comparaie, de existen), formule bine definite (operanzi-constante, variabile, funcii, predicate; operatori), cuantificatori. Pentru implementarea acestor operatori exist comenzi specifice n limbajele de manipulare a datelor (LMD) din sistemele de gestiune a bazelor de date relaionale (SGBDR). Aceste comenzi sunt utilizate n operaii de regsire (interogare). Dup tehnica folosit la manipulare, LMD sunt bazate pe: calculul relaional (QUEL n Ingres, ALPHA propus de Codd); algebra relaional (ISBL, RDMS); transformare (SQL, SQUARE); grafic (QBE, QBF). Transformarea ofer o putere de regsire echivalent cu cea din calculul i algebra relaional. Se bazeaz pe transformarea (mapping) unui atribut sau grup de atribute ntr-un atribut dorit prin intermediul unor relaii. Rezultatul este o relaie (tabel) care se poate utiliza ntr-o alt transformare. Grafica ofer interactivitate mare pentru constrirea cererilor de regsire. Utilizatorul specific cerea alegnd sau completnd un ecran structurat grafic. Poate fi folosit de ctre toate categoriile de utilizatori n informatic. 3) Restriciile de integritate ale modelului relaional sunt structurale i comportamentale.

Restriciile structurale sunt: Restricia de unicitate a cheii. ntr-o tabel nu trebuie s existe mai multe tupluri cu aceeai valoare pentru ansamblul cheie; Restricia referenial. Intr-o tabel t1 care refer o tabel t2, valorile cheii externe trebuie s figureze printre valorile cheii primare din t2 sau s ia valoarea null (neprecizat); Restricia entitii. Intr-o tabel, atributele din cheia primar nu trebuie s ia valoarea NULL. Cele trei restricii de mai sus sunt minimale. Pe lng acestea, exist o serie de alte restricii structurale care se refer la dependenele dintre date: funcionale, multivaloare, jonciune etc. (sunt luate n considerare la tehnicile de proiectare a bazelor de date relaionale - BDR). Restriciile de comportament sunt cele care se definesc prin comportamentul datelor i in cont de valorile din BDR: Restricia de domeniu. Domeniul corespunztor unui atribut dintro tabel trebuie s se ncadreze ntre anumite valori; Restricii temporare. Valorile anumitor atribute se compar cu nite valori temporare (rezultate din calcule etc.). Restriciile de comportament fiind foarte generale se gestioneaz fie la momentul descrierii datelor (de exemplu prin clauza CHECK), fie n afara modelului la momentul execuiei. Restriciile de integritate suportate de Oracle sunt: NOT NULL nu permite valori NULL n coloanele unei tabele; UNIQUE nu sunt permise valori duplicat n coloanele unei tabele; PRIMARY KEY nu permite valori duplicate sau NULL n coloana sau coloanele definite astfel; FOREIGN KEY presupune ca fiecare valoare din coloana sau setul de coloane defini astfel s aib o valoare corespondent identic n tabela de legtur, tabel n care coloana corespondent este definit cu restricia UNIQUE sau PRIMARY KEY; CHECK elimin valorile care nu satisfac anumite cerine (condiii) logice. Termenul de chei (keys) este folosit pentru definirea ctorva categorii de constrngeri i sunt: primary key, unique key, foreign key, referenced key. Se consider c modelul relaional are o serie de limite cum ar fi: Simplitatea modelului l face dificil de aplicat pentru noile tipuri

de aplicaii (multimedia, internet etc.); Nu asigur o independen logic total a datelor de aplicaie; Poate crete redundana datelor. 1.2. BAZE DE DATE RELAIONALE Bazele de date relaionale (BDR) utilizeaz modelul de date relaional i noiunile aferente. BDR au o solid fundamentare teoretic, n special prin cercetrile de la IBM conduse de E.F.Codd. BDR este un ansamblu organizat de tabele (relaii) mpreun cu legturile dintre ele. Concepte utilizate la organizarea datelor n BDR i respectiv fiiere sunt prezentate n tabelul 1.1. Concepte utilizate n organizarea datelor
Fiiere BDR fiier tabel(relaie) nregistrare tuplu (linie) cmp atribut(coloan) Tabelul 1.1. valori domeniu valori

Avantajele BDR fa de fiiere sunt prezentate n tabelul 1.2. Avantajele BDR


CRITERIU Independena datelor Niveluri de structurare Deschidere i portabilitate Reprezentarea i utilizarea datelor Structura de date se pstreaz BDR logic i fizic conceptual, logic i fizic mare simplificat prin model n dicionarul BDR Tabelul 1.2. FIIERE fizic logic i fizic mic complicat n programe.

Atunci cnd dorim s realizm o baz de date relaional trebuie s tim clar ce avem de fcut, adic s stabilim obiectivele activitii noastre. n acest sens, cteva dintre cele mai importante obiective, le prezentm n continuare: Partiionarea semnific faptul c aceleai date trebuie s poat fi folosite n moduri diferite de ctre diferii utilizatori; Deschiderea se refer la faptul c datele trebuie s fie uor adaptabile la schimbrile care pot aprea (actualizarea structurii, tipuri noi de date etc.); Eficiena are n vedere stocarea i prelucrarea datelor, care trebuie

s se fac la costuri ct mai sczute, costuri care s fie inferioare beneficiilor obinute; Reutilizarea nseamn faptul c fondul de date existent trebuie s poat fi reutilizat n diferite aplicaii informatice; Regsirea este o actvitate frecvent pe bazele de date i de aceea cererile de regsire trebuie s poat fi adresate uor de ctre toate categoriile de utilizatori, dup diferite criterii; Accesul nseamn modul de localizare a datelor i acest lucru trebuie s poat fi realizat prin diferite moduri de acces, rapid i uor; Modularizarea presupune faptul c realizarea BDR trebuie s se poat face modular pentru generalitate i posibilitatea lucrului n echip; Protecia bazei de date trebuie asigurat sub ambele aspecte: securitatea i integritatea datelor; Redundana se asigur n limite acceptabile prin implementarea unui model de date pentru baze de date i prin utilizarea unei tehnici de proiectare a BDR. Se asigur astfel, o redundan minim i controlat; Independena datelor fa de programe trebuie asigurat att la nivel logic ct i i fizic. Bazele de date relaionale au evoluat ca un tip special de aplicaii informatice, i anume cele care au organizarea datelor n memoria extern conform unui model de date specific. De aceea, n metodologia de realizare a BDR se parcurg, n cea mai mare parte, cam aceleai etape ca la realizarea unei aplicaii informatice, cu o serie de aspecte specifice. Pe de alt parte, n literatura de specialitate, sunt diferite propuneri de metodologii de realizare a bazelor de date. innd cont de cele dou aspecte de mai sus, sunt propuse cteva actviviti care trebuie parcurse la realizarea unei baze de date. Aceste activiti vor fi regsite, sub aceeai denumire sau sub denumiri diferite, n majoritatea metodologiilor de realizare a bazelor de date, din literatura de specialitate. Activitile (etapele) parcurse pentru realizarea unei BDR sunt: analiza de sistem, proiectarea noului sistem, realizarea componentelor logice, punerea n funciune, dezvoltarea. 1) Scopul analizei de sistem este de a evidenia cerinele aplicaiei i resursele utilizate (studiul), precum i de a evalua aceste cerine prin modelare (analiza).

Studiul situaiei existente se realizeaz prin: definirea caracteristicilor generale ale unitii, identificarea activitilor desfurate, identificarea resurselor existente (informaionale, umane, energetice, echipamente, financiare etc.), identificarea necesitilor de prelucrare. Analiza este o activitate de modelare (conceptual) i se realizeaz sub trei aspecte: structural, dinamic i funcional. a) Analiza structural evideniaz, la nivel conceptual, modul de structurare a datelor i a legturilor dintre ele. Cea mai utilizat tehnic este entitate-asociere. Aceasta conine: Identificarea entitilor: fenomene, procese, obiecte concrete sau abstracte (substantivele din prezentarea activitii descrise) (exemple de entiti: Persoane, Produse, Beneficiari). Identificarea asocierilor dintre entiti ca fiind legturile semnificative de un anumit tip (verbele din prezentarea activitii descrise). Identificarea atributelor ce caracterizeaz fiecare entitate n parte (exemple de atribute: Marca, Nume, Adres). Stabilirea atributelor de identificare unic a realizrilor entitii, drept chei. Rezultatul analizei structurale este modelul static (structural) numit i diagrama entitate-asociere. Diagrama entitate-asociere (EntityRelationship) poate fi generat cu produse software tip CASE (Computer Aided Software Engineering), ca de exemplu Oracle Designer. Pornind de la o astfel de diagram, se pot construi, n actvitatea de proiectare, schemele relaiilor (tabelelor). b) Analiza dinamic evideniaz comportamentul elementelor sistemului la anumite evenimente. Una din tehnicile utilizate este diagrama stare-tranziie. Aceasta presupune: Identificarea strilor n care se pot afla componentele sistemului. Identificarea evenimentelor care determin trecerea unei componente dintr-o stare n alta. Stabilirea tranziiilor admise ntre stri. Construirea diagramei stare-tranziie. Rezultatul analizei dinamice este modelul dinamic. c) Analiza funcional evideniaz modul de asigurare a cerinelor informaionale (fluxul prelucrrilor) din cadrul sistemului, prin care intrrile sunt transformate n ieiri. Cea mai utilizat tehnic este diagrama de flux al datelor. Conform acestei tehnici se delimiteaz: Aria de cuprindere a sistemului. Se identific sursele de date.

Se identific modul de circulaie i prelucrare a datelor. Se identific apoi rezultatele obinute. Rezultatul analizei funcionale este modelul funcional. 2) Proiectarea structurii bazei de date se face pe baza modelelor realizate n activitatea de analiz. Inainte de proiectarea bazei de date se alege tipul de sistem de gestiune a bazei de date. Alegerea SBGD-ului se face innd cont de dou aspecte: cerinele aplicaiei (utilizatorului) i performanele tehnice ale SGBD-ului. Cerinele aplicaiei se refer la: volumul de date estimat a fi memorat i prelucrat n BDR; complexitatea problemei de rezolvat; ponderea i frecvena operaiilor de intrare/ieire; condiiile privind protecia datelor; operaiile necesare (ncrcare/validare, actualizare, regsire etc.); particularitile activitii pentru care se realizeaz baza de date. Performanele tehnice ale SGBD-ului se refer la: modelul de date pe care-l implementeaz; ponderea utilizrii SGBD-ului pe pia i tendina; configuraia de calcul minim cerut; limbajele de programare din SGBD; facilitile de utilizare oferite pentru diferite categorii de utilizatori; limitele SGBD-ului; optimizrile realizate de SGBD; facilitile tehnice; lucrul cu mediul distribuit i concurena de date; elementele multimedia; instrumentele CASE; interfeele de comunicare; posibilitatea de autodocumentare; instrumentele specifice oferite. Proiectarea BDR se realizeaz prin proiectarea schemelor BDR i proiectarea modulelor funcionale specializate. Schemele bazei de date sunt: conceptual, extern i intern. a) Proiectarea schemei conceptuale pornete de la identificarea setului de date necesar sistemului. Aceste date sunt apoi integrate i structurate ntr-o schem (exemplu: pentru BDR relaionale cea mai utilizat tehnic este normalizarea). Pentru acest lucru se parcurg paii: Stabilirea schemei conceptuale iniiale care se deduce din modelul entitate-asociere (vezi analiza structural). Pentru acest lucru, se transform fiecare entitate din model ntr-o colecie de date (fiier), iar pentru fiecare asociere se definesc cheile aferente. Dac rezult colecii izolate, acestea se vor lega de alte colecii prin chei rezultnd asocieri (1:1, 1:m, m:n). Ameliorarea progresiv a schemei conceptuale prin eliminarea unor anomalii (exemplu: cele cinci forme normale pentru BDR relaionale). Stabilirea schemei conceptuale finale trebuie s asigure un echilibru ntre cerinele de actualizare i performanele de exploatare (exemplu: o form normal superioar asigur

performane de actualizare, dar timpul de rspuns va fi mai mare). Tehnica de normalizare este utilizat n activitatea de proiectare a structurii BDR i const n eliminarea unor anomalii (neajunsuri) de actualizare din structur. Anomaliile de actualizare sunt situaii nedorite care pot fi generate de anumite tabele n procesul proiectrii lor: Anomalia de tergere semnific faptul c stergnd un tuplu dintro tabel, pe lng informaiile care trebuie terse, se pierd i informaiile utile existente n tuplul respectiv; Anomaliile de adugare semnific faptul c nu pot fi incluse noi informaii necesare ntr-o tabel, deoarece nu se cunosc i alte informaii utile (de exemplu valorile pentru cheie); Anomalia de modificare semnific faptul c este dificil de modificat o valoare a unui atribut atunci cnd ea apare n mai multe tupluri. Normalizarea este o teorie construit n jurul conceptului de forme normale (FN), care amelioreaz structura BDR prin nlturarea treptat a unor neajunsuri i prin imprimarea unor faciliti sporite privind manipularea datelor. Normalizarea utilizeaz ca metod descompunerea (top-down) unei tabele n dou sau mai multe tabele, pstrnd informaii (atribute) de legtur. FN1. O tabel este n FN1 dac toate atributele ei conin valori elementare (nedecompozabile), adic fiecare tuplu nu trebuie s aib date la nivel de grup sau repetitiv. Structurile de tip arborescent i reea se transform n tabele cu atribute elemntare. O tabel n FN1 prezint nc o serie de anomalii de actualizare datorit eventualelor dependene funcionale incomplete. Fiecare structur repetitiv genereaz (prin descompunere) o nou tabel, iar atributele la nivel de grup se nltur, rmnnd doar cele elemntare. FN2. O tabel este n FN2 dac i numai dac este n FN1 i fiecare atribut noncheie al tabelei este dependent funcional complet de cheie. Un atribut B al unei tabele depinde funcional de atributul A al aceleiai tabele, dac fiecrei valori a lui A i corespunde o singur valoare a lui B, care i este asociat n tabel. Un atribut B este dependent funcional complet de un ansamblu de atribute A n cadrul aceleiai tabele, dac B este dependent funcional de ntreg ansamblul A (nu numai de un atribut din ansamblu). O tabel n FN2 prezint nc o serie de anomalii de actualizare, datorit eventualelor dependene tranzitive.

Eliminarea dependenelor incomplete se face prin descompunerea tabelei iniiale n dou tabele, ambele coninnd atributul intermediar (B). FN3. O tabel este n FN3 dac i numai dac este n FN2 i fiecare atribut noncheie depinde n mod netranzitiv de cheia tabelei. ntr-o tabel T, fie A,B,C trei atribute cu A cheie. Dac B depinde de A (A B) i C depinde de B (B C) atunci C depinde de A n mod tranzitiv. Eliminarea dependenelor tranzitive se face prin descompunerea tabelei iniiale n dou tabele, ambele coninnd atributul intermediar (B). O tabel n FN3 prezint nc o serie de anomalii de actualizare, datorate eventualelor dependene multivaloare. O definiie mai riguroas pentru FN3 a fost dat prin forma intermediar BCNF (Boyce Codd Normal Form): o tabel este n BCNF dac fiecare determinant este un candidat cheie.Determinantul este un atribut elementar sau compus fa de care alte atribute sunt complet dependente funcional. FN4. O tabel este n FN4 dac i numai dac este n FN3 i nu conine dou sau mai multe dependene multivaloare. ntr-o tabel T, fie A,B,C trei atribute. n tabela T se menine dependena multivaloare A dac i numai dac mulimea valorilor lui B ce corespunde unei perechi de date (A,C), depinde numai de o valoare a lui A i este independent de valorile lui C. FN5. O tabel este n FN5 dac i numai dac este n FN4 i fiecare dependen jonciune este generat printr-un candidat cheie al tabelei. n tabela T (A,B,C) se menine dependena jonciune (AB, AC) dac i numai dac T menine dependena multivaloare A -->> B sau C. Dependena multivaloare este caz particular al dependenei jonciune. Dependena funcional este caz particular al dependenei multivaloare. b) Proiectare schemei externe are rolul de a specifica viziunea fiecrui utilizator asupra BDR. Pentru acest lucru, din schema conceptual se identific datele necesare fiecrei viziuni. Datele obinute se structureaz logic n subscheme innd cont de facilitile de utilizare i de cerinele utilizator. Schema extern devine operaional prin construirea unor viziuni (view) cu SGBD-ul i acordarea drepturilor de acces. Datele ntr-o viziune pot proveni din una sau mai multe colecii i nu ocup spaiul fizic. c) Proiectarea schemei interne presupune stabilirea structurilor de memorare fizic a datelor i definirea cilor de acces la date. Acestea sunt specifice fie SGBD-ului (scheme de alocare), fie sistemului de operare. Proiectarea schemei interne nseamn estimarea spaiului fizic pentru BDR, definirea unui model fizic de alocare (a se vedea dac SGBD-ul permite explicit acest lucru) i definirea unor indeci pentru accesul direct, dup

cheie, la date. Proiectarea modulelor funcionale ine cont de concepia general a BDR, precum i de schemele proiectate anterior. n acest sens, se proiecteaz fluxul informaional, modulele de ncrcare i manipulare a datelor, interfeele specializate, integrarea elementelor proiectate cu organizarea i funcionarea BDR. 3) Realizarea componentelor logice. Componentele logice ale unei BD sunt programele de aplicaie dezvoltate, n cea mai mare parte, n SGBD-ul ales. Programele se realizeaz conform modulelor funcionale proiectate n etapa anterioar. Componentele logice in cont de ieiri, intrri, prelucrri i coleciile de date. n paralel cu dezvoltarea programelor de aplicaii se ntocmesc i documentaiile diferite (tehnic, de exploatare, de prezentare). 4) Punerea n funciune i exploatarea. Se testeaz funciile BDR mai nti cu date de test, apoi cu date reale. Se ncarc datele n BDR i se efectueaz procedurile de manipulare, de ctre beneficiar cu asistena proiectantului. Se definitiveaz documentaiile aplicaiei. Se intr n exploatare curent de ctre beneficiar conform documentaiiei. 5) Dezvoltarea sistemului. Imediat dup darea n exploatare a BDR, n mod continuu, pot exista factori perturbatori care genereaz schimbri n BDR. Factorii pot fi: organizatorici, datorai progresului tehnic, rezultai din cerinele noi ale beneficiarului, din schimbarea metodologiilor etc. 1.3. DEFINIREA SISTEMULUI DE GESTIUNE A BAZELOR DE DATE RELAIONALE (SGBDR) Teoria relaional, foarte bine pus la punct ntr-un domeniu de cercetare distinct, a dat o fundamentare solid realizrii de SGBD-uri performante. La sfritul anilor 80 i apoi n anii 90 au aprut, n special o dat cu ptrunderea n mas a microcalculatoarelor, numeroase SGBDR-uri. Aceasta a nsemnat o evoluie de la SGBD-urile de generaia nti (arborescente i reea) spre cele de generaia a doua (relaionale). Aceast evoluie s-a materializat, n principal n: oferirea de limbaje de interogare neprocedurale, mbuntirea integritii i securitii datelor, optimizarea i simplificarea acceselor. Teoria relaional este un ansamblu de concepte, metode i instrumente care a dat o fundamentare riguroas realizrii de SGBDR performante. Paralela ntre conceptele utilizate n evoluia organizrii datelor n memoria extern pn la sistemele relaionale este prezentata in tabelul 1.3:

Tabelul 1.3 FIIERE Fiier nregistrare Cmp Valoare TEORIA BD Colecie de date Familie de caracteristici Caracteristic Domeniu de valori TEORIA RELAIONAL Relaie Tuplu Atribut Domeniu SGBDR Tabela Linie Coloan Domeniu

Regulile lui Codd E.F. Codd (cercettor la IBM) a formulat 13 reguli care exprim cerinele maximale pentru ca un SGBD s fie relaional. Regulile sunt utile pentru evoluarea performanelor unui SGBDR. Acestea sunt: R0. Gestionarea datelor la nivel de relaie: limbajele utilizate trebuie s opereze cu relaii (unitatea de informaie). R1. Reprezentarea logic a datelor: toate informaiile din BDR trebuie stocate i prelucrate ca tabele. R2. Garantarea accesului la date: LMD trebuie s permit accesul la fiecare valoare atomic din BDR (tabel, coloan, cheie). R3. Valoarea NULL: trebuie s se permit declararea i prelucrarea valorii NULL ca date lips sau inaplicabile. R4. Metadatele: informaiile despre descrierea BDR se stocheaz n dicionar i trateaz ca tabele ,la fel ca datele propiu-zise. R5. Limbajele utilizate: SGBDR trebuie s permit utilizarea mai multor limbaje, dintre care cel puin unul s permit definirea tabelelor (de baz i virtuale), definirea restriciilor de integritate, manipularea datelor, autorizarea accesului, tratarea tranzaciilor. R6. Actualizarea tabelelor virtuale: trebuie s se permit ca tabelele virtuale s fie i efectiv actualizabile, nu numai teoretic actualizabile (exemplu atributul valoare dintr-o tabel virtual nu poate fi actualizat). R7. Actualizrile n baza de date: manipularea unei tabele trebuie s se fac prin operaii de regsire dar i de actulizare. R8. Independena fizic a datelor: schimbarea stucturii fizice a datelor (modul de reprezentare (organizare) i modul de acces) nu afecteaz programele. R9. Independena logic a datelor: schimbarea structurii de date (logice) a tabelelor nu afecteaz programele. R10. Restriciile de integritate: acestea, trebuie s fie definite prin LDD i stocate n dicionarul (catalogul) BDR. R11. Distribuirea geografic a datelor: LMD trebuie s permit ca

programele de aplicaie s fie aceleai att pentru date distribuite ct i petru date centralizate (alocarea i localizarea datelor vor fi n sarcina SGBDRului). R12. Prelucrarea datelor la nivel de baz (sczut): dac SGBDR posed un limbaj de nivel sczut (prelucrarea datelor se face la nivel de nregistrare), acesta nu trebuie utilizat pentru a evita restriciile de integritate. Regulile lui Codd pot fi grupate, conform cerinelor exprimate n cinci categorii, conform tabelului 1.4.

Tabelul 1.4. Gruparea regulilor lui Codd R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 1.Reguli de baz (funda- da da mentale) 2.Reguli da da structurale 3.Reguli privind da da integritatea datelor 4.Reguli privind da da da da manipularea datelor 5.Reguli privind da da da independena datelor Regulile lui Codd sunt greu de indeplinit n totalitate de ctre SGBDR. Pornind de la cele 13 reguli de mai sus, au fost formulate o serie de criterii (cerine) pe care trebuie s le ndeplineasc un SGBD pentru a putea fi considerat relaional ntr-un anumit grad. S-a ajuns astfel, la mai multe grade de relaional pentru SGBDR: cu interfa relaional (toate datele se reprezint n tabele, exist operatorii de selecie, proiecie i jonciune doar pentru interogare), pseudorelaional (toate datele se reprezint n tabele, exist operatorii de selecie, proiecie i jonciune fr limitri), minimal relaional (este pseudorelaional i n plus, operaiile cu tabele nu fac apel la pointeri observabili de utilizatori), complet relaional (este minimal relaional i n plus, exist operatorii de reuniune, intersecie i diferen, precum i restriciile de integritate privind unicitatea cheii i restricia referenial). n concluzie, SGBDR este un sistem software complet care implementez modelul de date relaional i respect cerinele impuse de acest model. El este o interfa ntre utilizatori i baza de date.

1.4. CARACTERIZAREA SGBDR Sistemele relaionale ndeplinesc funciile unui SGBD cu o serie de aspecte specifice care rezult din definirea unui SGBDR. Caracterizarea SGBDR se poate face pe dou niveluri: global (sistemele relaionale sunt privite ca o categorie distinct de SGBD) i particular (fiecare SGBDR are aspecte individuale comparativ cu altele similare). A. Mecanismele i instrumentele care ajut la caracterizarea global a SGBDR-urilor sunt: limbajele relaionale, protecia datelor, optimizarea cererilor de regsire, utilitarele specializate. 1) Limbajele relaional SGBDR ofer seturi de comenzi pentru descrierea i manipularea datelor. Acestea pot fi incluse ntr-un singur limbaj relaional (SQL, QUEL, QBE, SQUARE, ALPHA, ISBL) sau separate n LDD i LMD. n ambele situaii, comenzile pentru definirea datelor sunt distincte de cele pentru manipularea datelor. Limbajele relaionale de definire a datelor (LDD) sunt simplificate, cu puine comenzi. Descrierea datelor este memorat n BDR, sub form de tabele, n dicionarul (metabaza) bazei de date. Faciliti de descriere sunt prezente n SGBDR prin comenzi, care definesc anumite operaii, la nivelurile: conceptual, logic, fizic. Limbajele relaionale de manipulare a datelor (LMD) pot fi caracterizate dup criterii generale, funcionale i calitative. a) Caracterizarea general a LMD se face dup modul de tratare a datelor, operatorii relaionali, realizatorii i utilizatorii limbajului. Modul de tratare a datelor. Toate LMD relaionale realizeaz o tratare la nivel de ansamblu a datelor: unitatea de informative pentru lucru este tabela. Avantajele sunt date de posibilitatea gestionrii automat a tuplurilor duplicate i prelucrarea paralel a ansamblurilor. La comunicarea unui LMD relational cu un limbaj universal, avantajele se pierd deoarece comunicarea se poate face doar tuplu cu tuplu i nu la nivel de ansamblu. Deoarece limbajele universale ofer alte avantaje legate de proceduralitate, soluia este de a integra n acestea un limbaj relaional. Cursorul este soluia n SGBDR pentru a face trecerea de la tratarea la nivel de ansamblu la cea la nivel de nregistrare (tuplu). Operatorii relaionali implementai. SGBDR s-au dezvoltat, din punct de vedere relaional, avnd la baz calculul relaional orientat pe tuplu (ALPHA, QUEL), calculul relaional orientat pe domeniu (QBE), algebra relaional (ISBL), transformarea (mapping) (SQL, SQUARE). Limbajele bazate pe calculul relaional sunt neprocedurale, cele bazate pe algebra

relaional sunt procedurale, celelalte sunt combinaii. Realizatorii limbajelor relaionale s-au orientat pe domenii precise din teoria relaional. Astfel, au rezultat: limbaje relaionale standardizate internaional (exemplu SQL - ANSI), limbaje cu standard de utilizare impus de constructor (exemplu QUEL), limbaje nestandardizate (celelalte limbaje relaionale). Utilizatorii limbajelor relaionale sunt mult diversificai. SGBDR ofer att elemente procedurale (pentru specialiti) ct i neprocedurale (pentru nespecialilti). b) Caracterizarea funcional a LMD se face dup facilitile de interogare, actualizare a datelor, etc. Facilitile de interogare a datelor. Acestea sunt puternice i oferite prin comenzi pentru interogarea tabelelor de baz (exemplu SELECT) i interogarea tabelelor virtuale (exemplu SELECT). Facilitile de actualizare a datelor. Acestea se refer la actualizarea tabelelor de baz i a tabelelor virtuale prin comenzile: INSERT INTO (adaug rnduri la sfritul unei tabele); UPDATE ( modific rnduri dintr-o tabel); DELETE FROM (terge rnduri dintr-o tabel). Unele SGBDR nu permit actualizarea tabelelor virtuale (exemplu Foxpro), altele permit acces lucru cu o serie de restricii pentru ca operaia s se propage spre tabelele de baz fr ambiguiti (exemplu DB2, Oracle). Alte faciliti funcionale. La facilitile relaionale de mai sus, SGBDR-urile ofer i alte faciliti pe care le au toate limbajele de programare procedurale cum sunt: calculul aritmetic prin operatorii specifici (+, -, *, /, **); agregarea prin funcii standard (SUM) i prin comenzi (COMPUTE OF expr ); comenzi de intrare/ieire standard (ACCEPTPROMPT). c) Caracterizarea calitativ a LMD se face dup puterea selectiv, uurina de nvare, utlizare i eficiena limbajului. Puterea selectiv a LMD relaionale este dat de posibilitatea selectrii datelor dup criterii (filtre) complexe (exemplu comanda SELECT). Uurina de nvare i utilizare este nuanat n funcie de tipul LMD-ului relaional. Cele bazate pe calculul relaional sunt neprocedurale (descriptive), deci uor de nvat i utilizat (apropiat, ca stil, de limbajul natural) (exemplu QUEL) iar cele bazate pe algebra relaional sunt procedurale (algoritmice), deci mai greu de nvat i utilizat (exemplu ISBL). Cele intermediare promoveaz stilul neprocedural dar accept i elemente de control procedural (exemplu SQL) iar cele bazate pe grafic ofer primitive grafice pentru machetarea cererilor de regsire, deci uor de utilizat (exemplu QBE).

Eficiena utilizrii este determinat de posibilitatea optimizrii cererilor de regsire. LMD bazate pe calculul relaional las compilatorul s aleag ordinea de execuie a operaiilor, deci rezult o eficiena mare. LMD bazate pe algebra relaional au o ordine impus pentru execuia operaiilor, deci rezult o eficien mica. 2) Protecia datelor Aspectele privind protecia datelor sunt foarte importante pentru un sistem de baz de date i ele trebuie implementate de ctre SGBDR. Protecia bazei de date se refer la integritatea datelor (integritatea semantic, concurena la date, salvarea/restaurarea) i securitatea datelor (autorizarea accesului, viziunile, procedurile speciale, criptarea). a) Integritatea semantic. Definirea restriciilor de integritate se face, conform cerinelor modelului relaional, n LDD (exemplu CREATE TABLE, ALTER TABLE). Utilizarea restriciilor de integritate se face cu ajutorul unor mecanisme care controleaz validitatea regulilor pentru fiecare nou stare a BD. Aceste mecanisme sunt metode de detectare a inconsistenei datelor (se verific restrciiile de integritate) la sfritul tranzaciilor, care se realizeaz automat de SGBDR i puncte de verificare a integritii fixate de utilizator, acolo unde dorete el n program. b) Concurena la date (coerena). Unitatea de lucru pentru asigurarea coerenei datelor este tranzacia. Aceasta este un ansamblu de comenzi tratate unitar. Tranzacia se execut n totalitate sau deloc. Coerena poate fi afectat la actualizarea concurent sau la incidente. Mecanismele utilizate de SGBDR pentru asigurarea coerenei datelor (controlul accesului concurent) sunt: Blocarea la diferite niveluri: baz de date, tabel, tuplu, atribut; Definirea unor puncte de salvare n interiorul tranzaciilor (exemplu comanda savepoint); Tranzacii explicite (begin i end transaction) i implicite (comenzile de actualizare); Fiiere jurnal. 3) Optimizarea regsirii Cererile de regsire se exprim n SGBDR n diferite limbaje relaionale. Pentru a se obine un rezultat optim, se utilizeaz interfee automate de rescriere a cererilor de regsire, prin parcurgerea a doi pai: Exprimarea cererilor de regsire sub forma unor expresii algebrice relaionale, care are la baz echivalena dintre calculul i algebra relaional . Aplicarea unor transformri algebrice relaionale asupra expresiilor construite n pasul anterior, pentru a se obine expresii

relaionale echivalente i eficiente. Transformarea se poate realiza prin doua strategii de optimizare: generale, specifice. Strategiile generale sunt independente de modul de memorare a datelor. Ele se bazeaz pe propietile operaiilor din algebra relaional (comutativitatea, asociativitatea, compunerea ). Astfel de strategii sunt: selecia naintea jonciunii, proiecia naintea jonciunii, selecia naintea proieciei, combinarea seleciei multiple. Strategiile specifice in cont de modul de memorare a datelor i ele sunt caracteristice unui SGBDR. Elementele care influeneaz executarea operaiilor ce intervin la o cerere de regsire sunt: accesul direct, reguli de ordonare a expresiilor algebrice specifice unui SGBDR. 4) Utilitarele specializate Posibilitatile de utilizare ale unui SGBDR sunt influenate de utilitarele specializate pe care le are, pentru diferitele categorii de utilizatori (n Oracle: Developer pentru dezvoltatori, Designer pentru analiti, Administration Tools i Utilities pentru administrator etc.). B. Pentru a face o caracterizare particular,un anumit SGBDR vom lua n considerare o serie de criterii de comparaie. Aceste criterii se vor urmri, grupate pe anumite categorii, pentru cteva SGBDR-uri care ne intereseaz. Dup aceast analiz vom avea un argument serios pentru a putea alege un SGBDR n scopul dezvoltrii unei aplicaii cu baze de date. Gruparea caracteristicilor particulare de comparaie a SGBDR-urilor o vom face n funcie de facilitile de descriere, manipulare, utilizare i administrare a datelor. Caracteristicile n funcie de facilitile de descriere sunt: modul de implementare a modelului relaional; conceptul de baz de date utilizat n schem; definirea metadatelor; definirea relaiilor virtuale; actualizarea schemei relaiei; restriciile de integritate ce pot fi declarate. Caracteristicile n funcie de facilitile de manipulare sunt: LMD relaional implementat; funciile de calcul aritmetic i funciile agregate; modurile de acces la date; programarea orientat-obiect; tratarea valorii NULL; optimizarea cererilor de regsire; actualizarea relaiilor de baz i virtuale. Caracteristicile n funcie de facilitile de utilizare i administrare sunt: instrumentele de dezvoltare; instrumentele CASE; instrumentele analize statistice; software-ul pentru acces de la distan; utilitarele de ntreinere; mecanismele pentru autorizarea accesului la date.

1.5. EXEMPLE DE SISTEME DE GESTIUNE A BAZELOR DE DATE RELAIONALE

Oracle. Este realizat de firma Oracle Corporation USA. Sistemul este complet relaional, robust, se bazeaz pe SQL standard extins. Arhitectura sistemului este client/server, permnd lucrul, cu obiecte i distribuit. Are BD Internet i modul de optimizare a regsirii. Ultima versiune este Oracle 10g. DB2. Este realizat de firma IBM. Sistemul respect teoria relaional, este robust i se bazeaz pe SQL standard. Permite lucrul distribuit i are modul de optimizare a regsirii. Informix. Este realizat de firma Informix, respect teoria relaional i permite lucru distribuit. Progress. Este realizat de firma Progress Software. Are limbaj propriu (Progress 4GL) dar suport i SQL. Ruleaz pe o gam larg de calculatoare sub diferite sisteme de operare. SQL Server. Este realizat de firma Microsoft. Se bazeaz pe SQL i ruleaz n arhitectura client/server. Ingress II. Este realizat de firma Computer Associates. Este un SGBDR complet, implementeaz dou limbaje relaionale (nti QUEL i apoi SQL) i este suportat de diferite sisteme de operare (Windows, UNIX). Lucreaz distribuit n arhitectura client/server, are extensie cu faciliti orientate obiect i permite aplicaii de tip Internet. Organizarea fizic a tabelelor se face prin sistemul de operare. Visual FoxPro. Este realizat de firma Microsoft. Are un limbaj procedural propiu foarte puternic, o extensie orientat obiect, programare vizual i nucleu extins de SQL. Access. Este realizat de firma Microsoft. Se bazeaz pe SQL, are limbajul procedural gazd (Basic Access) i instrumente de dezvoltare. Paradox. Este realizat de firma Borland. Are limbaj procedural propiu (PAL) i suport SQL.

CAPITOLUL 2. FACILITATILE SI ARHITECTURA SISTEMULUI ORACLE


2.1. EVOLUIA I FACILITILE SISTEMULUI ORACLE Oracle este un sistem de gestiune a bazelor de date complet relaional, extins, cu faciliti din tehnologia orientat obiect (OO). Sistemul Oracle este realizat de firma Oracle Corporation care a fost nfiinat n anul 1977 n SUA - California i acum este cel mai mare furnizor de software de gestiunea datelor. Acesta este operaional pe toat gama de calculatoare (micro, mini, mainframe) sub diverse sisteme de operare. Prima versiune de SGBD Oracle a fost realizat la sfritul anilor '70 respectnd teoria relaional. n cadrul sistemului a fost implementat de la nceput limbajul relaional SQL pe care l-a dezvoltat ulterior fa de versiunea standard rezultnd SQL*Plus. ncepnd cu versiunea 5.0 SGBD Oracle are urmtoarele faciliti suplimentare: funcioneaz n arhitectura client/server; are limbaj procedural propriu PL/SQL; are precompilatoare ca interfa cu limbajele universale. n iunie 1997 s-a lansat SGBD Oracle versiunea 8.0, inclusiv n Romnia, care a marcat o nou generaie de baze de date Oracle deoarece iniiaz trecerea de la arhitectura client/server la arhitectura NC (Network Computing), are o mare deschidere, are optimizri performante i pune accent mai mare pe analiz (modelare-funcionalitate) fa de programare (codificare). n noiembrie 1998 s-a lansat SGBD Oracle 8i ca sistem de baze de date pe Internet. Aceast versiune are urmtoarele caracteristici: Este reproiectat arhitectural n mod fundamental i se ncadreaz n tendina de trecere de la arhitectura client/server la arhitectura NC; Permite dezvoltarea unei baze de date de orice dimensiune, n mod centralizat sau distribuit; Are faciliti de salvare/restaurare automate i inteligente; Permite partiionarea integral pentru tabele i indeci; Are mesagerie integral, prin comunicarea ntre aplicaii i procesare offline (chiar dac aplicaiile nu sunt conectate); Prelucrarea paralel pentru: replicare, cereri de regsire, actualizare; Ofer faciliti din tehnologia OO, prin care se permite definirea

i utilizarea de obiecte mari i complexe; Optimizeaz cererile de regsire prin reutilizarea comenzilor SQL identice lansate de utilizatori diferii i prin realizarea unui plan de execuie a instruciunilor SQL; Are un grad de securitate sporit prin: server de criptare, control trafic reea, niveluri de parolare etc.; Permite lucrul cu depozite de date (Data Warehouse) care conin date multidimensionale (cu tehnologia OLAP); Conine foarte multe produse ceea ce-l face s fie o platform pentru baze de date: servere (Oracle 8, Application, Security, Internet Commerce etc), instrumente (Designer, Developer, Express, WebDB etc), aplicaii (Financials, Projects, Market Manager, Manufacturing etc); Este primul SGBD pentru Internet cu server Java inclus; Reduce drastic costurilor pentru realizarea unei aplicaii(de cca 10 ori fa de versiunea anterioar); Este o platform multipl permind lucrul pe orice calculator, orice sistem de operare, orice aplicaie, orice utilizator; Are instrumente diverse pentru dezvoltarea aplicaiilor: bazate pe modelare (Designer, Developer, Application Server), bazate pe componente (Java), bazate pe HTML (browsere, editoare Web) i XML, prin programare: proceduri stocate (PL/SQL, Java), obiecte standard, obiecte ODBC, obiecte JDBC, fraze SQL etc., tip internet (WebDB); Ofer servicii multiple de Internet (Web, E_mail, e_bussines, etc) integrate cu servicii Intranet. Ulterior a fost lansat sistemul Oracle 9i care a marcat trecerea la o nou generaie de servicii internet. El este mai mult dect un suport pentru baze de date deoarece ofer o infrastructur complet de software pentru afaceri electronice (e-business) i ruleaz pe o varietate de sisteme de calcul i de operare: SUN-SOLARIS, HP-UX, IBM-AIX, PC_WINDOWS, XXLINUX. Componenta Oracle WebDB a evoluat n Oracle Portal. Oracle 9i DATABASE are fa de versiunea anterioar asigur o protecie ridicat i automatizat iar costul administrrii bazei de date scade n mod drastic. Oracle 9i REAL APPLICATION CLUSTERS (RAC) se bazeaz pe o nou arhitectur de BD numit mbinare ascuns (Cache Fusion). Aceasta este o nou generaie de tehnologie de clustere. Conform acestei arhitecturi la adugarea unui calculator nr-o reea cu BD Oracle, clusterele se adapteaz automat la noile resurse, fr s fie necesar redistribuirea datelor

sau rescrierea aplicaiei. Posibilitatea apariiei unei erori la o configuraie cu 12 calculatoare sub Oracle 9i RAC este foarte mic, esimat ca durat n timp la cca 100.000 de ani. n Oracle 9i APPLICATION SERVER se pot creea i utiliza aplicaii Web care sunt foarte rapide i permit integrarea serviciilor de Internet. Oracle 9i DEVELOPER SUITE este un mediu complet pentru dezvoltarea aplicaiilor tip afaceri electronice (e-business) i tip Web. El se bazeaz pe tehnologiile Java i XML i permite personalizarea (Oracle Personalization). n anul 2003 a fost lansat versiunea Oracle 10g care adaug noi faciliti sistemului Oracle 9i. 2.2. ARHITECTURA SISTEMULUI ORACLE Componentele care formeaz arhitectura de baz Oracle (vezi fig.2.1) sunt dispuse ntr-o configuraie client/server. Aceste componente sunt plasate pe calculatoare diferite ntr-o reea asigurnd funcionaliti specifice, astfel: serverul asigur memorarea i manipularea datelor, precum i administrarea bazei de date iar clientul asigur interfaa cu utilizatorul i lanseaz aplicaia care acceseaz datele din baza de date.

Figura 2.1 Arhitectura Oracle

Arhitectura Oracle se ncadreaz n tendinele actuale i anume este structurat pe trei niveluri: nucleul, interfeele i instrumentele de ntreinere. Nucleul Oracle conine componentele care dau tipul relaional pentru SGBD Oracle: limbajul relaional de regsire SQL i limbajul procedural propriu PL/SQL. Sistemul Oracle creeaz i ntreine automat dicionarul de date. Acesta face parte din baza de date Oracle i conine un set de tabele i viziuni (vederi) accesibile utilizatorilor doar n consultare. Dicionarul conine informaii de tipul: numele utilizatorilor autorizai, drepturile de acces, numele obiectelor din baza de date, structurile de date, spaiul ocupat de date, chei de acces etc. Interfeele sunt componentele care permit dezvoltarea aplicaiilor cu BD, astfel: DEVELOPER SUITE este componenta destinat dezvoltatorilor (programatorilor) de aplicaii. Conine generatoarele FORMS (meniuri i videoformate), REPORTS (rapoarte i grafice), JDEVELOPER; DESIGNER este component destinat analitilor/proiectanilor de aplicaii. Ofer elemente de CASE pentru proiectarea aplicaiilor cu BD; PRO*C este componenta destinat programatorilor n limbajele de programare universale (FORTRAN, COBOL, Pascal, C, ADA, PL1); DATAWAREHOUSE BUILDER este destinat analizei datelor multidimensionale, folosind tehnologia de tip OLAP (On Line Analitical Processing); ORACLE APPLICATIONS permite dezvoltarea unor aplicaii de ntreprindere (Financials, Manufacturing, Projects etc.); Instrumentele sunt componente destinate ntreinerii i bunei funcionri a unei BD Oracle. ENTERPRISE MANAGER CONSOLE conine mai multe utilitare destinate administratorului BD (deschidere/nchidere BD, autorizarea accesului, refacerea BD, conversii de date, etc.). 2.3. ORACLE SERVER Oracle Server (OS) permite managementul informaiilor organizate n baze de date, astfel nct se asigur accesul mai multor utilizatori n mod concurenial la acelai date, oferind faciliti de prevenire a accesului

neautorizat i de restaurare a datelor dup producerea unor erori. OS are urmtoarele faciliti: Client/server permite ca prelucrrile s fi mprite ntre serverul de baze de date i programele de aplicaie ale utilizatorilor aflate pe staiile conectate la server; Suport lucrul cu baze de date foarte mari; Permite utilizarea concurenial a bazelor de date; Ofer securitate sporit i integritatea datelor; Permite lucrul distribuit; Confer portabilitate aplicaiilor; Permite ca mai multe tipuri de calculatoare i sisteme de operare s coexiste pe aceeai reea. Oracle Server este un sistem relaional-obiectual de management a bazelor de date, care permite o abordare deschis, integrat i cuprinztoare a managementului informaiilor. OS const dintr-un cuplu format dintr-o baz de date i o instan Oracle. A. O baz de date Oracle este o colecie unitar de date, avnd o structur logic i una fizic putnd avea dou stri: open (accesibil) i close (inaccesibil). 1) Structura logic ale unei baze de date este format din tabelele spaiu (tablespaces), schema de obiectelor bazei de date, blocurile de date, extensiile i segmentele. Tabelele spaiu sunt unitile logice de memorie n care este mprit o baz de date i pot fi tabele spaiu de sistem i tabele spaiu de utilizator. Din punct de vedere al accesibilitii aceste pot fi on line i off line. Fiierele de date sunt structurile de memorie specifice unui sistem de operare pe care rezid tabelele spaiu ale unei baze de date. Schema este o colecie de obiecte, iar schema de obiecte este o structur logic ce se refer direct la datele unei baze de date(tabele, vederi, secvene, proceduri memorate, sinonime, indeci, clustere i link-uri de baz de date). Blocurile de date, extensiile i segmentele sunt elemente de control eficient al spaiului de memorie extern pe disc aferent unei baze de date. Blocul de date este unitatea de memorie cea mai mic manipulat de SGBD Oracle, iar mrimea acestuia msurat n bytes se definete la momentul creerii bazei de date. Extensia este format din mai multe blocuri de date contigue.

Segmentul este format din mai multe extensii. Segmentele pot fi: segmente de date (pentru memorarea datelor unei tabele), segmente de indeci, segmente roollback (folosite pentru memorarea informaiilor necesare pentru recuperarea datelor unei baze de date sau anularea unei tranzacii) i segmente temporare (folosite pentru prelucrarea instruciunilor SQL). 2) Structura fizic este definit de un set de fiiere specifice sistemului de operare pe care rezid SGBD Oracle, folosite pentru memorarea structurilor logice ale bazei de date i pentru pstrarea unor informaii tehnice de control. Aceste fiiere sunt: fiiere de date (Data files), fiiere Redo log (Redo Log files) i fiiere de control (Control files). Fiierele de date (Data files) conin datele unei baze de date, sub forma structurilor logice ale acesteia (tabele, vederi, secvene, proceduri memorate, sinonime, indeci, clustere i link-uri de baz de date). Fiierele de date au urmtoarele caracteristici: un fiier de date poate aparine unei singure baze de date, pot fi extinse automat n anumite momente specifice ale funcionrii bazei de date, unul sau mai multe fiiere de date pot memora o tabel spaiu. Fiierele Redo Log (Redo Log files) sunt folosite pentru memorarea tuturor schimbrilor de date produse asupra unei baze de date, astfel nct dac se ntmpl o cdere de curent s se previn distrugerea datelor bazei de date. Se pot folosi simultan mai multe fiiere de acest fel care s rezide pe discuri diferite. Fiierele de control (Control files) sunt folosite pentru memorarea informaiilor necesare pentru controlul structurii fizice a unei baze de date (numele bazei de date, numele i locaiile fiierelor de date, data creerii bazei de date etc). B. Instana Oracle (Oracle instance) este combinaia logic dintre structurile de memorie intern (SGA - system global area, PGA - program global area) i procesele Oracle de baz activate la momentul pornirii unei baze de date. 1) SGA este o regiune partajabil de memorie care conine datele i informaiile necesare unei instane Oracle i conine: Database Buffer Cache (conine blocurile de date cele mai recent utilizate pentru a reduce utilizarea discului); Redo Log Buffer (conine datele despre blocurile modificate); Shared Pool (pentru prelucrarea instruciunilor SQL); Cursorii (Statement Handles or Cursores) folosii pentru manipularea instruciunilor unui limbaj gazd folosind facilitatea Oracle Call Interface.

2) PGA este zona de memorie care conine datele i informaiile de control ale unui proces server. 3) Procesul este un mecanism al sistemului de operare care poate executa o serie de pai (instruciuni). Este cunoscut i sub numele de job sau task. Procesul are propria sa zon de memorie n care se execut. Un server Oracle are dou tipuri de procese: procese utilizator i procese Oracle. Procesul utilizator (user proces) este creat i meninut pentru a executa codul de program aferent unui anumit limbaj (C++) sau un produs Oracle (Oracle tool), SQL*Forms, Sql*Graphics etc. Procesul Oracle este apelat de ctre un alt proces pentru a executa funcia cerut de ctre acesta. Procesele Oracle sunt Procese server i procese background. Procesele server (Server Processes) sunt utilizate de Oracle pentru a prelucra cererile proceselor utilizator. Oracle poate fi configurat astfel nct s permit unul sau mai multe procese utilizator. Din acest punct de vedere avem servere dedicate care au un singur proces utilizator i servere multi prelucrare (multi-threaded server configuration). Pe anumite sisteme procesele utilizator i procesele server sunt separate, iar n altele sunt combinate ntr-unul singur. Dac folosim sistemul multi prelucrare sau dac procesele utilizator i procesele server se afl pe maini diferite atunci aceste procese trebuie s fie separate. Sistemul client/server separ procesele utilizator de ctre procesele server i le execut pe maini diferite. Procesele background (Background processes) sunt create pentru fiecare instan Oracle pentru a executa asincron anumite funcii. Acestea sunt: Database Writer (DBWR) scrie datele modificate n baza de date; Log Writer (LGWR) scrie nregistrrile redo log pe disc; Checkpoint (CKPT) scrie nregistrrile checkpoint la timpul potrivit ; System Monitor (SMON) execut recuperarea unei instane la momentul pornirii, colecteaz spaiul liber etc; Process Monitor (PMON) recupereaz procesele utilizator dac acestea cad accidental; Archiver (ARCH) copiaz n mod online fiierele Redo Log n fiiere de arhiv atunci cnd acestea se umplu cu datei; Recoverer (RECO) rezolv tranzaciile suspendate n sistemul cu baze de date distribuite; Dispacher (Dnnn) folosit n sistemul multithreaded;

Lock (LCKn) blochez procesele n sistemul Parallel server. Legtura dintre procesele utilizator i procesele Oracle este prezentat n figura 2.2.

Figura 2.2 Legtura dintre procesele utilizator i procesele Oracle

Interfaa program este mecanismul de comunicare dintre un proces utilizator i un proces server. Este metoda standard de comunicare ntre o aplicaie sau un instrument Oracle i Oracle Server. 2.4. CONCURENA, CONSISTENA I SECURITATEA DATELOR ntr-un sistem de baze de date de tip multiutilizator o preocupare principal este asigurarea accesului concurenial al mai multor utilizatori la aceleai date. Pentru aceast funcie Oracle folosete diverse mecanisme ca blocarea nregistrrilor i pstrarea mai multor versiuni consistente de date. Consistena la citire garanteaz c setul de date vzut de ctre o instruciune nu se schimb n timpul executrii acesteia (consisten la nivel

de instruciune). Asigur faptul c un utilizator care acceseaz baza de date nu ateapt ca alt utilizator s scrie date sau s citeasc date i c scrierea unor date n baza de date nu implic un timp de ateptare pentru utilizatorii care doresc s citeasc aceste date. De asemenea, asigur faptul c un utilizator va atepta la momentul scrierii n baza de date numai dac ncearc s modifice acelai rnd dintr-o tabel (tranzacii concurente). Mecanismul de blocare a rndurilor dintr-o tabel a bazei de date asigur ca datele vzute de un utilizator sau modificate de acesta s nu poat fi modificate de ctre alt utilizator pn cnd primul nu termin accesul la date. Datele i structurile unei baze de date reflect corect toate modificrile efectuate ntr-o anumit secven logic. Blocarea se poate executa automat sau manual. Securitatea unei baze de date presupune asigurarea unor faciliti care s permit controlul asupra modului n care o baz de date este accesat i utilizat. Ea poate fi: securitatea sistemului (System security) i securitatea datelor (Data security). Securitatea sistemului include mecanisme care controleaz accesul i utilizarea bazei de date la nivel de sistem (valideaz combinaiile username/password, spaiul pe disc alocat pentru un anumit utilizator, limitele de resurse pentru un utilizator). Securitatea datelor include mecanisme care controleaz accesul i utilizarea bazei de date la nivel de obiect (Exemplu utilizatorul SCOTT poate s emit instruciuni SELECT i INSERT, dar nu poate utiliza DELETE). Oracle Server furnizeaz controlul accesului, care nseamn restricionarea accesului la informaii pe baz de privilegii. De exemplu unui utilizator i se atribuie privilegiul de a accesa un anumit obiect al bazei de date. La rndul su acest utilizator, n mod corespunztor, poate s ofere privilegiul su altui utilizator. Controlul securitii n Oracle se asigur prin specificarea: utilizatorilor bazei de date, schemelor, privilegiilor, rolurilor, setarea limitelor de memorie, stabilirea limitelor de resurse i auditarea. Utilizatorii bazei de date i schemele. Fiecare baz de date are o list de nume de utilizatori. Pentru a accesa baza de date un utilizator trebuie s foloseasc o aplicaie i s se conecteze cu un nume potrivit. Fiecrui nume de utilizator i este asociat o parol. Orice utilizator are un domeniu de securitate care determin privilegiile i rolurile, cota de tabel spaiu alocat (spaiul pe disc alocat) i limitele de resurse ce le poate utiliza (timp CPU etc). Privilegiul este dreptul unui utilizator de a executa anumite instruciuni SQL. Privilegiile pot fi: privilegii de sistem i privilegii de

obiecte. Privilegiile de sistem permit utilizatorilor s execute o gam larg de instruciuni SQL, ce pot modifica datele sau structura bazei de date. Aceste privilegii se atribuie de obicei numai administratorilor bazei de date. Privilegiile de obiecte permit utilizatorilor s execute anumite instruciuni SQL numai n cadrul schemei sale, i nu asupra ntregii baze de date. Acordarea privilegiilor reprezint modalitatea prin care acestea pot fi atribuite utilizatorilor. Exist dou ci de acordare explicit (privilegiile se atribuie n mod direct utilizatorilor) i implicit (prin atribuirea acestora unor roluri, care la rndul lor sunt acordate utilizatorilor). Rolurile sunt grupe de privilegii, care se atribuie utilizatorilor sau altor roluri. Rolurile permit: Reducerea activitilor de atribuire a privilegiilor. Administratorul bazei de date n loc s atribuie fiecare privilegiu tuturor utilizatorilor va atribui aceste privilegii unui rol, care apoi va fi disponibil utilizatorilor; Manipularea dinamic a privilegiilor. Dac se modific un privilegiu de grup, acesta se va modifica n rolul grupului. Automat modificarea privilegiului se propag la toi utilizatorii din grup; Selectarea disponibilitilor privilegiilor. Privilegiile pot fi grupate pe mai multe roluri, care la rndul lor pot fi activate sau dezactivate n mod selectiv; Proiectarea unor aplicaii inteligente. Se pot activa sau dezactiva anumite roluri funcie de utilizatorii care ncearc s utilizeze aplicaia. Un rol poate fi creat cu parol pentru a preveni accesul neautorizat la o aplicaie. Aceast tehnic permite utilizarea parolei la momentul pornirii aplicaiei, apoi utilizatorii pot folosi aplicaia fr s mai cunoasc parola. Setarea cotelor de memorie ce pot fi folosite de ctre utilizatori se realizeaz folosind opiunile: Default tablespace. Un utilizator poate crea obiecte ale bazei de date fr a specifica numele tabelei spaiu n care s fie create obiectele; Temporary tablespace. Unui utilizator i se aloc tabele spaiu proprii n care s-i creeze obiectele; Tablespace quotas. Se pot seta limite fizice de memorie pentru tabelele spaiu proprii utilizatorilor. Profilurile i limitarea resurselor. Un profil este un element de securitate care permite manipularea resurselor ce pot fi alocate utilizatorilor. Resursele ce pot fi alocate sunt: numrul sesiunilor concurente, timpul CPU,

timpul de utilizare a unei sesiuni, restricii n utilizarea parolelor. Se pot crea diferite tipuri de profile care apoi vor fi atribuite fiecrui utilizator. Auditarea permite monitorizarea activitilor executate de ctre utilizatori astfel nct s se poat efectua investigaii referitoare la utilizrile suspecte ale bazei de date. Auditarea se poate efectua la nivel de instruciune, privilegiu sau obiect. Recuperarea unei baze de date este necesar atunci cnd apar cderi de curent sau defeciuni ale calculatorului. Tipurile de erori ce pot determina oprirea unei baze de date Oracle sunt: erori de utilizator; erori ale unor instruciuni sau ale proceselor utilizator; erori ale instanei Oracle; erori fizice pe disc. Structurile fizice folosite de Oracle pentru recuperarea unei baze de date sunt fiierele redo log, fiierele de control, segmentele rollback i copiile fizice ale datelor bazei de date. Fiierele redo log permit protejarea datelor bazei de date actualizate n memoria intern dar nescrise nc n baza de date. Se pot utiliza n mod online sau cu arhivare. Fiierele redo log on line sunt un set de dou sau mai multe fiiere care nregistreaz toate tranzaciile finalizate. Ori de cte ori o tranzacie este finalizat (comis) datele modificate sunt scrise n aceste fiiere. Utilizarea fiierelor este ciclic, adic atunci cnd se umple un fiier se utilizeaz cellalt. Fiierele redo log arhivate permit arhivarea fiierelor redo log umplute nainte de a fi rescrise. Se poate rula n modul ARCHIVELOG (caz n care baza de date poate fi integral recuperat att pentru o eroare a instanei, ct i a discului) sau NOARCHIVELOG (caz n care baza de date poate fi recuperat numai dup o eroare a instanei nu i a discului). n primul mod recuperarea se face cu baza de date pornit, iar n al doilea caz cu ea oprit. Fiierele de control conin informaii despre structura fiierelor bazei de date, numrul curent al secvenei de log folosit de ctre procesul LGWR etc. Segmentele rollback se folosesc pentru controlul tranzaciilor. Copiile bazei de date pot fi integrale sau pariale. Copia integral cuprinde toate fiierele de date, online redo log files i fiierele de control, iar copia parial conine numai anumite pri ale bazei de date. Datorit modului n care lucreaz procesul DBWR fiierele de date ale bazei de date pot conine blocuri potenial actualizate de ctre tranzaciile nefinalizate sau s nu conin blocuri de date actualizate de ctre tranzaciile finalizate. Blocurile de date coninnd tranzacii finalizate nu au fost nc scrise n fiierele de date, ci numai n fiierele redo log, ceea ce nseamn c fiierele redo log conin modificri de date care trebuie efectuate i n baza de date. Fiierele de redo log pot conine date ale unor

tranzacii nefinalizate care trebuie eliminate la momentul recuperrii bazei de date. Ca urmare a situaiilor de mai sus Oracle va folosi doi pai distinci pentru recuperarea unei baze de date: rolling forward i rolling backward. Rolling forward nseamn aplicarea (scrierea) asupra bazei de date a tuturor tranzaciilor finalizate i memorate n fiierele redo log. Se execut automat la momentul pornirii bazei de date dac avem fiiere redo log online. Rolling backward nseamn tergerea tuturor tranzaciilor nefinalizate din fiierele redo log. Acest pas se execut automat dup primul pas. Utilitarul de recuperare Recovery Manager creaz fiiere de salvare (backup) pentru fiierele de date ale bazei de date i restaureaz sau recupereaz baza de date din acesrte fiiere backup. 2.5. DICIONARUL DE DATE (DATA DICTIONARY) Fiecare baz de date Oracle are un dicionar de date, care este un set de tabele i vederi folosite n modul read-only pentru a referi datele bazei de date. Dicionarul de date este actualizat automat de ctre Oracle ori de cte ori intervin modificri n structura bazei de date. Dicionarul de date este alctuit din tabele de baz i vederi create pe aceste tabele. Tabelele de baz nu sunt accesibile datorit faptului c memoreaz datele criptic. Proprietarul dicionarului de date este utilizatorul SYS. Nici un utilizator nu poate altera obiecte din schema SYS. Dicionarul de date (DD) este accesat n dou situaii: ori de cte ori Oracle prelucreaz o instruciune DDL sau de ctre orice utilizator pentru consultarea informaiilor despre baza de date. DD este adus n memoria SGA. Este recomandat s nu se obiecte care s aparin utilizatorului SYS. Nu se vor modifica niciodat date din DD. Singura tabel care face excepie este tabela SYS.AUDIS. Aceast tabel poate crete mult n dimensiune, administratorul bazei de date putnd terge datele inutile. Vederile DD sunt prefixate cu USER, ALL sau DBA. Vederile prefixate cu USER furnizeaz informaii despre obiectele utilizatorilor, cele ALL despre toate obiectele din baza de date la care un utilizator are acces, iar cele cu DBA dau informaii despre toat baza de date. Exemple: select object_name, object_type from user_objects; select owner, object_name, object_type from all_objects; select owner, object_name, object_type from sys.dba_objects;

Tabelele ce pstreaz informaii despre activitile Oracle sunt tabele speciale care pot fi accesate numai de ctre administrator pentru a vedea performanele Oracle. Utilizatorul SYS este proprietarul acestor tabele. Numele lor este prefixat cu V_$, iar sinonimele lor cu V$. Categoriile de informaii ce se pot obine din dicionarul de date sunt: Informaii despre fiierele Online Redo Log; Informaii despre tabelele spaiu; Informaii despre fiierele de date ( Data Files); Informaii despre obiectele bazei de date; Informaii despre segmentele bazei de date; Informaii despre extensii ale bazei de date; Informaii despre pachetele Oracle cu valoare de dicionar (Dictionary Storage). Informaii despre utilizatorii bazei de date i profilele acesteia; Informaii despre privilegiile i rolurile din baza de date n tabelul 2.1 sunt descrise pachetele Oracle care permit PL/SQL s aib acces la anumite faciliti SQL sau s extind funcionalitatea BD. Pachete Oracle pentru accesul la facilitile SQL
DBMS_SPACE.UNUSED_SPACE DBMS_SPACE.FREE_BLOCKS DBMS_SESSION.FREE_UNUSE D_ USER_MEMORY DBMS_SYSTEM.SET_SQL_TRA CE_IN_SESSION Tabelul 2.1. Returneaz informaii despre spaiul nefolosit dintr-un obiect (tabel, index sau cluster) Returneaz informaii despre blocurile libere dintr-un obiect (tabel, index sau cluster) Permite recuperarea memoriei nefolosite dup efectuarea operaiilor care cer o cantitate mare de memorie (>100k) Permite sql_trace ntr-o sesiune identificat prin numrul serial i SID (valori luate din V$SESSION).

2.6. ACCESUL LA DATE Accesul la datele unei baze de date se realizeaz folosind instruciunile SQL (Structured Query Language) sau PL/SQL (Procedural Language). Instruciunile SQL se mpart n: Instruciuni de definire a datelor - DDL (Data Definition Statements). Acestea permit definirea, ntreinerea i tergerea unor obiecte ale bazei de date;

Instruciuni de manipulare a datelor DML (Data Manipulation Statements), care permit regsirea, inserarea, actualizarea i tergerea unor rnduri de date din tabele; Instruciuni de control a tranzaciilor (Transaction Control Statements) permit controlul instruciunilor DML (COMMIT, ROLLBACK, SAVEPOINT etc); Instruciuni de control a sistemului Oracle (System Control Statements) permit utilizatorului s controleze proprietile sesiunii curente prin activarea sau dezactivarea rolurilor sau setarea limbii; Instruciuni imprimate ntr-un limbaj gazd (Embeded SQL Statements) i ncorporeaz instruciuni DDL, DML i de control al tranzaciilor. O tranzacie este o unitate logic de lucru care cuprinde una sau mai multe instruciuni SQL executate de ctre un singur utilizator. Tranzacia ncepe cu prima instruciune SQL executabil i se termin n mod explicit cu finalizarea (commit) sau, dup caz, anularea tranzaciei (rollback). Finalizarea unei tranzacii face ca modificrile efectuate de intruciunilor SQL n baza de date s fie permanente, iar anularea (roll back) unei tranzacii duce la renunarea la actualizrile efectuate de instruciunile SQL pn la un moment dat. Tranzaciile mari pot fi marcate cu puncte intermediare de salvare. Acest lucru permite ca activitile efectuate ntre punctele de salvare s fie considerate finalizate, iar la momentul anulrii (rollback) acest lucru s se execute pn la un anumit punctul de salvare specificat. PL/SQL este un limbaj procedural Oracle care combin instruciunile SQL cu instruciunile de control a prelucrrii (IF THEN, WHILE i LOOP). Utilizarea procedurilor PL/SQL memorate n baza de date duce la reducerea traficului pe reea. n baza de date pot fi stocate proceduri, funcii, pachete, triggeri. Triggerii (declanatorii) sunt blocuri de instruciuni scrise de programatori pentru a aduga funcii suplimentare unei aplicaii. Fiecare trigger are un nume i conine una sau mai multe instruciuni PL/SQL. Un trigger poate fi asociat cu un eveniment i poate fi executat i ntreinut ca un obiect distinct. Numele unui trigger corespunde unui eveniment (runtime events) care se produce la momentul execuiei unei aplicaii.

CAPITOLUL 3. ELEMENTELE DE BAZ ALE LIMBAJULUI SQL*PLUS


3.1. DESPRE LIMBAJ n 1974 a fost lansat proiectul System/R de ctre firma IBM. Tot n acest an a aprut limbajul structurat de programare SEQUEL (Structured English as Query Language) autori fiind Chamberlin i Boyce. n 1976 apare un nou limbaj SEQUEL 2 care a fost declarat limbajul de interogare al SGBD System/R. Denumirea limbajului este schimbat de Chamberlin n SQL (Structured Query Language) n anul 1980. Ulterior limbajul a fost perfecionat fiind considerat cel mai rspndit limbaj de interogare a bazelor de date relaionale. Institutul Naional pentru Standarde n anul 1982 a lansat un proiect de lucru pentru standardizarea limbajelor de interogare care a fost finalizat n 1986 aprnd standardul ANSI SQL-86. Acesta definete comenzile de baz ale SQL, dar nu conine partea de actualizare i acordarea drepturilor de acces la o baz de date. Prin revizuire acest limbaj apare n 1989 SQL-1 ca fiind limbajul fundamental al SGBD ralaionale. n 1992 apare versiunea SQL-2 care ofer noi faciliti cum ar fi: jonciune extern, implementarea restriciei refereniale, modificarea schemei bazei de date, etc. Cel mai recent standard este SQL-3 care a fost lansat n anul 1999, acesta este considerat un limbaj complet n vederea definirii i gestiunii obiectelor complexe. Se consider c prin publicarea standardului propus n acest an a fost depit bariera relaionalului, el fiind mult mai mult dect un instrument de consultare a bazelor de date. 3.2. CONCEPTE UTILIZATE SQL*PLUS este un limbaj neprocedural i opereaz asupra datelor normalizate. Conceptele necesare a fi cunoscute pentru lucrul cu acest limbaj sunt: tabel, cheie primar, coloan, rnd, viziune, index, sinonim, cluster, baz de date relaional, comanda, blocul, cererea,raportul etc. Tabela sau relaia este un ansamblu format din n coloane (atribute/subansambluri) i m rnduri (tupluri/linii) care respect urmtoarele condiii minime: nu conine date la nivel agregat (valorile aflate la intersecia liniilor cu coloanele s fie la un nivel elementar); liniile sunt distincte unele fa de altele; nu conine coloane repetitive n descriere.

Cheia primar este un atribut care are valori distincte. Deci, fiecare linie se identific printr-o valoare distinct. Dou sau mai multe atribute care pot fi chei primare se numesc chei candidate. Coloana tabelei este format din valorile pe care le ia atributul n liniile tabelei respective. Rndul/tuplul/linia este format din valorile coloanelor ce se refer la o entitate a tabelei. Baza de date relaional este un ansamblu de tabele normalizate, grupate n jurul unui subiect, n principiu, bine definit. ntr-o baz de date relaional, entitile i legturile sunt transpuse n tabele. Viziunea este o tabela logic i reprezint o fereastr la date, dintruna sau mai multe tabele. Pentru ca accesul la date sa se fac mai rapid, se utilizeaz indexarea. Un index reprezint o cheie pe una sau mai multe coloane. Indexarea este dinamic deoarece se pot adaug sau terge indeci oricnd, fr ca datele memorate sau aplicaiile scrise s fie afectate. Pentru realizarea unor operaii sau pentru a utiliza n cereri nume mai scurte, se pot defini sinonime ale unor nume de tabele sau viziuni. Un cluster reprezint o anumit modalitate de grupare a rndurilor uneia sau mai multor tabele. Aceast grupare mrete viteza de execuie a unor operaii consumatoare de timp. Comanda este o instruciune emis din SQL*Plus ctre o baz de date Oracle. Blocul reprezint un grup de instruciuni SQL i PL/SQL. Cererea este o comanda SQL (SELECT) care regsete date din baza de date. Rezultatul cererii l formeaz datele regsite din baza de date. Raportul este rezultatul cererii formatat cu ajutorul comenzilor SQL*Plus. Numele unei baze de date, al unei tabele, coloane sau variabile utilizator trebuie s aib lungimea ntre 1 i 30 caractere. Un nume nu poate conine apostrofuri. Cu att mai puin, un nume utilizat ntr-o comand nu va fi introdus ntre apostrofuri. Literele mici i mari sunt echivalente (nu se face distincia ntre literele mici i mari). Un nume trebuie s nceap cu o liter, s conin numai anumite caractere (A-Z, 0-9, $, #, @, -), s nu duplice numele unui alt obiect de acelai tip i s difere de un cuvnt rezervat ORACLE. Cuvintele rezervate nu pot fi utilizate ca nume de tabele, coloane sau orice alte obiecte definite de utilizator. Ele sunt prezentate n Anexa 1.

3.3. FUNCII SQL Funciile se apeleaz prin sintaxa: Nume_funcie (argument1, argument2, ) Funciile SQL sunt cu un singur rnd sau scalare (returneaz un singur rezultat pentru fiecare rnd al cererii emise asupra unei tabele sau vederi) i cu mai multe rnduri numite funcii grup sau agregate (returneaz un singur rezultat pentru un grup de rnduri regsite dintr-o tabel sau vedere). A. Funciile SQL cu un singur rnd (funciile scalare) Acestea sunt funcii: numerice, caracter, de tip DATE, de conversie i alte funcii. 1) Funciile numerice accept valori numerice i returneaz rezultate numerice i sunt prezentate n tabelul 3.1. Tabela DUAL folosit n exemple, este creat automat de ctre Oracle odat cu crearea dicionarului de date i se afl n schema utilizatorului SYS, dar cu acest nume este accesibil tuturor utilizatorilor unei baze de date Oracle. Ea are o singur coloan numit DUMMY cu tipul de date VARCHAR2(1) i un singur rnd cu valoarea 'X'. Seleciile din tabela DUAL sunt utile pentru calcularea unor expresii constante cu comanda SQL SELECT. Din cauz c are un singur rnd, constanta este returnat o singur dat. Alternativ pentru aceeai activitate se poate selecta o constant, pseudocoloan sau o expresie din orice tabel. Tabelul 3.1 Funciile numerice
Funcia ABS(n) Rolul funciei Returneaz valoarea absolut a numrului n. Exemple SELECT ABS(-15) "Absolut" FROM DUAL; Absolut ---------15 SELECT COS(.3)"Arc_Cosinus" FROM DUAL; Arc cosinus ---------1.26610367 SELECT ASIN(.3) "Arc_Sinus" FROM DUAL; Arc_Sinus ---------.304692654 SELECT ATAN(.3) "Arc_Tangent" FROM DUAL;

ACOS(n)

Arc cosinus de n. Rezultatul este exprimat n radiani.

ASIN(n)

Arc sinus de n.

ATAN

Arc tangent de n.

ATAN2

Arc tangent de n i m sau arc tangent de n/m. Deci ATAN2(n,m) este identic cu ATAN2(n/m). Retureaz numrul ntreg cel mai mic care este mai mare sau egal cu n. Cosinus de n.

CEIL(n)

COS(n)

COSH(n)

Cosinus hiperbolic de n.

EXP(n)

Returneaz o valoare egal cu e ridicat la puterea n, unde e = 2.71828183. Returneaz numrul cel mai mare care este mai mic sau egal cu n. Returneaz logaritmul natural de n, unde n > 0.

FLOOR(n)

LN(n)

LOG(m,n)

Returneaz logaritm n baza m de n.(LOGmn)

MOD(m,n)

Returneaz restul mpririi

Arc_Tangent ---------.291456794 SELECT ATAN2(.3,.2) Arc_Tangent2" FROM DUAL; Arc_Tangent2 -----------.982793723 SELECT CEIL(15.7) "NUMR" FROM DUAL; NUMR ---------16 SELECT COS(180 * 3.14/180) "Cosinus de 180 grade" FROM DUAL; Cosinus de 180 grade ---------------------1 SELECT COSH(0) "Cosinus hiperbolic de 0" FROM DUAL; Cosinus hiperbolic de 0 ---------------------1 SELECT EXP(4) "e la puterea 4" FROM DUAL; e la puterea 4 -----------------54.59815 SELECT FLOOR(15.7) "Floor" FROM DUAL; Floor ---------15 SELECT LN(95) "Logaritm natural de 95" FROM DUAL; Logaritm natural de 95 ----------------4.55387689 SELECT LOG(10,100) "Log n baza 10 de 100" FROM DUAL; Log n baza 10 de 100 -----------------2 SELECT MOD(11,4) "Modulo 4"

POWER (n,m)

lui m la n. Dac n este 0 returneaz valoarea m. Aceast funcie se comport diferit fa de funcia modulo clasic din matematic, atunci cnd m este negativ. Avnd n vedere semnificaia funciei MOD funcia modulo clasic din matematic se poate exprima cu formula : m - n * FLOOR(m/n) Returneaz o valoare egal cu m la puterea n.

FROM DUAL; Modulo 4 ---------3 2.

ROUND (n[,m])

Returneaz n rotunjit la un numr de m yecimale. Dac m este omis se elimin zecimalele, iar dac este negativ se face rotunjirea numrului din dreapta virgulei zecimale, dup regula: m = -1 rotunjire la nivel de zeci, m = -2 rotunjire la nivel de sute i aa mai departe.

SELECT POWER(3,2) "Putere" FROM DUAL; Putere ---------9 SELECT ROUND(15.193,1) "Rotunjire" FROM DUAL; Rotunjire ---------15.2 SELECT ROUND(15.193,-1) "Rotunjire " FROM DUAL; Rotunjire ---------20 Aici rotunjirea s-a fcut la nivel de zeci, cci scala negativ nseamn rotunjirea valorii din drepta semnului zecimal, iar scala pozitiv nseamn rotunjirea numrului din dreapta semnului zecimal la ordinul de mrime ct este scala. SELECT SIGN(-15) "Semn" FROM DUAL; Semn ----------1 SELECT SIN(30 * 3.14159265359/180) "Sinus de 30 de grade" FROM DUAL; Sinus de 30 de grade -----------------.5 SELECT SINH(1) " Sinus hiperbolic de

SIGN(n)

SIN(n)

Returneaz semnul numrului n, dup regula: n<0 returneaz valoarea -1; n=0 returneaz valoarea 0; n>0 returneaz valoarea +1. Returneaz sinus de n n radiani.

SINH

Returneaz sinus hiperbolic

de n.

SQRT(n)

Returneaz rdcin ptrat din n.

TAN(n)

Returneaz tangent de n.

TANH(n)

Returneaz tangent hiperbolic de n.

TRUNC (n,m)

Returneaz valoarea lui n trunchiat la un numr de zecimale egal cu m. Dac m este omis se elimin valorile zecimale, iar dac ia o valoare negativ trunchiere se aplic prii din stnga virgulei zecimale, dup regula: m = -1 rotunjire la nivel de zeci, m= -2 rotunjire la nivel de sute i aa mai departe.

1" FROM DUAL; Sinus hiperbolic de 1 -------------------1.17520119 SELECT SQRT(26) "Rdcin ptrat" FROM DUAL; Rdcin ptrat ----------5.09901951 SELECT TAN(135 * 3.14/180) "Tangent de 135 grade" FROM DUAL; Tangent de 135 grade ----------------------1 SELECT TANH(.5) " Tangent hiperbolic de 5" FROM DUAL; Tangent hiperbolic de 5 -----------------------.462117157 SELECT TRUNC(15.79,-1) "Trunc" FROM DUAL; Trunc ---------10

2) Funciile caracter accept la intrare valori caracter i furnizeaz valori caracter sau numerice. n tabelul 3.2 sunt prezentate funciile caracter care returneaz caractere, iar n tabelul 3.3 funciile caracter care returneaz valori numerice. Valorile caracter returnate sunt de tipul VARCHAR2 dac nu se specific altfel. Tabelul 3.2 Funciile caracter care returneaz caractere
Funcia CHR(n) Rolul funciei Returneaz caracterul care are valoarea binar n. Exemple SELECT CHR(67)||CHR(65)||CHR(84) "Caractere" FROM DUAL; Caractere

CONCAT (c1,c2)

Returneaz o valoare format din concatenarea caracterului c1 cu caracterul c2.

INITCAP ('ir')

Returneaz irul de caractere 'ir' astfel nct fiecare cuvnt al irului are prima liter n format liter mare. Returneaz irul de caractere 'ir' astfel nct toate literele irului sunt de format liter mic.

LOWER ('ir')

LPAD ('c1',n,'c2')

Returneaz irul de caractere 'c1', pe lungime de n caractere, astfel nct partea din stnga irului pn la lungimea de n caractere este umplut cu secvene de caractere egale cu 'c2'. Dac irul 'c1' este mai lung dect valoarea n, atunci se returneaz partea dreapt a irului pe lungime de n caractere. LTRIM ('c1' Returneaz partea din irul [,'c2']) 'c1' care a mai rmas dup ce au fost nlturate toate caracterele din stnga acestuia care se regsesc n setul de caractere 'c2'. NLSSORT Returnez un ir de caractere ('c1' folosite pentru sortarea [,'nlsparams']) cmpurilor de tip caracter. Caracterul 'c1' definete un marcator de sortare, n sensul c toate valorile dintr-un cmp care sunt mai mari sau mai mici dect acesta vor fi afiate sau nu prin folosirea

--CAT SELECT CONCAT( CONCAT (nume, ' este '), funcie) "Funcie" FROM tab1 WHERE codfuncie = 7000; Funcie ----------------Popescu este PROGRAMATOR SELECT INITCAP('cuvnt1 cuvnt2') "Litere mari" FROM DUAL; Litere mari --------Cuvnt1 Cuvnt2 SELECT LOWER('BUCURETI') "Liter mic" FROM DUAL; Liter mic. -------------------bucureti SELECT LPAD('Page.1',10,'*.') "LPAD exemplu" FROM DUAL; LPAD exemplu --------------*.*.*Pag.1

SELECT LTRIM('xyxXxyREST IR','xy') "LTRIM exemplu" FROM DUAL; LTRIM exemplu -----------XxyREST IR SELECT nume FROM tab1 WHERE NLSSORT(nume,'NLS_SORT=romanian' )< NLSSORT('O','NLS_SORT=romanian') ORDER BY nume; NUME ----------

REPLACE ('c1','c2','c3')

RPAD ('c1',n[,'c2'])

RTRIM ('c1','c2')

clauzei ORDER BY. Parametrul 'nlsparams' defineste valoare lingvistic dup care s se fac sortare i se d sub forma 'NLS_SORT = sort' n care sort definete limba dup care dorim s se fac sortarea(german, romn etc). Returneaz irul 'c1' translatat, astfel nct n irul 'c1' toate valorile egale cu irul de cutare 'c2' sunt nlocuite cu irul de nlocuire 'c3'. Returneaz irul de caractere 'c1', pe lungime de n caractere, astfel nct partea din dreapta irului pn la lungimea de n caractere este umplut cu secvene de caractere egale cu 'c2'. Dac irul 'c1' este mai lung dect valoarea n, atunci se returneaz partea stng a irului pe lungime de n caractere. Returneaz partea din irul 'c1' care a mai rmas dup ce au fost nlturate toate caracterele din dreapta acestuia care se regsesc n setul de caractere 'c2'. Returneaz poriunea din irul 'c1' care ncepe de la al m-lea caracter pe lungime de n caractere.

IONESCU MARINESCU POPESCU OLGA Not: Numele care ncep cu o liter mai mare dect 'O' nu se vor afia.

SELECT REPLACE ('MAS i MUSCA','M','C') "REPLACE" FROM DUAL; REPLACE -------------CAS i CUC SELECT RPAD('CLUJ',10,'ab') "RPAD exemplu" FROM DUAL; RPAD exemplu ----------------CLUJababab

SUBSTR ('c1',m[,n])

SELECT RTRIM('BUCURETIyxXxy','xy') "RTRIM exemplu" FROM DUAL; RTRIM exemplu ------------BUCURETIyxX SELECT SUBSTR ('ABCDEFG',3.1,4) Subir1" FROM DUAL; Subir1 ---CDEF SELECT SUBSTR('ABCDEFG',-5,4) "Subir2" FROM DUAL; Subir2 ---CDEF

TRANSLATE ('c1','c2','c3')

1. Translateaz irul 'c1' prin intermediul irului 'c2' la valorile din irul 'c3' dup regula: fiecare caracter din irul c1 este cutat n irul 'c2', dac este gsit valoarea acestuia este nlocuit cu caracterul din irul 'c3' a crui poziie corespunde cu poziia caracterului din irul 'c2'. 2. Dac irul 'c2' este mai lung dect irul 'c3' caracterele ce nu pot fi translatate sunt eliminate din irul 'c1'. Returneaz irul 'c1' cu toate caracterele transformate n caractere mari.

SELECT TRANSLATE ('2KRB229', '0123456789ABCDEFGHIJKLMNOPQ RSTUV', '9999999999XXXXXXXXXXXXXXXXXX XXXXXXXX') "TRANSLATE 1" FROM DUAL; TRANSLATE 1 -------9XXX999 SELECT TRANSLATE ('2KRW229', '0123456789ABCDEFGHIJKLMNOPQ RSTUVWX', '0123456789') " TRANSLATE 2" FROM DUAL; TRANSLATE 2 ----------------2229 SELECT UPPER('Bucureti') "LITERE MARI" FROM DUAL; LITERE MARI ----BUCURETI

UPPER('c1')

Tabelul 3.3 Funciile caracter care returneaz valori numerice


Funcia ASCII ('c1') Rolul funciei Returneaz valoarea zecimal a primului caracter din irul 'c1'. 1.Caut n irul 'c1' ncepnd cu al n-lea su caracter a m-a apariie a irului 'c2' i returneaz poziia acestuia n irul 'c1' relativ la nceputul irului. Dac irul 'c2' nu este gsit n irul 'c1' se returneaz valoarea 0. Valorile asumate prin lips pentru n i m sunt 1. 2. Dac n este negativ cutarea se face invers de la sfritul irului. Returneaz lungimea n Exemple SELECT ASCII('Q') FROM DUAL; ASCII('Q') ---------81 SELECT INSTR ('CORPORATE FLOOR','OR', 3, 2) "INSTR" FROM DUAL; INSTR ---------14 SELECT INSTR ('CORPORATE FLOOR', 'OR', -3, 2) "INSTR INVERS" FROM DUAL; INSTR INVERS ----------------2 SELECT LENGTH('BUCURETI')

INSTR ('c1','c2' [,n[,m]])

LENGTH

caractere caractere CHAR.

a irului de 'c1' de tip

"LUNGIME IR" FROM DUAL; LUNGIME IR -------------------9

3) Funciile de tip DATE opereaz cu tipuri de date de tip DATE i sunt prezentate n tabelul 3.4. Toate funciile de tip DATE returneaz valori de tip DATE, mai puin funcia MONTH_BETWEEN care furnizeaz o valoare numeric. Structurile formatului fmt de afiare a datelor pentru funciile de tip DATE sunt prezentate n tabelul 3.7. Tabelul 3.4 Funciile de tip DATE
Funcia ADD_MONTHS(d,n) Rolul funciei Returneaz data d plus un numr de luni egal cu n. Exemple Dac n coloana data1 aferent numelui 'POPESCU' din tabela tab1 avem data 17 septembrie2005 cu comanda de mai jos se va ob'ine data 17 octombrie 2005. SELECT TO_CHAR (ADD_MONTHS(data1,1), 'DD-MON-YYYY') "Luna urmtoare" FROM tab1 WHERE nume = 'POPESCU'; Luna urmtoare ----------17-OCT-2005 Cu aceast funcie se poate determina numrul zilelor rmase din luna curent. SELECT SYSDATE, LAST_DAY(SYSDATE) "ULTIMA",LAST_DAY(SYSDATE) - SYSDATE "ZILE RMASE" FROM DUAL; SYSDATE ULTIMA ZILE RMASE -------------------------23-SEP-05 30-SEP-05 7 SELECT TO_CHAR(ADD_MONTHS(LAST_DAY(data1), 5), 'DD-MON-YYYY') "Cinci luni" FROM tab1 WHERE nume = 'POPESCU'; Cinci luni ----------28-FEB-2006 SELECT MONTHS_BETWEEN (TO_DATE('02-09-2005','MM-DD-YYYY'), TO_DATE('01-08-2005','MM-DD-YYYY') )

LAST_DAY (d)

Returneaz data ultimei zile din lun.

MONTHS_ BETWEEN (d1, d2)

Returneaz numrul de luni dintre datele d1

NEXT_DAY (d, 'c1')

i d2. Dac d1 i d2 sunt acelei zile din lun sau sunt ultimele zile din lun rezultatul este un numr ntreg, altfel Oracle calculeaz fraciuni din lun bazat pe o lun cu 31 zile. Returneaz data primei zile a sptmnii dup ziua definit de irul 'c1' i care este dup data d. Returneaz data d rotunjit la unitatea de timp specificat de ctre formatul fmt, conform specificaiilor de la sfritul tabelului. Returneaz data i timpul curent.

"Luni" FROM DUAL; Luni ---------1.03225806

ROUND (d[,fmt])

n exemplul de mai jos se returneaz data zilei care urmeaz zilei de Mari, dup data de 15 martie 1999. SELECT NEXT_DAY('15-MAR-05','TUESDAY') "ZIUA URMTOARE" FROM DUAL; ZIUA URMTOARE --------22-MAR-05 SELECT ROUND (TO_DATE ('27-SEP05'),'YEAR') "Noul an" FROM DUAL; Noul an --------01-JAN-06

SYSDATE

TRUNC (d,[fmt])

Returneaz data d fr timp trunchiat la o unitate specificat de formatul fmt, iar dac este absent se face trunchierea la ziua cea mai

SELECT TO_CHAR(SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "Data i timpul curent" FROM DUAL; Data i timpul curent ------------------27-09-2005 20:27:11 SELECT TRUNC(TO_DATE ('27-SEP-05','DD-MON-YY'), 'YEAR') "Anul nou" FROM DUAL; Anul nou --------01-JAN-05

apropiat. Formatul fmt utilizat de funciile ROUND i TRUNC Formatul fmt Semnificaia formatului fmt CC, SCC Se rotunjete la nivel de secol (primii doi digii ai anului exprimat pe patru digii + 1) Exemplu: 1898 se rotujete la 1998. SYYYY, YYYY, YEAR SYEAR, Se rotunjete la nivelul 01 ianuarie a anului din data care YYY, YY, Y se rotunjete. Exemplu: 27-sep-05 se rotunje;te la 01-jan-05. Q Rotunjire la nivel de trimestru (Se routunjete n sus la a asesprezecea zi a lunii a doua a trimestrului). MONTH, MON, MM, RM Rotunjire la nivel de lun (Se routunjete n sus la a asesprezecea zi a lunii).

4) Funciile de conversie convertesc o valoare de la un tip de dat la alt tip de dat. Aceste funcii au formatul general de forma tip_de_dat TO tip_de_dat i sunt prezentate n tabelul 3.5. Tabelul 3.5 Funciile de conversie
Funcia CONVERT ('c1', set_destinaie, [,set_surs] ) Semnificaia Convertete un ir de caractere de la un set de caractere la alt set de caractere. Setul set_surs este setul de caractere din care fac parte caracterele irului 'c1', iar set_destinaie este setul de caractere n care se convertesc caracterele irului 'c1'. Convertete irul 'c1' care conine digii hexazecimali la tipul de date RAW. Convertete digii hexazecimali de tip RAW la irul 'c1'. Convertete valoarea ROWID la o valoare de tip VARCHAR". Rezultatul conversiei Exemple SELECT CONVERT('Gro', 'US7ASCII', 'WE8HP') "Conversie" FROM DUAL; Conversie ---------Gross Seturile de caractere cele mai comune sunt: US7ASCII, WE8DEC, WE8HP, F7DEC, WE8EBCDIC500 , WE8PC850, WE8ISO8859P1 . INSERT INTO tab1 (raw_column) SELECT HEXTORAW('7D') FROM DUAL;

HEXTOROW('c1')

RAWTOHEX(raw) ROWIDTOCHAR (rowid)

SELECT ROWID FROM tab1 WHERE ROWIDTOCHAR(ROWID) LIKE '%Br1AAB%';

este tot impul un ir de 18 caractere. TO_CHAR pentru conversie de caractere, are sintaxa: TO_CHAR (d [, fmt]) TO_CHAR pentru conversie de numere, are sintaxa: TO_CHAR (n [, fmt]) CHARTOROWID ('c1') Convertete data d de tip DATE la o valoare de tip VARCHAR2 n formatul specificat.

ROWID -----------------AAAAZ6AABAAABr1AAB SELECT TO_CHAR (data1, 'Month DD, YYYY') "Format nou" FROM tab1 WHERE nume = 'ION'; Format nou -----------------May 01, 2005 SELECT TO_CHAR(10000,'L99G999D99MI') "Cantitate" FROM DUAL; Cantitate -------------$10,000.00SELECT nume FROM tab1 WHERE ROWID = CHARTOROWID ('AAAAfZAABAAACp8AAO'); nume ---------POPESCU INSERT INTO tab1 (data1) SELECT TO_DATE( 'January 15, 2005, 11:00 A.M.', 'Month dd, YYYY, HH:MI A.M.') FROM DUAL;

Convertete numrul n de tip NUMBER la o valoare de tip VARCHAR2. Convertete o valoare de tip CHAR sau VARCHAR2 la o valoare de tip ROWID

TO_DATE ('c1' [, fmt ])

TO_NUMBER ('c1',[,fmt ])

Convertete irul de caractere 'c1' de tip CHAR sau VARCHAR2 la o valoare de tip DATE n conformitate cu formatul fmt . Formatul fmt pentru datele de tip DATE este prezentat n tabelul 3.7. Convertete irul de caractere 'c1' de tip CHAR sau VARCHAR2 la o valoare numeric de tip NUMBER n conformitate cu formatul fmt. Forma acestui format este n tabelul 3.6.

UPDATE tab1 SET salariu = salariu + TO_NUMBER('100.00', '9G999D99') WHERE nume = 'ION';

Tabelul 3.6 Structurile formatului fmt pentru datele de tip NUMBER


Elementul fmt 9 0 Exemple 9999 0999 9990 Semnificaia elementului fmt Nr. semnificativ de digii care vor fi afiai Afieaz 0 n faa sau dup digiii semnificativi

$ B MI S D G , . RN sau rn

$999 B999 999MI S999 99D99 99G999 99,999,99 999.99 RN sau rn

Afieaz semnul $ n faa numrului Afieaz valorile 0 ca blank-uri Afieaz semnul - dup numerele negative Afieaz semnul + sau - n faa numerelor pozitive, respectiv negative Afieaz punctul zecimal n aceast poziie Separator de grupuri Virgula se afieaz n poziiile indicate Afieaz punctul zecimal n aceast poziie Afieaz cifre romane cu majuscule, respectiv cu caractere mici(minuscule)

Tabelul 3.7 Structurile formatului fmt pentru datele de tip DATE


Elementul fmt - /,.;: "text" AD sau A.D. BC sau B.C. CC sau SCC D DAY DD DDD HH sau HH12 HH24 J MI MM MON MONTH PM sau P.M. RR sau RRRR SS SSSS WW W YYYY,YYY,YY,Y Se specific n TO-DATE Da Da Da Da Nu Da Da Da Da Da Da Da Da Da Da Da Nu Da da Da Nu Nu Da Semnificaia elementului fmt Punctuaii pentru dat Text reprodus n rezultat Specificarea unui an din Era Noastr(E.N.) Specificarea unui an naintea Erei Noastre(.E.N.) Secolul = cu primii doi digii ai anului pe patru digii +1 Ziua din sptmn(de la 1 la 7) Numele zilei Ziua din lun(de la 1 la 31) Ziua din an(1 la 366) Ora din zi din intervalul 1 - 12 Ora din zi din intervalul 1 - 24 Ziua din calendarul Iulian cu valori ncepnd cu 1 ianuarie 4712 BC. Trebuie s fi ntreg. Minute (0 la 59) Luna (01 la 12) Numele prescurtat al lunii Numele ntreg al lunii Indicator de meridian Rotunjirea anului pe doi digii sau patru digii Secundele n cadrul minutului(0 la 59) Secundele de la miezul nopii n cadrul zilei(0 la 86399) Sptmna din an (1 la 53) Sptmna n cadrul lunii(1 la 5) Anul cu 4 , 3, 2, 1 digii.

Alte funcii cu un singur rnd sunt prezentate n tabelul 3.8.

Tabelul 3.8 Alte funcii cu un singur rnd


Funcia DUMP ('c1' [,return_format [,start_position [,length]]]) Rolul funciei Returneaz o valoare de tip VARCHAR2 coninnd codul tipului de date, lungimea n baii i reprezentarea intern a expresiei expr return_format este codul sistemului de numeraie n care este reprezentat valoarea returnat de funcie pentru irul 'c1'; Dac se furnizeaz ca o valoare egal cu codul sistemului de numeraie + 1000 se returneaz i numele sistemului de numeraie. start_position determin poziia din irul 'c1' de unde s nceap DUMP-u length este lungimea DUMP-ului. Returneaz un pointer sau locator care poate fi folosit pentru iniializare unei variabile de tip LOB, ntr-un INSERT, ntr-un UPDATE pentru iniializarea unei coloane de tip LOB sau ca atribut EMPTY, care nseamn c LOB-ul a fost iniializat dar nu a fost populat cu date. Returneaz un pointer sau locator asociat cu un LOB de tipul unui fiier binar de pe server. director este numele directorului unde se afl fiierul LOB de tip binar. nume_fiier este numele fiierului. Returneaz valoarea cea mai mare dint-o list de valori. Exemple SELECT DUMP('abc', 1016) FROM DUAL; DUMP('ABC',1016) ----------------------------------Typ=96 Len=3 CharacterSet=WE8DEC: 61,62,63 SELECT DUMP(nume, 8, 3, 2) "OCTAL" FROM tab1 WHERE nume = 'SCOTT'; OCTAL ---------------------------Type=1 Len=5: 117,124 Sistemele de numeraie sunt: 8 = sistemul octal; 10 = sistemul zecimal; 16 = sistemul hexazecimal; 17 = rezultatul este returnat sub forma de caractere singulare. INSERT INTO lob_tab1 VALUES (EMPTY_BLOB()); UPDATE lob_tab1 SET clob_col = EMPTY_BLOB();

EMPTY_ [B|C]LOB()

BFILENAME ('director', 'nume_fiier')

INSERT INTO tab1 VALUES (BFILENAME('lob_dir1',foto1.gif')) ;

GREATEST (expr [,expr] ...)

SELECT GREATEST ('HARRY', 'HARRIOT', 'HAROLD') "Mare" FROM DUAL; Mare -----

LEAST (expr [,expr] ...)

Returneaz valoarea cea mai mic dint-o list de valori.

NVL (expr1, expr2)

UID USER

Dac expr1 este NULL returneaz expresia expr2, iar dac expr1 nu este NULL returneaz expr1. Argumentele expr1 i expr2 pot avea orice tip de date. Dac sunt de tipuri diferite Oracle convertete expr2 la tipul expr1 nainte de a executa comparaiile. Valoarea returnat este totdeauna de tipul expr1, execpie fcnd situaia cnd expr1 este de tip caracter, caz n care rezultatul este VARCHAR2. Returnez un ntreg care identific n mod unic utilizatorul curent. Returneaz identificatorul utilizatorului curent n format VARCHAR2. Returneaz informaii despre sesiune curent.

HARRY SELECT LEAST('HARRY','HARRIOT','HAR OLD') "Mic" FROM DUAL; Mic -----HAROLD SELECT nume, NVL(TO_CHAR(comision), 'NOT APPLICABLE') "COMISION" FROM tab1 WHERE codepart = 30; NUME COMISION ---------- -----------------ALLEN 300 WARD 500 MARTIN 1400 TURNER 0 JAMES NOT APPLICABLE

USERENV (option)

VSIZE(expr)

Returneaz lungimea n baii a expresiei expr.

SELECT USER, UID FROM DUAL; USER UID ---------------------------SCOTT 19 SELECT USERENV('LANGUAGE') "Limbajul" FROM DUAL; Limbajul ----------------------------------AMERICAN_AMERICA.WE8DEC SELECT nume, VSIZE (nume) "BYTES" FROM tab1 WHERE codepart = 10; NUME BYTES ---------------------------CLARK 5 KING 4 MILLER 6

B.Funciile cu mai multe randuri (de grup) Furnizeaz un rezultat bazat pe prelucrarea mai multor rnduri. Toate funciile de grup, mai puin COUNT(*) ignor valorile NULL. Majoritatea funciilor de grup accept opiunile:DISTINCT (determin luarea n calcul numai a valorilor distincte ale rndurilor din cadrul grupului) i ALL ( determin luarea n calcul a tuturor valorilor grupului de rnduri). Funciile de grup sunt prezentate n tabelul 3.9. Tabelul 3.9 Funciile de grup
Funcia AVG([DISTINCT|ALL] n) Semnificaia Returnez media celor n valori Exemple SELECT AVG(salariu) "Medie" FROM tab1; Media ---------2077343.21429 SELECT COUNT(*) "Total" FROM tab1; Total ---------18 SELECT COUNT(job) "Count" FROM tab1; Count ---------14 SELECT COUNT(DISTINCT job) "Jobs" FROM emp; Jobs ---------5 SELECT MAX(salariu) "Maximum" FROM tab1; Maximum ---------5000 SELECT MIN(data1) "Minim" FROM tab1; Minimum

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

Returneaz toate rndurile cererii. Dac avem argumentul = * se returneaz toate rndurile indiferent de valoarea lor (NULL sau NOT NULL)

MAX([DISTINCT|ALL] expr)

Returneaz maximul din expresia expr.

MIN([DISTINCT|ALL] expr)

SUM([DISTINCT|ALL] n)

--------17-DEC-80 SELECT SUM(salariu) "Total" FROM tab1; Total ---------29081

Utilizatorii pot s-i scrie propriile funcii n PL/SQL pentru a executa activiti neacoperite de ctre funciile SQL. Aceste funcii pot fi folosite n comenzile SQL la fel ca i cele standard. De exemplu, funciile utilizator pot fi folosite n: lista de selecie a comenzii SELECT; condiia din clauza WHERE; clauzele CONNECT BY, START WITH, ORDER BY I GROUP BY ; clauza VALUES a comenzii INSERT; clauza SET a comenzii UPDATE. Funciile utilizator nu pot fi folosite n clauzele CONSTRAINT sau DEFAULT ale comenzilor C REATE TABLE sau ALTER TABLE i nici pentru actualizarea bazei de date. n funciile utilizator nu este permis utilizarea parametrilor OUT sau IN OUT. 3.4. EXPRESII SQL Expresia este o combinaie de unul sau mai muli operatori, operanzi (variabile, literali, coloane, funcii SQL) care se evalueaz la o singur valoare. Operatorii utilizai n comenzile SQL sunt: operatori SQL*PLUS; operatori SQL; operatori aritmetici; operatori logici; operatori specifici n expresiile de cereri. Ei sunt prezentai n Anexa 2, n ordinea descresctoare a prioritii, cei de aceeai importan fiind grupai ntre perechi de linii orizontale. Operatorii sunt evaluai de la stnga spre dreapta. O expresie are n general acelai tip de date ca i componentele sale. Expresiile sunt folosite pentru construirea instruciunilor SQL i a unor liste de expresii. A. Exist cinci forme de furnizarea a expresiilor pentru construirea instruciunilor SQL. 1) Forma I este format din coloan, pseudocoloan, constant, secven sau NULL i are sintaxa: nume_schem.tabel | vedere. coloan | pseudocoloan | ROWLABEL sau text | numr | nume_secven | nume secven. CURRVAL | NEXTVAL | NULL

Pentru nume_schem se poate folosi pe lng numele schemei utilizatorului i valoarea "PUBLIC", care calific sinonimele publice pentru o tabel sau o vedere, calificare care este suportat doar n instruciunile SQL pentru manipularea datelor de tip (DDL), nu i n cele de definire a datelor de tip DDL. Pseudocoloan poate fi doar LEVEL, ROWID sau ROWNUM. Exemple: Tab1.numecol_1 'acesta este un ir de caractere' 10 secventa1.CURRVAL 2) Forma II este folosit pentru definirea unei variabile gazd (host variable) cu sau fr indicator de variabil. Expresiile din aceast form se vor folosi doar n instruciunile SQL incluse n limbajele de programere gazd sau n instruciunile prelucrate de programele OCI(Oracle Call Interface). Sintaxa este de forma: : variabil_gazd INDICATOR :variabil_indicator Exemple: : nume_angajat INDICATOR :indicator_var_nume_angajat :nume_persoan 3) Forma III este folosit pentru apelul funciilor cu un singur rnd i are sintaxa: funcie (DISTINCT | ALL expresie1, expresie2, ) Exemple : LENGTH('BLAKE') ROUND(1234.567*43) SYSDATE 4) Forma IV este folosit pentru apelul funciilor de utilizator i are sintaxa: nume_schem . nume_pachet. nume_funcie Exemple: aria_cercului(raza) calcul_rate(nume_angajat)

5) Forma V este o combinaie de mai multe expresii i are sintaxa: ( expresie ) | + | - | PRIOR expresie | expresie1 * | / | - | || expresie2 Exemple: ('IONESCU' || ' PETRE') LENGTH('BUCURESTI') * 57 SQRT(144) + 72 funcie_utilizator(TO_CHAR(sysdate,'DD-MMM-YY') Expresiile pentru decodificarea unor valori folosesc sintaxa special de tip DECODE de forma: DECODE ( expr, val1, rezultat1, val2, rezultat2, . , valoare_asumat) expr va fi evaluat i apoi valoarea rezultat va fi comparat cu fiecarea dintre valorile val1, val2, . . Dac valoarea expresiei este egal cu una din valorile de comparaie se va furniza valoarea rezultat (rezultat1, rezultat2, ) care corespunde valorii de comparaie. Dac valoarea expresiei expr1 nu este egal cu nici una din valorule de comparaie se furnizeaz valoarea valoare_asumat. Dac valoarea asumat este omis atunci se furnizeaz valoarea NULL. Exemplu: DECODE (cod_funcie,10, 'programator', 20, 'cercettor', 30, 'vnztor', 40, 'operatorr', 'lips_funcie') Exemplul de mai sus decodific valoarea expresiei cod_funcie. Astfel dac valoarea expresiei cod_funcie = 10 se furnizeaz funcia programator, dac este = 20 se furnizeaz funcia cercettor i aa mai departe. n caz c expresia cod_funcie are a valoare care nu este egal cu nici una din valorile 10, 20, 30 sau 40 se furnizeaz ca rezultat valoarea lips_funcie. B. O list de expresii este o serie de expresii separate ntre ele prin virgul i nchis ntre paranteze rotunde i poate conine pn la maximum 1000 de expresii.

Exemplu: (10, 20, 40) ('SCOTT', 'BLAKE', 'TAYLOR') (LENGTH('MOOSE') * 57, -SQRT(144) + 72, 69) 3.5. CONDIIILE Condiia este o combinaie de una sau mai multe expresii i operatori logici evaluat cu una din valorile TRUE, FALSE sau UNKNOWN. Condiiile se pot folosi n clauza WHERE a instruciunilor SQL DELETE, SELECT i UPDATE sau ntr-una din clauzele WHERE, START WITH, CONNECT BY sau HAVING ale instruciunii SELECT. Exemple: 1) Expresia 1=1 este evaluat ca TRUE 2) Expresia NVL(sal, 0) + NVL(comm, 0) > 2500 adun valoarea sal cu comm i evalueaz rezultatul dac este >= cu 2500000. Dac sal sau comm sunt NULL se vor nlocui cu valoarea zero. Condiiile au opt forme de prezentare. Forma I este folosit pentru compararea unei expresii cu alt expresie sau cu o subcerere i are sintaxa: expresie1 = | != | <> | > | < | >= | <= expresi2 | (subcerere) sau list_de_expresii = | != | <> (subcerere) Forma II este folosit pentru compararea unei expresii sau a unei liste de expresii cu unul sau toi membrii unei liste de xepresii sau ai unei subcereri i are sintaxa: expresie1 = | != | <> | > | < | >= | <= ANY | SOME | ALL list_de_expresii | (subcerere) sau list_de_exp = | != | <> ANY | SOME | ALL (list_expr1, list_expr2, ) | (subcerere1, subcerere2, . ) Forma III este folosit pentru cutarea unei expresii sau a unei liste de expresii dac figureaz ntr-o list de expresii sau ntr-o subcerere i are sintaxa: expresie1 NOT IN list_de_expresii | (subcerere)

sau list_de_exp NOT IN ( list_expr1, list_expr2, ) | (subcerere1, subcerere2, . ) Forma IV este folosit pentru testarea existenei sau inexistenei expresiei ntre dou limite i are sintaxa: expresie1 NOT BETWEEN expr2 AND expr3 Forma V este folosit pentru testarea valorii NULL i are sintaxa: expresie1 IS NOT NULL Forma VI este folosit pentru testarea existenei unui rnd nt-o subcerere i are sintaxa: EXISTS ( subcerere ) Forma VII este folosit pentru testarea egalitii unei ir de caractere cu un format anume, cu un alt ir de caracter i are sintaxa: ir_ caracter1 NOT LIKE ir_cacrater2 ESCAPE 'caracter_de_schimbare' Forma VIII este folosit pentru specificarea unei combinaii de mai multe condiii i poate avea sintaxele: NOT condiie sau condiie1 NOT AND | OR condiie2 3.6. DESCHIDEREA I NCHIDEREA UNEI SESIUNI DE LUCRU SQL*PLUS Pentru a avea acces la componentele unei baze de date (tabele, viziuni, clustere etc.), utilizatorul trebuie mai nti s se conecteze la ea. La sfritul sau n timpul unei sesiuni SQL exist posibilitatea deconectrii de la baza de date. O prim conectare se face atunci cnd se ncepe lucrul cu SQL*Plus. Efectul comenzii sau utilizrii meniului sistem l constituie deschiderea unei sesiuni de lucru sub SQL*Plus. Comanda are urmtoarele forme sintactice: SQLPLUS [nume-utilizator[/parol] [@nume-baz-de-date] [@nume-fiier]

[-SILENT] SQLPLUS /NOLOG [-SILENT] SQLPLUS -? unde: nume-utilizator i parol: sunt numele i parola unui utilizator cu drept de acces la baza de date. @nume-baz-de-date: este numele unei baze de date cu care se lucreaz n reea (este alt nume dect cel al bazei de date implicite, de pe calculatorul la care se lucreaz). @nume-fiier: reprezint numele unui fiier de comenzi SQL care va fi fi rulat de SQL*Plus. SILENT: are ca efect inhibarea facilitii de afiare a tuturor informaiilor i mesajelor furnizate de SQL*Plus /NOLOG: lanseaz n execuie SQL*Plus dar nu face conectarea la o baz de date. -?: are ca efect afiarea versiunii curente a componentei SQL*Plus, dup care returneaz controlul sistemului de operare Dac n linia de comand se specific parola i @nume-baz-dedate atunci ntre ele nu trebuie s existe spaiu. Parola sau @nume-baz-dedate vor fi separate printr-un spaiu de @nume-fiier. Conectarea utilizatorului la o baz de date Dac n timpul unei sesiuni de lucru SQL*PLUS se dorete conectarea la o alt baz de date dect cea deschis iniial se poate folosi comanda CONNECT. Sintaxa acestei comenzi este: CONN[ECT] [nume-utilizator[/parol]] [@nume-baz-de-date]; unde: nume-utilizator i parol: sunt numele unui utilizator cu drepturi de acces la baza de date i parola unui astfel de utilizator. Chiar dac nu se specific parola (n linia de comand este opional), ea este cerut de sistem printrun mesaj explicit. Parola introdus la mesajul sistemului va fi invizibil. @nume-baz-de-date: se specific n cazul lucrului n reea, cnd se dorete conectarea la o alt baz de date dect cea aflat pe calculatorul la care se lucreaz.

De remarcat faptul c n timpul unei sesiuni de lucru cu SQL*Plus se poate realiza conectarea la o baz de date, fr a mai fi necesar nchiderea sesiunii. Furnizarea parametrilor nume-utilizator i parol asigur protecia bazei de date mpotriva accesului neautorizat. Deconectarea utilizatorului de la baza de date Deconectarea utilizatorului de la o baz de date se realizeaz prin comanda DISCONNECT. Sintaxa acestei comenzi este: DISC[ONNECT]; Comanda are ca efect deconectarea de la baza de date curent, fr a nchide sesiunea de lucru SQL*Plus. nchiderea sesiunii de lucru SQL*Plus nchiderea sesiunii de lucru SQL*PLUS i predarea controlului sistemului de operare al calculatorului gazd se realizeaz cu una din comenzile: QUIT, EXIT sau ^Z. Sintaxa acestor comenzi este: QUIT; EXIT: ^Z; 3.7. ELEMENTE DE LUCRU CU SQL*PLUS A. ncrcarea i executarea comenzilor n exemplele ce se vor prezenta, referitor la utilizarea comenzilor SQL*Plus, se va folosi tabela Oracle pers100 cu structura de mai jos: CREATE TABLE pers100 (CODPERS NUMBER(5), NUME VARCHAR2(30), PRENUME VARCHAR2(30), ZINAST NUMBER(2), LUNAST NUMBER(2), ANAST NUMBER(4), STRADA VARCHAR2(40), NRSTR NUMBER(2), SECTOR NUMBER(1), LOCNAST VARCHAR(20), FUNCTIA VARCHAR(15), SALARIU NUMBER(8), NUMAR_ACTIUNI NUMBER (6))

PCTFREE 5 PCTUSED 75; Comenzile se pot introduce pe una sau mai multe linii. Exemplu: Comanda sql> select * from pers100; este echivalent cu: sql> select 2 * from 3 pers100; Introducerea comentariilor se poate realiza folosind: Comanda REMARK din SQL*Plus Exemplu: REMARK comentariu Nu se vor introduce comentarii intre liniile aceleai comenzi SQL. Delimitatorii de comentariu din SQL /* */ Exemplu: /* comentariu */ comentariile tip PL/SQL prefixate cu - - Exemplu: -- comentariu Terminarea unei comenzi SQL se face cu: punct i virgul (;), slash (/) sau blank. Primele dou forme cer SQL*Plus s execute imediat comanda, a treia form nu. Comanda curent poate fi rulat sau rerulat introducnd comenzile RUN sau slash(/). Se pot introduce i blocuri PL/SQL care s fie executate. La sfritul blocurilor PL/SQL se vor insera dou linii una coninnd un punct, iar cealalt un slash(/). Exemplu: declare x number := 100; begin for i in 1 .. 10 loop insert into pers100 values (10, ionel, marin, 10,7,1970, ion manolescu,2, 6, suceava); end loop; end; /

Zona (aria) n care SQL*Plus memoreaz comenzile curente se numete buffer-ul SQL. Pe lng comenzile SQL i PL/SQL se pot introduce i comenzi SQL*Plus, care pot fi abreviate i la o liter. Comenzile foarte lungi pot fi ntrerupte i continuate pe linia urmtoare. ntreruperea se marcheaz cu -. Oracle automat afieaz semnul > (prompter) dup care se introduce restul comenzii. Exemplu: sql> select * from >pers100; Controlul listrii rapoartelor lungi se poate face utiliznd tasata Cancel sau setnd variabila PAUSE pe ON. Exemplu: set pause text de atenionare set pause on Aceast setare va determina ca sistemul s opreasc afiarea la fiecare pagin i s afieze textul text de atenionare. Cu SET PAUSE OFF se revine la starea anterioar. B. Editarea comenzilor SQL*Plus Editarea n mod linie se realizeaz prin comenzile din tabelul 3.10. Tabelul 3.10. Comenzile de editare a comenzilor SQL*Plus
Comanda APPEND text CHANGE /old/new/ CHANGE /text CLEAR BUFFER DEL INPUT INPUT text LIST LIST n LIST * LIST LAST LIST m n Abreviaia A text C /old/new/ C/text CL BUFF Fr abreviaie I I text L L n sau n L* L LAST Lmn Funcia Adaug text la sfritul unei linii Schimb un text cu altul terge textul unei linii Cur bufferul terge o linie Adaug una sau mai multe linii Adaug o linie format dintr-un text Listeaz toate liniile din buffer Listeaz linia n Listeaz linia curent Listeaz ultima linie Listeaz liniile de la m la n

Editarea comenzilor cu editorul sistemului se realizeaz cu comanda EDIT. Apare fereastra Editorului, n care se vor tasta instruciunile SQL dorite. Se salveaz fiierul cu nume.SQL i se execut cu comanda @nume. C. Crearea, regsirea, rularea i modificaea fiierelor de comenzi. Crearea fiierelor de comenzi se pot realiza prin:

Salvarea coninutului bufferului cu comanda SAVE. Exemplu: SAVE nume_ fiier.SQL nainte de salvare se va lista bufferul cu comanda LIST pentru a verifica dac instruciunile ce vor fi salvate sunt corecte. Utilizarea comenzii INPUT n corelaie cu SAVE Exemplu: sql> clear buffer sql> input select * from pers100 sql> save comand1.sql sql> @comand1 Utilizarea editorului de sistem SQL> EDIT nume_fiier Regsirea (citirea) fiierelor de comenzi se face cu comanda GET. Exemplu: SQL> GET edit3 SELECT * FROM PERS100; Rularea fiierelor de comenzi se execut folosind comenzile: START nume_fiier @nume_fiier Dac avem mai multe fiiere de comenzi pe care vrem s le executm secvenial, vom creea un fiier de comenzi coninnd comenzile START corespunztoare, dup care pentru rulare vom activa acest ultim fiier. Exemplu: n fiierul FILE2 introducem comenzile: START fi1 START fi2 START fi3 Apoi cu una din comenzile START FILE2 sau @FILE2 vom activa aceste comenzi. Modificarea fiierelor de comenzi se poate realiza folosind comanda EDIT nume_fiier sau comanda GET urmat de SAVE nume_fiier REPLACE. D. Faciliti pentru setarea fiierelor de comenzi Urmtoarele faciliti fac posibil setarea unor fiiere de comenzi care s permit utilizatorilor s-i introduc propriile valori pentru controlul

execuiei comenzilor: definirea variabilelor de utilizator; tergerea variabilelor de utilizator; substituirea valorilor n comenzi; folosirea comenzii START pentru furnizarea de valori n comenzi; crearea unor prompteri pentru introducerea valorilor. 1) Definirea variabilelor de utilizator se face explicit cu comanda DEFINE sau implicit prin utilizarea prefixrii variabilelor cu dou &. Definirea, listarea i tergerea unei variabile utilizator n mod explicit se fac cu comenzile: DEFINE nume_variabil = valoare variabila Exemplu: SQL > DEFINE variabila1 = mihai 2) tergerea variabilelor de utilizator se realizeaz prin utilizarea comenzii UNDEFINE nume_varaiabil. Exemplu: SQL> UNDEFINE varaiabila1 3) Substituirea variabilelor este o tehnic prin care putem creea proceduri de lucru astfel nct s folosim acelai script (grup de instruciuni) pentru efectuarea unor funcii diferite pornind de la structura procedurii. Variabilele ce se substituie pot exista la momentul substituirii dac anterior au fost create explicit cu comanda DEFINE sau implicit prin prefixare cu &. Exist patru modaliti de substituire a variabilelor: substituirea variabilelor prefixate cu un &; substituirea variabilelor prefixate cu dou &; substituirea variabilelor de tip &n cu ajutorul comenzii START; substituirea variabilelor folosind comenzile PROMPT, ACCEPT i PAUSE a) Substituirea variabilelor prefixate cu un &. Vom crea o procedur generalizat pentru calculul unor subgrupe statistice pe o coloan numeric. Exemplu: S se execute selecia din baza de date a valorilor salariilor aparinnd aceleai funcii, iar din aceste grupe afiarea celor care sunt cele mai mici din grup, ordonate descresctor. select funcia , min(salariu) minimum from pers100 group by funcia order by min(salariu) desc; n fraza SELECT de mai sus funcia, min, salariu i desc pot fi definite ca variabile, ceea ce va permite ca s putem utiliza pentru grupare i alt coloan, pentru calcul i valorile max sau sum, iar pentru ordonare vom putea folosi i valoarea ascendent. Pentru executarea acestei comenzi vom crea fiierul de comenzi CALC&.SQL, cu structura de mai jos:

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --*/ /* &v1_col_grup = nume coloan din tabel dup valorile creia se va face gruparea /* &v2_tip_calc = tipul calculului: min, max, sum pentru un anumit grup de valori numerice /* &v3_col_calc = numele coloanei de tip numeric dup care se va face calculul /*&v4_nume_col_calculat = numele coloanei, n list, pe care se vor afia valorile calculate /* &v5_tip_sort = tipul ordonrii(sortrii), desc(descending) sau asc(ascending) SELECT &v1_col_grup, &v2_tip_calc(&v3_col_calc), &v4_nume_col_calculat FROM pers100 GROUP BY &v1_col_grup ORDER BY &v2_tip_calc(&v3_col_calc,) &v5_tip_sort; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - --*/ Dup apelul fiierului cu comanda @calc& sistemul ne va cere succesiv s furnizm valorile dorite pentru variabilele definite astfel: Enter value for v1_col_grup: nume Enter value for v2_tip_calc: min Enter value for v3_col_calc: salariu Enter value for v4_nume_col_calculat: MINIMUM Enter value for v1_col_grup: nume Enter value for v2_tip_calc: min Enter value for v3_col_calc: salariu Enter value for v5_tip_sort: desc Iar rezultatul dup executare comenzii va arta ca mai jos: NUME MINIMUM ------------------------------ --------ionescu 3500000 petrescu 2500000 mihai 1500000 b) Substituirea variabilelor prefixate cu dou &. Pentru exemplificare vom crea, pornind de la fiierul de comenzi CALC&.SQL, fiierul de comenzi CALC&&.SQL n care variabilele vor fi prefixate cu doua caractere &, ca mai jos:

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - -*/ /* &&v1_col_grup = nume coloan din tabel dup valorile creia se va face gruparea /* &&v2_tip_calc = tipul calculului: min, max, sum pentru un anumit grup de valori numerice /* &&v3_col_calc = numele coloanei de tip numeric dup care se va face calculul /*&&v4_nume_col_calculat = numele coloanei, n list, pe care se vor afia valorile calculate /* &&v5_tip_sort = tipul ordonrii(sortrii), desc(descending) sau asc(ascending) */ SELECT &&v1_col_grup, &&v2_tip_calc(&&v3_col_calc), &&v4_nume_col_calculat FROM pers100 GROUP BY &&v1_col_grup ORDER BY &&v2_tip_calc(&&v3_col_calc), &&v5_tip_sort /* - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - - - - -*/ La momentul executrii fiierului de comenzi CALC&&.Sql sistemul va cere s introducem valorile dorite pentru variabilele definite la fel ca la apelul precedent cu deosebirea c valorile ce le vom furniza vor fi memorate de fiecare dat astfel c indiferent de cte ori apare o variabil pentru ea se va furniza valoarea o singur dat. Orice execuie ulterioar a unui fiier de comenzi n care apare una din variabilele create anterior (definite implicit ca variabile utilizator) se vor folosi aceste valori. Execuia acestui fiier de comenzi va produce acelai rezultat ca i execuia fiierului CALC&.SQL. Rulnd comanda DEFINE vom gsi n sistem pe lng alte variabile utilizator i variabilele create prin execuia fiierului CALC&&.SQL. Exemplu: SQL> DEFINE DEFINE _EDITOR = Notepad (CHAR) DEFINE _RC = 1 (CHAR) DEFINE V1_COL_GRUP = nume (CHAR) DEFINE V2_TIP_CALC = min (CHAR) DEFINE V3_COL_CALC = salariu (CHAR) DEFINE V4_NUME_COL_CALCULAT = minimum (CHAR) DEFINE V5_TIP_SORT = desc (CHAR) Dac vom dori rularea procedurii create anterior dar dnd variabilelor alte valori, va trebui nti s tergem aceste variabile cu comanda UNDEFINE.

c) Substituirea variabilelor de tip &n cu ajutorul comenzii START. Pentru a nu mai furniza interactiv valori pentru variabilele utilizator la momentul execuiei, le putem defini pe acestea sub forma &n , n care n ia valori ncepnd cu 1, iar valorile lor vor fi furnizate ca parametrii de apel ai instruciunii START. Astfel vom crea fiierul de comenzi CALCSTART.SQL de forma: /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - - --/* &1 = nume coloan din tabelei dup care se face gruparea /* &2 = tipul calculului: min, max, sum pentru un anumit grup /* &3 = numele coloanei de tip numeric dup care se va face calculul /* &4 = numele coloanei pe care se vor afia valorile calculate /* &5 = tipul ordonrii(sortrii), descending sau ascending*/ select &1, &2(&3) &4 from pers100 group by &1 order by &2(&3) &5; /* - - - - - - - - - - - - -- - - -- -- - - - - - - - - - - - -- - -*/ Pentru execuie vom apela fiierul de comenzi CALCSTART.SQL cu comanda START n care vom furniza ca parametrii valorile dorite pentru cele 5 variabile de tip &n definite. Exemplu: SQL> START CALCSTART nume min salariu MINIMUM desc Aceast execuie va produce acelai rezultat ca i execuiile fiierelor de comenzi CALC&.SQL i CALC&&.SQL. Deosebirea este c nu se mai creeaz variabilele utilizator astfel c putem executa n mod generalizat procedura CALCSTART dnd variabilelor orice alte valori logic acceptabile. d) Crearea unor modaliti interactive de comunicare cu calculatorul se realizeaz cu comenzile PROMPT, ACCEPT i PAUSE, care sunt de fapt operaii de intrare/ieire standard. PROMPT permite trimiterea (scrierea) de mesaje la utilizator. ACCEPT permite preluarea (citirea) rspunsurilor de la utilizator. PAUSE permite introducerea unui moment de pauz pentru ca utilizatorul s citeasc mesajul i s-i formuleze rspunsul. Aceste comenzi se folosesc n conjuncie cu INPUT i SAVE, pentru a introduce valorile dorite cu comenzile de mai sus, i respectiv pentru a le salva ntr-un fiier de comenzi, care s fie ulterior executat. Exemplu: SQL> Clear buffer SQL> INPUT

PROMPT Introducei un titlu format din maxim 30 caractere PAUSE urmeaz introducerea titlului, apsai RETURN ACCEPT TITLUL_MEU PROMPT TITLUL: PAUSE urmeaz comanda de centrare a titlului, apsai RETURN TTITLE CENTER TITLUL_MEU SKIP 2 PAUSE urmeaz selectarea din baza de date, apsai RETURN SELECT codpers, nume , prenume from pers100; SQL> SAVE cmdprompt SQL> @cmdprompt Rezultatul este:
Introducei un titlu format din maxim 30 caractere urmeaz introducerea titlului, apsai RETURN titlu:-----SELECTARE DIN BAZA DE DATE codpers, nume i prenume ---urmeaz comanda de centrare a titlului, apsai RETURN urmeaz selectarea din baza de date, apsai RETURN -----SELECTARE DIN BAZA DE DATE codpers, nume i prenume ---CODPERS NUME PRENUME -------------------------------------- ---------1 petrescu ion 2 petrescu florea 3 ionescu ion 4 ionescu dumitru 5 mihai florea 6 mihai ion 6 rows selected.

e) Utilizarea comenzilor PROMPT i ACCEPT n conjuncie cu substituirea variabilelor n exemplele anterioare cnd s-au utilizat fiierele de comenzi CALC&.SQL i CALC&&.SQL s-a vzut c sistemul pentru fiecare variabil a creat cte un prompter de forma: Enter value for nume_variabil : Ca atare se poate nlocui prompter-ul sistemului cu propriu prompter utiliznd pentru aceasta comenzile PROMPT i ACCEPT n fiierul de comenzi unde vrem s introducem o variabil pentru care vom construi alt prompter dect cel de sistem. Exemplu: SQL> Clear buffer SQL> INPUT PROMPT Introducei o valoare numeric pentru salariu PROMPT De exemplu: 1500000, 2500000 ACCEPT var_salariu NUMBER PROMPT valoare salariu:

SELECT codpers, nume, salariu from pers100 WHERE salariu = &var_salariu SQL> save cmd2prompt SQL> @cmd2prompt Rezultatul este:
Introducei o valoare numeric pentru salariu De exemplu: 1500000, 2500000 valoare salariu: aaaa aaaa is not a valid number valoare salariu: 3500000 old 1: SELECT codpers, nume, salariu from pers100 WHERE salariu = &var_salariu new 1: SELECT codpers, nume, salariu from pers100 WHERE salariu = 3500000 CODPERS NUME SALARIU -------------------------------------- --------4 ionescu 3500000

3.8. FORMATAREA REZULTATELOR Limbajul SQL*PLUS permite proiectarea i formatarea diverselor situaii de ieire. Aceste operaii sunt posibile prin utilizarea unor comenzi pentru tratarea ntreruperilor, comenzi pentru definirea titlurilor, definirea coloanelor, realizarea calculelor i stabilirea diverselor opiuni pentru poziionarea unor arii de lucru pe ecran. A. Tratarea ntreruperilor ntreruperea este un eveniment care se produce n timpul execuiei unei comenzi SELECT, cum ar fi, de exemplu, apariia sfritului de pagin sau schimbarea valorii unei expresii. Pentru a specifica evenimentele care determin o ntrerupere i aciunea corespunztoare SQL care se execut, se utilizeaz comanda BREAK. Ea poate specifica mai multe evenimente care genereaz o ntrerupere. Evenimentele sunt reinute ntr-o ordine numit "ierarhie de ntrerupere". La un moment dat,"se poate executa doar o singur comand BREAK. Comanda BREAK are urmtoarele forme sintactice: BRE[AK] ON {expr | ROW | PAG[E] | REPORT} [SKI[P] n | [SKIP]PAGE] [NODUP[LICATES] | DUP[LICATES]]; BRE[AK];

unde: ON expr determin o ntrerupere cnd se schimb valoarea expresiei expr; expr este fie o expresie care implic una sau mai multe coloane dintr-o tabel, fie o etichet ataat unei coloane declarat in comanda SELECT sau COLUMN. Dac ON expr apare de mai multe ori n comand, atunci expresiile respect "ierarhia de ntrerupere", aceasta fiind chiar ordinea n care sunt specificate expresiile. Cnd se folosete ON expr, trebuie utilizat i clauza ORDER BY, pentru a ordona rndurile din "ierarhia de ntrerupere*. Ordinea de apariie a expresiilor expr n comanda BREAK ON trebuie s rte aceeai cu cea prezent n SELECT...GRDER BY: ON ROW determin o ntrerupere cnd se selecteaz un rnd cu SELECT. Aceast ntrerupere este reinut la sfritul ierarhiei de ntrerupere; ON PAGE determin o ntrerupere la sfritul fiecrei pagini; ON REPORT determin o ntrerupere la sfritul raportului sau cererii, ntrerupere care este reinut la nceputul ierarhiei de ntrerupere. SKIP determin saltul peste n linii, nainte de a se tipri linia asociat ntreruperii respective. PAGE sau SKIP PAGE determin saltul la o pagin nou nainte de a tipri linia asociat respectivei ntreruperi. NODUPLICATES determin tiprirea de spaii cnd valorile de JJS coloana de ntrerupere sunt identice. DUPLICATES determin tiprirea valoarii coloanei de ntrerupere n fiecare rnd selectat. Valoarea NODUPLICATES este implicit. Comanda BREAK fr clauze indic poziia ntreruperii curente. Exemple: 1) S fie definit o ntrerupere generat de schimbarea valorilor coloanei FUNCT. La apariia acestui eveniment s fie afiate dou linii vide. SQL> BREAK ON FUNCT SKIP 2; SQL> SELECT MARCA,NUME,CODD, 2 SALA, VENS 3 FROM SALARIAI 4 ORDER BY FUNCT;
MARCANUME FUNCT 7000 ION ION DIRECTOR 2550 FRINCU ION SEF DEP 1000 COMAN RADU 2500 VLAD VASILE 4000 PAUL TEFAN 3755 DORU DAN CODD 100000 160000 130000 160000 160000 130000 SALA 45000 36000 35000 36500 35000 36500 VENS 40000 37000 2500 1500 5600 5500

1111 1680 3700 2553 3760 3770 2554 3759 3500 2650 1222

AVRAM ION VINZATOR RADU ION MNU DAN AILENEI FLORIN SANDU ION CARMEN ANA DARIAN GEO ALEXE IOAN DAN ION VLAD ION BARBU DAN

100000 130000 160000 120000 130000 130000 120000 160000 160000 120000 120000

21200 20750 27500 25000 25600 26500 26000 25700 24500 25060 20750

1000 3000 2500 400 0 2000 350 3500 2000

2) S fie definit o ntrerupere la apariia unei schimbri a valorii coloanei ODS din tabela SALARIAI. n momentul realizrii evenimentului s se realizeze salt la pagin nou. SQL> SET PAGESIZE 11 SQL> BREAK ON CODS SKIP PAGE; SQL> SELECT * FROM SALARIAT 2 ORDER BY CODS;
MARCA NUME 1111 AVRAM ION 2650 VLAP ION 1222 BARBU DAN MARCA NUME 2550 FRINCU ION 3500 DAN ION 1680 RADU ION FUNCT VINZATOR VINZATOR VINZATOR FUNCT SEF DEP VINZATOR VINZATOR CODD 100000 120000 120000 SALA 21200 25060 20750 VENS CODS 1000 1000 3500 2000 VENS CODS 37000 2500 350 3000

CODD SALA 160000 36000 160000 24500 130000 20750

MARCA NUME FUNCT CODD SALA VENS CODS VENS CODS 2553 AILENEI FLOR VINZATOR 120000 120000 250000 2000 2554 DARIAN GEO VINZATOR 260000 4000 MARCA NUME FUNCT CODD SALA VENS CODS 7000 ION ION DIRECTOR 100000 45000 40000 8000

9records selected. B. Tiprirea titlurilor Pentru afiarea unui titlu la sfritul sau la nceputul fiecrei pagini se utilizeaz comanda BTITLE, respectiv TTITLE. Comanda BTITLE are urmtoarele sintaxe: BTI[TLE] [COL[UMN] n1 [SKlP [n]] [TAB n] [LEFT | RIGHT | CENTER] [FORMAT char] [char | var]...;

BTI[TLE] {OFF | ON}; BTI[TLE] text; BTI[TLE] unde: COL[UMN] n determin saltul la coloana n a liniei curente. Prin SKIP n se determin saltul Ia nceputul liniei curente, de n ori. Dac n este omis, se sare o singur dat, iar dac n este zero, se realizeaz ntorcerea ia nceputul liniei curente. TAB n are a efect saltul a n coloane (prin coloan nelegndu-se nu o coloan de tabel, ci poziia cursorului) nainte dac n este pozitiv sau napoi dac n este negativ. Clauzele LEFT, RIGHT, CENTER determin alinierea la stnga, la dreapta respectiv afiarea centrata a datelor din linia curent. Urmtoarele date sunt aliniate ca an grup, de la nceputul pn la sfritul comenzii PRIN sau la urmtorul LEFT, CENTER, RIGHT sau COLUMN. CENTER i RIGHT folosesc valoarea returnat de comanda SET LINESIZE pentru a calcula poziia urmtorului articol. FORMAT char specific un model de format pentru articolul de date care urmeaz; acest format se menine pn la ntlnirea unei alte clauze FORMAT sau pn la sfritul comenzii. De reinut c doar un singur model de format poate fi activ la un moment dat. Dac nici un format potrivit nu are efect, atunci valorile sunt tiprite n conformitate cu formatul specificat n SET NUMFORMAT iar dac SET UNFORMAT nu a fost utilizat, valorile vor fi tiprite cu formatul implicit. Pentru specificarea titlurilor pot fi folosite constante (char) i variabile (var), ele fiind poziionate i formatate aa cum se specific n clauzele comenzii. Existena unui separator indic nceputul unor linii noi, iar doi separatori pe acelai rnd introduc o linie vid. Iniial, caracterul de separare este."!", ns el poate fi schimbat cu SET HEADSEP. SQL*PLUS interpreteaz comanda BTITLE h forma nou dac primul cuvnt dup numeie comenzii este numele unei clauze valide (LEFT, SKIP, COL etc.). Clauzele ON i OFF au ca efect apariia (ON) sau nu (OFF) a titlului. BTITLE text afieaz centrat textul specificat. Comanda BTITLE fr clauze specific titlul curent. Exemple:

1) S se afieze la sfritul unui raport final cu privire la produsele din depozitul cu codul 100000, n partea stng irul de caractere "Data:" iar n partea dreapt "Semntura:". SQL> SET PAGESIZE 11 SQL> BTITLE LEFT Data: RIGHT Semntura:; SQL> SELECT FROM PRODUSE 2 WHERE CODD=100000;
CODD 100000 100000 100000 Data: CODP D4 A3 A7 DENP SCAUN FOTOLIU MASA STOC 36 27 23 DATA CRT UM 10-SEP-05 BUC 15-SEP-05 BUC 05-SEP-05 BUC Semnatura:

2) S se afieze la sfritul unui raport privind situaia produselor din depozitul 100000, ncepnd din coloana 11, irul de caractere "OBSERVATIT. SQL> BTITLE COL 11 OBSERVAII; SQL> SELECT * FROM PRODUSE 2 WHERE CODD-100000;
CODD CODP DENP 100000 166666 PLACAJ 2/2 100000 144444 SCAUN D4 100000 111111 MESE 15/20 100000 122222 FOTOLIU A3 100000 133333 CANAPEA A7 100000 155555 BIROU C6X4 OBSERVAII STOC DATACRT 100 12-JUL-05 36 12-JUL-05 7 27-JUN-05 12 01-JUL-05 6 18-JUL-05 9 29-JUL-05 UM MP BUC BUC BUC BUC BUC

3) S se afieze centrat, la sfritul unui raport privind produsele din depozitul cu codul 100000, irul de caractere"Depozitul_MOBILA/100000". SQL> BTITLE CENTER Depozitul_MOBILA/100000 SQL> SELECT CODD "Cod depozit", 2 DENP "Denumire", 3 CODP "Cod produs", 4 STOC "Stoc",DATACRT "Data", 5 UM 6 FROM PRODUSE 7 WHERE CODD=100000;
Cod dep Denumire Cod produs Stoc Data UM

100000 100000 100000 100000 100000 100000

PLACAJ 2/2 SCAUN D4 MESE 15/20 FOTOLIU A3 CANAPEA A7 BIROU C6X4

166666 144444 111111 122222 133333 155555

100 36 7 12 6 9

12-JUL-05 12-JUL-05 27-JUN-05 01-JUL-05 18-JUL-05 29-JUL-05

MP BUC BUC BUC BUC BUC

Depozitul MOBILA/100000

4) S se afieze specificaiile curente pentru BTITLE. Ultima comand primit n sistem se prezint astfel: SQL> BTITLE COL 40 Total RIGHT Semntura; SQL> BTITLE;
btitle ON and is the following 28 characters: COL 40 Total RIGHT Semntura

Comanda TTITLE determin afiarea unui titlu la nceputul paginii i are urmtoarele sintaxe: TTI[TLE] [COL[UMN] n] [SKIP [1 | n] [TAB n] [LEFT | RIGHT | CENTER] [FORMAT char] [char | var] TTI[TLEI text; TTI[TLE]; Clauzele comenzii TTITLE au aceeai semnificaie ca la BTITLE. Comanda TTITLE fr clauze determin afiarea titlului curent. Exemplu: S se afieze la nceputul unui raport privind comenzile cu date mai mic de 30 septembrie 2005, urmtoarele iruri de caractere: "SITUAIA COMENZILOR" i "LA DATA DE 30-SEP-05". Cele dou iruri se vor afia centrat, pe dou linii. SQL> SET PAGESIZE 11 SQL> SET LIN 45 SQL> COLUMN NRCOM FORMAT 99999999 SQL> COLUMN NRCOM JUSTIFY CENTER SQL> COLUMN CODP FORMAT 99999999 SQL> COLUMN CODP JUSTIFY CENTER SQL> COLUMN VALOARE FORMAT 99999999999 SQL> COLUMN VALOARE JUSTIFY CENTER SQL> SET SPACE 7 SQL> TTITLE 'SITUAIA COMENZILOR LA DATA DE 30-SEP-05" SQL> SELECT 2 NRCOM,CODP,CANT*PRET VALOARE

3 FROM COMENZI 4 WHERE DATAL<='30- SEP-05;


SITUATIA COMENZILOR LA DATA DE 30- SEP-05 NRCOM 211111 255566 166666 27000 CODP 233333 133333 222222 375000 VALOARE 244444 144444 320000 282000

Anularea opiunilor n vederea anulrii opiunilor se utilizeaz comanda: CL[EAR] option Este anulat opiunea specificat prin option, dup cum urmeaz: BRE[AKS] anuleaz ntreruperea indicat prin comanda BREAK; BUFF[ER] determin tergerea textului din buffer-ul curent; COL[UMNS] anuleaz opiunile indicate n comanda COLUMN; COMP[UTES] anuleaz opiunile indicate prin comanda COMPUTE; SCR[EEN] determin tergerea ecranului, iar SQL determin tergerea buffer-ului SQL; TIMI[NG] terge toate zonele create cu comanda TIMING. Exemple: 1) S se anuleze ntreruperile. SQL> CLEAR BREAKS; 2) S se anuleze definiiile de coloan. SQL> CLEAR COLUMNS; Descrierea coloanelor Pentru specificarea modului de formare a unei coloane i a capului de coloan ntr-o situaie, se utilizeaz comanda COLUMN. Sintaxa ei este: COL[UMN] (col | expr) [ALI[AS] sinonim] CLE[AR] | DEF[AULT]] [COLOR {culoare| variabila-culoare}] [FORMAT] format] [HEA[DING] text [JUS[TIFY] {L[EFT | C[ENTER] | R[IGHT]] [LIKE {expr | etichet}] [LINEAPP {LINE | MARK | BOTH}] [NEW_VALUE variabila] [NU[LL] char] [NOPRl[NT] | PRINT]] [OLD_VALUE variabila] [ON | OFF] [PATTERN {numr-de-model | variabila-model} [WRA[PPED]! WOR[D,... WRAPPED] | TRU[NCATED]] ...;

unde: col sau expr au rolul de a identifica coloana sau expresia la care se refer comanda. Comanda COLUMN trebuie s se refere la o coloan sau la o expresie utilizat-a n comanda SELECT. Dac comanda COLUMN se refer la o expresie, aceasta trebuie s fie specificat n acelai mod n care a fost specificat n SELECT. De exemplu, dac n SELECT expresia este 'A.+B', nu se poate folosi, n COLUMN, T+A'. Dac sunt selectate din tabele diferite coloane cu acelai nume, atunci comanda COLUMN se va aplica tuturor tabelelor ce conin acea coloan. Clauza ALIAS pune n coresponden numele coloanelor cu sinonimul specificat. Clauza CLEAR are ca efect tergerea n totalitate a definiiei coloanei. Clauza FORMAT specific formatul de apariie ai coloanei. Limea implicit a coloanei este chiar limea coloanei definite n baza de date. Ea poate fi schimbat cu valoarea n, folosind "FORMAT An". Limea unei coloane numerice este implicit valoarea data de NUMWIDTH, ea putnd fi schimbat cu ajutorul clauzei FORMAT. Clauza HEADING definete capul coloanei, care implicit este col sau expr. Dac textul din definirea coloanei conine spaii sau semne de punctuaie, acestea trebuie puse ntre ghilimele. Fiecare semn "I" din text are ca efect nceperea unei linii noi. Clauza JUSTIFY aliniaz capul coloanei. Implicit, alinierea se face la dreapta pentru o coloan numeric i la stnga pentru alte tipuri de coloane. Clauza LIKE determin copierea specificaiilor altei coloane sau expresii (specificaii deja definite prin alt comand COLUMN). Prin folosirea clauzei NEWLINE se trece la o linie nou, nainte de a afia valorile coloanei. Clauzele PRINT i NOPRINT au ca efect tiprirea sau nu a coloanei. Dac se utilizeaz clauza NULL, textul va fi afiat chiar dac conine o valoare nul. Valoarea implicit este un ir de blancuri. Clauzele OFF sau ON determin folosirea, respectiv nefolosirea formatului specificaiei de ieire pentru o coloan, fr a-i afecta coninutul. Clauza WRAPPED are ca efect scrierea pe linia urmtoare a caracterelor care nu au ncput pe prima linie. Clauza WORD_WRAPPED are efect asemntor cu cel al clauzei WRAPPED, cu deosebirea c determin scrierea ntregului cuvnt pe linia urmtoare i nu pe dou rnduri ca la WRAPPED. Clauza TRUNC determin trunchierea valorii. Clauza COLOR specific culoarea utilizat pentru afiarea valorilor coloanei, ntr-o reprezentare liniar sau prin benzi. Variabila CLR n (n=l,60)

se refer la valoarea curent a culorii. Setarea se face prin comanda SET CLR n. Clauza LINEAPP stabilete modul de subliniere a coloanei. Utiliznd LINE dreapta apare continu. Folosind MARK se schieaz doar puncte, iar BOTH realizeaz ambele modaliti: linie i puncte. Clauza PATTERN specific modelul pe care-1 va avea dreptunghiul/banda ntr-un grafic de tip benzi sau sectorul ntr-un grafic de tip cerc. numr-demodel este cuprins ntre 1 i 16 i reprezint un model. Variabila PAT n, unde ns[l,30] se refer la poziia curent a modelului. Semnificaia valorilor din numr-de-model i a valorilor PAT n sunt precizate n documentaie. Numrul de comenzi COLUMN folosite indic faptul c se lucreaz cu diverse coloane sau expresii utilizate n comanda SELECT. Pentru o coloan sau expresie pot exista mai multe comenzi COLUMN. n cazul n care mai multe comenzi COLUMN folosesc aceeai clauz pentru aceeai coloan, se va lua n considerare doar ultima comand. Comanda COLUMN fr clauze are ca efect tiprirea definiiilor coloanei curente. Dac aceast comand are doar clauzele col i expr, efectul ei const n indicarea definirii coloanei existente. Trebuie precizat c n prima comanda COLUMN, expresia trebuie s aib aceeai form ca i n SELECT. n caz contrar, SQL*Plus nu va putea executa comanda COLUMN pentru coloana respectiv. Exemple: 1) S se defineasc coloana NUME pe o lime de 25 de caractere iar capul de coloan s fie scris pe dou rnduri, astfel: NUME PRODUS SQL> COLUMN NUME FORMAT A25 HEADING 'NUME PRODUS'; 5QL> SELECT DISTINCT(DENP) NUME 2 FROM PRODUSE;
NUME PRODUS MESE 15/20 FOTOLIU 2 records selected.

2) S se afieze sinonimul SALARIU pentru coloana definit de expresie aritmetic SALA+VENS. Coloana va fi scris cu formatul $99,999.99. SQL> COLUMN SALA+VENS ALIAS SALARIU SQL> COLUMN SALARIU FORMAT $99,999.99 SQL> SELECT SALA+VENS SALARIU, 2 MARCA, NUME 3 FROM SALARIAI;
SALARIU $22,200.00 $22,750.00 MARCA 1111 1222 NUME AVRAM ION BARBU DAN

2 records selected.

3) S se defineasc coloana DENP de 16 caractere alfanumerice, pentru care se specific sinonimul DENUMIRE . In capul de coloan se va afia textul "Denumire produs". SQL> COLUMN DENP FORMAT A16 SQL> COLUMN DENP ALIAS DENUMIRE SQL> COLUMN DENUMIRE HEADING "Denumire produs" SQL> SELECT * FROM PRODUSE;
CODD CODP Denumire produs 100000 166666 PLACAJ 2/2 100000 122222 FOTOLIU A3 100000 133333 CANAPEA A7 100000 155555 BIROU C6X4 100000 144444 SCAUN D4 100000 111111 MESE 15/20 6 records selected. STOC 100 7 36 12 6 9 DATACRT 12-JUL-92 27-JUN-92 12-JUL-92 01-JUL-92 18-JUL-92 29-JUL-92 UM MP BUC BUC BUC BUC BUC

4) S se defineasc coloana DENUM2 cu un format alfanumeric de trei caractere. Specificaiile pentru aceast coloan sunt copiate pentru coloana DENP. SQL> COLUMN DENUM2 FORMAT A3 SQL> COLUMN DENP LME DENUM2 SQL> SELECT * FROM PRODUSE 2 WHERE CODP<138333;
CODD CODP DEN 100000 111111 MES STOC DATACRT 7 27-JUN-05 UM BUC

5) S se defineasc coloana ADRESA pe 21 de caractere, utiliznd clauza WRAPPED. SQL> COLUMN FORMAT A21 ADRESA WRAPPED SQL> SELECT STR11 '-' 11NR11 '-' 11 LOC ADRESA 2 FROM CLIENI;
ADRESA MOILOR- 104-BUCURESTI DOROBANI- 18-BUCURESTI GOLENTINA-221-BUCURESTI EMINESCU-44-BUCURESTI 4 records selected.

D.Realizarea de calcule SQL*Plus permite realizarea unor calcule cu rndurile selectate din tabele. Pentru aceasta se utilizeaz comanda COMPUTE, care are urmtoarea sintax: COMP[UTE] [AVG | COU[NT] | MAX[IMUM] | MIN[IMUM] NUMBER) ISDT | SUM | VAR[IANCE}] OF { expresiei etichet),... ON [expresiei etichet IPAGE1 REPORT! ROW]; Semnificaia clauzelor este:
Clauza AVG COUNT MAXIMUM MINIMUM NUMBER STD SUM VARIANCE Semnificaia Valoare medie Contorizare valori nule Valoare maxim Valoare minim Contorizare rnduri Abatere standard Suma valorilor nenule Dispersia Tipul coloanei Tipuri de date Numeric Toate tipurile Numeric i caracter Numeric i caracter Toate tipurile Numeric Numeric Numeric

Dac se specific mai multe funcii, nu trebuie separate ntre ele prin virgul. OF precizeaz coloana sau expresia ale cror valori se vor supune calculului. Acestea trebuie s apar n comanda SELECT, altfel comanda COMPUTE le va ignora. Dac se dorete ca valoarea calculat s nu fie afiat pe ecran se va utiliza clauza NON PRINT ataat coloanei respective cu comanda SELECT. ON specific un element care va fi utilizat ca generator de ntrerupere. El poate fi: expresie, etichet, pagin (PAGE), raport (REPORT), linie (ROW). De cte ori se va schimba valoarea acestuia, se va declana automat recalcularea funciei definite de COMPUTE. n cazul n care se d comanda fr nici o funcie, se vor afia specificaiile de calcul definite. Secvena de instruciuni care se va utiliza, n general, va fi: SQL* BREAK ON expresiei SQL> COMPUTE clauza OF expresie2 ON expresiei; SQL> SELECT Exemple: 1) S se editeze situaia final cu urmtorul format: SITUAIE SUM(SALA) FUNCIE SQL> SET PAGESIZE 22 SQL>RUN 1 SELECT SUM(SALA),FUNCT FROM SALARIAI

2* GROUP BY FUNCT
SITUAIE SUM(SALA) 45000 179000 268560 FUNCT DIRECTOR SEF DEP VINZATOR

2) S se editeze o situaie final cu salariile grupate pe funcii i depozite. SQL> RUN 1 SELECT FUNCT, 2 SUM(DECODE(CODD,100000,SALA,0)) "DEP 10", 3 SUM(DECODE(CODD,130000,SALA,0)) "DEP 13", 4 SUM(DECODE(CODD,160000,SALA,0)) "DEP 16" 5 FROM SALARIAI 6 GROUP BY FUNCT;

SITUATIE FUNCT DIRECTOR SEF DEP VINZATOR Data: DEP 45000 0 21200 DEP 0 71500 72850 Semntura: DEP 0 107500 77700

3) S se afieze o situaie final cu salariile grupate pe funcii i depozite. De asemenea, s se introduc o coloan cu suma salariilor pe fiecare funcie. SQL>RUN 1 SELECT FUNCT, 2 SUM(DECODE(CODD,100000,SALA,0)) "DEP 10", 3 SUM(DECODE(CODD,130000,SALA,0)) "DEP 13", 4 SUM(DECODE(CODD,160000,SALA,0)) "DEP 16", 5 SUM(SALA) 6 FROM SALARIAI 7 GROUP BY FUNCT;
SITUATIE
FUNCT DIRECTOR SEF DEP VINZATOR DEP 10 45000 0 21200 DEP 13 0 71500 72850 DEP 16 0 107500 77700 SUM(SALA) 45000 179000 268500

Data:

Semntura:

4) S se afieze o situaie final cu salariile grupate pe funcii i depozite. De asemenea, s se fac totalul salariilor pe fiecare depozit i fiecare funcie. SQL> BREAK ON DUMMY; SQL> COMPUTE SUM OF "DEP 100000" ON DUMMY; SQI> COMPUTE SUM OF "DEP 130000" ON DUMMY; SQL> COMPUTE SUM OF "DEP 160000* ON DUMMY; SQL> COMPUTE SUM OF "TOTAL" ON DUMMY; SQI> COLUMN DUMMY NOPRINT; SQL> TTITLE CENTER "SITUAIA SALARATILOR" SKIP CENTER "PE DEPOZITE /FUNCII" SKIP CENTER " " SQL> RUN 1 SELECT FUNCT, 2 SUM(DECODE(CODB,lG0000SALA,0)) "DEP 10", 3 SUM(DECODE(CODD,130000,SALA,0)) "DEP 13", 4 SUM(DECODE(CODD,160000,SALA,0)) "DEP 16", 5 SUM(SALA,) 6 SUM(0) DUMMY 7 FROM SALARIAI 8 GROUP BY FUNCT
SITUATIA SALARIATILOR PE DEPOZITE / FUNCTII
FUNCT DIRECTOR SEF DEP VINZATOR DEP 10 45000 0 21200 66200 DEP 13 0 71500 72850 144350 DEP 16 0 107500 77700 185200 SUM(SALA) 45000 179000 268500

Data:

Semntura:

CAPITOLUL 4. CREAREA UNEI BAZE DE DATE PRIN COMENZI SQL


4.1. TIPURI DE UTILIZATORI AI BAZELOR DE DATE ORACLE n funcie de volumul activitilor implicate de administrarea unei baze de date Oracle, sarcinile de administrare pot fi repartizate pe mai multe categorii de utilizatori ai bazei de date. Administratorul bazei de date (DBA) este, n funcie de complexitatea i mrimea unei baze de date, o persoan sau mai multe persoane, care s execute urmtoarele sarcini administrative: Instalarea i dezvoltarea sever-ului Oracle; Alocarea memoriei sistemului i planificarea cerinelor viitoare de memorie ale acestuia; Crearea bazei de date i a obiectelor acesteia (tabele, viziuni, indeci); Modificarea structurii bazei de date n funcie de cerinele dezvoltatorilor de aplicaii; Definirea utilizatorilor bazei de date i ntreinerea sistemului de securitate; Controlul i monitorizarea accesului utilizatorilor la baza de date; Monitorizarea i optimizarea performanelor bazei de date; Definirea i asigurarea politicii de salvarea sau copiere (backup) i refacere (recovery) a bazei de date; Arhivarea datelor; Asigurarea legturii cu firma Oracle pentru suportul tehnic i licena de utilizare a produselor Oracle. Dezvoltatorii de aplicaii proiecteaz i implementeaz aplicaii cu baze de date Oracle, executnd urmtoarele sarcini: Proiectarea i dezvoltarea unei aplicaii, precum i a structurilor de date ale acesteia; Estimarea cerinelor de memorie pentru aplicaie; Definirea modificrilor structurilor de date ale unei aplicaii; Transmiterea tuturor informaiilor despre activitile de mai sus ctre administratorul bazei de date; Stabilirea msurilor de securitate pentru aplicaie. Administratorul de aplicaii se ocup cu administrarea unei aplicaii;

Utilizatorii finali ai bazei de date au acces la baza de date prin intermediul unei aplicaii sau a instrumentelor Oracle, executnd n special urmtoarele activiti: Adugarea, modificarea i tergerea datelor din baza de date n concordan cu drepturile de acces pe care le are; Generarea unor rapoarte cu datele din baza de date. Administratorul de reea este responsabil cu administrarea produselor Oracle de reea. Pentru a putea executa sarcinile de administrare a unei baze de date o persoan trebuie s aib privilegii (drepturi) att la nivelul bazei de date Oracle, ct i la nivelul sistemului de operare al serverului pe care se afl baza de date. Prin urmare un administrator trebuie s aib: Cont de administrator pentru sistemul de operare, care s-i permit s execute comenzile sistemului de operare; Cont de administrator Oracle definit de dou conturi de utilizator (SYS i SYSTEM cu parolele CHANGE_OF_INSTALL i respectiv MANAGER); Rol de DBA, care este creat automat la momentul crerii unei baze de date Oracle. Acest rol conine toate privilegiile bazei de date Oracle. Datorit faptului c un administrator execut activiti pe care un utilizator obinuit nu le poate executa este necesar ca acesta s poat fi autentificat nainte de a executa activitile de administrare. Pentru autentificarea administratorului exist dou metode: autentificarea folosind sistemul de operare i autentificarea folosind fiierul de parole. Autentificarea folosind sistemul de operare se face utiliznd dou conturi de administrator: OSOPER (sub care poate executa STARTUP, SHUTDOWN, ALTER DATABASE OPEN/MOUNT, ALTER DATABASE BACKUP, ARCHIVELOG i RECOVER) i contul OSDBA (care conine toate privilegiile de sistem cu opiunea ADMIN OPTION, precum i rolul OSOPER). Sub contul OSDBA se poate executa comanda CREATE DATABASE. Autentificarea folosind fiierul de parole permite definirea parolelor de acces pentru fiecare utilizator. Dup stabilirea unui utilizator ca administrator, de exemplu utilizatorul SCOTT cu parola TIGER, acestuia i va fi atribuit unul din privilegiile SYSDBA sau SYSOPER, cu comanda GRANT. Dup aceasta utilizatorul SCOTT se va conecta la baza de date ca SYSDBA sau SYSOPER cu comanda CONNECT. Exemplu: GRANT SYSDBA TO scott

GRANT SYSOPER TO scott CONNECT scott/tiger AS SYSDBA CONNECT scott/tiger AS SYSOPER Administrarea fiierului cu parole include operaiile de definire a fiierului cu parole, setarea parametrului de iniializare a bazei de date REMOTE_LOGIN_PASSWORDFILE, adugarea de utilizatori n acest fiier i ntreinerea fiierului cu parole. Crearea fiierului cu parole se execut cu utilitarul ORAPWD, care are trei parametrii: FILE, PASSWORD i ENTRIES, dintre care primii doi sunt obligatorii, iar ultimul este opional. Aceti parametrii definesc numele fiierului cu parole, parola pentru utilizatorul SYS i respectiv numrul de utilizatori care pot executa activiti de administrator (DBA). Setarea parametrului de iniializare REMOTE_LOGIN_PASSWORDFILE cu una din valorile NONE, EXCLUSIVE i SHARED permite utilizarea fiierului cu parole.Valoarea NONE determin ca baza de date Oracle s funcioneze fr fiier de parole, valoarea EXCLUSIVE determin ca fiierul de parole s fie folosit exclusiv de ctre o singur baz de date, iar valoare SHARED determin ca fiierul de parole s fie folosit de ctre mai multe baze de date. Pentru a avea un grad mare de securitate pentru baza de date, va trebui ca imediat dup crearea fiierului cu parole parametrul de iniializare REMOTE_LOGIN_PASSWORDFILE s fie setat pe valoarea EXCLUSIVE. Adugarea de utilizatori n fiierul cu parole se face la momentul atribuirii privilegiilor SYSDBA sau SYSOPER unui anumit utilizator. Exemplu: 1. Se creeaz fiierul cu parole conform indicaiilor de mai sus; 2. Se seteaz parametrul de iniializare REMOTE_LOGIN_PASSWORDFILE cu valoarea EXCLUSIVE; 3. Se conecteaz utilizatorul SYS, cu parola CHANGE_OF_INSTALL ca SYSDBA folosind comanda CONNECT SYS/change_of_install AS SYSDBA 4. Se pornete o instan i se creeaz o baz de date, dac este necesar, sau se monteaz i se deschide o baz de date existent; 5. Se creeaz utilizatorii care se doresc a fi administratori i care s fie adugai n fiierul cu parole, folosind comanda CREATE USER user1 IDENTIFIED BY parola1 6. Se atribuie unul din privilegiile SYSDBA sau SYSOPER acestui utilizator cu una din comenzile: GRANT SYSDBA TO user1 sau GRANT SYSOPER TO user1

7. Utilizatorul USER1 este adugat n fiierul cu parole i se poate conecta acum ca SYSDBA sau SYSOPER cu acest nume de utilizator n loc de numele SYS, folosind una din comenzile: CONNECT USER1/parola1 AS SYSDBA sau CONNECT USER1/parola1 AS SYSOPER Listarea membrilor fiierului cu parole se face din viziunea $PWFILE_USERS folosind comanda SELECT * FROM V$PWFILE_USERS ntreinerea fiierului cu parole se refer la executarea activitilor de extindere, relocare, tergere sau schimbare a strii acestui fiier. 4.2. CREAREA, PORNIREA I OPRIREA UNEI BAZE DE DATE ORACLE Configurarea serverului Oracle presupune urmtoarele activiti: Instalarea sistemului Oracle, care const n instalarea nucleului Oracle pe server, a instrumentelor (tools-urilor) de aplicaie pe staii; Evaluarea resurselor fizice ale calculatorului pe care se va instala serverul Oracle i baza de date; Definirea structurii logice a bazei de date i a strategiei de salvare (backup); Crearea i deschiderea bazei de date; Implementarea bazei de date proiectate, prin definirea segmentelor de revenire (rollback), a tabelelor spaiu i a obiectelor bazei de date; Salvarea bazei de date i definirea utilizatorilor bazei de date, n concordan cu licena Oracle. Pentru a crea o baz de date Oracle trebuie s avem suficient memorie pentru pornirea unei instane Oracle i pentru crearea tuturor obiectelor proiectate ale bazei de date. Dac la momentul instalrii s-a creat i o baz de date iniial atunci aceasta poate fi dezvoltat astfel nct s cuprind, n final, toate obiectele bazei de date proiectate. De asemenea aceast baz de date iniial poate fi tears i n locul ei s se creeze o nou baz de date. Dac am folosit o versiune anterioar Oracle se poate crea o baz de date nou n ntregime, dac nu ne mai intereseaz vechea baz de date, altfel putem migra aceast baz de date la noua versiune Oracle. Crearea unei baze de date se face n urmtorii pai: Salvarea complet a bazei de date existente; Crearea fiierului cu parametrii folosit la pornirea bazei de date. Editarea noului fiier cu parametrii, astfel nct parametrii acestuia s corespund cerinelor noii baze de date.

Controlul identificatorului instanei Oracle, care trebuie s fie identic cu numele bazei de date setat n parametrul DB_NAME; Pornirea utilitarul Entreprice Manager i conectarea la Oracle ca administrator. Pornirea unei instane Oracle (System Global Area i procesele background) cu opiunea Startup Nomount. Crearea noii bazei de date folosind comanda SQL CREATE DATABASE, prin intermediul creia Oracle execut: crearea fiierelor de date (data files), fiierelor de control (control files) i a fiierelor de refacere (redo log) ale bazei de date; crearea tabelei spaiu SYSTEM i a segmentului rollback SYSTEM; crearea dicionarului de date; crearea utilizatorilor SYS i SYSTEM; specific setul de caractere care va fi folosit la memorarea datelor n baza de date; monteaz i deschide baza de date pentru utilizare. Salvarea integral a bazei de date. Parametrii de iniializare a bazei de date furnizeaz valorile necesare pentru funcionarea acesteia sub o anumit instan Oracle. Acetia se personalizeaz prin intermediul unui fiier text, numit fiierul cu parametrii de iniializare. Acesta este citit la momentul pornirii bazei de date de ctre serverul Oracle. Pentru a face eventuale modificri, baza de date trebuie oprit complet i repornit dup ce s-au efectuat astfel de modificri. Muli parametrii de iniializare se folosesc pentru ajustarea i creterea performanelor bazei de date. Specificarea parametrilor se realizeaz dup urmtoarele reguli: Toi parametrii sunt opionali; n fiierul cu parametrii se vor fi introduce numai parametrii i comentarii; Semnul (#) marcheaz nceputul unui comentariu, restul liniei fiind ignorat; Serverul Oracle are valori asumate pentru fiecare parametru; Parametrii pot fi specificai n orice ordine; Fiierul de parametrii nu este case-sensitive ; Pentru a introduce mai muli parametrii pe o linie acetia se vor separa prin spaiu: PROCESSES = 100 SAVEPOINTS = 5 OPEN_CURSORS = 10 Unii parametrii, ca de exemplu ROLLBACK_SEGMENTS, accept valori multiple, acestea putndu-se specifica ntre paranteze i separate prin virgul, sau fr paranteze i virgule, ambele sintaxe fiind valide, astfel:
ROLLBACK_SEGMENTS = (SEG1, SEG2, SEG3, SEG4, SEG5)

Caracterul (/) folosete pentru marcarea ntreruperii scrierii unui parametru pe o linie i continuarea lui pe linia urmtoare, imediat fr nici un spaiu n fa, astfel: ROLLBACK_SEGMENTS = (SEG1, SEG2, \ SEG3, SEG4, SEG5) Parametrul IFILE se poate introduce ntr-un fiier cu parametrii alt fiier cu parametrii, astfel: IFILE = COMMON1.ORA Se pot folosi trei niveluri de imbricare. n exemplu de mai sus fiierul COMMON1.ORA poate conine un al doilea parametru IFILE pentru fiierul COMMON2.ORA, care la rndul su poate conine un al treilea parametru IFILE pentru fiierul COMMON3.ORA. De asemenea, se pot utiliza mai muli parametrii IFILE n acelai fiier, astfel: IFILE = DBPARMS.ORA IFILE = GCPARMS.ORA IFILE = LOGPARMS.ORA Dac valoarea unui parametru conine caractere speciale, atunci caracterul special trebuie precedat de caracterul de comutare (\) sau ntreaga valoare este inclus ntre caracterele ( ), ca n exemplul de mai jos: DB_DOMAIN = JAPAN.ACME\#.COM sau DB_DOMAIN = "JAPAN.ACME#.COM" Pentru schimbarea valorii unui parametru, aceasta se editeaz n fiierul cu parametrii. Cnd instana Oracle este repornit aceasta va folosi noua valoare a parametrului. Civa parametrii de iniializare sunt dinamici, n sensul c valorile acestora se pot modifica prin procedeul de mai sus sau n timp ce o instan ruleaz, folosind comenzile SQL: ALTER SESSION, ALTER SYSTEM sau ALTER SYSTEM DEFERRED cu sintaxele: ALTER SESSION SET nume_parametru = valoare ALTER SYSTEM SET nume_parametru = valoare ALTER SYSTEM SET nume_parametru = valoare DEFERRED Comanda ALTER SESSION schimb valoarea unui parametru numai la nivelul sesiunii care a lansat-o, dup repornirea bazei de date se va utiliza iari valoarea din fiierul cu parametrii. Comanda ALTER SYSTEM modific valoarea global a parametrului, la nivelul ntregului sistem, deci pentru toate sesiunile active, dup repornirea bazei de date se va utiliza iari valoarea din fiierul cu parametrii.

ROLLBACK_SEGMENTS = SEG1 SEG2 SEG3 SEG4 SEG5

Comanda ALTER SYSTEM DEFERRED modific valoarea global a parametrului nu pentru sesiunile active, ci pentru sesiunile viitoare, care vor fi active dup repornirea bazei de date. Afiarea valorilor curente ale parametrilor de iniializare ai bazei de date se face cu comanda SHOW PARAMETERS, afiarea fcndu-se n ordinea alfabetic a parametrilor. Listarea la imprimant a parametrilor afiai se face cu comanda SPOOL. Parametrii de iniializare se pot grupa n: Parametrii derivai sunt cei ale cror valori se calculeaz pornind de la valorile altor parametrii. Normal valorile acestora nu trebuie modificate; Parametrii globali prefixai cu GC sunt folosii pe sistemele care suport Oracle Parallel Server; Parametrii dependeni de sistemul de operare sunt cei ale cror valori sunt dependente de specificul sistemului de operare gazd. Exemplu: DB_BLOCK_BUFFERS care indic numrul ariilor de date (data buffers) din memoria principal sau DB_BLOCK_SIZE care indic mrimea unui bloc de date; Parametrii de tip variabil sunt cei ce pot lua anumite valori care s determine performanele sistemului sau anumite limite de funcionare. Exemplu: OPEN_CURSORS dac i se d valoarea 10 se vor putea deschide maxim 10 cursoare, iar DB_BLOCK_BUFFERS prin valorile pe care le va lua nu va impune anumite limite dar va modifica performanele sistemului; Parametrii statici sunt cei ale cror valori nu se pot modifica n timpul unei sesiuni sau cu baza de date pornit; Parametrii dinamici sunt cei ale cror valori se pot modifica, aa cum sa artat mai sus cu comenzile ALTER SESSION, ALTER SYSTEM sau ALTER SYSTEM DEFERRED; Aa cum s-a prezentat mai sus compania Oracle furnizeaz un fiier iniial cu parametrii cu ajutorul cruia putem s pornim o baz de date Pentru a personaliza baza de date conform cerinelor beneficiarului, administratorul va trebui s seteze valori noi pentru anumii parametrii specificai mai jos, astfel: DB_NAME definete numele bazei de date. Se formeaz dintr-un ir de maximum opt caractere. Dac nu se furnizeaz, Oracle atribuie bazei de date un nume standard. Acesta se gsete n fiierul cu parametrii furnizat o dat cu software-ul Oracle. n timpul creerii bazei de date numele acesteia este scris n fiierele de date, de control i de log. Exemplu: DB_NAME = BAZA1

DB_DOMAIN este format dintr-un ir de caractere i definete domeniul din reea cruia aparine baza de date, de obicei este definit de numele organizaiei creia aparine baza de date. Dac se utilizeaz numele domeniului din Internet, atunci partea adresei de e-mail care urmeaz dup caracterul @ este foarte bun pentru a fi folosit ca valoare pentru acest parametru. Exemplu: DB_DOMAIN = BUC.ORG.COM GLOBAL_NAMES definete numele global al bazei de date n cadrul reelei de calculatoare i este format din numele bazei de date i numele domeniului separate prin punct. Acest parametru mai poate lua i valorile: TRUE (caz n care se foreaz ca numele global al bazei de date s fie identic cu cel al bazei de date) sau FALSE (numele global nu are semnificaie, nu se utilizeaz). Exemplu: GLOBAL_NAMES =FALSE CONTROL_FILES definete numele fiierelor de control ce vor fi create pentru baza de date(se va furniza pentru fiecare fiier calea complet de acces la acesta). Este recomandat ca s se defineasc cel puin dou fiiere de control, care s fie plasate pe dou discuri diferite. Exemplu: CONTROL_FILES =diska:cntrl1.ora,diskb:cntrl2.ora LOG_FILES specific numrul maxim de grupuri de fiiere de log ce pot fi utilizate pentru o baz de date. Ia valori de la 2 la 255. Acest parametru specific totodat i numrul minim de fiiere de log ce pot fi deschise pentru o baz de date. DB_FILE_MULTIBLOCK_READ_COUNT definete numrul de blocuri citite simultan pentru accesarea unei tabele a bazei de date. Este folosit pentru optimizarea parcurgerii totale a unei tabele atunci cnd se caut o anumit valoare a unei coloane aferent unui rnd din aceasta. REMOTE_LOGIN_PASSWORDFILE specific dac se folosete sau nu fiierul cu parole pentru identificarea utilizatorilor ce pot executa activiti de administrator. Poate lua valorile: NONE nu se folosete fiierul de parole iar utilizatorul care va executa activiti de administrare trebuie s fie autentificat de ctre sistemul de operare gazd; EXCLUSIVE se folosete un singur fiier cu parole pentru o singur baz de date. Pe lng utilizatorii SYS i SYSTEM i ali utilizatori pot executa sarcini de administrare; SHARED se folosete un singur fiier cu parole pentru mai multe baze de date, caz n care singurii utilizatori ce pot executa activiti de administrare sunt SYS i SYSTEM. n acest caz nu se pot aduga ali utilizatori n fiierul cu parole.

DB_FILES specific numrul maxim de fiiere de date ce pot fi deschise de ctre o baz de date. De fiecare dat cnd se modific acest parametru baza de date se oprete i apoi se repornete. LOG_CHECKPOINT_INTERVAL specific frecvena punctelor de control (checkpoites) ; LOG_CHECKPOINT_TIMEOUT specific timpul maxim dintre dou puncte de control n secunde; PROCESSES specific numrul maxim de utilizatori care se pot conecta simultan la baza de date, iar acest numr trebuie s fie mai mare dect numrul total de procese background, Job Queue i Parallel Query; ROLLBACK_SEGMENTS definete toate segmentele rollback pe care o instan le poate acapara la momentul pornirii. Valoarea acestui parametru se d sub forma unei liste de valori. Exemplu: ROLLBACK_SEGMENTS = (rbseg1, rbseg2, rbseg3, rbseg4) LICENSE_MAX_SESSIONS specific numrul maxim de utilizatori concureniali ce pot fi admii n timpul unei sesiuni; LICENSE_MAX_USERS specific numrul maxim de utilizatori ce pot fi creai pentru o baz de date. LICENSE_MAX_SESSIONS i LICENSE_MAX_USERS nu pot avea simultan valori diferite de zero, deci unul din aceti parametrii trebuie s fie setat pe zero; LICENSE_SESSIONS_WARNING specific numrul de utilizatori concureniali. Dac se depete, se emite un mesaj de atenionare; TRANSACTIONS_PER_ROLLBACK_SEGMENT specific numrul tranzaciilor concurente permise pe un segment rollback; AUDIT_TRAIL activeaz sau dezactiveaz scrierea rndurilor n fiierul de audit. nregistrrile de audit nu se scriu dac parametrul are valoarea NONE sau lipsete. Zona de memorie SGA (System Global Area) conine urmtoarele structuri de memorie: database buffer cache, redo log buffer i shared pool. Database Buffer Cache este poriunea din SGA ce conine blocurile de date citite din fiierele de date ale bazei de date. Redo log buffer este zona n care se pstreaz informaii despre modificrile efectuate n baza de date. Shared pool este o zon care conine la rndul su trei structuri de memorie: library cache, dictionary cache i control structures. Dicionarul de date al bazei de date este citit n zonele library cache i dictionary cache. Mrimea SGA este influenat de valorile parametrilor urmtori: DB_BLOCK_SIZE definete, n bytes, mrimea unui singur bloc de date. Valorile tipice pentru acest parametru sunt 2048 i 4096;

DB_BLOCK_BUFFERS specific numrul de buffere ale bazei de date disponibile n zona database buffer cache, a crei mrime este egal cu DB_BLOCK_SIZE * DB_BLOCK_BUFFERS; LOG_BUFFER determin mrimea n bytes a zonei redo log buffer SHARED_POOL_SIZE specific mrimea n baii a ariei Shared pool. Acest parametru poate accepta valori numerice urmate de literele "K" sau "M", unde "K" nseamn c numrul va fi multiplicat cu 1000, iar "M" nseamn c numrul va fi multiplicat cu 1000000. OPEN_CURSORS specific numrul maxim de cursoare pe care o sesiune le poate deschide simultan. Valoarea asumat este de 50. Este bine ca acest numr s fie ct mai mare pentru a nu avea probleme cu rularea unei aplicaii. TRANSACTIONS specific numrul maxim de tranzacii concurente. O valoare mare a acestui parametru determin mrirea zonei de memorie SGA.

Exemple de creare a unei baze de date 1) CREATE DATABASE; n acest caz se creaz o baz de date Oracle n care toi parametrii comenzii CREATE DATABASE iau valorile standard furnizate de firma Oracle. 2) CREATE DATABASE baza1 LOGFILE GROUP 1 ('diskb:log1.log', 'diskc:log1.log') SIZE 50K, GROUP 2 ('diskb:log2.log', 'diskc:log2.log') SIZE 50K MAXLOGFILES 5 MAXLOGHISTORY 100 MAXDATAFILES 10 ARCHIVELOG CHARACTER SET US7ASCII DATAFILE 'diska:datfile1.dat' SIZE 2M DATAFILE 'disk1:datfile2.dbf' AUTOEXTEND ON 'disk2:datfile3.dbf' AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED; Dup crearea unei baze de date, instana Oracle poate fi lsat s ruleze, iar baza de date este deschis i montat pentru utilizare normal. Pentru opririle i pornirile ulterioare se poate utiliza Oracle Enterprise Manager. Pornirea i oprirea bazei de date

O baz de date i instana Oracle se poate porni cu utilitarul Oracle Enterprise Manager folosind fereastra de dialog Startup Database. O instan i o baz de date asociat se pot porni n mai multe moduri. Pornirea instanei fr montarea bazei de date se face atunci cnd dorim s crem o baz de date. Activitatea se execut din fereastra de dialog Startup Database prin selectarea butonului radio Startup Nomount; Pornirea instanei i montarea bazei de date, aceasta rmnnd nchis se execut atunci cnd dorim s executm anumite activiti de ntreinere: redenumirea fiierelor de date; adugarea, tergerea sau redenumirea fiierelor redo log; recuperarea integral a bazei de date; Aceast pornire se execut din fereastra de dialog Startup Database prin selectarea butonului radio Startup Mount. Montarea bazei de date se poate execut i dup pornirea unei instane fr baz de date montat, cu ajutorul comenzii SQL ALTER DATABASE cu opiunea MOUNT. Exemplu: SQL> ALTER DATABASE baza1 MOUNT; Pornirea instanei, montarea bazei de date i deschiderea acesteia se face n mod nerestricionat (accesibil tuturor utilizatorilor care au cu privilegiul CREATE SESSION) sau restricionat (accesibil doar utilizatorilor de tip DBA, utilizatorilor cu privilegiile CREATE SESSION i RESTRICTED SESSION). n modul de pornire restricionat se pot executa activiti ca: recrearea indecilor; exportul sau importul datelor bazei de date; ncrcarea datelor cu utilitarul SQL*Loader; blocarea temporar a accesului utilizatorilor obinuii la baza de date. Pornirea n mod nerestricionat se face din fereastra de dialog Startup Database prin selectarea butonului radio Startup Open. Pornirea n mod restricionat se face din fereastra de dialog Startup Database prin selectarea butonului radio Restrict Deschiderea unei baze de date se poate face dup ce instan a fost pornit, baza de date montat dar nchis, cu ajutorul comenzii SQL ALTER DATABASE cu opiunea OPEN. Exemplu: SQL> ALTER DATABASE baza1 OPEN; Transformarea modului de pornire normal a unei baze de date n modul restricionat se poate face i cu comanda SQL ALTER SYSTEM cu opiunea ENABLE RESTRICTED SESSION , iar revenirea la situaia iniial se face cu aceeai comand dar cu opiunea DISABLE RESTRICTED SESSION Exemplu: SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION; SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;

n anumite circumstane este posibil ca activitile de pornire a bazei de date i instanei Oracle s se execute altfel dect n mod uzual. Astfel putem avea: pornirea forat a unei instane, care se poate realiza atunci cnd instana curent nu poate fi oprit cu succes prin folosirea butoanelor radio Normal sau Immediate din fereastra de dialog Startup. n acest caz se poate fora pornirea unei noi instane Oracle, care va determina oprirea instanei anterioare aflat n situaia de mai sus. pornirea unei instane, montarea bazei de date i pornirea procesului de recuperare a bazei de date, a tabelelor spaiu sau a fiierelor de date, care se execut atunci cnd tim c mediul bazei de date are nevoie de recuperare. pornirea n modul exclusiv sau paralel, care se face atunci cnd avem un server Oracle care permite accesul mai multor instane la aceeai baz de date. pornirea automat a bazei de date la momentul pornirii sistemului de operare, se face dac dorim acest lucru. pornirea unei instane i a unei baze de date la distan, se face atunci cnd serverul Oracle este o parte a unui sistem de baze de date distribuite. Oprirea unei baze de date se poate face n dou moduri: normal sau forat. Modul normal, n care oprirea bazei de date se face ca revers al operaiei de pornire normal, sens n care se execut nchiderea bazei de date, demontarea bazei de date i oprirea instanei Oracle. Activitatea se execut din fereastra de dialog Shutdown Database prin selectarea butonului radio Normal. Oprirea unei baze de date n condiii normale presupune executarea de ctre Oracle a urmtoarelor activiti: oprirea conectrilor la baza de date; deconectarea tuturor utilizatorilor; la urmtoarea pornire a bazei de date nu se pornesc procedurile de recuperare. Modul forat se poate execut n dou moduri: imediat sau prin anularea instanei. Oprirea imediat a bazei de date se execut n cazul unui incident iminent. n cadrul acestei opriri Oracle execut instruciunea SQL aflat n lucru i orice alt tranzacie nefinalizat este anulat prin procesul de rollback; toi utilizatorii conectai sunt deconectai imediat. Oprirea se face din fereastra de dialog Shutdown Database prin selectarea butonului Immediate.

Oprirea prin anularea instanei se execut dac baza de date sau una din aplicaiile sale funcioneaz anormal i nici una din metodele de oprire anterioare nu funcioneaz. Aceast oprire se execut din fereastra de dialog Shutdown prin setarea butonului radio Abort. n timpul acestei opriri Oracle finalizeaz instruciunile SQL aflate n lucru, tranzaciile nefinalizate nu mai sunt aduse la starea anterioar momentului nceperii acestora (nu mai sunt anulate prin procesul de roll back), iar toi utilizatorii sunt deconectai imediat. 4.3. CREAREA I ACTUALIZAREA TABELELOR Comanda de creare a unei tabele, CREATE TABLE, realizeaz fie definirea unei tabele, urmnd ca introducerea de date s se efectueze ulterior, fie definirea i ncrcarea cu date a unei tabele, chiar n momentul creerii ei, folosind sintaxele: CREATE TABLE nume-tabel (spec-col [NOT NULL],...) SPACE definire-spaiu [PCTFREE n] | CLUSTER nume-cluster (nume-col,...)]; CREATE TABLE nume-tabel [(nume-col [NOT NULL],...)] [SPACE definire-spatiu [PCTFREE n] CLUSTER nume-cluster (nume-col,...)] [AS cerere] Unde: spec-col cuprinde nume-col, format, mrime. nume-col este numele coloanei din tabel. format reprezint formatul coloanei din tabel.Formatele acceptate sunt specificate n tabelul urmtor: Tipul datelor Char Date Formatul CHAR( mrime) DATE Explicaii Date alfanumerice. Marimea maxim a coloanei este de 240 caractere. Permit introducerea cmpurilor de tip dat. Exemplu: January 1, 4712 BC to December 31, 4712 AD

Long

LONG

LONG VARCHAR LONG ROW Numerice NUMBER NUMBER (mrime) NUMBER (ntregi zecimali) NUMBER(*) DECIMAL FLOAT INTEGER INTEGER (mrime) RAW SMALLINT RAW(mrimea) LONGRAW

Date caracter de mrime variabil, ntr-o tabel trebuie s fie definit doar o coloan de tip LONG. La fel ca LONG. Date binare RAW. Date numerice de mrime implicit. Date numerice de mrime specificat. Date numerice n baza zece. La fel ca datele de tip NUMBER. La fel ca datele de tip NUMBER. Nu accept descrierea mrimii coloanei. La fel ca datele de tip NUMBER. Nu accept descrierea mrimii zecimalelor. La fel ca date de tip INTEGER Date binare RAW. Mrimea maxim este 240 octei. Date de tip LONG.

n cazul celei de-a doua sintaxe, tipul i mrimea coloanelor vor fi copiate din rezultatul obinut n urma specificrii AS cerere. n ambele sintaxe se utilizeaz alte cuvinte cheie sau parametrii, care au urmtoarea semnificaie: NULL sau NOT NULL se refer la cmpurile din coloane care pot avea sau nu valori nule. Clauzele nume-col [NOT NULL] se pot repeta pentru maximum 254 de coloane. SPACES desemneaz modelul de alocare a spaiului pentru tabela ce se creaz. Modelul este creat n prealabil cu CREATE SPACES. Dac parametrul SPACE este omis, pentru toi parametrii de spaiu vor fi utilizate valorile implicite din comanda CREATE SPACE. PCTFREE permite specificarea unei alte valori dectt cea implicit de 20% pentru spaiul lsat liber. Are aceeai funcie ca i n comanda CREATE SPACE. CLUSTER este parametrul care indic faptul c tabela va fi inclus n clusterul cu numele nume-cluster. Introducerea datelor n tabela va declana memorarea lor n ordinea indicelui de cluster. Nume-col se refer la numele coloanelor din tabel care corespund coloanelor din cluster. Exemplu:

S se creeze tabelele: PRODUSE, CLIENI, PRETURI SALARIATI, DEPOZITE, COMENZI ce intr n componena bazei de date COMBAZA. SQL> CREATE TABLE PRODUSE 2 (CODD NUMBER(6) NOT NULL, 3 CODP NUMBER(5) NOT NULL, 4 DENP CHAR(11), 5 STOC NUMBER(6), 6 DATACRT DATE, 7 UM CHAR(3)); Table created. SQL> CREATE TABLE CLIENI 2 (CODC NUMBER(6) NOT NULL, 3 DENC CHAR(11), 4 LOC CHAR(11), 5 STR CHAR(16), 6 NRCHARC3), 7 CONTNUMBER(11), 8 TEL NUMBER(8), 9 TFAX NUMBER(8)) Table created. SQL> CREATE TABLE PRETURI 2 CODP NUMBER(5) NOT NULL, 3 PRETMAX NUMBEB(9,2), 4 PRETMIN NUMBER(9,2), 6 DATAI DATE, 6 DATASF DATE); Table created. SQL> CREATE TABLE SALARIATI 2 (MARCA NUMBER(4) NOT NULL, 3 NUME CHAR(16), 4 FUNCT CHAR(7), 6 CODD NUMBER(G) NOT NULL, 6 SALA NUMBER(9,2) 7 VENS NUMBER(9.2), 8 CODS NUMBER(4) NOT NULL); Table created. SQL> CREATE TABLE DEPOZITE 2 (CODD NUMBER(6) NOT NULL, 3 DEND NUMBER(6) NOT NULL, 4 NRSAL NUMBER(2)); Table created. SQL> CREATE TABLE COMENZI 2 (NRCOM NUMBER(6) NOT NULL,

3 CODP NUMBER(5) NOT NULL, 4 CODC NUMBEIK6) NOT NULL, 5 DATAL DATE, 6 CANT NUMBER(7), 7 PRE NUMBER(9-2)); Table created. Modificarea unei tabele presupune adugarea de noi coloane la sfritul acesteia sau modificarea tipurilor unor coloane deja existente. Comanda care realizeaz aceste operaii este ALTER TABLE. Sintaxa ei este: ALTER TABLE table {ADD | MODIFY} (spec-col [NULL | NOT NULL,...]) unde: ADD adaug la sfritul tabelei noi coloane care iniial au valori nule; ulterior, prin actualizare, aceste coloane se vor completa cu date. MODIFY schimb definirea unei coloane existente. Modificarea tipului sau mrimii unei coloane presupune ca aceasta s conin numai valori nule. spec-col reprezint numele, formatul i mrimea coloanei ce se va aduga sau se va modifica. NULL se refer la faptul c valorile din coloan ce se adaug/modific sunt nule. NOT NULL specific faptul c o coloan nu poate avea valori nule (NOT NULL). Unei coloane deja existente i se poate ataa parametrul NOT NULL numai dac aceasta conine valori nenule. Exemple: 1) S se adauge la tabela DEPOZITE o nou coloan CANTDEP ce nu a fost prevzut iniial. SQL> ALTER TABLE DEPOZITE ADD 2 (CANTDEP NUMBER(7)); Table altered. 2) S se modifice atributele coloanei CANTDEP (respectiv mrirea acesteia cu dou uniti). SQL> ALTER TABLE DEPOZITE MODIFY 2 (CANTDEP NUMBER(9)); Table altered.

Pentru tergerea unei tabele ntr-o baz de date se utilizeaz comanda DROP TABLE. Sintaxa ei este: DROP TABLE nume-tabel: n general, nu se pot terge tabelele create de ali utilizatori. La tergerea unei tabele. se terg automat indecii corespunztori (create fie de ctre proprietarul tabelei, fiu de ctre ali utilizatori) i privilegiile conferite n legtur cu ea. Rmn, ns, viziunile i sinonimele referitoare la tabela tears, care vor deveni invalide. Va trebui fie ca acestea s fie terse, fie s se defineasc sau s se redefineasc tabela n aa fel inct viziunile i sinonimele s devin valide. Exemplu: S se stearg tabela DEPOZITE. SQL> DROP TABLE DEPOZITE; Table dropped. Se pot modifica numele atribuite tabelelor, sau sinonimelor utiliznd comanda RENAME. Sintaxa ei este: RENAME nume-vechi TO nume-nou; unde: nume-vechi i nume-nou sunt constante de tip ir de caractere (nu se scriu ntre ghilimele sau apostrofuri). 4.4. CREAREA I ACTUALIZAREA INDECILOR n vederea obinerii de performane superioare privind accesul la tabelele unei baze de date se pot construi indeci folosind comanda CREATE INDEX. Comanda are ca efect crearea unui index la o tabel, index care va conine cte o intrare pentru fiecare valoare care apare n coloana specificat pentru tabela respectiv. Aceast coloan se numete coloana de index. Sintaxa comenzii CREATE INDEX este: CREATE [UNIQUE] INDEX nume-index ON nume-tabela (nume-col [ASC | DESC], nume-col [ASC | DESC],...) [COMPRESS | NOCOMPRESS] [SYSSORT | NOSYSSORT] [ROWS =n][PCTFREE = {20 | n}];

unde: UNIQUE se refer la faptul c tabela nu va conine dou rnduri cu aceleai valori n coloanele index (deci nu vor exista dubluri n coloana index). Dac se omite, tabela poate conine oricte asemenea rnduri care s aib n coloana index aceeai valoare. ASC|DESC precizeaz ordinea n care va fi pstrat indexul: ascendent sau descendent. COMPRESS indic faptul c indecii pot fi comprimai, reducndu-se n acest mod spaiul necesar memorrii acestora i mrindu-se viteza operaiilor care folosesc indecii. Comprimarea nu permite gsirea ntr-un index a valorii unui anumit cmp fr s acceseze tabela. NOCOMPRESS suprim comprimarea indecilor. SYSSORT specific faptul c procedura standard ORACLE de sortare este folosit pentru a crea un index. NOSYSSORT este folosit pentru depanare. ROWS specific numrul aproximativ de rnduri ce urmeaz a fi indexate. Acest numr este utilizat pentru a optimiza sortarea n SYSSORT. Clauza nu are efect n SQL*Plus. PCTFREE specific, n momentul crerii indexu-lui, procentul din spaiul pentru index ce trebuie s rmn liber pentru actualizri. Nu are efect asupra extensiilor alocate dup crearea indexului. Indexul creat permite creterea vitezei de acces la datele unei tabele prin intermediul coloanei index datorit faptului c se vor cuta rndurile corespunztoare valorilor coloanei index, fr a citi ntreaga tabel. Deoarece indexul i tabela trebuie actualizate, introducerile, tergerile i modificrile n cmpul de valori ale coloanei index necesit un timp mai mare. De aceea, se recomand crearea de maxim 3 indeci pentru o tabel. In funcie de necesiti, se pot creea i terge n mod dinamic indeci. Indecii creai pentru o singur tabel trebuie s aib nume distincte. Pentru tabele diferite pot fi creai indeci cu acelai nume. n momentul tergerii acestor indeci trebuie specificat tabela din care fac parte. Comanda de validare a unui index este VALIDATE INDEX. Aceast comand verific integritatea indexului specificat pentru o anumit tabel. Dac pe tabela respectiv a fost creat un singur index, al crui nume va fi specificat n comand, atunci numele tabelei poate fi omis. Comanda VALIDATE INDEX are sintaxa: VALIDATE INDEX nume-index [ON nume-tabel] [WITH LIST]; unde:

WITH LIST salveaz informaiile referitoare la index ntr-un fiier. nume-index este numele indexului ce urmeaz a fi validat. Dac indexul este valid, comanda va afia un mesaj corespunztor (Index validated). Obinerea oricrui alt mesaj va determina tergerea indexului i recrearea lui. tergerea unui index din baza de date se realizeaz cu ajutorul comenzii DROP INDEX, cu sintaxa: DROP INDEX nume-index [ON nume-tabel]; Dac pe o anumit tabel a fost creat un singur index, numele tabelei respective poate fi omis n linia de comand. Este posibil ca doi indeci creai pe tabele diferite s aib acelai nume. n acest caz, n linia de comand vor aprea att numele indexului ct i al tabelei pentru care a fost creat. Se recomand numai tergerea indecilor proprii. Exemple: 1) S se creeze un index cu numele SUMAR pentru coloana FUNCT din tabela SALARIAI. SQL> CREATE INDEX SUMAR 2 ON SALARIATI(FUNCT); Index created 2) S se creeze un index cu numele MARCA pentru coloana MARCA din tabela SALARIAI. SQL> CREATE INDEX MARCA 2 ON SALARIAT(MARCA); Index created. 3) S se creeze un index cu numele MARCA din pentru coloana MARCA clia tabela SALARIAI cu suprimarea comprimrii lui. SQL> CREATE INDEX MARCA 2 ON SALARIATI(MARCA) NOCOMPRESS; Index created. 4) S se verifice integritatea indexului SUMAR. SQL> VALIDATE INDEX SUMAR; Index validated. 6) S se verifice integritatea indexului MARCA pentru tabela SALARIAI. SQL> VALIDATE INDEX MARCA ON SALARIAI; Index validated. 7) S se tearg indexul SUMAR. SQL> DROP INDEX SUMAR; Index dropped. 8) S se tearg indexul MARCA din tabela SALARIAI. SQL> DROP INDEX MARCA ON SALARIAI;

Index dropped. 4.5. CREAREA I ACTUALIZAREA TABELELOR I INDECILOR PARTIIONAI Partiionarea este procesul de mprire a tabelelor i indecilor foarte mari n mai multe tabele, i respectiv indeci, mai mici numite partiii pentru a le putea manipula mai uor. O dat definite partiiile, instruciunile SQL pot accesa i manipula aceste partiii n loc de a manipula ntreaga tabel sau ntregul index din care au provenit. Toate partiiile au aceleai atribute logice ca i tabela sau indexul din care au provenit. De exemplu toate partiiile unei tabele au aceleai coloane cu aceleai constrngeri de integritate ca i tabela, iar partiiile unui index sunt construite dup aceeai coloan ca i indexul din care au provenit. Fiecare partiie este memorat ntr-un segment propriu aflat n aceeai tabel spaiu sau n tabele spaiu diferite. Plasarea partiiilor n tabele spaiu diferit prezint urmtoarele avantaje semnificative: Riscul pierderii datelor poate fi diminuat; Salvarea i restaurarea partiiilor se poate face independent unele fa de altele; Se poate realiza o echilibrare a operaiilor de I/O prin maparea partiiilor pe discuri diferite. O partiie este definit de urmtoarele: Numele partiiei identific n mod unic partiia n schema de obiecte a unui utilizator; Referirea unei partiii se face n context obligatoriu cu numele tabelei sau indexului din care provine. Numele unei partiii poate s apar n instruciuni DDL i DML, precum i n utilitarele Import/Export i SQL*Loader. Exemplu: ALTER TABLE tab10 DROP PARTITION part1; Aria de cuprindere a partiiei este format din rndurile tabelei sau indexului, care aparin acesteia bazat pe valorile coloanele ce definesc partiia. Aria de cuprindere este definit prin clauzele: PARTITION BY RANGE ( coloana1, colana2, ) i VALUES LESS THAN (valoare1, valoare2, )

unde coloana1, coloana2, formeaz lista coloanelor. n funcie de valorile acestora se stabilesc rndurile din tabel sau index care aparin partiiei. Coloanele dup care se face partiionarea nu trebuie s conin valori de tip NULL, iar numrul lor nu poate fi mai mare de ct 16; valoare1, valoare2, formeaz lista valorilor coloanelor. n funcie ele se selecteaz rndurile pentru a fi incluse n partiie. Aceste valori formeaz limita superioar a partiiei. Limitele partiiei definesc mulimea rndurilor tabelei sau indexului ce vor fi incluse n aceasta. Orice partiie are dou limite, limita inferioar a crei valoare este definit de valoarea LESS THAN din definirea partiiei precedente i care este inclus n partiie, i limita superioar este definit de valoarea LESS THAN din definirea partiiei curente, valoare care nu este inclus n partiie. De la aceast regul face excepie prima partiie care nu are limit inferioar. Partiionarea nu se poate face dup pseudocoloanele LEVEL, ROWID sau MISLABEL. Ca valoare n clauza LESS THAN a ultimei partiii se poate specifica i MAXVALUE, care reprezint o valoare virtual egal cu infinit. Cheia de partiionare este un set de valori format din valorile coloanelor de partiionare aferente unui rnd al partiiei. Specificarea unei valorii alta dect MAXVALUE pentru parametrul LESS THAN impune o constrngere implicit de tip CHECK la nivel de tabel, cu aceast valoare. Reguli de partiionare a tabelelor si a indecilor Partiionarea tabelelor se face respectnd cteva reguli eseniale, astfel: O tabel poate fi partiionat dac nu este inclus ntr-un grup de tabele sau nu conine tipurile de date LOB, LONG, LONG RAW sau obiect; O tabel partiionat sau nepartiionat poate avea indeci i partiionai i/sau nepartiionai; Atributele fizice ale unei partiii pot fi specificate iniial prin comanda CREATE TABLE pentru crearea partiiei implicit sau explicit. Specificarea implicit se face prin furnizarea atributelor fizice pentru tabel i nespecificarea acestora pentru partiie n clauza PARTITION. Atributele fizice implicite pot fi ulterior modificate cu comanda ALTER TABLE MODIFY DEFAULT ATTRIBUTES. Specificarea explicit se face prin furnizarea acestora n clauza PARTITION, caz n care valorile atributelor fizice ale partiiei vor suprascrie valorile atributelor fizice implicite ale tabelei. Atributele fizice explicite pot fi ulterior modificate cu comenzile ALTER TABLE MODIFY PARTITION

sau ALTER TABLE MOVE PARTITION Partiionarea indecilor se face respectnd cteva reguli: Un index poate fi partiionat dac nu este inclus ntr-un grup de indeci sau nu este definit pentru o tabel inclus ntr-un grup de tabele; Indecii pot fi de patru categorii: locali prefixai, locali neprefixai, globali prefixai i globali neprefixai. Indecii globali pot fi partiionai sau nepartiionai. Un index este local dac cheile dintr-o partiie oarecare a acestuia refer rnduri aflate ntr-o singur partiie a tabelei pentru care a fost creat. Indexul local este prefixat dac este definit pe un set de coloane dintre care cea mai din stnga este coloana dup care a fost partiionat att indexul local, ct i tabela pe care a fost creat acesta. De exemplu, presupunem c avem tabela TAB10 i indexul su INDEX10, care au fost partiionai dup coloanele COL1 i CIOL2. Dac indexul INDEX10 este definit pe coloanele (COL1, COL2, COL3), atunci el este local prefixat pentru c n partea cea mai din stnga(prefix) a listei coloanelor de indexare se afl coloanele COL1 i COL2 dup care s-a fcut partajarea tabelei i a indexului su. Dac indexul INDEX10 ar fi definit pe coloanele (COL1, CO23) atunci indexul este local neprefixat. Indecii locali nu pot fi partiionai cu clauza BY RANGE, aceast clauz se aplic numai pentru indecii globali. Un index este global dac cheile dintr-o partiie oarecare a acestuia refer rnduri aflate n mai multe partiii ale tabelei pentru care a fost creat. La fel ca i n cazul indexului local putem avea index global prefixat i index global neprefixa. Indexul global arat faptul c partiionarea acestuia este definit de utilizator i nu trebuie s fie echivalent cu partiionarea tabelei pentru care se creeaz. Definirea atributelor fizice ale indecilor comport aceleai reguli ca la definirea atributelor fizice ale partiiilor unei tabele, cu deosebirea c aici se folosesc pentru crearea unui index comenzile: CREATE INDEX sau ALTER TABLE SPLIT PARTITION, iar pentru modificarea atributelor fizice comenzile SQL ALTER INDEX MODIFY PARTITION sau ALTER INDEX REBUILD PARTITION.

Crearea partiiilor unei tabele i ale unui index Crearea partiiilor este similar cu cea a crerii tabelelor sau indecilor. Crearea partiiilor unei tabele se face cu comanda CREATE TABLE folosind i clauza PARTITION. Exemplu: Avem tabela FACTURI ce cuprinde documente din anii 1999 2002. Tabela are printre alte coloane si coloanele AN, LUNA, ZI i dorim s partiionm tabela n trei partiii, astfel nct partiia 1 s conin date din anii 1999 i 2000, partiia 2 date din anul 2001, iar partiia 3 date din anul 2001. Cu comanda de mai jos vom crea cele 3 partiii, astfel: CREATE TABLE facturi (numar_factura NUMBER (12), nume_furnizor VARCHAR(25), an NUMBER(4), luna NUMBER(2), zi NUMBER(2)) STORAGE (INITIAL 100K NEXT 50K) LOGGING PARTITION BY RANGE (an, luna, zi) (PARTITION p1_1999_2000 VALUES LESS THAN (2001, 13, 32) TABLESPACE tabsp_1 NOLOGGING, PARTITION p1_2001 VALUES LESS THAN (2002, 13, 32) TABLESPACE tabsp_2 NOLOGGING, PARTITION p1_2002 VALUES LESS THAN (2001, 13, 32) TABLESPACE tabsp_3 NOLOGGING); Crearea partiiilor unui index se face cu comanda CREATE INDEX folosind i clauza PARTITION. Activitatea comport unele diferene de la un tip de index la altul, conform exemplelor de mai jos: Exemple: 1) Crearea unui index local prefixat pentru tabela de mai sus cu specificarea partiiilor: CREATE INDEX index_loc_prefix ON facturi (an, luna, zi, numr_factur) LOCAL (PARTITION p1 TABLESPACE tabsp1, PARTITION p2 TABLESPACE tabsp1, PARTITION p3 TABLESPACE tabsp1); 2) Crearea unui index local prefixat pentru tabela de mai sus fr specificarea partiiilor: CREATE INDEX index_loc_prefix ON facturi (an, luna, zi, numr_factur) LOCAL;

3) Crearea unui index local neprefixat pentru tabela de mai sus cu specificarea partiiilor: CREATE INDEX index_loc_prefix ON facturi LOCAL (PARTITION p1 TABLESPACE tabsp1, PARTITION p2 TABLESPACE tabsp1, PARTITION p3 TABLESPACE tabsp1); 4) Crearea unui index local neprefixat pentru tabela de mai sus fr specificarea partiiilor: CREATE INDEX index_loc_prefix ON facturi (an, lun, zi) LOCAL; 5) Crearea unui index global prefixat pentru tabela de mai sus cu specificarea numelui partiiilor i a parametrului GLOBAL: CREATE INDEX index_loc_prefix ON facturi (an, luna, zi, numr_factur) GLOBAL PARTITION BY RANGE (an, luna, zi) (PARTITION p1_1999_2000 VALUES LESS THAN (2001, 13, 32) TABLESPACE tabsp_1 NOLOGGING, PARTITION p1_2001 VALUES LESS THAN (2002, 13, 32) TABLESPACE tabsp_2 NOLOGGING, PARTITION p1_2002 VALUES LESS THAN (2001, 13, 32) TABLESPACE tabsp_3 NOLOGGING); 6) Crearea unui index global prefixat pentru tabela de mai sus fr specificarea numelui partiiilor i a parametrului GLOBAL: CREATE INDEX index_loc_prefix ON facturi (an, luna, zi, numr_factur) PARTITION BY RANGE (an, luna, zi) (PARTITION VALUES LESS THAN (2001, 13, 32) TABLESPACE tabsp_1 NOLOGGING, PARTITION VALUES LESS THAN (2002, 13, 32) TABLESPACE tabsp_2 NOLOGGING, PARTITION VALUES LESS THAN (2001, 13, 32) TABLESPACE tabsp_3 NOLOGGING); 7) Crearea unui index global prefixat pentru tabela de mai sus cu specificarea numelui partiiilor i a parametrului GLOBAL, cu un numr de partiii diferit de cel al partiiilor tabelei pe care se creaz i cu alte coloane de partiionare dect cele dup care s-a partiionat tabela: CREATE INDEX index_loc_prefix ON facturi (an,lun, numr_factur) GLOBAL PARTITION BY RANGE (an, lun) (PARTITION p1_1999_2001 VALUES LESS THAN (2002, 13) TABLESPACE tabsp_1 NOLOGGING,

PARTITION p1_2001 VALUES LESS THAN (2003, 13) TABLESPACE tabsp_2 NOLOGGING); Intreinerea partiiilor ntreinere a partiiilor se realizeaz prin executarea activitilor de modificare, mutare, adugare, distrugere, trunchiere, splitare, reunire a acestora, precum i schimbarea partiiilor i reconstruirea partiiilor index. Modificarea unei partiii a unei tabele se face cu comanda ALTER TABLE cu clauza MODIFY PARTITION. Cu aceast comand se pot modifica atributele fizice ale partiiei sau ale partiiei indexului aferent. Mutarea partiiilor unei tabele sau index se face pentru a schimba tabela spaiu n care rezid acestea din diverse considerente, dintre care cele de obinere a unor performane n exploatarea sunt cele mai frecvente. Operaia se execut cu comanda ALTER TABLE cu opiunea MOVE PARTITION. Exemplu: ALTER TABLE tab10 MOVE PARTITION part1 TABLESPACE tabsp10 NOLOGGING; Mutarea partiiei unei tabele care conine date, determin necesitatea recrerii tuturor indecilor locali sau globali ataai acesteia. Adugarea unor noi partiii se poate executa doar pentru o tabel partiionat sau un index local. Operaia se execut cu comanda ALTER TABLE cu opiunea ADD PARTITION. Exemplu: ALTER TABLE tab100 ADD PARTITION part1 VALUES LESS THAN (935); O nou partiie poate fi adugat doar dup partiia cu limita superioar cea mai mare. Dac dorim s adugm o partiie la nceput, ntre partiiile existente sau dup ultima partiie care are limita superioar egal cu valoarea MAXVALUE, atunci acest lucru se poate realiza prin splitarea unei partiii, n cazul de fa prima, una adiacent cu locul de inserare a noii partiii, i respectiv ultima partiie. Dac pentru tabela partiionat creia i adugm o nou partiie exist un index local, atunci Oracle creeaz automat o partiie de index pentru noua partiie adugat. Distrugerea partiiilor unei tabele se face dup anumite reguli funcie de situaiile n care se afl partiia, cu ajutorul comenzii ALTER TABLE cu opiunea DROP PARTITION. Distrugerea partiiei unei tabele care conine date i a indexului global se poate face lsnd

nealterai indecii globali n timpul distrugerii partiiei, dup care acetia vor fi recreai sau tergnd toate rndurile partiiei cu comanda DELETE dup care distrugem partiia. Aceast comand actualizeaz indecii globali. Distrugerea partiiei unei tabele care conine date i a constrngerilor refereniale de integritate se poate face dezactivnd constrngerile de integritate, distrugnd partiia i apoi reactivnd constrngerile de integritate. tergerea rndurilor partiiei cu comanda DELETE, apoi distrugem partiia. Distrugerea partiiilor unui index se face dup anumite reguli funcie de situaiile n care se afl partiia, cu ajutorul comenzii ALTER INDEX cu opiunea DROP PARTITION. O partiie a unui index local nu poate fi distrus, ea se distruge implicit atunci cnd se distruge partiia tabelei creia i corespunde. O partiie fr date a unui index global poate fi distrus. Dac o partiie a unui index global conine date, atunci prin distrugerea acesteia partiia urmtoare devine invalid i trebuie recreat; Trunchierea partiiilor unei tabele se face cu comanda ALTER TABLE cu opiunea TRUNCATE PARTITION i are ca efect tergerea tuturor rndurilor de date din aceast partiie i a partiiei corespunztoare a indexului local asociat, dac exist. Partiiile indecilor nu pot fi trunchiate, singur trunchiere posibil este cea specificat mai sus. Trunchierea unei partiii a unei tabele i a indecilor globali asociai i/sau a constrngerilor de integritate referenial se face dup aceleai reguli ca i operaia de distrugere. Splitarea partiiilor unei tabele sau ale unui index se face cu comanda ALTER TABLE/INDEX cu opiunea SPLIT PARTITION. O partiie a unei tabele ce conine date, prin splitare toi indecii asociai devin inutilizabili i ca atare acetia trebuie recreai. Numai partiia fr date nu invalideaz indecii. Partiia unui index poate fi splitat numai dac indexul este global i nu conine date, cci partiia unui index local se spliteaz automat atunci cnd se spliteaz partiia tabelei creia i corespunde. Fuzionarea sau reunirea partiiilor unei tabele sau ale unui index se face cu ajutorul comenzilor ALTER TABLE/INDEX i cu una din opiunile DROP PARTITION sau EXCHANGE PARTITION, pentru c o opiune explicit de fuzionare nu exist. O partiie a unei tabele poate fi reunit cu alt partiie numai dac nu are indeci globali sau constrngeri de integritate refereniale asociate. Fuzionarea unei partiii a unei tabele se face totdeauna cu partiia imediat superioar. Presupunem c avem tabela TAB10 cu partiiileP1, P2, P3 i P4 i vrem

s reunim partiia P2 cu P3, se vor exporta datele din tabele P2, se execut comanda ALTER TALE tab10 DROP PARTITION p2 , dup care importm datele exportate n partiia P3. Fuzionarea sau reunirea partiiilor unui index local se face implicit cnd se reunesc partiiile corespunztoare ale acestora, iar fuzionarea a dou partiii P2 i P3, care conin date, ale unui index global, se poate face astfel: ALTER INDEX index_global DROP PARTITION p2; ALTER INDEX index_global REBUILD PARTITION p3; Schimbarea partiiilor realizeaz transformarea unei partiii a unei tabele ntr-o tabel nepartiionat sau o tabel nepartiionat ntr-o partiie a unei tabele partiionate. Operaia se execut cu comanda ALTER TABLE cu opiunea EXCHANGE PARTITION. 4.6. CREAREA I ACTUALIZAREA VEDERILOR O viziune (vedere sau tabel virtual) este o form de prezentare a datelor din una sau mai multe tabele sau viziuni pentru un utilizator, obinut prin executarea unei cereri. O viziune este tratat ca o tabel i se mai numete i tabel virtual. Utilizatorul care creeaz viziunea trebuie s aib privilegiul CREATE VIEW sau CREATE ANY VIEW. Proprietarul viziunii trebuie s aib, n mod explicit, acordate privilegiile de acces la toate obiectele referite de ctre viziune, privilegii ce nu pot fi obinute prin intermediul rolului. De asemenea, funcionalitatea unei viziuni depinde de privilegiile proprietarului acesteia. De exemplu, dac proprietarul viziunii are privilegiul SELECT pentru tabela din care s-a creat viziunea (numit i tabel de baz), atunci acesta poate executa prin intermediul viziunii doar operaii de SELECT din tabel. Operaia se execut cu comanda SQL CREATE VIEW, astfel: 1) CREATE VIEW v10 AS SELECT col1, col2, col4 FROM tab2 WHERE col1 = 20; Crearea unei viziuni v10, cu coloanele col1, col2 i col4, ca un subset de date din tabela tab2, care are coloanele col1,col2,col3,col4,col5 2) CREATE VIEW v11 AS SELECT col1, col2, col4, col7 FROM tab2, tab3 WHERE tab2.col1 = tab3.col1;

Crearea viziunii v11ca reuniune a unor date din tabelele tab2 (col1,col2,col3,col4,col5) i tab3 (col1, col8, col9): Dac n timpul crerii unei viziuni Oracle detecteaz anumite erori acestea sunt semnalate, iar dac se folosete opiunea FORCE viziunea este totui creat cu starea INVALID. Cu aceast opiune o vedere poate fi creat chiar dac tabela sau tabelele de baz nu exist. Viziunea astfel creat va fi valid, deci va pute fi utilizat, abia dup ce se va crea tabela de baz, iar proprietarul viziunii va primi drepturile necesare de utilizare a acestora. Vederea de tip reuniune (vedere join) este definit ca vederea care cumuleaz rnduri din mai multe tabele. Modificarea unei astfel de vederi se face respectndu-se condiia de cheie rezervat. O tabel se numete tabel cu cheie rezervat dac orice cheie a acesteia poate fi cheie n vederea tip reuniune a crei tabel de baz este. Altfel spus, o tabel cu cheie rezervat are cheile rezervate n cadrul vederii join. Prin intermediul unei astfel de vederi se pot actualiza date (UPDATE, DELETE sau INSERT) numai n tabela de baza care conine cheia sau cheile rezervate, cu condiia obligatorie ca opiunea SELECT de creare a vederii s nu conin una din clauzele DISTINCT, GROUP BY, START WITH, CONNECT BY, ROWNUM i nici o operaie de setare de tip UNION, UNION ALL, INTERSECT sau MINUS. Deci prin intermediul unei vederi de tip reuniune se pot modifica date numai asupra coloanelor care se mapeaz pe tabela de baz care conine cheia sau cheile rezervate. Cu ajutorul vederilor ALL_UPDATABLE_COLUMNS, DBA_UPDATABLE_COLUMNS i USER_UPDATABLE_COLUMNS din dicionarul de date se pot obine informaii despre coloanele vederii de tip reuniune ce pot fi modificate. Inlocuirea unei vederi este operaia de recrearea acesteia i se execut prin distrugerea vederii i recrearea acesteia si redefinirea vederii cu clauza OR REPLACE. Exemplu: CREATE OR REPLACE VIEW v10 AS SELECT col1, col2 FROM tab2 WHERE col1 = 30; nainte de a nlocui o vedere, trebuie avute n vedere urmtoarele efecte: nlocuirea unei vederi determin nlocuirea definiiei acesteia din dicionarul de date; Dac n vedere nlocuit a existat clauza CHECK OPTION, iar n definiia noii vederi nu mai este inclus, aceast clauz este distrus; Toate vederile i programele PL/SQL dependente de vedere nlocuit devin invalide.

Distrugerea vederilor se execut cu comanda DROP VIEW . Vederea partiionat mparte o tabel foarte mare n buci mai mici numite partiii i le reunete pe acestea pentru a se obine performane n administrare i regsirea datelor. Cererile care folosesc anumite intervale de valori conforme cu cele folosite la crearea partiiilor vor regsi date numai din partiiile aferente acestora. O vedere partiionat se creeaz folosind constrngerea de integritate CHECK sau clauza WHERE. Considerm tabelele t1, t2 i t3 cu aceleai coloane, deci pot fi considerate partiii ale unei tabele care la nsumeaz. Exemplu: ALTER TABLE t1 ADD CONSTRAINT c1 CHECK (col1 between 0 and 1000); ALTER TABLE t2 ADD CONSTRAINT c1 CHECK (col1 between 1000 and 10000); ALTER TABLE t3 ADD CONSTRAINT c1 CHECK (col1 between 10000 and 100000); CREATE VIEW v10 AS SELECT * FROM t1 UNION ALL SELECT * FROM t2 UNION ALL SELECT * FROM t3; CREATE VIEW v10 AS SELECT * FROM t1 WHERE col1 between 0 and 1000 UNION ALL SELECT * FROM t2 WHERE col1 between 1000 and 10000 UNION ALL SELECT * FROM t3 WHERE col1 between 10000 and 100000); 4.7. CREAREA I ACTUALIZAREA SECVENELOR Secvenele sunt numere unice de identificare a coloanelor unei tabele i pot fi utilizate la efectuarea diferitelor operaii ntr-o aplicaie. Crearea unei secvene se execut cu comanda CREATE SEQUENCE, astfel: CREATE SEQUENCE secv_1 INCREMENT BY 1 START WITH 1 NOMAXVALUE CACHE 10; unde: INCREMENT BY arat valoare cu care se incrementeaz o secven curent pentru a se obine secvena urmtoare,

START WITH este valoarea de pornire a secvenei(prima valoare), NOMAXVALUE arat c nu avem o limit superioar pn unde se pot genera secvene, CACHE definete numrul de secvene viitoare care se pstreaz anticipat n memorie pentru obinerea unor performane superioare. Cnd aceast valoare se epuizeaz Oracle ncarc n memorie urmtorul se de secvene. Modificarea unei secvene se face cu comanda SQL ALTER SEQUENCE i poate opera asupra parametrilor iniiali ai comenzii de creare a secvenei. Parametrul de iniializare SEQUENCE_CACHE_ENTRIES determin numrul secvenelor care pot fi inute n memorie de Oracle. Distrugerea secvenelor se face cu comanda SQL DROP SEQUENCE. Referirea secvenelor se face cu pseudocoloanele NEXTVAL i CURRVAL , n care: NEXTVAL genereaz urmtoarea valoare a secvenei. Referirea se face prin nume_secven.NEXTVAL. Exemple: 1) CREATE SEQUENCE secv1; INSERT INTO tab1 (COL1, COL2) VALUES (secv1.NEXTVAL, 300); CURRVAL definete valoarea curent a secvenei i se refer prin nume_ 2) INSERT INTO tab10 (COL4, COL5) VALUES (secv1.CURRVAL, 1300); INSERT INTO tab10 (COL4, COL5) VALUES (secv1.CURRVAL, 2 300); Valoarea NEXTVAL poate fi referit o singur dat, iar valoarea CURRVAL de mai multe ori, cu condiia ca valoarea NEXTVAL s fi fost referit, deci secvena curent s fi fost creat. 4.8. CREAREA I ACTUALIZAREA SINONIMELOR Sinonimul este un alt nume (alias) pentru o tabel, o vedere, secven, procedur, funcie sau pachet. Sinonimul poate fi public sau privat. Sinonimul public este inclus n schema unui grup de utilizatori numit PUBLIC i este accesibil tuturor utilizatorilor, iar cel privat aparine numai unui anumit utilizator. Crearea sinonimului se face cu comanda CREATE SYNONYM i se distruge cu comanda DROP SYNONYM. Exemple:

Crearea unui sinonim privat: CREATE SYNONYM sin1 FOR tab10; Crearea unui sinonim public: CREATE PUBLIC SYNONYM sin10 FOR tab10; Distrugerea unui sinonim: DROP SYNONYM sin1; DROP PUBLIC SYNONYM sin10; 4.9. CREAREA I ACTUALIZAREA GRUPURILOR DE TABELE I A GRUPURILOR DE INDECI Grupul de tabele (cluster) este o metod de memorare comprimat a unor tabele de date care au coloane comune i care sunt foarte des folosite mpreun. Cheia grupului (key cluster) este coloana sau grupul de coloane pe care tabelele grupate le au comune. Cheia grupului se va specifica atunci cnd se creeaz acesta i atunci cnd se creeaz tabelele ce vor fi incluse n grup. Fiecare valoare a cheii de grup se va memora o singur n cadrul grupului de tabele sau al grupului de indeci indiferent de cte ori apare aceasta n tabelele grupului. Coloanele care se aleg pentru a fi definite cheile de grup sunt cele folosite cel mai mult pentru a reuni tabelele atunci cnd se execut o anumit cerere. Cea mai bun cheie de grup este aceea care are suficiente valori unice, astfel nct rndurile care se grupeaz dup aceasta s poat fi incluse ntr-un singur bloc de date. Astfel dac avem prea puine rnduri pe o cheie de grup obinem o pierdere a spaiului de memorie i performane neglijabile, iar dac avem prea multe timpul de cutare suplimentar, cutare n mai multe blocuri de date, va duce la degradarea performanelor. Setarea parametrilor de memorie PCTFREE i PCTUSED trebuie fcut cu mare grij, astfel nct s nu afectm spaiul utilizat pentru inserarea rndurilor i nici pe cel ce va fi folosi pentru actualizarea datelor aferente rndurilor inserate n bloc. Valorile acestor parametrii folosite la definirea grupului sunt automat utilizate i pentru tabelele ce vor fi grupate. Chiar dac vom specifica aceti parametrii la crearea unei tabele n cadrul grupului ei vor fi ignorai. Specificarea spaiului necesar pentru memorarea rndurilor aferente unei chei de grup se face prin intermediul clauzei SIZE a comenzii SQL CREATE CLUSTER. Valoarea acestui parametru este specificat n bytes i reprezint spaiul ce trebuie rezervat n cadrul blocului de date aferent grupului pentru memorarea valorii sau valorilor cheii de grup. Prin intermediul acestuia, Oracle determin numrul rndurilor de date ce ncap

ntr-un bloc de date al grupului. Dac SIZE este specificat astfel nct ntrun bloc de date s ncap dou chei de grup atunci spaiul acestui bloc este folosit de ambele chei, iar dac un bloc de date nu poate cuprinde toate rndurile aferente unei chei de grup, cheia de grup se memoreaz o singur dat, iar blocurile de date se nlnuiesc de blocul n care se afl cheia de grup. Dac ntr-un bloc de date ncap mai multe chei de grup, atunci acesta poate s aparin mai multor lanuri de date. Specificarea locului (tabelei spaiu) n care s fie plasat grupul de tabele i grupul index asociat este obligatorie la crearea acestor grupuri. Crearea grupului de tabele (cluster) se face cu comand SQL CREATE CLUSTER. Se va crea nti grupul de tabele i apoi tabelele ce vor face parte din grup. Atributele fizice se furnizeaz o singur dat, doar pentru grup nu i pentru tabele. Exemplu: CREATE CLUSTER grup1 (col1 NUMBER (5)) PCTUSED 75 PCTFREE 10 SIZE 600 TABLESPACE tabsp1 STORAGE (INITIAL 200k NEXT 290k MINEXTENTS 3 MAXEXTENTS 25 PCTINCREASE 30); CREATE TABLE tab1 (col1 NUMBER(5) PRIMARY KEY, col2 NUMBER (10), ) CLUSTER grup1 (col1); CREATE TABLE tab2 (col3 NUMBER(5) PRIMARY KEY, col4 NUMBER (10), , col1 NUMBER (5) REFERENCE tab1(col1)) CLUSTER grup1 (col1); unde col1 este cheia grupului. Crearea grupului de indeci (cluster) se face cu comand SQL CREATE INDEX cu clauza ON CLUSTER. Se va crea nti grupul de tabele i apoi grupul de indeci asociat. Exemplu: CREATE INDEX index1 ON CLUSTER grup1 INITRANS 2 MAXTRANS 5 TABLESPACE tabsp2GR

PCTFREE 10 STORAGE (INITIAL 50k NEXT 50k MINEXTENTS 3 MAXEXTENTS 25 PCTINCREASE 30); Modificarea grupurilor de tabele sau de indeci se face cu comanda SQL ALTER CLUSTER. Elementele ce pot face obiectul modificrii sunt atributele fizice ale grupului.

CAPITOLUL 5. INCARCAREA SI ACTUALIZAREA DATELOR CU COMENZI SQL


5.1. ADUGAREA DE NOI TUPLURI Actualizarea datelor se refer la adugarea unor noi rnduri ntr-o tabel (cu comanda INSERT), la modificarea valorilor uneia sau mai multor valori dintr-un rnd (cu comanda UPDATE) i la tergerea unui rnd dintr-o tabel (cu comanda DELETE). n vederea adugarii unor rnduri noi ntr-o tabel sau ntr-o viziune se utilizeaz comanda: INSERT INTO nume-tabel [(nume-col1,nume-col2,...)] {VALUES (valoare 1,valoare2,...) | cerere ); Pentru nume-col1,nume-col2... precizate n paranteze vor fi furnizate valorile corespunztoare, iar coloanelor nespecificate le sunt ataate valori nule. Coloanele pot fi precizate n orice ordine, ns trebuie asigurat corespondena ntre numele coloanelor i valorile furnizate. n cazul n care anumite coloane nu sunt specificate explicit se impune ca ordinea n care apar valorile n comanda INSERT s coincid cu cea n care coloanele au fost definite la crearea tabelei. Dac nu se mai cunoate ordinea de declarare a coloanelor se folosete comanda DESCRIBE care va afia lista coloanelor definite pentru tabela respectiv, tipul i lungimea lor. Prin forma INSERT...VALUES se introduce n tabel un singur rnd. Cu ajutorul valorii NULL se pot introduce valori nule. Pentru a furniza valori pentru o coloan de tip dat calendaristic se poate folosi funcia TO_DATE sau cuvntul cheie SYSDATE. Funcia TO_DATE permite furnizarea valorilor ntr-un format diferit de cel standard. Specificarea cererii din comanda INSERT determin copierea unor date dintr-o tabel n alta pe attea rnduri cte au rezultat din cererea SQL. Exemple: 1) S se adauge un nou rnd n tabela PRODUSE. SQL> INSERT INTO PRODUSE VALUES

1 (100000,11111,'MESE 15/20',7,'27-JUN-92,BUC') 1 record created. 2) S se creeze o nou tabel, EXEMPLU, cu un singur cmp numeric, identic cu coloana CODP a tabelei PRODUSE. S se introduc n aceast nou tabel codul produselor din tabela PRODUSE. SQL> CREATE TABLE EXEMPLU 2 (CODP NUMBER(6) NOT NULL); Table created. SQL> INSERT INTO EXEMPLU 2 SELECT CODP FROM PRODUSE; 5 records created. 5.2. MODIFICAREA TUPLURILOR DIN TABELE n funcie de momentul n care se dorete realizarea modificrilor asupra bazei de date, utilizatorul poate folosi una din urmtoarele comenzi: SET AUTOCOMMIT IMM[EDIATE] (schimbrile se efectueaz imediat); SET AUTOCOMMIT OFF (schimbrile sunt pstrate ntr-un buffer).La execuia comenzii COMMIT se permanentizeaz schimbrile efectuate, iar la execuia comenzii ROLLBACK se renun la schimbrile realizate. n scopul modificrii datelor dintr-o tabel se utilizeaz una din formele sintactice ale comenzii UPDATE: UPDATE nume-tabel [sinonim] SET nume-crt=expresie,nume -expresie,... [WHERE condiie]; UPDATE nume-tabel [sinonim] SET (nume-col, nume-col,...)=(subcerere) [WHERE condiie]; Sunt dou posibilitati de modificare. Una const n furnizarea n mod explicit a fiecarei valori pentru cmpurile care trebuie modificate iar cealalt posibilitate const n obinerea valorilor n urma unei cereri SQL. Dac nu este specificat clauza WHERE se vor modifica toate rndurile tabelei. (nume-col,nume-col,...)=(subeercre) impune ca cererea s conin pentru fiecare rnd un numr de valori corespunztor numrului de coloane din

paranteza care precede caracterul =. n cazul n care se modifse o singur coloan, parantezele pot fi omise. Exemple: 1) S se modifice cmpul NRSAL din tabela SALARIAI, pentru depozitul cu codul 130000, atribuindu-i valoarea 11. SQL> UPDATE DEPOZITE 2 SET NRSAL=11 3 WHERE CODD= 130000; 1 record updated. 2) S se modifice data de livrare, cantitatea solicitat i preul de livrare pentru produsul cu codul 13333 din comanda cu numrul 211111. SQL> UPDATE COMENZI 2 SET DATAL=SYSDATE,CANT=50, PRET=42000 3 WHERE CODP=13333 AND 4 NRCOM=211111; 1 record updated. 3) S se modifice data de livrare cu data actual pentru toate produsele cu codul egal cu 13333, din toate comenzile. SQL> UPDATE COMENZI 2 SET DATAL=SYSDATE 3 WHERE CODP=13333; 1 record updated. 4) S se mreasc salariul cu 15% pentru salariaii care au o funcie identic cu CARMEN ANA. SQL> UPDATE SALARIAI 2 SET SALA=SALA*1.15 3 WHERE FUNCT IN 4 (SELECT FUNCT 5 FROM SALARIAI 6 WHERE NUME='CARMEN ANA'); 11 records updated.

5.3. TERGEREA TUPLURILOR DIN TABELE tergerea unor rnduri dintr-o tabel se realizeaz cu urmtoarea comand: DELETE FROM nume tabela [WHERE condiie]; Folosirea clauzei WHERE determin tergerea acelor rnduri care ndeplinesc condiia impus. n aceast clauz pot fi folosite i subcereri. Dac nu este specificat nici o condiie, se terg toate rndurile tabelei. tergerile accidentale pot fi omise, restaurndu-se valorile iniiale prin comanda AUTOCOMMIT OFF. Exemple: 1) S se tearg datele din tabela DEPOZITE. SQL> DELETE FROM DEPOZITE; 5 records deleted. 2) S se tearg datele pentru depozitele care au codul mai mare sau egal cu 100000. SQL> DELETE FROM DEPOZITE 2 WHERE CODD>=100000; 2 records deleted. 3) S se scrie comanda pentru tergerea datelor despre salariatul VLAD VASILE. tergerile s nu fie efectuate imediat ci ulterior. SQL> SET AUTOCOMMIT OFF SQL> DELETE FROM SALARIAI 2 WHERE NUME='VLAD VASILE'; 1 record deleted. SQL> COMMIT ; 4) S se tearg datele salariailor care au aceeai funcie cu a lui PAUL TEFAN. tergerile s nu fie realizate imediat. Ulterior s se renune la aceste tergeri. SQL> SET AUTOCOMMIT OFF SQL> DELETE FROM SALARIAI 2 WHERE FUNCT IN 3 (SELECT FUNCT FROM SALARIAI 4 WHERE NUME='PAUL TEFAN'); 5 records deleted.

CAPITOLUL 6. SELECTAREA DATELOR DIN TABELELE BAZEI DE DATE


6.1. Comanda SELECT Pentru a selecta datele din una sau mai multe tabele se utilizeaz comanda SELECT a carei sintaxa este: SELECT [ALL | DISTINCT] {[nume-tabela.]* | expr [sinonim], expr [sinonim],} FROM nume-tabel [@ legatur][sinonim], nume-tabel [@ legatur][sinonim], [WHERE conditie] [ CONNECT BY conditie [START WITH conditie] ] [ GROUP BY { expr, expr.. | CUBE ( expr, expr.. ) | ROLLUP ( expr, expr ) } ] [HAVING conditie] [ {UNION | INTERSECT | MINUS} SELECT] [ ORDER BY {expr | numr-poziie} [ASC | DESC] {expr | numar-pozitie}[ASC | DESC], [ FOR UPDATE OF nume-col, nume-col,[NOWAIT] ]; Clauzele comenzii trebuie utilizate n ordinea specificat n sintax, excepie fcnd clauzele CONNECT BY, START WITH, GROUP BY i HAVING (care pot fi specificate n orice ordine). Clauzele ORDER BY i FOR UPDATE OF pot fi schimbate ntre ele. Clauza ALL determin afiarea tuturor rndurilor rezultate n urma cererii, spre deosebire de clauza DISTINCT care determin eliminarea duplicatelor, afind doar rndurile distincte. Utilizarea caracterului asterisc (*) are ca efect selectarea tuturor coloanelor din tabela specificat prin clauza FROM, n ordinea n care au fost definite la creare. n situaia final, fiecare expresie formulat n comand devine un nume de coloan. Totodat, orice sinonim, dac este specificat, este folosit n scopul etichetrii expresiei precedente din tabela afiat. Dac sinonimul conine blancuri sau caractere speciale cum sunt + i -, trebuie incluse ntre apostrofuri. Pentru a evita ambiguitatea, n cazul n care tabelele conin coloane cu acelai nume, este necesar calificarea coloanelor cu numele tabelei .

Identificarea tabelelor n care trebuie cutate datele corespunztoare coloanelor specificai se face prin specificarea numelor lor dup clauza FROM. n locul numelor de tabele se pot folosi sinonimele acestora. Clauza WHERE specific o condiie care este folosit pentru a selecta rndurile. Clauza CONNECT BY indic faptul c rndurile formeaz o structur arborescent. Prin aceast clauz sunt definite relaiile necesare pentru a conecta rndurile tabelei ntr-un arbore. Operatorul PRIOR folosit naintea uneia din cele dou pri ale condiiei, definete nodul printe iar n cealalt parte nodul fiu. Clauza START WITH, prin specificarea unei condiii care trebuie satisfcut, stabilete rndul folosit ca rdcin a arborelui. Dac se omite, comanda SELECT va returna o serie de arbori ncepnd cu fiecare rnd selectat. Existena clauzei CONNECT BY ntr-o comand SELECT permite utilizarea pseudocoloanei LEVEL, care returneaz valoarea 1 pentru nodul rdcin, 2 pentru fiii nodului rdcin, 3 pentru nepoi etc. Clauzele GROUP BY i HAVING determin afiarea unor informaii sintetice despre grupuri de rnduri care au aceeai valoare n una sau mai multe coloane. Aceste coloane sunt, n general, funcii de grup. ROLLUP activeaz o comanda SELECT pentru a calcula mai multe niveluri de subtotaluri dintr-un grup specificat de dimensiuni. Calculeaz de asemenea i un total general. ROLLUP este o extensie simpl a clauzei GROUP BY, deci sintaxa este foarte uor de folosit. Extensia ROLLUP este foarte eficient i nu ngreuneaz o cerere. Rolul extensiei ROLLUP este foare clar: creaz subtotaluri care pornesc de la cel mai detaliat nivel pn la un total general dup gruparea care a fost precizat n clauza ROLLUP. CUBE acioneaz asupra unui grup specificat de coloane i creaz subtotaluri pentru toate combinaiile posibile ntre acestea. Dac sa specificat de exemplu: CUBE (timp,regiune, department), rezultatul va include toate valorile care ar fi incluse ntr-un ROLLUP plus combinaii adiionale. Pentru a combina rezultatele a dou comenzi SELECT ntr-un singur rezultat, se folosesc operatorii UNION, INTERSECT i MINUS. UNION returneaz rezultatele obinute de la fiecare cerere n parte, INTERSECT returneaz doar rezultatele comune celor dou cereri iar MINUS returneaz rezultatele obinute de la prima cerere i care nu apar n urma celei de a doua selecii.

Pentru a putea folosi aceste clauze este necesar ca numrul i tipul coloanelor selectate de fiecare comand SELECT s fie aceleai, lungimile lor putnd fi diferite. Dac sunt combinate mai mult de dou comenzi SELECT, ele vor fi evaluate de la stnga la dreapta. Pentru a schimba ordinea de evaluare pot fi folosite parantezele. Totodat, cei trei operatori impun utilizarea cuvntului DISTINCT n toate comenzile SELECT. Clauza ORDER BY specific ordinea n care trebuie returnate rndurile distincte ale unei tabele. Clauza FOR UPDATE determin blocarea rndurilor selectate ale tabelei astfel nct acestea nu vor mai putea fi actualizate de ali utilizatori pn la deblocarea lor cu una din comenzile COMMIT sau ROLL BACK. Comanda SELECT ... FOR UPDATE trebuie urmat de una sau mai multe comenzi UPDATE ... WHERE. Dac se folosete clauza NOWAIT, selecia este considerat terminat chiar dac rndurile selectate de FOR UPDATE nu pot fi blocate deoarece alt utilizator lucreaz cu ele.

6.2. Utilizarea clauzei FROM Pentru a selecta una sau mai multe tabele i pentru a specifica, eventual, identificatorul proprietarului i legtura cu reeaua se folosete secvena: SELECT ... FROM [ident-proprietar] tabela [@LINK],...; Exemple: 1) S se selecteze toate coloanele din tabela SALARIAI. SQL> SELECT * FROM SALARIAI; sau SQL> SELECT ALL FROM SALARIATI;
MARCA 1111 1222 1000 3500 2500 3700 2650 NUME AVRAM ION BARBU DAN COMAN RADU DAN ION VLAD VASILE MANU DAN VLAD ION FUNCT VNZATOR VNZATOR EF DEP VNZATOR EF DEP VNZATOR VNZATOR CODD SALA 100000 21200 120000 20750 130000 35000 160000 24500 160000 36500 160000 27500 120000 25060 VENS 1000 2000 2500 3550 1500 2500 3500 CODS 1000 1000 1000 2500 2500 2500 1000

7 records selected.

2) S se selecteze coloanele MARCA, NUME, SALA, VENS din tabela SALARIAI. SQL> SELECT MARCA,NUME,SALA,VENS 2 FROM SALARIAI;
MARCA NUME 1111 AVRAM ION 1222 BARBU DAN 1000 COMAN RADU 3500 DAN ION 2500 VLAD VASILE 3700 MANU DAN 2650 VLAD ION SALA 21200 20750 35000 24500 36500 27500 25060 VENS 1000 2000 2500 3550 1500 2500 3500

7 records selected. 3) S se selecteze coloana NUME din tabela SALARIAI SQL> SELECT NUME 2 FROM SALARIAI;
NUME AVRAM ION BARBU DAN COMAN RADU DAN ION VLAD VASILE MANU DAN VLAD ION

7 records selected. 4) S se selecteze coloana FUNCT din tabela SALARIAI n variantele utilizrii i neutilizrii clauzei DISTINCT. SQL> SELECT FUNCT AFIARE_FUNCTIE 2 FROM SALARIAI;
AFISARE_FUNCTIE VNZATOR VNZATOR SEF DEP VNZATOR SEF DEP VNZATOR VNZATOR

7 records selected. SQL>SELECT DISTINCT FUNCT 2 AFIARE_DISTINCT_FUNCTIE 3 FROM SALARIAI;

AFISARE_DISTINCT_FUNCTIE VNZATOR EF DEP

2 records selected. 6.3 Utilizarea operatorilor n formularea condiiilor de selecie din clauza WHERE Operatorii SQL*Plus (Anexa2) pot aprea n orice parte a unei comenzi i au ntietate fa de orice alt tip de operatori. Operatorii aritmetici i logici sunt utilizai pentru formularea condiiilor de selecie. Exemple: 1) S se selecteze toate nregistrrile privind salariaii al cror salariu este mai mare de 15000 u.m.: SQL> SELECT * FROM SALARIATI 2 WHERE SALA>15000 ;
MARCA 1111 1222 1000 3500 2500 3700 2650 NUME AVRAM ION BARBU DAN COMAN RADU DAN ION VLAD VASILE MANU DAN VLAD ION FUNCT VNZATOR VNZATOR EF DEP VNZATOR EF DEP VNZATOR VNZATOR CODD SALA 100000 21200 120000 20750 130000 35000 160000 24500 160000 36500 160000 27500 120000 25060 VENS 1000 2000 2500 3550 1500 2500 3500 CODS 1000 1000 1000 2500 2500 2500 1000

7 records selected. 2) S se selecteze coloanele MARCA i NUME, precum i veniturile totale (SALA+VENS) pentru angajaii care au un salariu mai mare dect 35.000 u.m. SQL> SELECT MARCA, NUME, SALA+VENS 2 FROM SALARIAI 3 WHERE SALA>35000 ;
MARCA NUME 2650 VLAD VASILE SALA + VENS 38000

1 record selected 3) S se selecteze coloanele NUME, FUNCT i SALA pentru salariaii care au fncia de vnztor. SQL> SELECT NUME, FUNCT FROM SALARIAI 2 WHERE FUNCT=VNZATOR ;
NUME AVRAM ION FUNCT VNZATOR SALA 21200

BARBU DAN DAN ION MANU DAN VLAD ION

VNZATOR VNZATOR VNZATOR VNZATOR

20750 24500 27500 25060

5 records selected. 4) S se selecteze coloanele MARCA, NUME, CODD din tabela SALARIAI, pentru salariaii al cror venit suplimentar depete salariul. SQL> SELECT MARCA, NUME, CODD 2 FROM SALARIAI 3 WHERE VENS>SALA ; no records selected 5) S se selecteaze i afieze cmpurile MARCA, NUME, SALARIU pentru salariaii ale cror venituri suplimentare sunt mai mari de 1.500 u.m. i lucreaz n subordinea superiorului cu Codul 1000. SQL> SELECT MARCA, NUME, SALA 2 FROM SALARIAI 3 WHERE VENS>1500 4 AND CODS=1000 ;
MARCA 1222 1000 2650 NUME BARBU DAN COMAN RADU VLAD ION SALA 20750 35000 25060

3 records selected 6) S se afieze toate coloanele pentru salariaii cu funcia vnztor, care au salariul mai mare ca 20.000 u.m. i lucreaz n subordinea superiorului cu Codul 1000. SQL> SELECT * FROM SALARIAI 2 WHERE FUNCT =VANZATOR 3 AND SALA>20000 4 AND CODS=1000 ;
MARCA 1111 1222 2650 NUME AVRAM ION BARBU DAN VLAD ION FUNCT VNZATOR VNZATOR VNZATOR CODD SALA 100000 21200 120000 20750 120000 25060 VENS 1000 2000 3500 CODS 1000 1000 1000

3 records selected. 7) S se afieze coloana NUME i SALA pentru angajaii care au salariul mai mic ca 30.000 u.m. SQL> SELECT NUME FROM SALARIAI

WHERE SALA<30000 ;
SALA 21200 20750 24500 27500 25060

NUME AVRAM ION BARBU DAN DAN ION MANU DAN VLAD ION

5 records selected. 8) S se selecteze nregistrrile pentru care funcia este SEF DEP sau salariul este mai mare dect 35.000 u.m. SQL> SELECT MARCA, CODS FROM SALARIAI 2 WHERE FUNCT='SEF DEP' OR SALA>35000 ;
MARCA 1000 2500 NUME COMAN RADU VLAD VASILE FUNCT CODD EF DEP 130000 EF DEP 160000 SALA 35000 36500 VENS 2500 1500 CODS 1000 2500

2 records selected. 9) S se selecteze datele despre salariaii care au funcia de vnztor i nu lucreaz n subordinea superiorului cu codul 1000, SQL> SELECT * FROM SALARIAI 2 WHERE FUNCT=VANZATOR 3 AND CODS!=l000;
MARCA 3500 3700 NUME DAN ION MANU DAN FUNCT VNZATOR VNZATOR CODD SALA 160000 24500 160000 27500 VENS 3550 2500 CODS 2500 2500

2 records selected. 10) S se selecteze toi salariaii care lucreaz n subordinea superiorului cu codul 1000 precum i cei care au salariul mai mic de 26.000 u.m. sau funcia de vnztor. SQL> SELECT * FROM SALARIAI 2 WHERE FUNCT=VNZATOR 3 OR SALA< 26000 AND CODS=1000 ;
MARCA 1111 1222 3500 2650 NUME AVRAM ION BARBU DAN DAN ION VLAD ION FUNCT VNZATOR VNZATOR VNZATOR VNZATOR CODD SALA 100000 21200 120000 20750 160000 24500 120000 25060 VENS 1000 2000 3550 3500 CODS 1000 1000 2500 1000

4 records selected 11) S se selecteze MARCA i NUMELE pentru nregistrrile care conin date despre angajaii a cror funcie este cea de ef de depozit sau

care au un salariu de 35.000 u.m. i lucreaz n subordinea superiorului cu codul 1000. SQL> SELECT MARCA, NUME 2 FROM SALARIAI 3 WHERE FUNCT=SEF DEP OR 4 (SALA=35000 AND CODS=1000) ;
MARCA 1000 2500 NUME COMAN RADU VLAD VASILE

2 records selected. 12) S se selecteze datele salariailor care lucreaz n subordinea superiorului cu marca 1000 i au funcia ef de depozit sau salariul n valoare de 35.000 u.m. SQL> SELECT * FROM SALARIAI 2 WHERE (FUNCT=SEF DEP OR SALA=35000) 3 AND CODS=1000 ;
MARCA 1000 NUME COMAN RADU FUNCT CODD SALA EF DEP 130000 35000 VENS 2500 CODS 1000

1 record selected. 13) S se afieze valorile coloanelor MARCA, NUME, FUNCT privind angajaii care lucreaz n subordinea superiorului cu marca 1000 i au funcia de ef de depozit sau de vnztor. SQL> SELECT MARCA,NUME,FUNCT, CODS 2 FROM SALARIAI 3 WHERE (FUNCT=SEF DEF OR 4 FUNCT=VANZATOR') 5 AND CODS=1000 ;
MARCA 1111 1222 1000 2650 NUME AVRAM ION BARBU DAN COMAN RADU VLAD ION FUNCT VNZATOR VNZATOR EF DEP VNZATOR CODS 1000 1000 1000 1000

4 records selected. 14) S se selecteze coloanele MARCA, NUME, FUNCT pentru salariaii care au funcia de ef depozit sau pentru cei care lucreaz n subordinea superiorului cu marca 1000 i au funcia de vnztor. SQL> SELECT MARCA,NUME,FUNCT, CODS 2 FROM SALARIAI 3 WHERE FUNCT='SEF DEP'

4 5
MARCA 1111 1222 1000 2500 2650

OR (FUNCT=VNZATOR AND CODS=1000) ;


NUME AVRAM ION BARBU DAN COMAN RADU VLAD VASILE VLAD ION FUNCT VNZATOR VNZATOR EF DEP EF DEP VNZATOR CODS 1000 1000 1000 2500 1000

5 records selected. 15) S se selecteze toate datele privind angajaii ce nu au funcia de vnztor. SQL> SELECT * FROM SALARIAI 2 WHERE NOT (FUNCT= VANZATOR) ;
MARCA NUME 1000 COMAN RADU 2500 VLAD VASILE FUNCT EF DEP EF DEP CODD SALA 130000 35000 160000 36500 VENS 2500 1500 CODS 1000 2500

2 records selected. 16) S se selecteze valorile coloanelor MARCA, NUME, FUNCT, SALA+VENS pentru angajaii care au salariul cuprins ntre 24.500 i 36.000 u.m. SQL>SELECT MARCA, NUME, FUNCT, SALA+VENS 2 FROM SALARIAI 3 WHERE SALA BETWEEN 24500 AND 36000 ;
MARCA 1000 3500 3700 2650 NUME COMAN RADU DAN ION MANU DAN VLAD ION FUNCT EF DEP VNZATOR VNZATOR VNZATOR SALA+VENS 37500 28050 30000 28560

4 records selected. 17) S se selecteze cmpurile NUME, FUNCT, SALA+VENS pentru salariaii care au salariul mai mic dect 24500 i mai mare dect 36000. SQL> SELECT NUME, FUNCT, SALA+VENS 2 FROM SALARIAI 3 WHERE SALA NOT BETWEEN 24500 AND 36000 ;
NUME AVRAM ION BARBU DAN VLAD VASILE FUNCT VNZATOR VNZATOR EF DEP SALA+VENS 22200 22750 38000

3 records selected.

18) S se selecteze cmpurile MARCA, NUME i FUNCT pentru salariaii care lucreaz n depozitul cu codurile 130000 sau 160.000. SQL> SELECT MARCA, NUME, FUNCT 2 FROM SALARIAI 3 WHERE CODD IN (130000,160000) ;
MARCA 1000 3500 2500 3700 NUME COMAN RADU DAN ION VLAD VASILE MANU DAN FUNCT EF DEP VNZATOR EF DEP VNZATOR

4 records selected 19) S se selecteze cmpurile MARCA, NUME, SALA, VENS pentru salariaii care au alt funcie dect cea de vnztor. SQL> SELECT MARCA, NUME, SALA, VENS 2 FROM SALARIAI 3 WHERE FUNCT NOT IN (VNZATOR) ;
MARCA 1000 2500 NUME COMAN RADU VLAD VASILE FUNCT SALA EF DEP 35000 EF DEP 36500 VENS 2500 1500

2 records selected Operatorul LIKE face posibil realizarea unor cereri de regsire a nregistrrilor ce conin un cmp a crui valoare este comparat cu un ir de caractere dat. Pentru a evalua expresiile logice n care apar iruri de caractere se poate folosi clauza LIKE n urmtoarea secven: SELECT ... WHERE coloan LIKE ir ; Avantajul unei viteze mari de regsire ca urmare a indexrii este pierdut n momentul n care se caut ntr-o coloan indexat un ir care ncepe cu - sau %. Aceste caractere speciale suplinesc unul, respectiv mai multe caractere. Exemple: 1) S se selecteze coloanele NUME i FUNCT precum i veniturile totale pentru salariaii al cror nume ncepe cu litera C. SQL> SELECT NUME, FUNCT, SALA+VENS 2 FROM SALARIAI 3 WHERE NUME LIKE 'C% ;
NUME FUNCT SALA+VENS

COMAN RADU

EF DEP 37500

1 record selected 2) S se selecteze coloanele NUME, FUNCT, SALA+VENS pentru salariaii al cror nume se termin cu litera N. SQL> SELECT NUME,FUNCT, SALA+VENS 2 FROM SALARIAI 3 WHERE NUME LIKE %N' ;
NUME AVRAM ION BARBU DAN DAN ION MANU DAN VLAD ION FUNCT VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR SALA+VENS 22200 22750 28050 30000 28560

5 records selected 3) S se selecteze coloanele MARCA, NUME, MARCA, FUNCT pentru salariaii al cror nume este format din nou caractere (inclusiv spaiu), pe ultima poziie fiind N. SQL> SELECT NUME, MARCA, FUNCT, SALA+VENS 2 FROM SALARIAI 3 WHERE NUME LIKE _ _ _ _ _ _ _ _N ;
MARCA 1111 1222 NUME AVRAM ION BARBU DAN FUNCT VNZATOR VNZATOR

2 recors selected 4)S se selecteze salariaii al cror nume are pe poziia a treia litera M. SQL> SELECT NUME, FUNCT 2 FROM SALARIAI 3 WHERE NUME LIKE _ _M%' ;
NUME COMAN RADU FUNCT EF DEP

1 record selected 5) S se selecteze salariaii al cror nume are o lungime de nou caractere. SQL> SELECT NUME 2 FROM SALARIAI 3 WHERE NUME LIKE '_ _ _ _ _ _ _ _ _';
MARCA 1111 1222 NUME AVRAM ION BARBU DAN NS

2 recors selected Regsirea unor nregistrri ce conin cmpuri cu valori nule se face cu ajutorul operatorului NULL. Exemple: 1) S se selecteze datele pentru salariaii ce nu au venit suplimentar. SQL> SELECT MARCA, NUME, FUNCT 2 FROM SAI.ARIATI 3 WHERE VENS IS NULL ;
MARCA 3770 NUME CARMEN ANCA FUNCT VNZATOR CODD 130000 SALA 26500 VENS 4000 CODS

1 record selected 2) S se selecteze toate datele salariaiilor care sunt ef depozit i al cror cmp VENS (venituri suplimentare) nu conine valoarea NULL. SQL> SELECT * FROM SALARIATI WHERE 2 VENS IS NOT NULL AND FUNCT IS SEF DEP ;
MARCA 1000 2500 NUME COMAN RADU VLAD VASILE FUNCT EF DEP EF DEP CODD SALA 130000 35000 160000 36500 VENS 2500 1500 CODS 1000 2500

2 records selected 6.4.Ordonarea liniilor rezultate n urma unei cereri Limbajul SQL*Plus are posibilitatea ordonrii cresctoare sau descresctoare a liniilor rezultate n urma unei cereri. Aceast operaie se realizeaz prin intermediul secvenei: SELECT ... FROM ... WHERE ... ORDER BY {expr | numr-poziie} [ASC | DESC], ; unde: expr reprezint o expresie care face referire la una sau mai multe coloane; numr-poziie este un numr care identific poziia coloanei din comanda SELECT, dup care se dorete sortarea. Utilizarea operatorului de tipul UNION, INTERSECT sau MINUS impune prezena argumentului numr-poziie. ASC sau DESC precizeaz modul

de ordonare ascendent, respectiv descendent. n cazul n care clauzele ORDER BY i DISTINCT sunt utilizate mpreun, clauza ORDER BY trebuie s se refere la coloane care n-au fost menionate n comanda SELECT. Exemple: 1) S se selecteze toate coloanele tabelei SALARIAI privind salariaii care sunt vnztori i pentru care marca superiorului este 1000. Afiarea s se fac dup valorile coloanei MARCA, descresctor. SQL>SELECT * FROM SALARIAI 2 WHERE CODS=1000 3 AND FUNCT=VNZATOR 4 ORDER BY MARCA DESC ;
MARCA 2650 1222 1111 NUME VLAD ION BARBU DAN AVRAM ION FUNCT VNZATOR VNZATOR VNZATOR CODD SALA 120000 25060 120000 20750 100000 21200 VENS 3500 2000 1000 CODS 1000 1000 1000

3 records selected 2) S se selecteze cresctor dup salariu, angajaii cu funcia vnztor pentru care marca superiorului este 1000. SQL>SELECT * FROM SALARIAI 2 WHERE CODS=1000 3 AND FUNCT='VNZATOR' 4 ORDER BY SALA ;
MARCA 1222 1111 2650 NUME BARBU DAN AVRAM ION VLAD ION FUNCT VNZATOR VNZATOR VNZATOR CODD 120000 100000 120000 SALA 20750 21200 25060 VENS 2000 1000 3500 CODS 1000 1000 1000

3 records selected. 3) S se selecteze cresctor, dup salariu, coloanele MARCA, NUME, SALA, VENS, SALA+VENS pentru acei salariai cu funcia de vnztor i pentru care marca superiorului este 1000 SQL> SELECT MARCA, NUME, SALA, VENS 2 FROM SALARIAI 3 WHERE CODS=1000 AND FUNCT='VNZATOR' 4 ORDER BY SALA ;
MARCA 1222 1111 2650 NUME BARBU DAN AVRAM ION VLAD ION SALA 20750 21200 25060 VENS 2000 1000 3500 SALA+VENS 22750 22200 28560

3 records selected. 4) S se selecteze coloanele MARCA, NUME, CODD, VENS ordonate cresctor dup codul depozitului i veniturile suplimentare. SQL> SELECT MARCA,NUME,CODD,VENS 2 FROM SALARIAI 3 WHERE FUNCT='VNZATOR' 4 ORDER BY CODD, VENS ;
MARCA 1111 1222 2650 3700 3500 NUME AVRAM ION BARBU DAN VLAD ION MANU DAN DAN ION CODD 100000 120000 120000 160000 160000 VENS 1000 2000 3500 2500 3550

5 records selected 6.5. Selecii din mai multe tabele Operaia prin care se selecteaz i se grupeaz coloanele din tabele diferite, n scopul obinerii unor informaii coerente, poart numele de jonciune (JOIN). Pentru a realiza o jonciune i pentru a preciza corespondena ntre rndurile tabelelor, se utilizeaz urmtoarea secven: SELECT ... FROM nume-tab1, nume-tab2, ... WHERE condiie ; unde: condiie reprezint orice expresie care compar cmpurile diferitelor tabele.Vor fi selectate rndurile pentru care condiia este ndeplinit. n condiie poate fi folosit operatorul (+) care simuleaz existena unor rnduri vide n tabelele pentru care nu se gsesc corespondene. Exemple: 1) Din tabela COMENZI (creat anterior de utilizator, pe structura NrCom, DataCom, CodP, Cant, PreMax, PretMin, Pret(pltit), s se selecteze codul produsului, cantitatea i diferena dintre valoarea mrfurilor comandate la preul maxim i cel efectiv negociat (pentru un cmp definit DIFERENTA). Ordonarea s se fac ascendent dup CODP. SQL> SELECT COMENZI.CODP,CANT, 2 PRETMAX*CANT-PRET*CANT DIFERENTA

3 4 5
CODP 13333 14444 16686

FROM COMENZI,PRETURI WHERE PRETURI.CODP=COMENZI.CODP ORDER BY COMENZI.CODP ;


CANT DIFERENTA 4 8000 6 3000 15 75000

3 records selected. 2) S se afieze din tabela COMENZI codul produsului, diferena dintre valoarea mrfurilor comandate la preul maxim i cel efectiv negociat (pentru DIF_MAX), diferena dintre valoarea mrfurilor comandate la preul minim i cel efectiv negociat (pentru DIF_MIN) selectate dup criteriul egalitii EQUI-JOIN (JOIN pe condiie de egalitate). Liniile vor fi ordonate cresctor dup valoarea total a comenzii. SQL> SELECT COMENZI.CODP, 2 PRETMAX*CANT-*PRET*CANT DIF_MAX, 3 PRETMIN*CANT-PRET*CANT DIF_MIN 4 FROM COMENZI.PRETURI 5 WHERE PRETURI.CODP=COMEN2I.CODP 6 ORDER BY PRET*CANT;
CODP 14444 13333 16666 DIF_MAX 3000 8000 75000 DIF_MIN 0 -4000 -15000

3 records selected. 3) S se afieze cmpurile CODP, DENP, STOC i CANT, utiliznd criteriul egalitii OUTER-JOIN, pe cmpul comun CODP (se afieaz datele despre acele produse pentru care exist comenzi dar nu sunt n tabela Produse). Liniile vor fi ordonate cresctor dup cmpul CODP. SQL> SELECT COMENZI.CODP, DENP, STOC, CANT 2 FROM PRODUSE, COMENZI 3 WHERE COMENZI.CODP=PRODUSE.CODP (+) 4 ORDER BY COMENZI.CODP ;
CODP 13333 14444 16666 DENP CANAPEA A7 SCAUN D4 PLACAJ 2/2 STOC 6 36 100 CANT 4 6 15

3 records selected. 4) S se afieaze n modul distinct (far a se repeta aceleai linii), Codul depozitului i funciile care conin valori nule n cmpul veniturilor

suplimentare. Selectarea s se fac pe criteriul egalitii pe cmpul comun CODD i n condiiile n care acel depozit exist. SQL> SELECT DISTINCT DEPOZITE.CODD, NUME, FUNCT 2 FROM SALARIATI, DEPOZITE 3 WHERE SALARIATI.CODD=DEPOZITE.CODD (+) 4 AND VENS IS NULL;
CODD 130000 NUME CARMEN ANCA FUNCT VNZATOR

1 record selected. 5) S se afieze n modul distinct codul depozitului i funciile care conin valori nule n cmpul veniturilor suplimentare. Selectarea se face pe criteriul egalitii n cmpul comun CODD i n condiiile n care acel depozit exist. Liniile vor fi ordonate descresctor dup codul depozitului (din tabela SALARIAI). Se va aduga n tabela salariai un nou tuplu cuprinznd datele vnztorului Alexe Ioan, cod depozit 160000 i fr venituri suplimentare, pentru eficiena ordonrii. SQL> SELECT DISTINCT DEPOZTTE.CODD.FUNCT 2 FROM SALARIATLDEPOZITE 3 WHERE SALARIATLCODD=DEPOZITE.CODD(+) 4 AND VENS IS NULL 5 ORDER BY SALARIATI.CODD DESC
CODD 160000 130000 NUME ALEXE IOAN CARMEN ANCA FUNCT VNZTOR VNZATOR

2 records selected ntr-o cerere se pot nlocui numele de tabele sau coloane prin etichete. 6) S se selecteze cmpurile NUME, FUNCT, DEND din tabelele DEPOZITE (pentru care este utilizat numele D), CodD, DenD, Capac, NrSal, i SALARIAI (pentru care este utilizat numele S). Liniile vor fi ordonate cresctor dup cmpul NUME. SQL> SELECT NUME, FUNCT, D.CODD, DEND 2 FROM DEPOZITE D, SALARIAI S 3 WHERE D.CODD=S.CODD 4 ORDER BY NUME
NUME ALEXE IOAN AVRAM ION BARBU DAN FUNCT VNZATOR VNZATOR VNZATOR CODD 160000 100000 120000 DEND SPORT MOBILA ALIMENTAR

CARMEN ANCA COMANRADU DAN ION DORU DAN FRINCU ION RADU IOANA SANDU ION VLAD ION VLAD VASILE

VNZATOR SEF DEP VNZATOR SEF DEP SEF DEPR VNZATOR VNZATOR VNZATOR SEF DEP

130000 130000 160000 130000 160000 130000 130000 120000 160000

AUTO AUTO SPORT AUTO SPORT AUTO AUTO ALIMENTAR SPORT

13 records selected. Pentru a pune n eviden posibilitatea schimbrii denumirilor de tabele, n exemplele care urmeaz se va folosi, cu preponderen, adresarea prin calificare. 7) S se selecteze, n condiiile redenumirii tabelelor COMENZI cu CONTRACT i PRODUSE cu COS, a coloanelor CODP, CANT, PRE din CONTRACT i coloanelor DENP, STOC din COS. S fie selectate doar cmpurile care au unitatea de msur "buc. Liniile vor fi ordonate cresctor dup valorile comenzilor. SQL> SELECT CONTRACT.CODP,CONTRACT.CANT, 2 CONTRACT.PRET, DENP, COS.STOC 3 FROM COMENZI CONTRACT, PRODUSE COS 4 WHERE CONTRACT.CODP=COS.CODP 5 AND UM='BUC 6 ORDER BY CONTRACT.CANT*COS.PRET
CODP 14444 13333 CANT 6 4 PRE 4500 80000 DENP SCAUN D4 CANAPEA A STOC 36 76

2 records selected. 8) S se selecteze, n condiiile redenumirii tabelelor COMENZI cu CONTRACT i PRODUSE cu COS, a coloanelor CODP, CANT, PRE din CONTRACT i a coloanelor DENP, STOC din COS. Vor fi selectate doar cmpurile care au unitatea de msur buc iar liniile vor fi ordonate cresctor dup valorile comenzilor. La afiare se ve extrage o coloan numit 'DIFERENA' care s reflecte stocul rmas n urma onorrii comenzii. SQL> SELECT CONTRACT.CODP, 2 CONTRACT.CANT,CONTRACT.PRET, 3 DENP, COS.STOC, 4 COS.STOC-CONTRACT.CANT DIFERENA 5 FROM COMENZI CONTRACT,PRODUSE COS 6 WHERE CONTRACT.CODP=COS.CODP 7 AND UM=BUC'

8
CODP 14444 13333

ORDER BY CONTRACT.CANT * CONTRACT.PRET


CANT 6 4 PRE 4500 80000 DENP SCAUN D4 CANAPEA A7 STOC DIFERENA 36 30 6 2

2 records selected. 9) Din tabela COMENZI (definit prin etichetele T1 i T2) s se selecteze CODP, CODC, n condiiile n care valoarea comenzii este mai mare ca 50.000 u.m. (JOIN-ul unei tabele pe ea nsi). SQL> SELECT DISTINCT T1.CODP, T2.CODC 2 FROM COMENZI T1,COMENZI T2 3 WHERE Tl.CANT * T2.PRET >60000
CODP 13333 14444 16666 22222 CODC 121111 121111 121111 121111

4 records selected 10) S se selecteze campurile CODP,.DENP, PRE, PRETMAX, PRETM1N pentru produsele al cror pre (negociat) este cuprins ntre preul maxim i preul minim. Ordonarea s se fac cresctor dup cmpul CODP. SQL> SELECT PRODUSE.CODP, DENP, 2 COMENZI.PRET, 3 PRETMIN,PRETMAX 4 FROM PRODUSE, PRETURI, COMENZI 5 WHERE COMENZI.PRET BETWEEN PRETMIN AND PRETMAX 6 ORDER BY PRODUSE.CODP
CODP 13333 14444 16666 DENP CANAPEA A7 SCAUN D4 PLACAJ 2/2 PRE PRETMIN PRETMAX 80000 79000 82000 4500 4500 5000 25000 24000 30000

3 records selected. 6.6. Realizarea cererilor incluse Subcererile reprezint cereri incluse n clauzele unor comenzi SQL. Rndurile selectate de o subcerere nu sunt afiate, ele fiind utilizate n continuare de o comand SQL.

Dac subcererea este folosit n partea dreapt a unei expresii logice sau a unei expresii de atribuire, ea va returna o singur valoare sau o coloan de valori. Compunerea valorii rezultate cu cea din stnga expresiei se face n conformitate cu operatorul care face legtura ntre cele dou pri. n cazul n care subcererea este folosit pentru a specifica valori n comenzi ca INSERT, CREATE TABLE, UPDATE, ea va returna cte o valoare pentru fiecare coloan specificat n comand. Clauze ca ORDER BY, FOR nu pot fi folosite n subcereri. Subcererile apar, n general, n urmtoarele comenzi: COPY [FROM nume-utilizator/parol@baz-de-date] [TO nume-utilizator/parol@baz-de-date] {APPEND | CREATE | INSERT | REPLACE} Tabel (col1,col2,) USING cerere;; CREATE TABLE tabel AS cerere ; INSERT INTO tabel | [(col1,col2,)] [VALUES (val1,val2,...) | cerere]; UPDATE tabel [sinonim] SET (col1, col2, ) = (cerere) [WHERE condiie]; Exist si subcereri corelate cu cererile din comanda principal, care apar doar n clauza WHERE a comenzii SELECT. Ele pot utiliza sinonime pentru tabela precizat n comanda SELECT i sunt evaluate cte o dat pentru fiecare rnd selectat n comanda principal. Subcererile corelate pot apare n formule ca: 1). SELECT coloana1, coloana2,... FROM tabela1, tabela2 tab2,... WHERE coloana1 IN (SELECT coloana1 FROM tabela1 WHERE condiie) .... ;

2) SELECT coloana1, coloana2,... FROM tabela1 tab1, tabela2 tab2,... WHERE coloana2 IN (SELECT funcie (coloan) FROM tabela2 tab2 WHERE tab2.coloana=coloana) .... ; Exemple: 1) S se selecteze cmpurile NUME i FUNCT ale salariailor cu funcia identic cu a lui RADU IOANA. SQL> SELECT NUME, FUNCT, FUNCIE 2 FROM SALARIAI 3 WHERE FUNCT= 4 (SELECT FUNCT FROM SALARIAI 5 WHERE NUME='RADU IOANA');
NUME AVRAM ION BARBU DAN DAN ION MANU DAN VLAD ION SANDU ION CARMEN ANA RADU IOANA ALEXE IOAN FUNCIE VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR

9 records selected. 2) S se selecteze, n modul distinct, valorile timpurilor MARCA, SALA, NUME, CODS ale angajailor care au salariul mai mare dect unul dintre subordonaii superiorului cu codul 1000. Rezultatele sunt cerute ordonate descresctor, dup valorile cmpului SALA. SQL> SELECT DISTINCT MARCA, SALA, NUME, CODS 2 FROM SALARIATI 3 WHERE SALA> ANY 4 (SELECT SALA FROM SALARIAI 5 WHERE CODS=1000) 6 ORDER BY SALA DESC;
MARCA 2500 3755 2550 1000 8700 8770 8755 8760 SALA 36500 36500 36000 35000 27500 26500 25700 25600 NUME VLAD VASILE DORU DAN FRINCU ION COMAN RADU MNU DAN CARMEN ANA ALEXE IOAN SANDU ION CODS 2500 4000 2500 1000 2500 4000 2500 4000

8650 8600 1111

25060 24500 21200

VLAD ION DAN ION AVRAM ION

1000 2500 1000

11 records selected. 3) S se selecteze valorile cmpurilor MARCA, NUME, SALA, CODS ale angajailor care au salariul mai mare dect al oricrui salariat din subordinea angajatului cu codul 1000. Datele s fie ordonate descresctor dup valorile cmpului MARCA. SQL> SELECT MARCA, NUME, SALA, CODS 2 FROM SALARIAI 3 WHERE SALA>ALL 4 (SELECT SALA FROM SALARIAI 5 WHERE CODS=1000) 6 ORDER BY MARCA DESC;
MARCA 3755 2550 2500 NUME DORU DAN FRINCU ION VLAD VASILE SALA 36500 36000 36500 CODS 4000 2500 2500

3 records selected. 4) S se selecteze cmpurile CODD, DEND, NRSAL pentru acele depozite care au numrul de salariai mai mare ca 5 i codul cuprins n intervalul 100000 i 130000. SQL> SELECT CODD, DEND, NRSAL 2 FROM DEPOZITE 3 WHERE NRSAL>5 AND CODD IN 4 (SELECT CODD FROM DEPOZITE 5 WHERE CODD BETWEEN 100000 AND 130000);
CODD 120000 DEND NRSAL ALIMENTAR 11

1 record selected. 5) S se selecteze CODD, DEND, NRSAL pentru acele depozite care au numrul de salariai mai mare ca 5 i codul n afara intervalului 100000 i 130000. SQL> SELECT CODD.DEND,NRSAL 2 FROM DEPOZITE 3 WHERE NRSAL>5 AND CODD NOT IN 4 (SELECT CODD FROM DEPOZITE 5 WHERE CODD BETWEEN 100000 AND 130000);
CODD 140000 DEND NRSAL TEXTILE 7

1 record selected. 6) S se selecteze urmtoarele informaii: marca, funcia i veniturile totale ale salariailor care au funcia i salariul lui VLAD VASILE. SQL> SELECT MARCA, NUME, SALA+VENS 2 FROM SALARIAI 3 WHERE (FUNCT, SALA)= 4 (SELECT FUNCT,SALA FROM SALARIAI 5 WHERE NUME=' VLAD VASILE ');
MARCA 1500 3755 NUME VLAD VASILE DORU DAN SALA+VENS 38000 42000

2 records selected. 7) S se selecteze MARCA, NUME, SALA+VENS pentru acei angajai care au funcia lui VLAD VASILE sau salariul mai mare sau egal cu cel pe care l are RADU IOANA. Ordonarea este cresctoare dup valorile cmpului NUME. SQL> SELECT MARCA, NUME, SALA+VENS 2 FROM SALARIAI 3 WHERE FUNCT IN 4 (SELECT FUNCT FROM SALARIAI 5 WHERE NUME='VLAD VASILE') 6 OR SALA>= 7 (SELECT SALA FROM SALARIATI 8 WHERE NUME=RADU IOANA) 9 ORDER BY NUME ;
NUME FUNCT ALEXE IOAN VNZATOR AVRAM ION VNZATOR BARBU DAN VNZATOR CARMEN ANCA VNZATOR COMANRADU SEF DEP DAN ION VNZATOR DORU DAN SEF DEP FRINCU ION SEF DEP MANU DAN VNZATOR RADU IOANA VNZATOR SANDU ION VNZATOR VLAD ION VNZATOR VLAD VASILE SEF DEP SALA+VENS 22200 22750 22200 23456 37500 24850 42000 73000 30000 23750 25600 28560 38000

13 records selected. Dac se dorete evitarea afirii valorilor NULE ale cmpului sum venituri totale (SALA+VENS), atunci se va proceda astfel:

SQL> SELECT MARCA, NUME, SALA+VENS 2 FROM SALARIAI 3 WHERE FUNCT IN 4 (SELECT FUNCT FROM SALARIAI 5 WHERE NUME='VLAD VASILE') 6 OR SALA>= 7 (SELECT SALA FROM SALARIATI 8 WHERE NUME=RADU IOANA) 9 AND VENS IS NOT NULL 10 ORDER BY NUME ; 8) S se selecteze cmpurile NUME i CODD ale angajailor cu codul superiorului 1000 i care au aceeai Funcie cu DORU DAN. S se afieze numai salariaii pentru care exist coresponden de CODD n tabelele DEPOZITE i SALARIAI. Datele s fie ordonate cresctor dup valorile cmpurilor CODD i NUME. SQL> SELECT NUME, DEPOZITE.CODD 2 FROM SALARIATI, DEPOZITE 3 WHERE CODS = 1000 4 AND DEPOZITE.CODD=SALARIATI.CODD 5 AND FUNCT IN 6 (SELECT FUNCT FROM SALARIAI 7 WHERE NUMEs'DORU DAN') 8 ORDER BY DEPOZITE.CODD, NUME;
NUME COMAN RADU CODD 130000

1 record selected. 9) S se selecteze cmpurile MARCA, NUME, CODD, DEND, SALA+VENS pentru angajaii care au salariul mai mare dect media salariilor realizate n depozitul din care fac ei parte. SQL> SELECT MARCA, NUME, SALARIATI.CODD, 2 DEND, SALA+VENS 3 FROM SALARIATI, DEPOZITE 4 WHERE SALA> 5 (SELECT AVG(SALA) FROM SALARIAI 6 WHERE SALARIATI.CODD=DEPOZITE.CODD) 7 AND DEPOZITE.CODD=SALARIATI.CODD 8 ORDER BY MARCA;
NUME CODD COMAN RADU 130000 DEND AUTO SALA+VENS 37500

VLAD VASILE 160000 FRINCU ION 160000 DORU DAN 130000

SPORT SPORT AUTO

38000 73000 42000

6.7. Utilizarea expresiilor, funciilor, variabilelor sistem i pseudocoloanelor n selectarea datelor Expresiile aritmetice pot fi utilizate n comenzile de selectare a datelor. Ele se construiesc cu ajutorul operatorilor aritmetici, numelor de coloane i constantelor. Exemple: 1) S se selecteze cmpurile CODD, CODP, CODC, precum i CANT*PRET denumit ca valoare total, din tabela COMENZI, pentru toate nregistrrile al cror cod de depozit este 100000. SQL> SELECT CODD, CODP, CODC, CANT*PRET 2 FROM COMENZI, DEPOZITE 3 WHERE CODD=100000 ;
CODD 100000 100000 100000 100000 CODP 13333 14444 16666 22222 CODC 121111 121111 121111 121111 VALOARE TOTAL 320000 27000 375000 282000

4 records selected 2) S se selecteze codurile produselor i data pn la care preurile sunt admise, pentru produsele din tabela COMENZI care au preul negociat mai mare dect preul mediu stabilit. SQL> SELECT DISTINCT PRETURI.CODP, DATASF 2 FROM PRETURI, COMENZI 3 WHERE COMENZI.PRET > PRETMIN+PRETMAX)/2
CODP 14444 11111 12222 16666 13333 DATASF 01-NOV-05 30-AUG-05 30-SEP-05 01-NOV-05 01-GCT-05

5 records selected. 3) S se afieze numele, marca, raportul VENS/SALA i veniturile totale pentru efii de depozite. Ordonarea datelor s fie fcut cresctor dup valorile raportului menionat. SQL> SELECT NUME, MARCA, VENS/SALA, VENS+SALA

2 3 4
NUME FRINCU ION DORU DAN COMAN RADU VLAD VASILE

FROM SALARIATI WHERE FUNCT='SEF DEP' ORDER BY VENS/SALA DESC ;


MARCA 2550 3755 1000 2500 VENS/SALA 1.0277777777777778 .15068493150684932 .07142857142857143 .0410958904109589 VENS+SALA 73000 42000 37500 38000

4 records selected 4) S se selecteze numele, codul depozitului, venitul total lunar i anual prognozat din tabela SALARIAI, pentru vnztori. Ordonarea s fie fcut cresctor dup valorile cmpului NUME. SQL> SELECT NUME,CODD, SALA+VENS, (SALA+VENS)*12 2 FROM SALARIAI 3 WHERE FUNCT='VNZATOR' 4 ORDER BY NUME;
NUME ALEXE IOAN AVRAM ION BARBU DAN CARMEN ANCA DAN ION MANU DAN RADU IOANA SANDU ION VLAD ION CODD 160000 100000 120000 130000 160000 160000 130000 130000 120000 SALA+VENS 26500 22200 22750 26500 24850 30000 23750 25600 28560 (SALA+VENS)*12 318000 266400 273000 318000 298200 360000 285000 307200 342720

9 records selected O expresie aritmetic n care un operand este nul (valoarea NULL) are o valoare nul (NULL). De aceea, de multe ori, construirea corect a expresiilor aritmetice presupune transformarea valorii NULL ntr-o alt valoare, eventual nul fa de operaia aritmetic (cum ar fi, de exemplu, zero la adunare, unu la nmulire etc.). Se presupune c n cmpul VENS s-au introdus i valori NULL. Pentru astfel de valori, expresia SALA+VENS are valoarea NULL, indiferent ce valoare are SALA, ceea ce matematic nu este corect. De aceea, pentru exemplul anterior, se recomand ca valoarea NULL a cmpului VENS s fie transformat n zero (fiind o sum) naintea evalurii expresiei aritmetice.

Exemple: 1) S se selecteze coloanele NUME, MARCA, VENS, SALA+VENS din tabela SALARIAI, n condiiile n care codul superiorului este 1000. SQL> SELECT NUME, MARCA,VENS, SALA+VENS 2 FROM SALARIATI 3 WHERE CODS= 1000 ;
NUME MARCA AVRAM ION 1111 BARBU DAN 1222 COMAN RADU 1000 VLAD ION 2650 VENS 1000 2000 2500 SALA+VENS 22200 22750 36000

Deoarece venitul suplimentar al salariatului VLAD ION este NULL, venitul lui total (SALA+VENS) a rezultat tot NULL. Utiliznd funcia NVL, ca n exemplul de mai jos, VENITUL_TOTAL este acum calculat corect (pentru toi salariaii). SQL> SELECT NUME, 2 SALA+NVL(VENS,0) VENIT_TOTAL 3 FROM SALARIAI 4 ORDER BY NUME ;
NUME ALEXE IOAN AVRAM ION BARBU DAN CARMEN ANCA COMAN RADU DAN ION DORU DAN FRINCU ION MANU DAN RADU IOANA SANDU ION VLAD ION VLAD VASILE VENIT_TOTAL 25700 22200 22750 26500 35000 24850 42000 73000 30000 23750 25600 28560 38000

13 records selected. n capul de tabel, rezultat n urma cererilor, apar numele coloanelor din baza de date. n locul acestora pot fi afiate etichete de coloan declarate n comenzile de definire a tabelelor. Sintaxa de declarare este: SELECT coloana1 nume-etichet1, coloana2 nume-etichet2, ;

Notaiile pentru coloane cu etichete au fost utilizate i n exemplele anterioare, cum ar fi cele pentru Diferena, Valoare Total sau Diferen MIN sau MAX etc. Exemplu: S se selecteze denumirea depozitelor, codul acestora i numrul de salariai ce i desfoar activitatea n cadrul lor, ordonate cresctor dup denumire. SQL> SELECT DEND PROFILUL, 2 CODD CODUL, 3 NRSAL NUMR DE SALARIAI 4 FROM DEPOZITE 5 ORDER BY DEND;
PROFILUL ALIMENTAR AUTO MOBILA SPORT TEXTILE CODUL 120000 130000 100000 160000 140000 NUMR DE SALARIAI 11 5 3 4 7

Funciile aritmetice sunt utilizate n cererile de selecie. Exemple: 1) S se afieze codul, denumirea i cantitatea - ridicat la ptrat, pentru produsele cu unitatea de msur BUC. SQL> SELECT CODP, CODUL, 2 DENP, DENUMIRE, 3 POWER (CANT,2) CANT_PATRAT 4 FROM PRODUSE 5 WHERE UM='BUC 6 ORDER BY CODP ;
CODUL 14444 11111 12222 13333 DENUMIRE CANT_PATRAT SCAUN D4 1296 MESE 15/20 49 FOTOLIU A3 144 CANAPEA A7 36

4 records selected. 2) S se selecteze n modul distinct cmpurile CODP, DENP, CODC.DENC i s se calculeze cmpul [(CANT*PRET)/2], rotunjit la dou zecimale. SQL> SELECT DISTINCT 2 COMENZI.CODP, DENP, 3 COMENZI.CODC, DENC,

4 ROTUNJIRE 5 6 7
CODP 13333 16666 14444

ROUND ( (COMENZI.CANT*COMENZI.PRET)/2,2 ) FROM COMENZI, CLIENTI, PRODUSE WHERE COMENZI.CODP = PRODUSE.CODP AND COMENZI.CODC = CLIENTI.CODC;
DENP CANAPEA A7 PLACAJ 2/2 SCAUN D4 CODC 121111 121111 121111 DENC UNIT-2 UNIT-2 UNIT-2 ROTUNJIRE 160000 187500 13500

3 records selected. Funciile caracter opereaz asupra irurilor de caractere. Ele se utilizeaz pentru transformarea literelor mari n mici sau invers, extragerea unui subir dintr-un ir, ncepnd cu o anumit poziie, selectarea cuvintelor care se pronun asemntor cu un ir dat etc. Exemple: 1) S se afieze o situaie final prin care s fie redate cmpurile NUME i MARCA angajatului, reunite ntr-un cmp comun denumit INFORMAIE, iar cmpul venituri totale anuale s fie denumit VENIT_ANUAL. Selecia este cerut pentru angajaii cu codul superiorului egal cu 1000. SQL>SELECT NUME || - || MARCA INFORMAIE 2 (SALA+VENS)*12 VENIT_ANUAL 3 FROM SALARIAI 4 WHERE CODS =1000;
INFORMAIE AVRAM ION - 1111 BARBU DAN - 1222 COMAN RADU - 1000 VLAD ION - 2650 VENIT_ANUAL 266400 273000 450000 342720

4 records selected. 2) S se selecteze cmpurile NUME i FUNCT din tabela SALARIAI i s se atribuie un cod de clasificare fiecrei funcii. Codul este format dintr-o singur cifr i are valorile: 1 pentru vnztor, 2 pentru director, 3 pentru restul funciilor. SQL> SELECT NUME, FUNCT, 2 DECODE(FUNCT, VNZATOR,l ,DIRECTOR,2,3) 3 CLASIFIC_FUNCT 4 FROM SALARIAI 5 ORDER BY FUNCT, NUME ;
NUME FUNCT CLASIFIC_FUNCT

COMAN RADU DORU DAN FRINCU ION VLAD VASILE ALEXE IOAN AVRAM ION BARBU DAN CARMEN ANCA DAN ION MANU DAN RADU IOANA SANDU ION VLAD ION

SEF DEP SEF DEP SEF DEP SEF DEP VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR

3 3 3 3 1 1 1 1 1 1 1 1 1

13 records selected 3) S se afieze salariul i veniturile suplimentare ale tuturor angajailor, cu specificarea numelui numai pentru salariaii vnztori. Pentru restul angajailor s se afieze mesajul: *** Nu intereseaz ***. Ordonarea s se fac dup funcie, n mod descresctor. SQL> SELECT DECODE 2 ( 3 FUNCT,VNZATOR, NUME, ***Nu intereseaz*** 4 ) NUMELE, 5 SALA, NVL (VENS, 0) 6 FROM SALARIAI 7 ORDER BY FUNCT DESC;
NUMELE AVRAM ION BARBU DAN DAN ION MANU DAN VLAD ION SANDU ION CARMEN ANCA RADU IOANA ALEXE IOAN *** Nu intereseaz *** *** Nu intereseaz *** *** Nu intereseaz *** *** Nu intereseaz *** SALA 21200 20750 24500 27500 25060 25600 26500 20750 25700 35000 36500 36000 36500 VENS 1000 2000 350 2500 3500 0 0 3000 0 2500 1500 37000 5500

13 records selected. 4) S se afieze primele 5 caractere din NUME, MARCA i primul caracter din funcie, pentru toi angajaii. SQL> SELECT SUBSTR (NUME, l, 5) 5_din_Nume, 2 MARCA, Marca_Sal, 3 SUBSTR (FUNCT, 1, 1) 1_din_Funcie 4 FROM SALARIAI;

5_din_Nume AVRAM BARBU COMAN DAN I VLAD MANU FRINC VLAD DORU SANDU CARME RADU ALEXE

Marca_Sal 1111 1222 1000 3500 2500 3700 2550 2650 3755 3760 3770 1680 3755

1_din_Funcie V V S V S V S V S V V V V

13 records selected. 5) S se selecteze i afieze numele, funcia i salariul total pentru toi angajaii care au numele terminat cu litera N. Situaia trebuie aib urmtoarea form: Persoana_cu_Funcia SALA+VENS NUME SALARIAT - funcie SQL> SELECT NUME || - || Persoana_cu_Funcia, 2 SALA+VENS SAL_TOTAL 3 FROM SALARIAI 4 WHERE 5 UPPER (NUME) LIKE %N
Persoana_cu_Funcia AVRAM ION-vnztor BARBU DAN- vnztor DAN ION- vnztor MNU DAN- vnztor FRINCUION-sefdep VLAD ION- vnztor DORUDAN-sefdep SANDU ION- vnztor ALEXE lOAN-vnzator SAL_TOTAL 22200 22750 24850 30000 73000 28560 42000 25600

LOWER

(FUNCT)

5) S se selecteze cmpurile CODC, DENC, STR i NR din tabela CLIENI, pentru clienii cu cifra 1 pe prima poziie a contului lor. SQL> SELECT CODC, DENC, STR, NR 2 FROM CLIENI WHERE 3 INSTR (CONT,'1',1)=1 ;
CODC 121111 211111 DENC UNIT-1 UNIT-2 STR Moilor Dorobani NR 104 18

6) S se afieaze numele i marca acelor angajai al cror nume se pronun asemntor cu DORU DAN. SQL> SELECT NUME, MARCA 2 FROM SALARIAI 3 WHERE SOUNDEX (NUME) = SOUNDEX (DORU DAN) ;
NUME DORU DAN DORU DANIEL MARCA 3755 5565

2 records selected. 7) S se selecteze din tabela SALARIAI coloanele NUME i MARCA, pentru angajaii a cror funcie este asemntoare fonetic cu irul de caractere: 'vnztor'. SQL> SELECT NUME, MARCA 2 FROM SALARIAI 3 WHERE SOUNDEX (FUNCT)= SOUNDEX (VNZATOR)
NUME AVRAM ION BARBU DAN DAN ION MANU DAN MARCA 1111 1222 3500 3700

4 records selected. 8) S se selecteze constanta NUMELE SI CODUL CLIENILOR: i valorile cmpurilor DENC, CODC pentru clienii din strada Calea Moilor i cu un cod mai mare ca 100000. SQL> SELECT "NUMELE SI CODUL CLIENILOR:" , 2 DENC, CODC 3 FROM CLIENI 4 WHERE STR LIKE MOILOR% 5 AND CODC> 100000 ;
NUMELE I CODUL CLIENILOR: NUMELE I CODUL CLIENILOR: DENC UNIT-2 CODC 121111

Pentru afiarea cmpurilor de tip dat calendaristic sau pentru calcule n care sunt implicate aceste cmpuri, exist funcii specifice. Exemple: 1) S se selecteze n modul distinct codurile i denumirile produselor, precum i a datei pn la care preurile actuale sunt admise. Ordonarea s se fac cresctor dup valorile cimpului CODP. SQL> SELECT DISTINCT PRODUSE.CODP,

2 3 4 5
CODP 11111 12222 13333 15555 16668 14444

PRODUSE.DENP.DATASF FROM PRETURI,PRODUSE WHERE PRODUSE.CODP=PRETURI.CODP ORDER BY PRETURI.CODP ;


DENP MESE 15/20 FOTOLIU A3 CANAPEA A7 BIROU C6X4 PLACAJ 2/2 SCAUN D4 DATASF 30-AUG-05 30-SEP-05 01-OCT-05 01-OCT-05 01-NOV-05 01-NOV-05

6 records selected. 2) S se selecteze cmpurile CODP i DATASF scriindu-se codul pe un rnd i data pe urmtorul. Data va fi scris sub forma LL/ZZ-AA : Se vor folosi operatorul TRUNC care asigur trecerea la rndul urmtor, funcia TO_CHAR (expr [fmt] ) care efectueaz conversia cmpului dat expr ntr-un ir de caractere n formatul specificat n [fmt]; comanda COLUMN care definete un alt format de afiare a coloanei DATASF. SQL> COLUMN DATASF FORMAT A21 TRUNC SQL> SELECT CODP, 2 TO_CHAR (DATASF, MM/DD-YY) DATASF 3 FROM PRETURI;
CODP 11111 12222 13333 15555 16666 14444 DATASF 08/30-05 09/30-05 10/01-05 10/01-05 11/01-05 11/01-05

6 records selected. 3) S se selecteze coloanele CODP, DATASF la produsele cu codul mai mare ca 13333, afind ziua i luna n litere iar anul cu patru cifre. SQL> COLUMN DATASF FORMAT A26 SQL> SELECT CODP, 2 TO_CHAR (DATASF, DAY MONTH YYYY) DATASFRIT 3 FROM PRETURI 4 WHERE CODP>13333 ;
CODP 15555 16666 14444 DATASFRIT THURSDAY OCTOBER SUNDAY NOVEMBER SUNDAY NOVEMBER 2005 2005 2005

3 records selected 4) S se selecteze CODP, DATASF la produsele cu codul mai mare ca 13333, afind luna n litere i pentru an ultimele dou cifre. SQL> SELECT CODP, 2 TO_CHAR (DATASF, DAY MONTH YY) DATASFRIT 3 FROM PRETURI WHERE CODP> 13333 ;
CODP 15555 16666 14444 DATASFRIT THURSDAY OCTOBER SUNDAY NOVEMBER SUNDAY NOVEMBER 05 05 05

3 records selected 5) S se selecteze coloanele CODP, DATASF la produsele cu codul mai mare ca 13333, afind ziua n cifre, luna n litere i anul cu patru cifre. SQL> SELECT CODP, 2 TO_CHAR (DATASF, DD MONTH YYYY) DATASFRIT 3 FROM PRETURI 4 WHERE CODP> 13333 ;
CODP 15555 16666 14444 DATASFRIT 01 OCTOBER 01 NOVEMBER 01 NOVEMBER 2005 2005 2005

3 records selected 6) S se selecteze coloanele CODP, DATASF la produsele cu codul mai mare ca 13333, afind primele trei litere de la zi, luna n litere i anul cu patru cifre. SQL> SELECT CODP, 2 TO_CHAR (DATASF, DY MONTH YYYY) DATASFRIT 3 FROM PRETURI 4 WHERE CODP> 13333 ;
CODP 15555 16666 14444 DATASFRIT THU OCTOBER SUN NOVEMBER SUN NOVEMBER 2005 2005 2005

3 records selected 7) S se selecteze cmpurile CODP, DATASF la produsele cu codul mai mare ca 13333, afind ziua n litere, luna n cifre i anul cu patru cifre.

SQL>SELECT CODP, 2 TO_CHAR (DATASF, DATASFRIT 3 FROM PRETURI 4 WHERE CODP> 13333 ;
CODP 15555 16668 14444 DATASFRIT THURSDAY 10 2005 SUNDAY 11 2005 SUNDAY 11 2005

DAY

MM

YYYY)

3 records selected. 8) S se selecteze cmpurile CODP, DATASF la produsele cu codul mai mare ca 13333, afind primele trei litere pentru zi i lun i ultimele dou cifre de la an. SQL>SELECT CODP, 2 TO_CHAR (DATASF, DY-MON-YY) DATASFRIT 3 FROM PRETURI 4 WHERE CODP>13333 ;
CODP 15555 16666 14444 DATASFRIT THU-OCT-05 SUN-NOV-05 SUN-NOV-05

3 records selected. 9) S se selecteze cmpurile CODP, DATASF pentru produsele cu codul mai mare dect 13333, afindu-se primele trei litere de la zi, luna n litere i ultimele dou cifre de la an. SQL>SELECT CODP, 2 TO_CHAR (DATASF, DY-MONTH-YY) DATASFRIT 3 FROM PRETURI 4 WHERE CODP>13333 ;
CODP DATA SFRIT 16556 THU-OCTOBER -05 16666 SUN-NOVEMBER -05 14444 SUN-NOVEMBER -05

3 records selected. 10) S se selecteze coloanele CODP, DATASF pentru toate produsele, afind ziua n cifre urmate de sufixul -th, primele trei litere ale lunii i ultimele dou cifre ale anului, desprite prin liniu. SQL>SELECT CODP,

2 TO CHAR DATASFRIT 3 FROM PRETURI ;


CODP 11111 12222 13333 16555 16666 14444 DATASFRIT 30TH-AUG-05 30TH-SEP- 05 01ST-OCT- 05 01ST-OCT- 05 01ST-NOV- 05 01ST-NOV- 05

(DATASF,

DDth-MON-YY)

6 records selected. 11) S se selecteze din tabela PRETURI valorile cmpurilor CODP i DATASF. Data de sfrit (DATASF) s se prezinte nsoit de timpul intern, exprimat n diverse forme de afiare. SQL>SELECT CODP, 2 TO_CHAR (DATASF, DDth-MON-YY HH:MIPM) DATASFRIT 3 FROM PRETURI ;
CODP 11111 12222 13333 15555 16666 14444 DATASFRIT 30TH-AUG-05 30TH-SEP-05 01ST-OCT-05 01ST-OCT-05 01ST-NOV-05 01ST-NOV-05 12:00AM 12:00AM 12:00AM 12:00AM 12:00AM 12:00AM

6 records selected. Sau : SQL> SELECT CODP, 2 TO_CHAR (DATASF, DATASFRIT 3 FROM PRETURI ;
CODP 11111 12222 13333 15555 16666 14444 DATASFRIT 30TH-AUG-05 30TH-SEP-05 01ST-OCT-05 01ST-OCT-05 01ST-NOV-05 01ST-NOV-05 12:00 12:00 12:00 12:00 12:00 12:00

DDth-MON-YY

HH:MI)

6 records selected. 12) S se afieze cmpurile CODP, DATASF i data de sfrit a valabilitii unui pre (considerat la o distan de 90 de zile fa de DATASF).

SQL> SELECT CODP, DATASF, DATASF+90 2. FROM PRETURI;


CODP 11111 12222 13333 15555 16666 14444 DATASF DATASF+90 30-AUG-05 28-NOV-05 30-SEP-05 29-DEC-05 01-OCT-05 30-DEC-05 01-OCT-05 30-DEC-05 01-NOV-05 30-JAN-06 01-NOV-05 30-JAN-06

6 records selected 13) S se selecteze codul produsului, data maxim admis de practicare a unui pre i data curent pentru acele produse care ndeplinesc condiia ca DATASF+10 s fie mai mare dect SYSDATE. SQL>SELECT CODP, DATASF, 2 SYSDATE DATA_CURENT 3 FROM PRETURI 4 WHERE DATASF+10 > SYSDATE ;
CODP 12222 13333 15555 16666 14444 DATASF 30-SEP-05 01-OCT-05 01-OCT-05 01-NOV-05 01-NOV-05 DATA_CURENT 13-SEP-05 13-SEP-05 13-SEP-05 13-SEP-05 13-SEP-05

5 records selected. 14) S se selecteze codul produsului, data de sfrit, data curent, valorile expresiilor TRUNC(DATASF+90) - TRUNC (SYSDATE) i DATASF+90. Selecia s se realizeze pentru produsele cu codul mai mare ca 13333 i data de sfrit plus 90 de zile mai mare dect data curent. SQL>SELECT CODP, DATASF, 2 SYSDATE DATA_CURENTA, 3 TRUNC(DATASF+90)-TRUNC(SYSDATE) DIFERENA 4 DATASF+90 DATA_90 5 FROM PRETURI 6 WHERE DATASF+90 > SYSDATE 7 AND CODP>13333 ;
CODP 15555 16666 14444 DATASF 01-OCT-05 01-NOV-05 01-NOV-05 DATA_CURENTA DIFERENTA DATA_90 02-OCT-05 89 30-DEC-05 02-OCT-05 120 30-JAN-06 02-OCT-05 120 30-JAN-06

3 records selected.

Operaiile de calcul cu data calendaristic sunt posibile n cadrul unei comenzi de selecie. Structura afirii cmpurilor rezultate se poate stabili prin comanda COLUMN. 15) S se selecteze i afieze coloanele CODP, DATASF, RDATE i RSDATE (utiliznd funciile NEXT_DAY i LAST_DAY). SQL>COLUMN DATASF FORMAT A21 SQL>COLUMN RDATE FORMAT A21 SQL>COLUMN RSDATE FORMAT A20 SQL>SELECT CODP, TO_CHAR (DATASF, DAY MON - YY) DATASFRIT TO_CHAR (NEXT_DAY (DATASF+90, VINERI), DAY MON - YY) RDATE TO_CHAR (LAST_DAY (DATASF+90), DAY MON YY) RSDATE FROM PREURI ;
CODP 11111 12222 DATASF WEDNESDAY AUG-05 FRIDAY SEP-05 RDATE VINERI NOV-05 VINERI DEC-05 RSDATE WEDNESDAY NOV-05 SATURDAY DEC-05

2 records selected O operaie posibil de realizat este i cea de a aduna algebric un numr de luni la o dat calendaristic: funcia ADD_MONTHS (d,n), care adun n luni la data d. 16) S se afieze codul produsului, data de sfrit i a unui nou termen de valabilitate a unui pre dat, calculat prin adugarea a trei luni. S se selecteze doar produsele al cror cod este mai mic dect 13333, iar data de sfrit este mai mare dect data curent plus trei luni. SQL>SELECT CODP, DATASF, 2 ADD_MONTHS (DATASF,3) RDATE 3 FROM PRETURI 4 WHERE 5 DATASF > SYSDATE+90 6 AND CODP<13333 ;
CODP 11111 12222 DATASF 30-AUG-05 30-SEP-05 RDATE 30-NOV-05 30-DEC-05

2 records selected

17) S se selecteze codul, denumirea produselor i data de sfrit, pentru acele produse care ndeplinesc urmtoarele condiii: data de sfrit este cuprins n intervalul: 30/Aug/05 - l/Oct/05; preurile sunt mai mari ca 30.000 u.m.. Datele s se ordoneze cresctor dup codul produsului. SQL>SELECT DISTINCT PRODUSE.CODP, DENP, DATASF 2 FROM PRETURI, PRODUSE 3 WHERE 4 DATASF BETWEEN 30-AUG-05 AND 01-OCT-05 5 AND PRET > 30000 6 AND PRODUSE.CODP=PRETURI.CODP 7 ORDER BY PRODUSE.CODP ;
CODP 12222 13333 15555 DENP FOTOLIU A3 CANAPEA A7 BIROU C6X4 DATASF 30-SEP-05 01-OCT-05 01-OCT-05

3 records selected 6.8.Utilizarea funciilor de grupare i a clauzei GROUP BY n selectarea datelor Rezultatele obinute n urma selectrilor pot fi grupate cu ajutorul clauzei GROUP BY. Secvena utilizat pentru aceast operaie este: SELECT GROUP BY tabel.coloana1, tabel.coloan2, HAVING condiie ; Prin parcurgerea secvenei se obine cte un rnd pentru nregistrrile care au aceleai valori n coloanele specificate n clauza GROUP BY. Prezena clauzei HAVING determin obinerea acelor grupuri care ndeplinesc condiiile specificate. Este de reinut faptul c GROUP BY i HAVING trebuie s fie declarate dup clauzele WHERE, CONNECT BY i START WITH, n cazul cnd acestea exist n comand. Exemple: 1) S se selecteze din tabela PRETURI valorile din coloana DATASF i s se contorizeze numrul apariiilor acestora.

SQL> SELECT TO_CHAR (DATASF, DATA - DD MON YYYY) 2 DATA_MAXIMA, 3 COUNT (*) NUMAR_PRODUSE 4 FROM PRETURI 5 GROUP BY TO_CHAR (DATASF, DATA - DD MON YYYY);
DATA MAXIMA DATA - 01 NOV 2005 DATA - 01 OCT 2005 DATA - 30 AUG 2005 DATA - 30 SEP 2005 NUMAR_PRODUSE 2 2 1 1

2) S se selecteze i afieze valoarea medie zilnic a comenzilor ce trebuie onorate n perioada 01-30 Iulie 2005 SQL> SELECT AVG (CANT*PRET) MEDIA 2 FROM COMENZI 3 WHERE 4 DATAL >01-JUL-05AND DATAL < 30-JUL-05 ;
MEDIA 25100

3) S se afieze valoarea total a salariilor i veniturilor suplimentare pentru salariaii cu funcia vnzator. SQL> SELECT SUM (SALA) TOTAL_SAL , 2 SUM (VENS) TOTAL_VEN 3 FROM SALARIAI 4 WHERE FUNCT = VNZATOR;
TOTAL_SAL TOTAL_VEN 268560 14750

4) S se afieze media anual a veniturilor totale (SALA+VENS) pentru salariaii cu funcia vnztor. SQL> SELECT AVG (SALA+VENS)*12 MEDIA_ANUALA FROM SALARIAI WHERE FUNCT=VNZATOR;
MEDIA_ANUALA 308147

5) S se afieze valoarea maxim i minim a salariului precum i diferena max-min. Selecia se face din tabela SALARIAI.

SQL> SELECT MAX (SALA) MAX_SAL, 2 MIN (SALA) MIN_SAL, 3 MAX (SALA)-MIN (SALA) DIF_MAX_MIN 4 FROM SALARIAI ;
MAX_SAL 45000 MIN_SAL 24250 DIF_MAX_MIN 25750

6) S se determine lungimea maxim a irurilor de caractere din coloana DENP a tabelei PRODUSE. SQL>SELECT MAX (LENGTH (DENP)) LUNG_MAX_DENP 2 FROM PRODUSE ;
LUNG_MAX_DENP 10

7) S se selecteze coloanele NUME, PUNCT, SALA+VENS din tabela SALARIAI pentru angajaii care au salariul egal cu salariul maxim. SQL> SELECT NUME, FUNCT, SALA+VENS 2 FROM SALARIAI 3 WHERE SALA = 4 (SELECT MAX (SALA) FROM SALARIAI) ;
NUME ION ION FUNCT DIRECTOR SALA+VENS 85000

1 record selected 8) S se selecteze coloanele DENP, CODP, CODD din tabela PRODUSE pentru care stocul existent este mai mare sau egal cu cantitatea comandat. SQL> SELECT DENP, CODP, CODD 2 FROM PRODUSE 3 WHERE STOC >= 4 (SELECT SUM (CANT) FROM COMENZI );
DENP PLACAJ 2/2 SCAUN D4 CANAPEA A7 CODP 166666 144444 133333 CODD 100000 100000 100000

9) S se afieze numrul de valori nenule nregistrate n coloana VENS din tabela SALARIAI. SQL> SELECT COUNT (VENS) 2 FROM SALARIAI ;
COUNT (VENS) 11

10) S se selecteze din tabela SALARIAI coloanele NUME, FUNCT, SALA+VENS pentru efii de depozite care au salariul mai mare sau egal cu jumtate din salariul maxim. SQL>SELECT NUME, FUNCT, SALA+NVL (VENS,0) 2 FROM SALARIAI 3 WHERE SALA >= 4 (SELECT MAX (SALA)/2 FROM SALARIAI) 5 AND FUNCT= SEF DEP ;
NUME FUNCT COMAN RADU SEF DEP VLAD VASILE SEF DEP FRINCU ION SEF DEP DORU DAN SEF DEP PAUL STEFAN SEF DEP SALA+NVL(VENS,0) 37500 38000 73000 42000 40600

11) S se afieze numrul de produse distincte care au ca unitate de msur BUC SQL>SELECT COUNT(DISTINCT CODP) NR_PROD 2 FROM PRODUSE 3 WHERE UM = BUC;
NR_PROD 5

12) S se afieze numrul de subordonai ai salariatului cu marca 2500. SQL> SELECT COUNT(*) NR_SUBORD FROM SALARIAI WHERE CODS=2500;
NR_SUBORD 3

13) S se afieze valoarea medie a salariilor i valoare medie a veniturilor suplimentare pentru fiecare depozit fie utiliznd comanda SELECT de mai multe ori, fie clauza GROUP BY o singur dat. Folosind comanda SELECT: Pentru salariaii depozitului 100000 (codd=100000) SQL> SELECT AVG(SALA), AVG(VENS) FROM SALARIAI WHERE CODD = 100000;
AVG(SALA) AVG(VENS)

33100

20500

Pentru salariaii depozitului 120000 (codd=120000) SQL>SELECT AVG(SALA), AVG(VENS) 2 FROM SALARIAI 3 WHERE CODD = 120000;
AVG(SALA) 2402.5 AVG(VENS) 1975

Pentru salariaii depozitului 130000 (codd=130000) SQL> SELECT AVG(SALA), AVG(VENS) 2 FROM SALARIAI 3 WHERE CODD = 130000;
AVG(SALA) 28870 AVG(VENS) 2750

Pentru salariaii depozitului 160000 (codd=160000) SQL> SELECT AVG(SALA), AVG(VENS) 2 FROM SALARIAI 3 WHERE CODD = 160000;
AVG(SALA) 30866.7 AVG(VENS) 9390

Folosind clauza GROUP BY: SQL> SELECT CODD, AVG(SALA), AVG(VENS) 2 FROM SALARIAI 3 WHERE CODD = 160000; 4 GROUP BY CODD ;
CODD 100000 120000 130000 160000 AVG(SALA) 33100 24202.5 28870 30866 AVG(VENS) 20500 1975 2750 9390

14) S se calculeze media salariului pentru fiecare grup de angajai care au acelai superior. SQL> SELECT CODS, AVG(SALA) 2 FROM SALARIAI 3 GROUP BY CODS ;

CODS 1000 2500 2550 3755 4000 7000 8000

AVG (SALA) 22336.7 27083,3 25500 26600 26050 35750 4500

15) S se calculeze media salariului anual prognozat pentru salariaii care au acelai superior i nu au funcia de ef depozit. SQL> SELECT CODS,AVG(SALA)*12 MEDIE_SAL_ANUAL 2 FROM SALARIAI 3 WHERE FUNCT NOT IN ('SEF DEP') 4 GROUP BY CODS ;
CODS 1000 2500 2550 3755 4000 8000 MEDIE_SAL_ANUAL 268040 271500 306000 319200 312600 540000

16) S se calculeze i afieze valoarea medie a comenzilor pentru fiecare depozit. SQL> SELECT AVG (CANT*PRET) VAL_MEDIE, 2 DEPOZITE.CODD COD_DEP 3 FROM COMENZI, DEPOZITE 4 WHERE COMENZI.CODD=DEPOZITE.CODD 5 GROUP BY DEPOZITE.CODD ;
VAL_MEDIE 251000 COD_DEP 100000

17) S se calculeze i afieze valoarea medie a comenzilor pe produse. SQL> SELECT AVG (CANT*PRET) VAL_MEDIE, 2 PRODUSE.CODP COD_PROD 3 FROM PRODUSE, COMENZI 4 WHERE COMENZI.CODP=PRODUSE.CODP 5 GROUP BY PRODUSE.CODP ;
VAL_MEDIE 320000 27000 375000 COD_PROD 133333 144444 166666

18) S se determine media salariului anual pentru fiecare funcie dac exist mai mult de doi salariai angajai pe aceeai funcie. Se vor afia funcia, numrul de salariai cu uncia respectiv i media calculat. SQL> SELECT FUNCT FUNCIE, 2 COUNT(*) NR_SAL, 3 AVG(SALA)*12 MEDIE_SAL 4 FROM SALARIAI 5 GROUP BY FUNCT 6 HAVING COUNT(*)>2 ;
FUNCIE SEF DEP VNZATOR NR_SAL 5 11 MEDIE_SAL 429600 292975

2 records selected. 19) S se selecteze codurile superiorilor (CODS) care au doi sau mai muli subordonai. SQL> SELECT CODS 2 FROM SAIARIATI 3 WHERE FUNCT=VNZATOR 4 GROUP BY CODS 5 HAVING COUNT(*)>=2 ;
CODS 1000 2500 2550 3755 4000

5 records selected. 20) S se selecteze codurile superiorilor care au media veniturilor suplimentare ale subordonailor mai mare dect 10% din salariul mediu. Se vor afia codurile superiorilor i media veniturilor totale anuale ale subordonailor. SQL> SELECT CODS, 2 AVG (SALA+NVL (VENS,0) )*12 MED_VEN_TOT_AN 3 FROM SALARIAI 4 GROUP BY CODS 5 HAVING AVG (VENS) > AVG (SALA)*0.10;
CODS 2500 7000 8000 MED_VEN_TOT_AN 486400 474300 1020000

21) S se selecteze funciile pentru care salariile medii sunt mai mari dect salariul mediu al unui vnztor. Se vor afia funciile i salariile medii pentru fiecare funcie. SQL> SELECT FUNCT, AVG(SALA) MEDIE_SAL 2 FROM SALARIAI 3 GROUP BY FUNCT 4 HAVING AVG (SALA) > 5 (SELECT AVG(SALA) FROM SALARIAI 6 WHERE FUNCT= VNZATOR );
FUNCT DIRECTOR SEF DEP MEDIE_SAL 45000 35800

22) S se afieze numrul salariailor din depozitul cu codul 100000 i s se determine ci dintre ei au venituri suplimentare. SQL> SELECT COUNT (*) NR_SALARIAI_DEP_100000, 2 COUNT(VENS) NR_SAL_VEN_SUPL 3 FROM SALARIAI 4 WHERE CODS=100000 ;
NR_SALARIAI_DEP_100000 4 NR_SAL_VEN_SUPL 3

23) S se determine numrul salariailor din depozitul cu codul 100000 precum i suma i media veniturilor lor suplimentare. SQL> SELECT SUM (NVL (VENS,0)) SUMA_VEN_SUPL, 2 COUNT (NVL (VENS,0)) NR_SAL, 3 AVG (NVL (VENS,0)) MEDIA_VEN_SUPL 4 FROM SALARIAI 5 WHERE CODS=100000 ;
SUMA_VEN_SUPL 9000 NR_SAL MEDIA_VEN_SUPL 4 2250

24) Pentru a afla numrul de angajai i salariul mediu anual n toate combinaiile posibile de departamente i funcii, se va folosi urmtoarea cerere: SELECT DECODE(GROUPING(nume_dept), Departamentele', nume_dept) AS nume_dept, 1, 'Toate

DECODE(GROUPING(functia), 1, 'Toate Functiile', functia) AS functia, COUNT(*) "Total Angajati", AVG(sal) * 12 "Sal Mediu" FROM ang, dept WHERE dept.nume_dept = emp.nume_dept GROUP BY CUBE (nume_dept, functia);
Nume dept. functia total angajati sal mediu --------------- --------- ---------- ---------- --------------------------------CONTABILITATE FUNCTIONAR 1 15600 CONTABILITATE MANAGER 1 29400 CONTABILITATE PRESEDINTE 1 60000 CONTABILITATE Toate Functiile 3 35000 CERCETARE ANALYST 2 36000 CERCETARE FUNCTIONAR 2 11400 CERCETARE MANAGER 1 35700 CERCETARE Toate Functiile 5 26100 VANZARI FUNCTIONAR 1 11400 VANZARI MANAGER 1 34200 VANZARI VANZATOR 4 16800 VANZARI Toate Functiile 6 18800 Toate Departamentele ANALYST 2 36000 Toate Departamentele FUNCTIONAR 4 12450 Toate Departamentele MANAGER 3 33100 Toate Departamentele PRESEDINTE 1 60000 Toate Departamentele VANZATOR 4 16800 Toate Departamentele Toate Functiile 14 24878.5714

6.9. Operaii pe tabele structurate arborescent Limbajul SQL*Plus permite explorarea structurilor arborescente existente n baza de date. Operaia se realizeaz cu ajutorul clauzelor START WITH i CONNECT BY din comanda SELECT. SELECT FROM CONNECT BY [PRIOR] col1 = [PRIOR] col2 START WITH col = valoare ;

Exemple: 1) S se afieze cmpurile NUME, FUNCT, CODS, MARCA din tabela SALARIAI. Datele s fie ordonate cresctor dup codul superiorului. SQL>SELECT NUME, FUNCT, CODS, MARCA FROM SALARIATI ORDER BY CODS;
NUME AVRAM ION BARBU DAN COMAN RADU VLAD ION AILENEI FLORIN DAN ION DARIAN GEO FRINCU ION RADU ION VLAD VASILE ALEXE IOAN MANU DAN DORU DAN CARMEN ANCA PAUL TEFAN SANDU ION ION ION FUNCT VNZTOR VNZTOR SEF DEP VNZTOR VNZTOR VNZTOR VNZTOR SEF DEP VNZTOR SEF DEP VNZTOR VNZTOR SEF DEP VNZTOR SEF DEP VNZTOR DIRECTOR CODS 1000 1000 7000 1000 2500 2500 2500 2500 2500 7000 3755 3755 7000 4000 7000 4000 7000 MARCA 1111 1222 1000 2650 2553 3500 2554 2550 1680 2500 3759 3700 3755 3770 4000 3760 7000

2) S se selecteze NUMELE, MARCA, codul superiorului i codul depozitului pentru subordonaii direci i indireci ai salariatului cu numele DORU DAN. SQL> SELECT NUME, MARCA, CODS, CODD 2 FROM SALARIATI 3 CONNECT BY PRIOR MARCA = CODS 4 START WITH NUME = DORU DAN;
NUME DORU DAN MANU DAN ALEXE IOAN MARCA 3755 3700 3759 CODS 7000 3755 3755 CODD 130000 160000 160000

3 records selected 3) S se afieze cmpurile MARCA, NUME, FUNCT, CODS, CODD din tabela SALARIAI, ordonate cresctor dup marca i codul superiorului, pentru subordonaii direci i indireci ai salariatului cu numele VLAD VASILE. SQL> SELECT MARCA, NUME, FUNCT, CODS, CODD 2 FROM SALARIATI 3 CONNECT BY PRIOR MARCA = CODS 4 START WITH NUME = VLAD VASILE

5 ORDER BY MARCA, CODS;


MARCA 1680 2500 2550 2553 2554 2556 7000 NUME RADU ION VLAD VASILE FRINCU ION AILENEI FLORIN DARIAN GEOR DAN ION ION ION FUNCT VNZTOR SEF DEP SEF DEP VNZTOR VNZTOR VNZTOR DIRECTOR CODS 2500 7000 2500 2550 2550 2500 7000 CODD 2553 3500 2554 2550 2500 2500 7000

7 records selected. 4) S se afieze cmpurile MARCA, NUME, FUNCT, CODS, CODD din. tabela SALARIAI, ordonate cresctor dup marca. SQL> SELECT MARCA,NUME,FUNCT,CODS,CODD 2 FROM SALARIAI 3 ORDER BY MARCA;
MARCA 1000 1111 1222 1680 2500 2550 2553 2554 2650 3500 3700 3755 3759 3760 3770 4000 7000 NUME COMAN RADU AVRAM ION BARBU DAN RADU ION VLAD VASILE FRINCU ION AILENEI FLORIN DARIAN GEO VLAD ION DAN ION MNU DAN DORU DAN ALEXE IOAN SANDU ION CARMEN ANA PAUL TEFAN ION ION FUNCT SEF DEP VINZATOR VINZATOR VINZATOR SEF DEP SEF DEP VINZATOR VINZATOR VINZATOR VINZATOR VINZATOR SEF DEP VINZATOR VINZATOR VINZATOR SEF DEP DIRECTOR CODS 7000 1000 1000 2500 7000 2500 2550 2550 1000 2500 3755 7000 3755 4000 4000 7000 7000 CODD 130000 100000 120000 130000 160000 160000 120000 120000 120000 120000 160000 130000 160000 130000 130000 160000 100000

17 records selected. 5) S se selecteze numele, marca, codul superiorului, codul depozitului pentru subordonaii direci i indireci ai salariatului cu numele DORU DAN. SQL> SELECT NUME,MARCA,CODS,CODD 2 FROM SALARIAI 3 CONNECT BY PRIOR MARCA=CODS 4 START WITH NUME='DORU DAN';
NUME DORU DAN MARCA 3755 CODS 7000 CODD 130000

MNU DAN 3700 ALEXE IOAN 3759

3755 3755

160000 160000

3 records selected. 6) S se afieze MARCA, NUME, FUNCT, CODS i CODD ordonate cresctor dup marc i cod superior pentru subordonaii direci i indireci ai salariatului cu numele VLAD VASILE. SQL> SELECT MARCA,NUMEJFUNCT,CODS,CODD 2 FROM SALARIAI 3 CONNECT BY PRIOR MARCA=CODS 4 START WITH NUME='VLAD VASILE' 5 ORDER BY MARCA.CODS
MARCA 1680 2500 2550 2553 2554 3500 NUME RADU ION VLAD VASILE FRINCU ION AILENEI FLORIN DARIAN GEO DAN ION FUNCT VINZATOR SEF DEP SEF DEP VINZATOR VINZATOR VINZATOR CODS 2500 7000 2500 2550 2550 2500 CODD 130000 160000 160000 120000 120000 160000

6 records selected. 7) S se afieze cmpurile NUME i MARCA pentru subordonaii direci i indireci ai salariatului ION ION precum i nivelul lor de subordonare. SQL> SELECT LEVELJWME.MARCA 2 FROM SALARIAI 3 CONNEOT BY PRIOR MARCA=CODS 4 START WITH NUME='ION ION';
LEVEL 1 2 3 3 3 2 3 4 4 3 3 2 3 3 2 3 3 NUME ION ION COMAN RADU AVRAM ION BARBU DAN VLAD ION VLAD VASILE FRINCU ION AILENEI FLORIN DARIAN GEO RADU ION DAN ION DORU DAN MNU DAN ALEXE IOAN PAUL TEFAN SANDU ION CARMEN ANA MARCA 7000 1000 1111 1222 2650 2500 2550 2553 2554 1680 3500 3755 3700 3759 4000 3760 3770

8) S se selecteze cmpurile LEVEL, NUME i MARCA apartinnd subordonailor lui ION ION. Nivelul de subordonare va fi pus n eviden i prin afiarea deplasat a numelor salariailor subordonai fa de numele superiorului corespunztor. SQL> COLUMN ORG.CHART FORMAT A21 SQL> SELECT LEVEL, 2 LPADC ( ,LEVEL*2) || NUME NUME_SI_PRENUME, 3 MARCA 4 FROM SALARIAI 5 CONNECTBY PRIOR MARCA=CODS 6 START WITH NUME='ION ION;
LEVEL 1 2 3 3 3 2 3 4 4 3 3 2 3 3 2 3 3 NUME.SI.PRENUME ION ION COMAN RADU AVRAM ION BARBU DAN VLAD ION VLAD VASILE FRINCU ION AILENEI FLORIN DARIAN GEO RADU ION DAN ION DORU DAN MNU DAN ALEXEIOAN PAUL TEFAN SANDU ION CARMEN ANA MARCA 7000 1000 1111 1222 2650 2500 2550 2553 2554 1680 3500 3755 3700 3759 4000 3760 3770

17 records selected. 9) S se afieze cmpurile LEVEL, NUME, MARCA apartinnd subordonailor salariailor PAUL TEFAN i COMAN RADU, punnd n eviden, prin scriere decalat, modul de subordonare. SQL> SELECT LEVEL, LPAD( ','LEVEL*2) || NUME 3 NUME_SI_PRENUME,MARCA 4 FROM SALARIAI 5 CONNECT BY PRIOR MARCA=CODS 6START WITH NUME='PAUL TEFAN 7 OR NUME='COMAN RADU
LEVEL 1 2 2 2 NUME COMAN RADU AVRAM ION BARBU DAN VLAD ION MARCA 1000 1111 1222 2650

1 2 2

PAUL TEFAN SANDU ION CARMEN ANA

4000 3760 3770

7 records selected.
10) S se afieze cmpurile LEVEL, NUME i MARCA, in structur arborescent, apartinnd salariailor din subordinea celor cu aceeai funcie cu a salariatului COMAN RADU.

SQL> SELECT LEVEL,LPADC ',LEVEL*2) || NUME 2 NUME_SI_PRENUME, MARCA 3 FROM SALARIAI 4 CONNECT BY PRIOR MARCA=CODS 5 START WITH FUNCT IN 6 (SELECT FUNCT FROM SALARIAI 7 WHERE NUMEsCOMAN RADU);
LEVEL 2 3 3 3 2 3 4 4 3 3 2 3 3 2 3 3 NUME_SI_PRENUME COMAN RADU AVRAM ION BARBU DAN VLAD ION VLAD VASILE FR1NCU ION AILENEI FLORIN DARIAN GEO RADU ION DAN ION DORU DAN MNU DAN ALEXEIOAN PAUL TEFAN SANDU ION CARMEN ANA MARCA 1000 1111 1222 2650 2500 2550 2553 2554 1680 3500 3755 3700 3759 4000 3760 3770

11) S se selecteze cmpurile LEVEL, NUME, MARCA, FUNCT, CODD aparinnd subordonailor angajailor care lucreaz n acelai depozit cu RADU ION. SQL> SELECT LEVEL, 2 LPADC (` `,LEVEL*2) || NUME 3 NUME_SI_PRENUME, 4 MARCA,FUNCT,CODD 5 FROM SALARIAI 6 CONNECT BY PRIOR MARCA=CODS 7 START WITH CODD IN 8 (SELECT CODD 9 FROM SALARIAI 10 WHERE NUME='RADU ION')

LEVEL 1 1 2 2 2 1 2 2 1 1

NUME_SI_PRENUME RADU ION COMAN RADU AVRAM ION BARBU DAN VLAD ION DORU DAN MNU DAN ALEXE IOAN CARMEN ANA SANDU ION

MARCA 1680 1000 1111 1222 2650 3755 3700 3759 3770 3760

FUNCT VINZATOR SEF DEP VINZATOR VINZATOR VINZATOR SEF DEP VINZATOR VINZATOR VINZATOR VINZATOR

CODD 130000 130000 100000 120000 120000 130000 160000 160000 130000 130000

10 records selected. 12) S se selecteze cmpurile NUME, MARCA, FUNCT, CODD aparinnd superiorilor salariatului VLAD ION. SQL> SELECT NUME,MARCA,CODS,FUNCT,CODD 2 FROM SALARIAI 3 CONNECT BY MARCA=PRIOR CODS 4 START WITH NUME=`VLAD ION`;
NUME VLAD ION COMAN RADU 1000 ION ION MARCA 2650 7000 7000 CODS 1000 SEF 8000 FUNCT VINZATOR DEP DIRECTOR CODD 120000 130000 100000

3 records selected. 13) S se afieze cmpurile NUME, MARCA, FUNCT aparinnd subordonailor salariatului VLAD VASILE, mai puin datele salariatului AILENEI FLORIN. SQL> SELECT NUME,MARCA,FUNCT 2 FROM SALARIATI 3 WHERE NUME !=AILENEI FLORIN 4 CONNECT BY PRIOR MARCA=CODS 5 START WITH NUME='VLAD VASILE';
NUME VLAD VASILE FRINCU ION DARIAN GEO RADU ION DAN ION MARCA 2500 2550 2554 1680 3500 FUNCT SEF DEP SEF DEP VINZATOR VINZATOR VINZATOR

14) S se afieze o serie de date despre subordonaii salariatului ION ION, mai puin datele despre VLAD VASILE i despre salariaii din subordinea lui. SQL> SELECT MARCA,LEVEL,NUME,PUNCT,CODS 2 FROM SALARIAI

3 4 5
MARCA 7000 1000 1111 1222 2650 3755 3700 3759 4000 3760 3770

CONNECT BY PRIOR MARCA=CODS AND NUME <> 'VLAD VASILE' START WITH NUME='ION ION';
LEVEL 1 2 3 3 3 2 3 3 2 3 3 NUME ION ION COMAN RADU AVRAM ION BARBU DAN VLAD ION DORU DAN MNU DAN ALEXE IOAN PAUL TEFAN SANDU ION CARMEN ANA FUNCT DIRECTOR SEF DEP VINZATOR VINZATOR VINZATOR SEF DEP VINZATOR VINZATOR SEF DEP VINZATOR VINZATOR CODS 8000 7000 1000 1000 1000 7000 3755 3755 7000 4000 4000

11 records selected 15) S se afieze o serie de date ale salariailor subordonai lui ION ION, mai puin datele salariailor COMAN RADU i VLAD VASILE precum i ale subordonailor lui VLAD VASILE. SQL> SELECT MARCA,NUME,LEVEL,FUNCT, 2 CODS.CODD 3 FROM SALARIAI 4 WHERE NUME <> 'COMAN RADU' 5 CONNECT BY PRIOR MARCA=CODS 6 AND NUME != 'VLAD VASILE' 7 START WITH NUME='ION ION'
MARCA 7000 1111 1222 2650 3755 3700 3759 4000 3760 3770 NUME ION ION AVRAM ION BARBU DAN VLAD ION DORU DAN MNU DAN ALEXE IOAN PAUL TEFAN SANDU ION CARMEN ANA LEVEL 1DIRECTOR 3 VINZATOR 3 VINZATOR 3 VINZATOR 2 SEF DEP 3 VINZATOR 3 VINZATOR 2 SEF DEP 3 VINZATOR 3 VINZATOR FUNCT 8000 1000 1000 1000 1000 3755 3755 7000 4000 4000 CODS 100000 100000 120000 120000 130000 160000 160000 160000 130000 130000

10 records selected. 16) S se afieze datele salariailor subordonai direct salariatului ION ION. SQL> SELECT MAJRCA,NUME,LEVEL, 2 FUNCT,CODS,CODD

3 4 5 6

FROM SALARIAI WHERE LEVEL=2 CONNECT BY PRIOR MARCA=CODS START WITH NUME='ION ION'
LEVEL 2 2 2 2 FUNCT SEF DEP SEF DEP SEF DEP SEF DEP CODS 7000 7000 7000 7000 CODD 130000 160000 130000 160000

MARCA NUME 1000 COMAN RADU 2500 VLAD VASILE 3755 DORU DAN 4000 PAUL TEFAN

4 records selected. CAPITOLUL 6. SELECTAREA DATELOR DIN TABELELE BAZEI DE DATE.................................................................................................. 1 6.1. Comanda SELECT......................................................................... 1 6.2. Utilizarea clauzei FROM ............................................................... 3 6.3 Utilizarea operatorilor n formularea condiiilor de selecie din clauza WHERE ..................................................................................... 5 6.3.Ordonarea liniilor rezultate n urma unei cereri............................ 12 6.4. Selecii din mai multe tabele ........................................................ 14 6.5. Realizarea cererilor incluse .......................................................... 18 6.6. Utilizarea expresiilor, funciilor, variabilelor sistem i pseudocoloanelor n selectarea datelor........................................................... 24 6.7.Utilizarea funciilor de grupare i a clauzei GROUP BY n selectarea datelor................................................................................. 38 6.8. Operaii pe tabele structurate arborescent .................................... 46

CAPITOLUL 7. APLICATII INFORMATICE UTILIZAND LIMBAJUL SQL


7.1. Aplicaie informatic pentru activitatea de salarizare 1) Folosindu-se instruciunile SQL, s se creeze tabelele DatePers, DateSal, Impozitar, Pontaj, SporVechime, Taxe, Deduceri. CREATE TABLE DatePers ( codang number (5) primary key, nume varchar2 (35), cnp varchar2 (13), datan date, adresa varchar2 (30), localitate varchar2 (15), telefon varchar2 (12) ); CREATE TABLE DateSal ( codang number(5) references DatePers (codang), functia varchar2 (10), salbaza number (15), persintr number (2), vechime number (3), codsef number (5) references DatePers(codang) ); CREATE TABLE Impozitar ( linie number (5) primary key, dela number (15), panala number (15), suma number (15), procent number (3) ); CREATE TABLE Pontaj (

codang number (5) references DatePers(codang), luna number (3), zilelucr number(3), orezi number(3), zileco number(3), zilecm number(3), orelucrate number(4), constraint pk primary key(codang,luna) ); CREATE TABLE SporVechime ( nr number (3) primary key, dela number (3), panala number (3), procent number (3) ); CREATE TABLE Taxe ( den varchar2 (10) primary key, procent number (2), cotamax number (15) ); CREATE TABLE Deduceri ( den varchar2 (30) primary key, cotasuma number(15), cotaproc number(2), cotamax number(15) ); 2) S se ncarce cu date tabelele create. SQL> DELETE FROM DatePers; INSERT INTO DatePers VALUES (100, 'Ion Ion', '1234567890100', '10-JAN-1970', 'Mangaliei 100', 'Constanta', '0722123456'); INSERT INTO DatePers VALUES

(200, 'Popescu Ion', '1234567890200', '10-FEB-1975', 'Tomis 232', 'Constanta', '0744123456'); INSERT INTO DatePers VALUES (300, 'Ionescu Gheorghe', '1234567890300', '10-MAR-1980', 'Ferdinand 48', 'Mangalia', '0788123456'); SQL> DELETE FROM DateSal; INSERT INTO DateSal VALUES (100, 'Ec', 5000000, 1, 10, 300); INSERT INTO DateSal VALUES (200, 'Inginer', 6500000, 2, 5, 300); INSERT INTO DateSal VALUES (300, 'Director', 15000000, 0, 15, null); SQL> DELETE FROM Impozitar; INSERT INTO Impozitar VALUES (1, 0, 2100000, 0, 18); INSERT INTO Impozitar VALUES (2, 2100001, 5200000, 378000,23); INSERT INTO Impozitar VALUES (3, 5200001, 8300000, 1091000,28); INSERT INTO Impozitar VALUES (4, 8300001, 11600000, 1959000,34); INSERT INTO Impozitar VALUES (5, 11600001, 99999999999, 3081000, 40); SQL> DELETE FROM Pontaj; INSERT INTO Pontaj VALUES (100, '1', 22, 8, 3, 0, 170); INSERT INTO Pontaj VALUES (200, '1', 30, 8, 5, 10, 200); INSERT INTO Pontaj VALUES (300, '1', 22, 8, 0, 0, 176); SQL> DELETE FROM SporVechime; INSERT INTO SporVechime VALUES (1, 0, 3, 5); INSERT INTO SporVechime VALUES (2, 4, 10, 10); INSERT INTO SporVechime VALUES (3, 11, 20, 15); INSERT INTO SporVechime VALUES (4, 21, 40, 20); SQL> DELETE FROM Taxe; INSERT INTO Taxe VALUES ('CASS', 6.5, 999999999999999); INSERT INTO Taxe VALUES ('CAS', 9.5, 15000000); INSERT INTO Taxe VALUES ('Somaj', 1, 999999999999999); SQL> DELETE FROM Deduceri; INSERT INTO Deduceri VALUES ('Deducere de baza', 1800000, 0, 1800000);

INSERT INTO Deduceri VALUES ('Deducere suplimentara', 0, 0.5, 3600000); INSERT INTO Deduceri VALUES ('Chelt profesionale', 0, 15, 270000); Interogarea tabelelor bazei de date 1) S se afieze informaiile despre angajaii firmei. SQL> SELECT * FROM DatePers;
CODANG NUME CNP DataN ADRESA LOCALITATE TELEFON --------------------------------------------------------------------------------------------------------------------------------------------------------100 Ion Ion 1234567890100 10-JAN-1970 Mangaliei 100 Constanta 0722123456 200 Popescu Ion 1234567890200 10-FEB-1975 Tomis 232 Constanta 0744123456 300 Ionescu Gheorghe 1234567890300 10-MAR-1980 Ferdinand 48 Mangalia 0788123456

2) S se selecteze toi angajaii din Constana. SQL> SELECT * FROM DatePers WHERE localitate ='Constanta';
CODANG NUME CNP DataN ADRESA LOCALITATE TELEFON --------------------------------------------------------------------------------------------------------------------------------------------------------100 Ion Ion 1234567890100 10-JAN-1970 Mangaliei 100 Constanta 0722123456 200 Popescu Ion 1234567890200 10-FEB-1975 Tomis 232 Constanta 0744123456

3) S se afieze numele tuturor angajailor care sunt din localitile a cror nume ncepe cu litera M. SQL> SELECT nume, localitate FROM DatePers WHERE localitate LIKE 'M%';
CODANG NUME CNP DataN ADRESA LOCALITATE TELEFON --------------------------------------------------------------------------------------------------------------------------------------------------------300 Ionescu Gheorghe 1234567890300 10-MAR-1980 Ferdinand 48 Mangalia 0788123456

4) S se afieze codul i salariile angajailor care au salariul de baz ntre 6000000 i 7000000 SQL> SELECT codang, salbaza FROM DateSal WHERE salbaza BETWEEN 6000000 AND 7000000;
CODANG SALBAZA ---------------------------------------200 500000

5) S se afieze codul angajatului cu vechime de 10 i respectiv 15 ani SQL> SELECT codang, vechime FROM DateSal WHERE vechime IN (10,15);
CODANG VECHIME ---------------------------------------100 10 300 15

6) S se afieze impozitarul n formatul n care apare n Monitorul Oficial SQL> SELECT dela || ' - ' || panala ||' '|| suma || ' + ' || procent || ' % pentru ceea ce depaseste ' || dela FROM Impozitar;

DELA ||'-'|| PANALA ||''|| SUMA || '+' || PROCENT ||'%PENTRU CEEA CE DEPASESTE' ---------------------------------------------------------------------------------------------------------------------------0 - 2100000 0 + 18% pentru ceea ce depaseste 0 2100001 - 5200000 378000 + 23% pentru ceea ce depaseste 2100001 5200001 - 8300000 1091000 + 28% pentru ceea ce depaseste 5200001 8300001 - 11600000 1959000 + 34% pentru ceea ce depaseste 8300001 11600001 - 999999999999 3081000 + 40% pentru ceea ce depaseste 11600001

7) S se afieze, concatenat, codul angajatului i luna din tabela Pontaj. Pentru irul astfel creat s se afieze lungimea sa. SQL> SELECT CONCAT (codang, luna), ANGAJAT_LUNA LENGTH (concat (codang,luna)) LUNGIME_SIR FROM Pontaj;
ANGAJAT_LUNA LUNGIME_SIR -----------------------------------------------1001 4 2001 4 3001 4

8) S se afieze valoarea 41000/32000 rotunjit la 2 i, respectiv 3 zecimale SQL> SELECT ROUND (41000/32000, 2) ROUND (41000/32000, 3) FROM DUAL; 2_ZECIMALE, 3_ZECIMALE

2_ZECIMALE 3_ZECIMALE -------------------- -------------------------1.28 1.281

9) S se afieze angajaii care au cuvntul Ion n nume (nume i prenume) mpreun cu vrsta acestora. Vrsta se va afia n dou moduri: rotunjit n ani i n ani cu luni. SQL> SELECT nume, ROUND ((sysdate-datan)/365, 0) ROUND ((sysdate-datan)/365, 1) FROM DatePers WHERE nume LIKE '%Ion%'; ANI, ANI_CU_LUNI

NUME ANI ANI_CU_LUNI ----------------------------------------------------------------------------------------Ion Ion 34 34.2 Popescu Ion 29 29.1 Ionescu Gheorghe 24 24

10) S se afieze numele angajailor i data mplinirii limitei de vrst pentru pensionare (62 de ani) precum i numrul de luni rmase pn la pensionare (62ani*12luni). SQL> SELECT nume, ADD_MONTHS (datan, 62*12) DATA_PENSIONARE MONTHS_BETWEEN(ADD_MONTHS(datan,62*12),sysdate) LUNI_PENSIONARE FROM DatePers;
NUME DATA_PENSIONARE LUNI_PENSIONARE ----------------------------------- --------- --------------------------------------------------------------Ion Ion 10-JAN-32 334.11 Popescu Ion 10-FEB-37 395.11 Ionescu Gheorghe 10-MAR-42 456.11

11) S afieze numele angajailor i ultima zi a lunii corespunztoare datei de natere a angajatilor din localitatea Mangalia SQL> SELECT nume, LAST_DAY (datan) ULTIMA_ZI_DIN_LUNA FROM DatePers WHERE localitate='Mangalia';
NUME ULTIMA_ZI_DIN_LUNA ----------------------------------------------------------------Ionescu Gheorghe 31-MAR-80

12) S se afieze urmtoarea zi de Smbt (dup DataCurent->sysdate) SQL> SELECT NEXT_DAY (sysdate,'Saturday') URMATOAREA_SAMBATA FROM DUAL;
URMATOAREA_SAMBATA ------------------------------------08-OCT-05

13) S se afieze numele angajailor i data naterii acestora ntr-un format MM/YYYY (M=Month=Luna, Y=Year=An) SQL> SELECT nume, TO_CHAR(datan,'MM/YYYY') LUNA_AN FROM DatePers;
NUME LUNA_AN -----------------------------------------------Ion Ion 01/1970 Popescu Ion 02/1975 Ionescu Gheorghe 03/1980

14) S se afieze numele i CNP-ul angajailor nscui pe 10 ianuarie 1970 SQL> SELECT cnp FROM DatePers WHERE datan= TO_DATE ('10 January 1970', 'dd Month YYYY');
NUME CNP ---------------------------------------------Ion Ion 1234567890100

15) S se afieze codul angajailor, numele i salariul acestora indexat cu 5% pentru economiti i 10% pentru director. Se stabilete un JOIN pe tabelele DatePers i DateSal pentru identificarea numelui i, respectiv, codul angailor al cror salariu va fi indexat. Salariul care nu va fi indexat va fi trecut cu SAL_BAZA n coloana SAL_INDEXAT (opiunea DEFAULT din funcia DECODE). SQL> SELECT ds.codang, dp.nume, ds.salbaza SAL_BAZA, DECODE (functia, 'Ec', salbaza*1.05, 'Director', salbaza*1.1, salbaza ) SAL_INDEXAT FROM DateSal ds, DatePers dp WHERE ds.codang = dp.codang;

CODANG NUME SAL_BAZA SAL_INDEXAT ---- ------------------------------------------------------------------------------------------------100 Ion Ion 5000000 5250000 200 Popescu Ion 6500000 6500000 300 Ionescu Gheorghe 15000000 16500000

16) S se afieze suma salariilor de baz SQL> SELECT 'Suma este' ||sum (salbaza) SUMA FROM DatePers dp, DateSal ds WHERE dp.codang=ds.codang(+);
SUMA --------------------------Suma este 26500000

17) S se afieze numele fiecrui angajat i codul efului direct superior SQL> SELECT nume || 'lucreaza pentru' || codsef ANGAJAT_SEF FROM DatePers dp, DateSal ds WHERE dp.codang=ds.codang;
ANGAJAT_SEF ----------------------------------------------------------Ion Ion lucreaza pentru 300 Popescu Ion lucreaza pentru 300 Ionescu Gheorghe lucreaza pentru -

18) S se afieze salariu de baz mediu, salariu minim i salariu maxim pentru toi salariaii cu codul cuprins ntre 10 i 1000. SQL> SELECT Avg (salbaza) MEDIU, Min (salbaza) MINIM, Max (salbaza) MAXIM FROM DateSal WHERE codang BETWEEN 10 AND 1000;
MEDIU MINIM MAXIM -----------------------------------------------7875000 3500000 16500000

19) S se afieze toi angajaii cu funcia de Director, din localitatea Mangalia i cu un salariu mai mare de 14000000. SQL> SELECT nume, functia, salbaza

FROM DatePers dp, DateSal ds WHERE dp.codang=ds.codang AND functia= 'Director' AND dp.localitate=Mangalia AND salbaza>14000000;
NUME FUNCTIA SALBAZA -------------------------------------------------------------------Ionescu Gheorghe Director 16500000

20) S se afieze toi angajaii din structura ierarhic a societii. Rdcina arborelui este Directorul . SQL> SELECT LPAD (' ',5*(LEVEL-1)) || codang, functia FROM DateSal ds START WITH functia='Director' CONNECT BY PRIOR codang=codsef; Rezultatul este:
LPAD('',5*(LEVEL-1))||CODANG FUNCTIA ----------------------------------------------------------------300 Director 100 Ec 200 Inginer 400 Tehnician

21) S se blocheze rndurile selectate de o cerere SQL> SELECT * FROM Impozitar FOR UPDATE Tabel blocat pentru update-area tuplurilor:
LINIE DELA PANALA SUMA PROCENT -------------------------------------------------------------------------------1 0 210000 18 2 2100001 5200000 378000 23 3 5200001 8300000 1091000 28 4 8300001 11600000 1959000 34 5 11600001 99999999999 3081000 40

22) S se adauge un nou angajat n tabela DatePers i s se selecteze angajatul adugat dup prima liter din nume i dup apartenena sa o localitate.

SQL> INSERT INTO DatePers VALUES (400, 'Popa Vasile', '1234567890400', '10-APR-1980', 'Zorelelor 12' ,'Medgidia', '0721333333'); SELECT * from DatePers WHERE nume LIKE P% AND localitate IN (Mangalia, Medgidia);
CODANG NUME CNP DataN ADRESA LOCALITATE TELEFON -------------------------------------------------------------------------------------------------------------------------------------------400 Popa Vasile 1234567890400 10-APR-80 Zorelelor12 Medgidia 0721333333

23) S se adauge datele salariale pentru angajatul nou introdus. S se selecteze codul, numele i datele salariale introduse pentru noul angajat. SQL> INSERT INTO DateSal VALUES (400,'Tehnician',3500000,4,25,200); SELECT ds.codang, dp.nume, ds.functia, ds.vechime, ds.codsef FROM DatePers dp, DateSal ds WHERE dp.codang=ds.codang AND ds.codang=400 OR dp.nume = %Vasile; ds.salbaza, ds.persintr,

CODANG NUME FUNCTIA SALBAZA PERSINTR VECHIME CODSEF --------------------------------------------------------------------------------------------------------------400 Popa Vasile Tehnician 3500000 4 25 200

24) S se adauge n tabela Pontaj datele pentru noul angajat (cu date introduse de la tastatura). SQL> PROMPT S se adauge n Tabela Pontaj datele pentru: INSERT INTO Pontaj (codang, luna, zilelucr, orezi, zileco, zilecm, orelucrate) VALUES('&CodAngajat',&LunaPontaj','&ZileLucr','&OrePeZi', '&ZileConOdihna','&ZileConMed',' &OreLucrEfectiv');
S se adauge n Tabela Pontaj datele pentru: Enter value for codangajat: 400 Enter value for lunapontaj: 1 Enter value for zilelucr: 22 Enter value for orepezi: 8 Enter value for zileconodihna: 1 Enter value for zileconmed: 1 Enter value for orelucrefectiv: 8 1 row created.

Ulterior de poate aduga la linia de stare (o selecie explicit, prin introducerea codului corespunztor noul angajat inserat n tabel) . SQL> SELECT * FROM Pontaj WHERE codang=&CodAngajat;
Enter value for codangajat: 400 CODANG LUNA ZILELUCR OREZI ZILECO ZILECM ORELUCRATE -----------------------------------------------------------------------------------------------------400 1 22 8 1 1 8

SAU, o selecie implicit prin specificarea direct a codului angajatului: SQL> SELECT * FROM Pontaj WHERE codang= 400;
CODANG LUNA ZILELUCR OREZI ZILECO ZILECM ORELUCRATE -----------------------------------------------------------------------------------------------------400 1 22 8 1 1 8

25) S se adauge o noua tax, n tabela TAXE, utiliznd variabile de memorie SQL> ACCEPT den PROMPT 'Denumire:' ACCEPT procent PROMPT 'Procent:' ACCEPT cotamax PROMPT 'Cota maxima:' INSERT INTO Taxe VALUES('&den','&procent','&cotamax');
Denumire: Procent: Cota maxima: TAXA NOUA 2 3 ('&den','&procent','&cotamax') ('TAXA NOUA','2','3')

Old 1: INSERT INTO Taxe VALUES New 1: INSERT INTO Taxe VALUES 1 row created.

Ulterior, dup rulare, se va putea selecta. SQL> SELECT * FROM TAXE WHERE den = &Denumire ;
DEN PROCENT COTAMAX -------------------------------------------------------------------------TAXA NOUA 2 3

26) S se creeze o nou tabel pentru Datele Personale ale Angajatilor din Constana (DatePersCta) i s se adauge ulterior n aceast tabel datele personale ale angajailor din Constana existente n tabela iniial DatePers. SQL> CREATE TABLE DatePersCta ( codang number(5) primary key, nume varchar2(35), cnp varchar2(13), datan date, adresa varchar2(30), localitate varchar2(15), telefon varchar2(10) ); INSERT INTO DatePersCta SELECT * FROM DatePers WHERE localitate='Constanta'; COMMIT; SELECT * FROM DatePersCta;
CODANG NUME CNP DataN ADRESA LOCALITATE TELEFON -----------------------------------------------------------------------------------------------------------------------------------------------------100 Ion Ion 1234567890100 10-JAN-1970 Mangaliei 100 Constanta 0722123456 200 Popescu Ion 1234567890200 10-FEB-1975 Tomis 232 Constanta 0744123456

27) S se majoreze salariul directorului cu 10 procente. SQL> UPDATE DateSal SET salbaza=salbaza*1.1 WHERE functia='Director'; Rezultatul se poate vizualiza utiliznd variabila Functia: SQL> SELECT * FROM DateSal WHERE functia='&Functia';
Enter value for functia: Director NRCRT CODANG FUNCTIA SALBAZA PERSINTR VECHIME CODSEF ----------------------------------------------------------------------------------------------------3 300 Director 19965000 0 15

28) S se tearg toate nregistrrile din DatePersCta unde numrul de telefon ncepe cu 0744... SQL> DELETE FROM DatePersCta WHERE telefon LIKE '0744%'; SELECT * FROM DatePersCta;
CODANG NUME CNP DataN ADRESA LOCALITATE TELEFON -----------------------------------------------------------------------------------------------------------------------------------------------------100 Ion Ion 1234567890100 10-JAN-1970 Mangaliei 100 Constanta 0722123456

29) S se afieze numele tabelelor create n schema proprie de obiecte SQL> SELECT table_name from USER_TABLES;
TABLE_NAME ------------------DATEPERS DATEPERSCTA DATESAL DEDUCERI DEPT EMP IMPOZITAR PONTAJ SALGRADE TAXE

30) S se adauge atributul TMP de tip NUMBER n tabela DatePersCta. SQL> ALTER TABLE DatePersCta ADD ( TMP NUMBER (3) ); DESCRIBE DatePersCta;
Name Null? Type -------------------------------------------------------------------------CODANG NOT NULL NUMBER(5) NUME VARCHAR2(35) CNP VARCHAR2(13) DATAN DATE ADRESA VARCHAR2(30) LOCALITATE VARCHAR2(15) TELEFON VARCHAR2(10) TMP NUMBER (3)

31) S se modifice atributul TMP la o lungime de 5 poziii SQL> ALTER TABLE DatePersCta

MODIFY ( TMP NUMBER (5) ); DESCRIBE DatePersCta;


Name Null? Type -------------------------------------------------------------------------CODANG NOT NULL NUMBER(5) NUME VARCHAR2(35) CNP VARCHAR2(13) DATAN DATE ADRESA VARCHAR2(30) LOCALITATE VARCHAR2(15) TELEFON VARCHAR2(10) TMP NUMBER (5)

32) S se redenumeasc tabela DatePersCta n CONST SQL> ALTER TABLE DatePersCta RENAME TO Const; 33) S se tearg tabela DatePersCta SQL> DROP TABLE DatePersCta; 34) S se adauge la DatePers restricia de Validare Codang>0. SQL> ALTER Table DatePers ADD (CONSTRAINT check_comp CHECK (codang>0) ); 35) S se creeze tabela virtual CONSTANTA care va conine date despre angajaii din Constana SQL> CREATE VIEW Constanta AS SELECT * FROM DatePers WHERE localitate='Constanta';
View created.

36) S se tearg tabela virtual CONSTANTA SQL> DROP VIEW Constanta;


View dropped.

37) S se afieze numrul de nregistrri din tabela DatePers SQL> SELECT count (*) NR_INREG FROM DatePers;
NR_INREG --------------4

38) S se vizualizeze restriciile tabelei DatePers SQL> SELECT CONSTRAINT_TYPE, CONSTRAINT_NAME, STATUS FROM USER_CONSTRAINTS WHERE TABLE_NAME= 'DATEPERS';
C CONSTRAINT_NAME STATUS - ------------------------------ ----------------------C CHECK_COMP ENABLED

7.2. Aplicaie informatic pentru activitatea de aprovizionare i desfacere a unei firme

1. Crearea bazei de date. 1) S se creeze tabelele clieni, furnizori, produse, tranzacii, documente i proddoc. CREATE TABLE clienti ( codc varchar2 (5), denc varchar2 (30), adr varchar2 (30), loc varchar2 (20), cont varchar2 (11), banca varchar2 (15), constraint pk_codc primary key (codc) ); CREATE TABLE furnizori ( codf varchar2 (5), denf varchar2 (30), adr varchar2 (30), loc varchar2 (20), cont varchar2 (11), banca varchar2 (15), constraint pk_codf primary key (codf) ); CREATE TABLE produse ( codp varchar2 (5), denp varchar2 (25), um varchar2 (5), pret number (10), stoc number (5), termen date, constraint pk_codp primary key (codp) );

CREATE TABLE tranzactii ( codt varchar2 (5), dent varchar2 (1) constraint nn_dent not null constraint ck_dent check (upper (dent) in ('L','R')), dataora date default sysdate, codf varchar2 (5), codc varchar2 (5), constraint pk_codt primary key (codt), constraint fk_codf foreign key (codf) references furnizori (codf), constraint fk_codc foreign key (codc) references clienti (codc) ); CREATE TABLE documente ( codd number (5) constraint ck_codd check (codd>0), dend varchar2 (4) constraint nn_dend not null constraint ck_dend check (upper (dend) in ('FACT','AVIZ','NIR','CHIT')), data date default sysdate, codt varchar2 (5), constraint pk_codd primary key (codd), constraint fk_codt foreign key (codt) references tranzactii (codt) ); CREATE TABLE proddoc ( codd number(5), codp varchar2(5), um varchar2(5), cant number(5), constraint pk_coddp primary key (codd,codp) ); 2. Modificarea structurii tabelelor bazei de date 1) S se modifice dimensiunea atributului CodP din tabela Produse, la 4 caractere.

SQL> PROMPT Modificati dimensiunea atributului Codp din tabela Produse la 4 caractere SQL> ALTER TABLE produse MODIFY (codp varchar2 (4)); SQL> DESCRIBE produse;
Name Null? Type ------------------------------- -------- -----------------------------------------------CODP NOT NULL VARCHAR2 (4) DENP VARCHAR2 (40) UM VARCHAR2 (5) PRET NUMBER (13) STOC NUMBER (7) TERMEN DATE

2) Adugai atributul IE (number(2)) tabelei ProdDoc SQL> PROMPT Adaugati atributul IE (number (2) ) tabelei proddoc SQL> ALTER TABLE proddoc ADD (IE NUMBER (2)); SQL> DESCRIBE proddoc;
Name Null? Type ------------------------------- -------- ------------------------------------------------CODD NOT NULL NUMBER (5) CODP NOT NULL VARCHAR2 (5) UM VARCHAR2 (5) CANT NUMBER (6) IE NUMBER (2)

3) Adugai atributul Valoare, numeric de 20 caractere, la tabela Documente. SQL> PROMPT Adaugati atributul valoare la tabela documente SQL> ALTER TABLE documente ADD (valoare number (20)); SQL> DESCRIBE documente;
Name Null? Type ------------------------------- -------- ----------------------------------------------CODD NOT NULL NUMBER (5) DEND NOT NULL VARCHAR2 (4) DATA DATE CODT VARCHAR2 (5) VALOARE NUMBER (20)

3.Inserare nregistrri n tabele. SQL> DELETE FROM clienti; SQL> DELETE FROM furnizori;

SQL> SQL> SQL> SQL>

DELETE FROM produse; DELETE FROM tranzactii; DELETE FROM documente; DELETE FROM proddoc;

SQL> PROMPT INSERARE N TABELA CLIENI; SQL> INSERT INTO clienti VALUES ('1','GOODS ','PIPERA 135','BUCURESTI','A1234567890','BRD'); SQL> INSERT INTO clienti VALUES ('2','DepozitPC','Stefan cel Mare 110','Bucuresti', 'A1231231234','BCR'); SQL> INSERT INTO clienti VALUES ('3','Flamingo','Mihai Eminescu 18','Cluj','A1231231235','BCR'); SQL> INSERT INTO clienti VALUES ('4','Ultra Pro','Mihai Bravu 11','Timisoara','B1231231234','BRD'); SQL> INSERT INTO clienti VALUES ('5','Flanco','Dorobantilor 130','Cluj','C1231231234','BCR'); SQL> PROMPT INSERARE N TABELA FURNIZORI; SQL> INSERT INTO furnizori VALUES ('1','GOODS ','PIPERA 135','BUCURESTI','A1234567890','BRD'); SQL> INSERT INTO furnizori VALUES ('2','ComputerNT','Gral Popescu 13','Iasi','A1234123412','BRD'); SQL> INSERT INTO furnizori VALUES ('3','Python','Charles de Gaule 117','Cluj','A1234512345','BCR'); SQL> INSERT INTO furnizori VALUES ('4','Blue Ridge','Magheru 307','Bucuresti','B1234554321','BRD'); SQL> INSERT INTO furnizori VALUES ('5','Deck Electronics','Lacul Alb 35','Iasi','B1234567777','BCR'); SQL> PROMPT INSERARE N TABELA PRODUSE; SQL> INSERT INTO produse VALUES('P1','Monitor 7inch','buc',3500000,1000, TO_DATE('01/08/2006','DD/MM/YYYY')); SQL> INSERT INTO produse VALUES('P2','CD-RW ASUS 24x10x40x','buc',1000000,500, TO_DATE('01/08/2005','DD/MM/YYYY')); SQL> INSERT INTO produse VALUES('P3','Tastatura qwerty','buc',300000,100, TO_DATE('01/06/2004','DD/MM/YYYY'));

SQL> INSERT INTO produse VALUES('P4','CPU AMD Athlon 1.4GHz','buc',2700000,700, TO_DATE('01/12/2004','DD/MM/YYYY')); SQL> INSERT INTO produse VALUES('P5','Mouse A4TECH','buc',100000,150, TO_DATE('01/06/2004','DD/MM/YYYY')); SQL> PROMPT INSERARE N TABELA TRANZACII; SQL> INSERT INTO tranzactii VALUES ('T1','R',TO_DATE('01/08/2003 02:12:39','MM/DD/YYYY HH:MI:SS'),'3','1'); SQL> INSERT INTO tranzactii VALUES ('T2','R',TO_DATE('11/10/2003 10:20:09','MM/DD/YYYY HH:MI:SS'),'4','1'); SQL> INSERT INTO tranzactii VALUES ('T3','L',TO_DATE('12/10/2003 12:12:30','MM/DD/YYYY HH:MI:SS'),'1','5'); SQL> INSERT INTO tranzactii VALUES ('T4','L',TO_DATE('02/11/2003 04:55:39','MM/DD/YYYY HH:MI:SS'),'1','2'); SQL> PROMPT INSERARE N TABELA DOCUMENTE; SQL> INSERT INTO documente (codd,dend,data,codt) VALUES (10123,'FACT',TO_DATE('01/08/2003','MM/DD/YYYY'),'T1'); SQL> INSERT INTO documente (codd,dend,data,codt) VALUES (20123,'NIR',TO_DATE('01/08/2003','MM/DD/YYYY'),'T1'); SQL> INSERT INTO documente (codd,dend,data,codt) VALUES (10124,'FACT',TO_DATE('11/10/2003','MM/DD/YYYY'),'T2'); SQL> INSERT INTO documente (codd,dend,data,codt) VALUES (20124,'NIR',TO_DATE('11/10/2003','MM/DD/YYYY'),'T2'); SQL> INSERT INTO documente (codd,dend,data,codt) VALUES (30122,'AVIZ',TO_DATE('12/10/2003','MM/DD/YYYY'),'T3'); SQL> INSERT INTO documente (codd,dend,data,codt) VALUES (10125,'FACT',TO_DATE('12/10/2003','MM/DD/YYYY'),'T3'); SQL> INSERT INTO documente (codd,dend,data,codt) VALUES (30123,'AVIZ',TO_DATE('02/11/2003','MM/DD/YYYY'),'T4'); SQL> INSERT INTO documente (codd,dend,data,codt) VALUES (10126,'FACT',TO_DATE('02/11/2003','MM/DD/YYYY'),'T4'); SQL> INSERT INTO documente (codd,dend,data,codt) VALUES (40123,'CHIT',TO_DATE('02/11/2003','MM/DD/YYYY'),'T4');

Valorile pentru cmpul valoare din tabela Documente nu au fost direct introduse n tabel, deoarece acest cmp este unul calculat, iar valorile sale se vor introduce printr-o formul. SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> PROMPT INSERARE N TABELA PRODDOC; INSERT INTO proddoc VALUES (10123,'P1','buc',500,null); INSERT INTO proddoc VALUES (10123,'P2','buc',500,null); INSERT INTO proddoc VALUES (20123,'P1','buc',500,null); INSERT INTO proddoc VALUES (20123,'P2','buc',500,null); INSERT INTO proddoc VALUES (10124,'P3','buc',100,null); INSERT INTO proddoc VALUES (10124,'P4','buc',500,null); INSERT INTO proddoc VALUES (10124,'P5','buc',100,null); INSERT INTO proddoc VALUES (20124,'P3','buc',100,null); INSERT INTO proddoc VALUES (20124,'P4','buc',450,null); INSERT INTO proddoc VALUES (20124,'P5','buc',100,null); INSERT INTO proddoc VALUES (30122,'P1','buc',100,null); INSERT INTO proddoc VALUES (30122,'P2','buc',200,null); INSERT INTO proddoc VALUES (10125,'P1','buc',100,null); INSERT INTO proddoc VALUES (10125,'P2','buc',200,null); INSERT INTO proddoc VALUES (30123,'P1','buc',300,null); INSERT INTO proddoc VALUES (30123,'P4','buc',500,null); INSERT INTO proddoc VALUES (10126,'P1','buc',300,null); INSERT INTO proddoc VALUES (10126,'P4','buc',500,null);

4. Definirea generatorului de numere de secven: 1) S se creeze o secven SECV care ncepe cu valoarea 10127 i se termina cu valoarea 10130 i pasul 1. Acest secven secv se va folosi ulterior pentru generarea automat de numere unice pentru cmpul codd din tabela Documente. Se vor genera succesiv, cresctor, numerele cuprinse ntre 10127 i 10130. SQL>CREATE SEQUENCE secv INCREMENT BY 1 START WITH 10127 MAXVALUE 10130 NOCACHE NOCYCLE; // nume secven // pasul de incrementare // valoarea de pornire a secvenei // valoarea maxim a secvenei // secven finit

2) S se adauge o nou valoare pentru atributul cheii primare codd din tabela Documente folosindu-se succesiunea generat de secvena SECV anterior creat. SQL> INSERT INTO documente VALUES (secv.nextval, FACT, sysdate2, T5, null);

SQL> SELECT * from documente;


CODD DEND DATA CODT VALOARE ----------- ------------------ ---------------- ---------------- -----------------------------------10123 FACT 08-JAN-05 T1 20123 NIR 08-JAN-05 T1 10124 FACT 10-NOV-05 T2 20124 NIR 10-NOV-05 T2 30122 AVIZ 10-DEC-05 T3 10125 FACT 10-DEC-05 T3 30123 AVIZ 11-FEB-05 T4 10126 FACT 11-FEB-05 T4 40123 CHIT 11-FEB-05 T4 10127 FACT 26-FEB-06 T5

La execuie se observ adugarea tuplului 10127-FACT26FEB04-T5, cheia primar astfel definit, pentru cmpul codd, fiind prima valoare a secvenei SECV. La fiecare apelare a cuplului INSERTSELECT secvena SECV anterior creat va incrementa automat cheia primar Codd din tabela Documente. 3) S se adauge nregistrrile corespunztoare pentru o recepia a 100 de buci din produsul P3 i alte 200 de buci din produsul P4 de la furnizorul 4, tiindu-se c factura a fost emis de furnizor cu 2 zile nainte de recepia produselor. SQL> INSERT INTO tranzactii VALUES ('T5','R', sysdate, '4','1'); SQL> INSERT INTO documente VALUES
(secv.nextval, 'FACT', sysdate-2, 'T5',0);

SQL> INSERT INTO documente VALUES (20125,'NIR', sysdate,'T5' ,0); SQL> INSERT INTO proddoc VALUES (secv.currval,'P3','buc',100,0);* SQL> INSERT INTO proddoc VALUES (secv.currval,'P4','buc',200,0);* SQL> INSERT INTO proddoc VALUES (20125,'P3','buc',100,1); SQL> INSERT INTO proddoc VALUES (20125,'P4','buc',200,1);

Pentru a se putea defini cerina ca factura s fie emis cu dou zile nainte de recepia produselor, s-a optat pentru varianta sysdate-2 (data curent-dou zile), ntruct recepia produselor intrate n gestiune se face n ziua curent de lucru. Cele dou tupluri sunt cele care definesc aprovizionarea produselor P3 i P4, avnd drept valori, pentru unul din cele dou atribute ale cheii primare, codd - numrul de secven curent (secv.currval) definit anterior i preluat de la generatorul secv.nextval (din nregistrarea: secv.nextval - FACT- sysdate-2, T5, 0 ) Adugrile la stoc ale celor dou produse se vor regsi n tabela Proddoc. nainte de inserare: SQL> select * from documente;
CODD DEND DATA CODT --------------------------------------------------------------20123 NIR 08-JAN-05 T1 10124 FACT 10-NOV-05 T2 20124 NIR 10-NOV-05 T2 30122 AVIZ 10-DEC-05 T3 10125 FACT 10-DEC-05 T3 30123 AVIZ 11-FEB-05 T4 10126 FACT 11-FEB-05 T4 40123 CHIT 11-FEB-05 T4 10123 FACT 08-JAN-05 T1

Dup inserare: SQL> select * from documente;


CODD DEND DATA CODT VAL ---------------------------------------- ------------------------------20123 NIR 08-JAN-05 T1 10124 FACT 10-NOV-05 T2 20124 NIR 10-NOV-05 T2 30122 AVIZ 10-DEC-05 T3 10125 FACT 10-DEC-05 T3 30123 AVIZ 11-FEB-05 T4 10126 FACT 11-FEB-05 T4 40123 CHIT 11-FEB-05 T4 10123 FACT 08-JAN-05 T1 10127 FACT 27-FEB-06 T5 0 20125 NIR 29-FEB-06 T5 0

Cmpurile adugate n cele dou tabele i avnd valoarea cheii primare generat ca fiind 10127 (primul numr din secvena SECV) sunt cele corespunztoare instruciunilor SECV.NEXTVAL i SECV.CURRVAL, care au generat, respectiv, preluat valorile pentru cheia primar.

4) S se afieze ultimul numr utilizat din secvena SECV: SQL> SELECT secv.CURRVAL FROM DUAL;
CURRVAL ---------------10127

5) S se modifice pasul secvenei SECV de la 1 la 10000 SQL> ALTER SEQUENCE secv INCREMENT BY 10000;
Sequence altered.

6) S se terg secvena SECV . SQL> DROP SEQUENCE secv;


Sequence dropped.

5. Actualizri la nivelul aplicaiei: 1) S se insereze n atributul IE din tabela Proddoc, valorile: 1,pentru NIR (I) ; -1, pentru AVIZE (E); 0, pentru celelalte documente. SQL> UPDATE proddoc SET IE= -1 WHERE SUBSTR (TO_CHAR (codd), 1, 1)= ' 3 '; SQL> UPDATE proddoc SET IE=1 WHERE SUBSTR (TO_CHAR (codd), 1, 1)= ' 2 '; SQL> UPDATE proddoc SET IE=0 WHERE SUBSTR (TO_CHAR (codd), 1, 1) NOT IN( '2 ', ' 3 '); SQL> SELECT * FROM proddoc;
CODD CODP UM CANT IE -------- ----- ----- --------- ---------------------10123 P2 buc 500 0 20123 P1 buc 500 1 10123 P1 buc 500 0 20123 P2 buc 500 1 30123 P1 buc 300 -1 30123 P4 buc 500 -1 10126 P1 buc 300 0 10126 P4 buc 500 0 10127 P3 buc 100 0 10127 P4 buc 200 0 20125 P3 buc 100 1 20125 P4 buc 200 1

2) S se calculeze i s se afieze valoarea total pentru fiecare document, din tabela Documente. SQL> UPDATE documente D SET valoare = (SELECT SUM (cant*pret) valoare FROM proddoc PD, produse P WHERE P.codp=PD.codp AND D.codd=PD.codd GROUP BY D.codd); SQL> SELECT codd, valoare FROM documente WHERE valoare IS NOT NULL;
CODD VALOARE --------- -------------------------------20123 2.250E+09 10124 1.390E+09 20124 1.255E+09 30122 550000000 10125 550000000 30123 2.400E+09 10126 2.400E+09 10127 570000000 20125 570000000 10123 2.250E+09

3) S se diminueze stocul aferent prodului P5 cu 50 de buci. SQL> UPDATE produse SET stoc= stoc - 50 WHERE codp= 'P5'; SQL> SELECT codp, denp, stoc from produse ;
CODP DENP STOC --------------------------------------------------P5 Mouse A4TECH 150

6. Funciile pentru iruri de caractere: 1) S se selecteze numele i localitea unde i au sediul clienii, folosind formatul de afiare cu prima liter majuscul. SQL> SELECT INITCAP (DENC) LITERA_MARE_NUME, INITCAP (LOC)

FROM clienti;
LITERA_MARE_NUME INITCAP (LOC) ------------------------------------- -------------------------Interconn Bucuresti Depozitul De Calculatoare Bucuresti Flamingo Cluj Ultra Pro Timisoara Flanco Cluj

2) S se concateneze irurile corespunztoare atributelor Adresa i Localitate din tabela furnizori, pentru furnizorul Blue Ridge . SQL> SELECT denf, CONCAT (adr, loc) "Adesa_din_Localitatea" FROM Furnizori WHERE denf = Blue Ridge ;
DENF Adresa _ din _ Localitatea ------------------------------ ------------------------------------------------Blue Ridge Magheru 307 Bucuresti

3) S se selecteze toi furnizorii, aducnd coddf, denf i loc la lungimea de 20 de caractere fiecare, utiliznd LPAD i RPAD. SQL> SELECT LPAD (codf, 20, ' * '), LPAD (denf, 20), LPAD (loc, 20, '-' ) FROM furnizori ;
LPAD(CODF,20,'*') LPAD(DENF,20) LPAD(LOC,20,'-') --------------------------------------------------------------------------------------------*******************1 INTERCONN -----------Bucureti *******************2 Computer Network ------------------Iasi *******************3 Python ------------------Cluj *******************4 Blue Ridge -----------Bucuresti *******************5 Deck Electronics -------------------Iasi

SQL> SELECT

RPAD (codf, 20, ' * '), RPAD (denf, 20), RPAD (loc, 20, '-' ) FROM furnizori ;

RPAD(CODF,20,'*') RPAD(DENF,20) RPAD(LOC,20,'-') ------------------------------ -------------------- ---------------------------------------------------1* * * * * * INTERCONN BUCURESTI---2* * * * * * Computer Network Iasi----------------3* * * * * * Python Cluj---------------4* * * * * * Blue Ridge Bucuresti---------5* * * * * * Deck Electronics Iasi-----------------

4) S se afieze furnizorii din alte localiti dect Bucureti. SQL> SELECT codf, denf , loc FROM furnizori WHERE UPPER (loc) <> 'BUCURESTI' ;
CODF DENF LOC --------------------------------------------------------------------------2 Computer Network Iasi 3 Python Cluj 5 Deck Electronics Iasi

5) S se afieze clienii a cror denumire ncepe cu litera "F" SQL> SELECT codc, denc FROM clienti WHERE SUBSTR (denc,1,1)= 'F';
CODC DENC ---------------------------------3 Flamingo 5 Flanco

9. Funciile de dat 1) S se afieze denumirea furnizorilor cu care nu s-au mai ncheiat tranzacii n ultimele 6 luni. SQL> SELECT codf, denf FROM furnizori WHERE codf NOT IN ( SELECT codf FROM tranzactii WHERE MONTHS_BETWEEN (sysdate,dataora)<=6 );
CODF DENF ----- -----------------------------2 Computer Network 3 Python 5 Deck Electronics

2) S se afieze perioada (lunile) de garanie rmase pn la expirarea produselor (inventariate n tabela Produse) cu enumerarea doar a celor care mai au ca valabilitate minimum 3 luni. SQL> SELECT codp, denp,

MONTHS_BETWEEN (termen, sysdate) LUNI_GARANTIE FROM produse where MONTHS_BETWEEN (termen, sysdate) >3;
CODP DENP LUNI_GARANTIE ----------- --------------------------------- ------------------------------------------P1 Monitor 17inch 29.0727 P2 CD-RW ASUS 24x10x40x 17.0727 P3 Tastatura qwerty 3.0727001 P4 CPU AMD Athlon 1.4GHz 9.0727001 P5 Mouse A4TECH 3.0727001

3) S se selecteze produsul cu termenul de garanie cel mai ndeprtat (August 2007) i s se evidenieze lunile de garanie rmase de la data curent la termen. SQL> SELECT codp, denp,
MONTHS_BETWEEN ('01-Aug-06', sysdate) LUNI_MAXIME_GARANTIE

FROM produse WHERE termen='01-Aug-07' ;


CODP DENP LUNI_MAXIME_GARANTIE ---- ---------------------------------------------------------------------------P1 Monitor 17 inch 29.072489

4) S se afieze, codul, denumirea, termenul de garanie, precum i data decalat cu trei luni fa de termenul de garanie i data anetrioar cu trei luni termenului de garanie. Se vor evidenia produsele ale cror termene de valabilitate nu au expirat. SQL> SELECT codp, denp, termen, ADD_MONTHS (termen, 3) PESTE_TREI_L, ADD_MONTHS (termen, -3) CU_TREI_L_IN_URMA FROM produse WHERE termen>sysdate;
CODP DENP TERMEN PESTE_TREI_L CU_TREI_L_N_URM ---- ------------------------------------ --------- --------------------------------------------------------------------------P1 Monitor 17inch 01-AUG-07 01-NOV-07 01-MAY-07 P2 CD-RW AS 01-AUG-06 01-NOV-06 01-MAY-06 P3 Tastatura 01- JUN-05 01- SEP- 05 01-MAR-05 P4 CPU AMD 1.4GHz 01- DEC-05 01-MAR-06 01-SEP- 05 P5 Mouse A4TECH 01- JUN-05 01- SEP- 05 01-MAR-05

5) S se afieze data urmtoarei zile a sptmnii (char) dup o dat declarat. SQL> SELECT NEXT_DAY ('01-MAR-05', 1) FROM dual;
NEXT_DAY ---------------06-MAR-05

SQL> SELECT NEXT_DAY ('01-MAR-05', 2) FROM dual;


NEXT_DAY ---------------07-MAR-05

5) S se afieze ultima zi a lunii (char) dup o dat declarat. SQL> SELECT LAST_DAY ('01-jun-05') FROM dual;
LAST_DAY --------------30-JUN-05

SQL> SELECT codp, denp, termen, LAST_DAY (termen) ULTIMA_ZI_LUNA FROM produse;
CODP DENP TERMEN ULTIMA_ZI_LUNA ---- --------------------------------------------------------------------------------------------------------P1 Monitor 17inch 01-AUG-07 31- AUG-07 P2 CD-RW ASUS 24x10x40x 01-AUG-06 31 -AUG-06 P3 Tastatura qwerty 01 -JUN-05 30 - JUN-05 P4 CPU AMD Athlon 1.4GHz 01 -DEC-05 31 - DEC-05 P5 Mouse A4TECH 01 -JUN-05 30 -JUN-05.

Funcia ROUND poate fi aplicat pe date calendaristice. Round (data1)ntoarce data1 cu timpul setat la 12:00AM (noaptea). Aceasta este folositoare atunci cnd se compar date care au timpuri diferite. ROUND (data1,'MONTH') ntoarce: prima zi a lunii coninnd data1, dac data1 este n prima parte a lunii, prima zi a urmtoarei luni, dac data1 este n a doua jumtate a lunii

ROUND(data 1,' YEAR') ntoarce: prima zi a anului coninnd data1, dac data1 este n prima jumtate a anului, prima zi a urmatorului an, dac data1 este n a doua jumtate a lunii

De exemplu: 6) S se folosesc funcia ROUND pentru a returna prima zi a lunii sau anului sau prima zi a urmtoarei luni sau an, n funcie de data declarat. SQL> SELECT SYSDATE, ROUND (SYSDATE, 'MONTH' ) LUNA_ROTUNJITA, ROUND (SYSDATE,'YEAR') ANUL_ROTUNJIT FROM DUAL;
SYSDATE LUNA_ ROTUNJITA ANUL_ ROTUNJIT --------- --------- --------------------------------------------------------------------------02-SEP-05 01-SEP-05 01-JAN-06

7) Analog, s se identifice rezultatele ntoarse de funcia LAST_DAY pentru valorile atributului TERMEN din tabela Produse: SQL> SELECT codp, denp, termen, LAST_DAY (termen) ULTIMA_ZI_LUNA FROM produse;
CODP DENP TERMEN ULTIMA_ZI_LUNA ------------------------------------------------- -------- -------------------------------------P1 Monitor 17inch 01-AUG-07 31-AUG-07 P2 CD-RW ASUS 24x10x40x 01-AUG-06 31-AUG-06 P3 Tastatura qwerty 01-JUN-05 30-JUN-05 P4 CPU AMD Athlon 1.4GHz 01-DEC-05 31-DEC-05 P5 Mouse A4TECH 01-JUN-05 30-JUN-05

8) Funcia TRUNC(data1,'char') gsete prima zi a lunii care e coninut n data1, dac char = 'MONTH' sau gsete prima zi a anului care conine data1dac char= 'YEAR'. S se utilizeze facilitile acestei funcii. SQL> SELECT SYSDATE DATA_CURENTA, TRUNC (SYSDATE, 'MONTH') PRIMA_ZI_LUNA, TRUNC (SYSDATE,'YEAR') PRIMA_ZI_AN FROM SYS.DUAL;

DATA_CURENTA PRIMA_ZI_LUNA PRIMA_ZI_AN --------- --------- -----------------------------------------------------02-OCT-05 01-OCT-05 01-JAN-05

8. Funcii matematice: 1) S se afieze lungimea atributului Denumire client din tabela Clieni SQL> SELECT denc, LENGTH (denc) LUNGIME_NUME FROM clienti;
DENC LUNGIME_NUME ------------------------------ ----------------------INTERCONN 9 Depozitul de calculatoare 25 Flamingo 8 Ultra Pro 9 Flanco 6

2) S se afieze comisionul corespunztor vnzrii fiecrui produs, n mii lei SQL> ACCEPT SQL> SELECT comision PROMPT 'Introduceti comision: '; denp, pret, & comision COMISION (%) pret*&comision/1000 VALOARE_COMISION FROM produse;
10

Introduceti comision:

DENP PRET COMISION (%) VALOARE_COMISION ----------------------------------------- --------------------------------------------------------------Monitor 17inch 3500000 10 35000 CD-RW ASUS 24x10x40x 1000000 10 10000 Tastatura qwerty 300000 10 3000 CPU AMD Athlon 1.4GHz 2700000 10 27000 Mouse A4TECH 100000 10 1000

3) S se calculze i afieze stocul iniial pentru fiecare produs n parte. SQL> SELECT FROM P.codp, stoc STOC_INITIAL, SUM (stoc+IE*cant) STOC_CURENT produse P, proddoc PD

WHERE GROUP BY

P.codp = PD.codp P.codp, stoc;

CODP STOC_INITIAL STOC_CURENT ---- ---------- ---------------------------------------------P1 1000 6100 P2 500 2300 P3 100 600 P4 700 4350 P5 100 300

4) S se afieze denumirea, preul i stocul actual al produselor, sub forma: PRODUSUL <<nume>> ARE PRETUL UNITAR: <<pret>> LEI. STOCUL ACTUAL ESTE: <<stoc>> <<um>> SQL> SELECT 'PRODUSUL ' || LOWER (denp) || 'ARE PRETUL UNITAR: ' ||pret|| 'LEI. STOCUL ACTUAL ESTE: ' ||stoc|| 'DE' || um FROM produse;
PRODUSUL Monitor 17inch ARE PRETUL UNITAR: 3500000 LEI. STOCUL ACTUAL ESTE: 1000 DE buc PRODUSUL Cd-rw asus 24x10x40x ARE PRETUL UNITAR: 1000000 LEI. STOCUL ACTUAL ESTE: 500 DE buc PRODUSUL Tastatura qwerty ARE PRETUL UNITAR: 300000 LEI. STOCUL ACTUAL ESTE: 100 DE buc PRODUSUL CPU amd athlon 1.4ghz ARE PRETUL UNITAR: 2700000 LEI. STOCUL ACTUAL ESTE: 700 DE buc PRODUSUL Mouse a4tech ARE PRETUL UNITAR: 100000 LEI. STOCUL ACTUAL ESTE: 100 DE buc

5) S se afieze codul produsului i preul mrit cu 1.1 pentru Monitoare i cu 1.2 pentru Mouse. SQL> SELECT codp, pret PRET_INITIAL, DECODE (denp, 'monitor 17inch', pret*1.1, mouse A4TECH', pret*1.2, pret) PRET_MARIT FROM produse;
CODP PRET_INITIAL PRET_MARIT ---- --------- ------------------------------------------------------P1 3500000 3850000 P2 1000000 1000000 P3 300000 300000 P4 2700000 2700000 P5 100000 120000

6) S se afieze Cantitatea Medie cumprat din fiecare produs i s se ordoneze tuplurile dup Cantitate.

SQL> SELECT P.codp, AVG (cant) CANT_MEDIE FROM produse P, proddoc PR WHERE P.codp= PR.codp AND IE =1 GROUP BY P.codp ORDER BY AVG (cant);
CODP CANT_MEDIE ----------------------------P3 100 P5 100 P4 325 P1 500 P2 500

Ca algoritm de analiz al funciei DECODE se poate observa c, pentru coloana DENP (primul argument) are loc cutarea valorilor monitor 17 inch i mouse A4 Tech, iar n cazul n care acestea sunt regsite pe coloana denumirilor, preurile lor sunt actualizate cu 1.1 i, repsectiv, 1.2. Pentru restul produselor care nu fac obiectul cutrii, se trece implicit, ultimul argument, n cazul de fa coloana PRET, sau se poate trece o expresie Pret_Nemodificat Fiind vorba de cumprare, implicit se ia n calcul ca document de intrare NIR-ul (pentru aprovizionare), acest lucru necesitnd o condiie suplimentar IE=1 (alturi de cea care identific din tabela Produse doar acele produse care au fcut obiectul tranzaciei i au la baz un document justificativ). 7) S se afieze doar acele produse care au cantitatea minim vndut mai mare dect cantitatea minim a produsului P3. SQL> SELECT codp, MIN (cant) CANT_MINIMA FROM proddoc WHERE IE= -1 GROUP BY codp HAVING MIN (cant) > (SELECT MIN (cant) FROM proddoc WHERE codp='P3');
CODP CANT_MINIMA ----- -------------------------P2 200 P4 500

Fiind vorba de vnzare se pornete de la ideea c documentul justificativ aferent ieirii din gestiune este avizul, ca atare, se va trece condiia IE=-1. Totodat, n aceast situaie este vorba de o clauz select imbricat pentru a permite selecia doar a celor produse care respect o condiie fa de produsul P3. Ca i n cazul anterior nu se va trece n clauza select atributul cant dup pentru care se calculeaz funciile i se face gruparea. 8) S se afieze cantitatea medie doar pentru produsele care apar mai mult de dou ori n tabela Proddoc. SQL> SELECT codp, AVG (cant) CANT_MEDIE FROM proddoc GROUP BY codp HAVING COUNT (*) > 2;
CODP CANT_MEDIE ---- ---------------------P1 300 P2 350 P3 100 P4 391.66667

9) S se afieze doar acele produse pentru care cantitatea este mai mare sau egal cu 200. SQL> SELECT codp, MAX (cant) CANT_MAXIMA FROM proddoc HAVING MAX (cant) > = 200 GROUP BY codp;
CODP CANT_MAXIMA ----- -------------------------P1 500 P2 500 P4 500

10) S se afieze doar acele produse pentru care cantitatea medie este mai mare sau egal cu 200. SQL> SELECT codp, AVG (cant) MEDIE FROM proddoc

GROUP BY codp HAVING AVG (cant) > 200;


CODP MEDIE ----------------------------P1 300 P2 350 P4 391.66667

11) S se afieze cantitatea medie pe tip de produs, pentru toate codurile de produs mai puin P1. SQL> SELECT codp, AVG (cant) MEDIE_CANT FROM proddoc WHERE codp != 'P1' GROUP BY codp;
CODP MEDIE_CANT ----- ----------------------------P2 350 P3 100 P4 391.66667 P5 100

12) S se calculeze cantitatea medie pentru fiecare produs distinct, din tabela Proddoc. SQL> SELECT codp, AVG (cant) MEDIE FROM proddoc GROUP BY codp;
CODP MEDIE --------------------------P1 300 P2 350 P3 100 P4 391.66667 P5 100

13) Determinai preul mediu pentru fiecare produs n afar de produsul Monitor 17inch din tabela Produse. SQL> SELECT codp, AVG (pret) PRET_MEDIU FROM produse WHERE denp!= 'Monitor 17inch'

GROUP BY codp;
CODP PRET_MEDIU ---------------------------------P2 1000000 P3 300000 P4 2700000 P5 100000

14) Afiai preul minim pe produs. SQL> SELECT denp, MIN (pret) PRET_MINIM FROM produse GROUP BY denp;
DENP PRET_MINIM --------------------------------------------------------CD-RW ASUS 24x10x40x 1000000 CPU AMD Athlon 1.4GHz 2700000 Monitor 17inch 3500000 Mouse A4TECH 100000 Tastatura qwerty 300000

15) S se afieze toate produsele cu diferene cantitative n documente. SQL> SELECT a.codp FROM ( SELECT p.codp, SUM (cant) cant FROM proddoc p,documente d WHERE p.codd=d.codd AND dend='FACT' GROUP BY p.codp ) a, (SELECT p.codp, SUM(cant) cant FROM proddoc p,documente d WHERE p.codd=d.codd AND dend<>'FACT' GROUP BY p.codp )b WHERE a.codp=b.codp AND a.cant-b.cant <> 0;
CODP -------P4

Se identific cu documentele FACTURA care se regsesc att n nomenclatorul de documente (tabela Documente) ct i n nomenclatorul de documente tranzacionate (participante la tranzaciile de produse, din tabela Proddoc). Apoi se identific cu restul de documente (n afar de FACTURA) aflate att n nomenclator, ct i n tranzacii. n final se trec condiiile de identificare a produselor tranzacionate i se stabilesc diferenele cantitative. 16) S se afieze denumirea, preul i valoarea total a vnzrilor pentru fiecare produs, innd cont de comisionul de 5%. SQL> SELECT denp, pret, SUM(pret*cant*1.05) TOTAL_VANZARI FROM produse, proddoc WHERE produse.codp=proddoc.codp AND IE= -1 GROUP BY denp,pret;
DENP PRET TOTAL_VANZARI ------------------------------------------------------------------------------CD-RW ASUS 24x10x40x 1000000 210000000 CPU AMD Athlon 1.4GHz 2700000 1.418E+09 Monitor 17inch 3500000 1.470E+09

S-au identificat doar produsele pentru care IE=-1, respectiv au ieit din gestiune (au fost vndute) fiind nsoite de documentul AVIZ (de expediie). 17) S se afieze valoarea maxim, valoarea medie, valoarea minim i valoarea total pentru livrrile (IE= -1) de produse efectuate. SQL> SELECT MAX (1.05*cant*pret) VZ_MAX, AVG (1.05*cant*pret) VZ_MED, MIN (1.05*cant*pret) VZ_MIN, SUM (1.05*cant*pret) VZ_TOTAL FROM produse, proddoc WHERE produse.codp=proddoc.codp AND IE= -1 GROUP BY produse.codp;

VZ_MAX VZ_MED VZ_MIN VZ_TOTAL --------- --------- --------- ------------------------------------1.103E+09 735000000 367500000 210000000 210000000 210000000 1.418E+09 1.418E+09 1.418E+09

1.470E+09 210000000 1.418E+09

18) S se calculeze i afieze profiturile rezultate din vnzari (IE= -1) cu comision de 5% SQL> SELECT p.codp, pret*0.95 PROFIT FROM produse p, proddoc pd WHERE p.codp=pd.codp AND IE= -1;
CODP PROFIT ---- ------------------P1 3325000 P2 950000 P1 3325000 P4 2565000

19) S se afieze tranzaciile cu valoare mai mic dect cea mai mare valoare a unei tranzacii cu furnizorul 4 SQL> SELECT codt, valoare FROM documente WHERE valoare < ANY ( SELECT valoare FROM documente d, tranzactii t WHERE d.codt=t.codt AND codf='4' );
CODT VALOARE ----- ---------------------T2 1.255E+09 T3 550000000 T3 550000000 T5 570000000 T5 570000000

20) Afiai produsele care au cantitatea mai mare dect cea mai mic cantitate a produsului P4 (min(cant)P4=200).

SQL> SELECT codp, cant FROM proddoc WHERE Codp!= P4 AND cant > SOME (SELECT DISTINCT cant FROM proddoc WHERE codp='P4') ORDER BY cant DESC;
CODP CANT --------------------P2 500 P1 500 P1 500 P2 500 P1 300 P1 300

Cea mai mic cantitate a produsului P4 este de 200 buci, astfel c, cererea principal ntoarce toate produsele, cu excepia lui P4 (specificat explicit) care sunt ntr-o cantitatea mai mare dect minimul cantitii produsului P4 specificat. Astfel, condiia '> ANY' nseamn mai mare ca minim iar '=ANY' este echivalent cu operatorul IN. Cnd se folosete SOME/ANY, DISTINCT este frecvent utilizat pentru a mpiedica s se selecteze liniile de mai multe ori. 21) S se afieze produsele care au cantitatea mai mare sau egal cu cea mai mare cantitate a produsului P4 (max(cant)P4=5200), inclusiv produsul P4. SQl> SELECT codp, cant FROM proddoc WHERE cant > = SOME (select MAX (cant) FROM proddoc WHERE codp='P4') ORDER BY cant DESC;
CODP CANT ---------------------P2 500 P1 500 P1 500 P2 500 P4 500

P4 P4

500 500

22) S se afieze, pentru fiecare document n parte, ce procent reprezint produsele din totalul de produse de pe document. SQL> SELECT a.codd, a.codp, a.PROC/b.TOTAL*100 PROCENT FROM (SELECT codd, codp, cant PROC FROM proddoc GROUP BY codd, codp,cant) a, (SELECT codd, SUM (cant) TOTAL FROM proddoc GROUP BY codd) b WHERE a.codd=b.codd ;
CODD CODP PROCENT ----- ----- ------------------------------------------10123 P1 50 10123 P2 50 10124 P3 14.285714 10124 P4 71.428571 10124 P5 14.285714 10125 P1 33.333333 10125 P2 66.666667 10126 P1 37.5 10126 P4 62.5 10127 P3 33.333333 10127 P4 66.666667 20123 P1 50 20123 P2 50 20124 P3 15.384615 20124 P4 69.230769 20124 P5 15.384615 20125 P3 33.333333 20125 P4 66.666667 30122 P1 33.333333 30122 P2 66.666667 30123 P1 37.5 30123 P4 62.5

23) S se afieze documentele avnd valorile totale cuprinse ntre 1.500.000.000 i 6.500.000.000 sau cele ca sunt NIR-uri i Facturi. SQL> SELECT * from documente WHERE valoare BETWEEN 1500000000 AND 6500000000 OR (dend='NIR' AND dend='FACT') ORDER BY data ASC;

CODD DEND DATA CODT VALOARE ------- ---- --------- ----- ----------------------------------------------------------------------------------------------20123 NIR 08-JAN-03 T1 2.250E+09 10123 FACT 08-JAN-03 T1 2.250E+09 30123 AVIZ 11-FEB-03 T4 2.400E+09 10126 FACT 11-FEB-03 T4 2.400E+09

24) S se afieze perioada de timp, n sptmni rmase pn la expirarea fiecrui produs. Sptmnile (cu perioadele interimare rezultate) se vor rotunji (prin funciile ROUNDsau TRUNC ) la valorile ntregi. SQL> SELECT termen, ROUND ((termen-sysdate)/7) SAPT_GARANTIE FROM produse;
TERMEN SAPT_GARANTIE ----------------- -------------------------01-AUG-06 126 01-AUG-05 74 01-JUN-04 13 01-DEC-04 39 01-JUN-04 13

25) S se afieze denumirea i valoarea documentelor mpreun cu data incheierii lor, doar pentru tranzaciile ncheiate n luna februarie 2005. SQL> SELECT dend, valoare, data DATA_INCHEIERII FROM documente WHERE TO_CHAR (data, 'MM/YY') = '02/05';
DEND VALOARE DATA_INCHEIERII ---- --------------------------------------------------------FACT 570000000 27-FEB-05 NIR 570000000 29-FEB-05

26) S se creeze un index nou pe atributul denumire produs (Denp) din tabela Produse. SQL> CREATE INDEX prod_idx ON produse (denp);
Index created.

27) S se afieze indecii creai pentru tabela Produse i dac asigur unicitatea. SQl> SELECT IC.index_name, IC.column_name, IC.column_position COL_POZ, IX.uniqueness FROM user_indexes IX, user_ind_columns IC WHERE IC.index_name=IX.index_name AND IC.table_name= 'PRODUSE ';
No rows selected.

28) S se tearg indexul creat anterior. SQl> DROP INDEX prod_idx;


Index dropped.

29) S se afieze restriciile definite pentru tabela Tranzacii. SQL> SELECT CONSTRAINT_TYPE TIP_RESTR, CONSTRAINT_NAME NUME_RESTR, STATUS STAREA_RESTR FROM USER_CONSTRAINTS WHERE TABLE_NAME= 'TRANZACTII';
TIP_RESTR NUME_RESTR STAREA_RESTR -------------------------------------------------------------------------------------C NN_DENT ENABLED C CK_DENT ENABLED P PK_CODT ENABLED R FK_CODF ENABLED R FK_CODC ENABLED

30) S se afieze numele tabelelor create n schema proprie de obiecte SQL> SELECT table_name FROM USER_TABLES ;
TABLE_NAME ---------------------BONUS CLIENTI DEPT DOCUMENTE EMP FURNIZORI PRODDOC PRODUSE

SALGRADE TRANZACTII 10 rows selected.

31) S se afieze tipurile de obiecte create n schema proprie de obiecte SQL> SELECT DISTINCT OBJECT_TYPE FROM USER_OBJECTS;
OBJECT_TYPE --------------INDEX SEQUENCE TABLE

32) S se redenumeasc tabela Clieni n tabela Clieni_Redenumii. SQL> ALTER TABLE clienti RENAME TO clienti_redenumiti;
Table altered.

SQL> SELECT * FROM Clienti_Redenumiti;


CODC DENC ADR LOC CONT BANCA -----------------------------------------------------------------------------------------------------------------------------------1 CONN PIPERA 135 BUCURESTI A1234567890 BRD 5 Flanx Dorobantilor 130 Cluj C1231231234 BCR

33) S se tearg tabela Clieni_Redenumii i s se elibereze spaiul ocupat de aceasta. SQL> TRUNCATE TABLE clienti_redenumiti; 34) S se creeze un sinonim public pentru tabela Produse din schema de obiecte Student. SQL> CREATE PUBLIC SYNONYM prod FOR student.produse; 35) S se creeze utilizatorul AGENT001 cu parola Agent. SQL> CREATE USER AGENT001 IDENTIFIED BY agent; 36) S se creeze o serie de drepturi la nivel de sistem pentru utilizatorul AGENT001. SQL> GRANT CREATE TABLE, CREATE SEQUENCE,

CREATE VIEW TO AGENT001; 37) S se modifice parola utilizatorului AGENT001 cu noua_parola SQL> ALTER USER AGENT001 IDENTIFIED BY noua_parola; 38) S se creeze rolul AgVanz cu drepturile RESOURCE si CONNECT la nivel de sistem. SQL> CREATE ROLE agvanz; SQL> SET ROLE AgvVanz; SQL> GRANT RESOURCE, CONNECT TO AgVanz; 39) S se ataeze rolul AgVanz utilizatorului AGENT001. SQL> GRANT AgVanz TO AGENT001; 40) S se anuleze drepturile primite de utilizatorul AGENT001 pe tabela Documente. SQL> REVOKE ALL ON documente FROM AGENT001; 41) S se creeze tabela partiionat Vnzari (codt, data, suma) cu partiii pentru vnzarile din ultimele 3 luni. SQL> CREATE TABLE vanzari (codt varchar2 (5), data date, suma number (11) ) STORAGE (INITIAL 100K NEXT 50K) LOGGING PARTITION BY RANGE(data) (PARTITION LUNA03 VALUES LESS THAN (4) TABLESPACE T0, PARTITION LUNA02 VALUES LESS THAN (3) TABLESPACE T1, PARTITION LUNA01 VALUES LESS THAN (2) TABLESPACE T2); 42) S se adauge noi tupluri din tabela Tranzacii n partiia LUNA02 din tabela Vnzri.

SQL> INSERT INTO vanzari PARTITION (LUNA02) SELECT T.codt, TO_CHAR (dataora,'MM-DD-YYYY'), valoare FROM tranzactii T, documente D WHERE T.codt=D.codt AND MONTHS_BETWEEN (data, sysdate)=2; 43) S se creeze un raport care s afieze informaiile despre tranzaciile ncheiate n ultimul an, documentele i produsele aferente i un total general. SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SET PAGESIZE 200 SET LINESIZE 100 SET FEEDBACK OFF SET ECHO OFF SET VERIFY OFF COLUMN CODT FORMAT a5 HEADING 'Nr' COLUMN DENT FORMAT a1 HEADING 'Tip' COLUMN DATAORA FORMAT a10 HEADING 'Data' COLUMN DEND FORMAT a4 HEADING 'Doc' COLUMN CODD FORMAT 99999 HEADING 'Nr Doc' COLUMN CODF FORMAT a5 HEADING 'Fz' COLUMN CODC FORMAT a5 HEADING 'Cl' COLUMN VALOARE FORMAT 99999999999 HEADING 'Valoare Tranzactie' SQL> COLUMN CODP FORMAT a5 HEADING 'Produs' COLUMN CANT FORMAT 99999 HEADING 'Cantitate' SQL> SELECT T.codt, dent, dataora, dend, D.codd, codf, codc, valoare, codp, cant FROM tranzactii T,documente D, proddoc P WHERE T.codt=D.codt AND D.codd=P.codd ORDER BY T.codt, Dcodd, codp
Nr T Data Doc Nr Doc Fz Cl Valoare Produs Cantitate ---------------------------------------------------------------------------------------------------------------------T1 R 08-JAN-04 FACT 10123 3 1 2250000000 P1 500 T1 R 08-JAN-04 FACT 10123 3 1 2250000000 P2 500 T1 R 08-JAN-04 NIR 20123 3 1 2250000000 P1 500 T1 R 08-JAN-04 NIR 20123 3 1 2250000000 P2 500 T2 R 10-NOV-04 FACT 10124 4 1 1390000000 P3 100 T2 R 10-NOV-04 FACT 10124 4 1 1390000000 P4 500 T2 R 10-NOV-04 FACT 10124 4 1 1390000000 P5 100

ANEXE
ANEXA 1 CUVINTE REZERVATE LIST ROWID LOCK ROWNUM ACCES DISTINcT LONG ROWS ADD DOES MAJCEXTENTS RUN ALL DROP MINUS SELECT ALTER MODE SESSION AND ELSE MODIFY SET ANY ERASE MOVE SHARE APPEND EVALUATE NEW SIZE AS EXCLUSIVE NOAUDIT SMALLINT ASC EXISTS NOCOMPRESS SPACE ASSERT FILE NOLIST START ASSIGN FLOAT NOSYSSORT SUCCESSFUL AUDIT FOR NOT SYNONYM BETWEEN FORMAT NOWAIT SYSDATE BY FROM NULL SYSSORT CHAR GRANT NUMBER TABLE CHECK GRAPHIC OF TEMPORARY CLUSTER GROUP OFFLINE THEN COLUMN HAVING OLD TO COMMENT IDENTIFIED ON TRIGGER COMPRESS IF ONLINE UID CONNECT IMAGE OPTIMIZE UNION CONTAIN IMMEDIATE OPTION UNIQUE CONTAINS IN OR UPDATE. CRASH INCREMENT ORDER USER CREATE INDEX PAGE USING CURRENT INDEXED PARTITION VALIDATE DATAPAGES INDEXPAGES PCTFREE VALUES DATE INITIAL PRIOR VARCHAR DBA INSERT PRIVILEGES VARGRAPHIC DBLINK INTEGER PUBLIC VIEW DECIMAL INTERSECT RAW WHENEVER DEFAULT INTO RENAME WHERE DEFINITION IS REPLACE WITH DELETE LEVEL REPORT DESC LIKE RESOURCE REVOKE

ANEXA 2 OPERATORI UTILIZATI IN LIMBA JUL SQL*PLUS A. Sintaxa operatorilor SQL*PLUS


Operator & &,&& Functie Specific nlocuirile lexicale ntr-un fiier de comenzi executat cu START. Opiunile sunt nlocuite prin &s: prima prin &1, a doua prin &2 etc. Indic o variabil utilizator ntr-o comand SQL*PLUS. Se cere o valoare de fiecare dat cnd variabila & este gsit i se cere o valoare cnd se gsete prima dat variabila &&. Incheie o variabil de substituie urmat de un caracter ce ar putea fi parte a numelui variabilei.

B. Sintaxa operatorilor SQL


Operator () @ Functie Include o subcerere coninut ntr-o alt comand Delimiteaz o constant de tip caracter sau dat calendaristic. Un apostrof ntr-o constant de tip caracter se preprezint prin dou apostrofuri. Marcheaz un nume de coloan sau sinonim care conine caractere speciale. Marcheaz literalii ntr-un format de tip dat calendaristic. Precede un nume de legtur la o baz de date, ntr-o clauz FROM.

C. Operatori aritmetici SQL


Operator +, *, / +|| Functie Operatori unari + i (valori pozitive, respectiv valori negative) Operatori de nmulire i mprire Operatori de adunare i scdere Concatenare de iruri de caractere

D. Operatori logici
Operator <, >, =, >=, <=, !=, <> NOT AND OR [NOT] IN(list) ANY ALL [NOT] BETWEEN X AND Y EXISTS [NOT] LIKE Functie Operatori de comparatie Funcia logic NU Funcia logic I Funcia logic SAU Egal cu oricare valoare din lista de valori Indic o valoare oarecare dintr-o mulime Indic toate valorile unei mulimi Valoarea unei variabile [nu] se gsete n intervalul [x,y] Condiia este adevrat dac o subcerere returneaz cel puin un rnd Compar valoarea unui cmp cu un ir de caractere. Dac n irul de caractere urmeaz % se compar cu orice secvent de caractere; _ - se compar cu orice caracter; Operatorul specific dac valoarea unei variabile este sau nu nul

IS [NOT] NULL

E. Operatori utilizai n expresiile de cereri


Operator UNION INTERSECT MINUS Functie Combin mai multe cereri, returnnd reunirea liniilor selectate de cererile individuale Combin mai multe cereri, returnnd intersecia liniilor selectate de cererile individuale Combin mai multe cereri, returnnd diferena liniilor selectate de dou cereri (rndurile distincte selectate de prima cerere i neselectate de a doua cerere)

F. Ali operatori SQL


Operator (+) PRIOR Functie Indic faptul c o coloan ce l precede este coloan de jonciune extern (OUTER JOIN COLUMN) Definte relaiile printe-fiu ntre nodurile unei cereri structurate arborescent. Dac operatorul PRIOR precede o expresie din stnga unei egaliti, se face o selecie descendent. Dac operatorul PRIOR precede o expresie din dreapta unei egaliti se va face o selecie ascendent.

ANEXA 3 PSEUDOCOLOANE UTILIZATE IN LIMBA JUL SQL*PLUS


Numr coloan LEVEL NULL ROWID ROWNUM SYSDATE UID USER Valoare returnat 1 pentru rdcin, 2 pentru subdirector (copil) al rdcinii etc. Se utilizeaz n comanda SELECT i cluza CONNECT BY Returneaz o valoare nul. Nu poate fi folosit n expresiile logice. Numrul de identificare al rndului. Un identificator de rnd este de tipul ROWID i nu de tipul numr sau caracter. Numrul de ordine al rndului selectat din tabel (numrnd de la 1) Data calendaristic i timpul curent Identificator de utilizator, este un numr unic pentru fiecare utilizator Returneaz numele utilizatorului curent

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