Sunteți pe pagina 1din 220

INTRODUCERE

n contextul dezvoltrii societii informaionale o serie de


concepte, cunoscute altdat doar de specialiti, au devenit familiare unui
numr mare de utilizatori ai tehnologiei informaiei. O mare parte dintre
acetia utilizeaz, poate nu tocmai corect, conceptele de: baze de date,
sistem de gestiune a bazei de date, sistem de baze de date. n limbajul
curent ele, uneori, sunt confundate ca semnificaie, dar, pentru specialiti
semnific altceva.
Titlul crii se refer doar la conceptul de baz de date realizat n
sistemul Oracle cu limbajul SQL.
n capitolul 1 se trateaz aceste concepte absolut necesare unui
utilizator, specialist n informatic sau simplu utilizator, pentru a crea i
exploata o baz de date.
Celelalte capitole trateaz aspectele privind crearea, actualizarea
i exploatarea unei baze de date, n diverse moduri, cu limbajul SQL din
sistemul Oracle. Pentru aceasta, n capitolul 2, se prezint facilitile i
arhitectura sistemului Oracle, de altfel un sistem cu multe faciliti i n
continu dezvoltare. n celelalte capitole se urmrete pas cu pas crearea,
ncrcarea, actualizarea i exploatarea unei baze de date.
Cartea se ncheie cu dou aplicaii definite i realizate n cadrul
orelor de curs i laborator la disciplina Sistemul de gestiune a bazelor de
date Oracle. De altfel, exemplele din carte au constituit suportul practic de
la disciplinele Baze de date si Sisteme de gestiune a bazelor de date, fiind
un punct de plecare pentru ntocmirea lucrrilor i a proiectelor de an.
n concluzie, pot spune c fundamentele teoretice, multitudinea
exemplelor prezentate ofer studenilor i specialitilor n informatic
posibilitatea de a proiecta i utiliza baze de date n sistemul Oracle. Cartea
este util studenilor de la forma de nvmnt ZI i IDD care studiaz
disciplinele de Baze de date si Sisteme de gestiune a bazelor de date.
Mulumesc colegilor din cadrul colectivului Baze de date al
Catedrei de Informatic Economic, ASE Bucureti care au citit aceast
carte i au fcut observaii pentru mbuntirea coninutului ei.
Mulumesc doctoranzilor Adela Bra i Anca Fodor care m-au
ajutat la sistematizarea i tehnoredactarea acestei cri.
27 septembrie 2005

Autorul

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.

10

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

11

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:

12

Tabelul 1.3
FIIERE

TEORIA BD

Fiier
nregistrare

Colecie de date
Familie de
caracteristici
Caracteristic
Domeniu de valori

Cmp
Valoare

TEORIA
RELAIONAL
Relaie
Tuplu

Tabela
Linie

Atribut
Domeniu

Coloan
Domeniu

SGBDR

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

13

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.

14

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.

15

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

16

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

17

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

18

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.

19

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.

20

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

21

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

22

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

23

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

24

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.

25

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.

26

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;

27

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

28

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

29

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,

30

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

31

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;

32

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;

33

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.

34

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.

35

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.

36

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.

ACOS(n)

Arc cosinus de n. Rezultatul


este exprimat n radiani.

ASIN(n)

Arc sinus de n.

ATAN

Arc tangent de n.

37

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;

ATAN2

Arc tangent de n i m sau


arc tangent de n/m. Deci
ATAN2(n,m) este identic cu
ATAN2(n/m).

CEIL(n)

Retureaz numrul ntreg cel


mai mic care este mai mare
sau egal cu n.

COS(n)

Cosinus de n.

COSH(n)

Cosinus hiperbolic de n.

EXP(n)

Returneaz o valoare egal


cu e ridicat la puterea n, unde
e = 2.71828183.

FLOOR(n)

Returneaz numrul cel mai


mare care este mai mic sau
egal cu n.

LN(n)

Returneaz logaritmul
natural de n, unde n > 0.

LOG(m,n)

Returneaz logaritm n baza


m de n.(LOGmn)

MOD(m,n)

Returneaz restul mpririi

38

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)

ROUND
(n[,m])

SIGN(n)

SIN(n)

SINH

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.

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.

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.

Returneaz sinus hiperbolic

39

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

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

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

40

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.

LOWER ('ir')

Returneaz irul de caractere


'ir' astfel nct toate literele
irului sunt de format liter
mic.

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

41

--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')

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

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

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

42

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

UPPER('c1')

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

Tabelul 3.3 Funciile caracter care returneaz valori numerice


Funcia
ASCII ('c1')

Rolul funciei
Returneaz
valoarea
zecimal
a
primului
caracter din irul 'c1'.

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

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

LENGTH

43

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')

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.

LAST_DAY (d)

Returneaz data
ultimei zile din
lun.

MONTHS_
BETWEEN (d1, d2)

Returneaz
numrul de luni
dintre datele d1

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
-------------------------7
23-SEP-05 30-SEP-05
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') )

44

NEXT_DAY (d, 'c1')

ROUND (d[,fmt])

SYSDATE

TRUNC (d,[fmt])

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.

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

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

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

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

45

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] )

HEXTOROW('c1')

RAWTOHEX(raw)
ROWIDTOCHAR
(rowid)

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

46

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;

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

este tot impul un ir de


18 caractere.

ROWID
-----------------AAAAZ6AABAAABr1AAB

TO_CHAR pentru
conversie de caractere,
are sintaxa:
TO_CHAR
(d [, fmt])

Convertete data d de
tip DATE la o valoare
de tip VARCHAR2 n
formatul specificat.

TO_CHAR pentru
conversie de numere,
are sintaxa:
TO_CHAR
(n [, fmt])

Convertete numrul n
de tip NUMBER la o
valoare de tip
VARCHAR2.

CHARTOROWID
('c1')

Convertete o valoare
de tip CHAR sau
VARCHAR2 la o
valoare de tip ROWID

TO_DATE
('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.

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;

TO_NUMBER
('c1',[,fmt ])

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

Semnificaia elementului fmt

9999
0999 9990

Nr. semnificativ de digii care vor fi afiai


Afieaz 0 n faa sau dup digiii semnificativi

47

$
B
MI
S

$999
B999
999MI
S999

D
G
,
.
RN sau rn

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

Se specific
n
TO-DATE
Da
Da
Da
Da
Nu

D
DAY
DD
DDD
HH sau HH12
HH24
J

Da
Da
Da
Da
Da
Da
Da

MI
MM
MON
MONTH
PM sau P.M.
RR sau RRRR
SS
SSSS

Da
Da
Da
Da
Nu
Da
da
Da

WW
W
YYYY,YYY,YY,Y

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.

48

Tabelul 3.8 Alte funcii cu un singur rnd


Funcia
DUMP ('c1'
[,return_format
[,start_position
[,length]]])

EMPTY_
[B|C]LOB()

BFILENAME
('director',
'nume_fiier')

GREATEST (expr
[,expr] ...)

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.

49

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();

INSERT INTO tab1 VALUES


(BFILENAME('lob_dir1',foto1.gif'))
;

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)

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.

UID
USER

USERENV (option)

Returneaz informaii
despre sesiune curent.

VSIZE(expr)

Returneaz lungimea n baii


a expresiei expr.

50

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

SELECT USER, UID


FROM DUAL;
USER
UID
---------------------------19
SCOTT
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

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)

51

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

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

SUM([DISTINCT|ALL] n)

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

52

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)

53

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.

54

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)

55

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]

56

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

57

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))

58

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;
/

59

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:

60

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

61

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:

62

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --*/
/* &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:

63

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - -*/
/* &&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.

64

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

65

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 ---PRENUME
CODPERS NUME
-------------------------------------- ---------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:

66

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];

67

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

68

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

FUNCT
VINZATOR
VINZATOR
VINZATOR

CODD
100000
120000
120000

SALA
21200
25060
20750

MARCA NUME
2550
FRINCU ION
3500
DAN ION
1680
RADU ION

FUNCT
SEF DEP
VINZATOR
VINZATOR

CODD SALA
160000 36000
160000 24500
130000 20750

VENS CODS
1000
1000
3500
2000
VENS CODS
37000 2500
350
3000

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]...;

69

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:

70

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

71

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

72

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] |
variabila-culoare}]
DEF[AULT]]
[COLOR
{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]]
...;

73

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)

74

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

75

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.

76

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

Semnificaia

AVG
COUNT
MAXIMUM
MINIMUM
NUMBER
STD
SUM
VARIANCE

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

77

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

DEP
45000
0
21200

Data:

DEP
0
71500
72850

DEP
0
107500
77700

Semntura:

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

78

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

Data:

DEP 10
45000
0
21200
66200

DEP 13
0
71500
72850
144350

Semntura:

79

DEP 16
0
107500
77700
185200

SUM(SALA)
45000
179000
268500

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;

80

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

81

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

82

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.

83

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)

84

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.

85

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

86

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.

87

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;

88

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

89

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;

90

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.

91

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

Formatul

Explicaii

CHAR( mrime)

Date

DATE

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

92

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:

93

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,

94

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.

95

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}];

96

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:

97

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;

98

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, )

99

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

100

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.

101

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;

102

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,

103

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

104

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

105

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;

106

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.

107

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,

108

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:

109

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

110

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

111

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.

112

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

113

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

114

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.

115

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.

116

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 .

117

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.

118

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

7 records selected.

119

VENS
1000
2000
2500
3550
1500
2500
3500

CODS
1000
1000
1000
2500
2500
2500
1000

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;

120

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

121

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

122

WHERE SALA<30000 ;

NUME
AVRAM ION
BARBU DAN
DAN ION
MANU DAN
VLAD ION

SALA
21200
20750
24500
27500
25060

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

123

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'

124

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.

125

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

126

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

127

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

128

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

129

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

130

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

131

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

132

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'

133

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.

134

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)
.... ;

135

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

136

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

137

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:

138

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

139

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

140

2
3
4

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

NUME
FRINCU ION
DORU DAN
COMAN RADU
VLAD VASILE

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.

141

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, ;

142

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,

143

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

144

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.
SUBSTR (NUME, l, 5) 5_din_Nume,
SQL> SELECT
2
MARCA, Marca_Sal,
3
SUBSTR (FUNCT, 1, 1) 1_din_Funcie
4
FROM SALARIAI;

145

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

LOWER

(FUNCT)

SAL_TOTAL
22200
22750
24850
30000
73000
28560
42000
25600

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

146

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,

147

2
3
4
5

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

CODP
11111
12222
13333
15555
16668
14444

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

148

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.

149

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

DAY

MM

YYYY)

DATASFRIT
THURSDAY 10 2005
SUNDAY 11 2005
SUNDAY 11 2005

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,

150

2
TO
CHAR
DATASFRIT
3
FROM PRETURI ;
CODP
11111
12222
13333
16555
16666
14444

(DATASF,

DDth-MON-YY)

DATASFRIT
30TH-AUG-05
30TH-SEP- 05
01ST-OCT- 05
01ST-OCT- 05
01ST-NOV- 05
01ST-NOV- 05

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

DDth-MON-YY

HH:MI)

12:00
12:00
12:00
12:00
12:00
12:00

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

151

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.

152

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

153

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.

154

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.

155

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

156

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)

157

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 ;

158

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

159

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

160

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,

161

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
;

162

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

163

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

164

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

165

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

166

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

NUME_SI_PRENUME

MARCA

2
3
3
3
2
3
4
4
3
3
2
3
3
2
3
3

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

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')

167

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

168

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

169

3
4
5
6

FROM SALARIAI
WHERE LEVEL=2
CONNECT BY PRIOR MARCA=CODS
START WITH NUME='ION ION'

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

LEVEL
2
2
2
2

FUNCT
SEF DEP
SEF DEP
SEF DEP
SEF DEP

CODS
7000
7000
7000
7000

CODD
130000
160000
130000
160000

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

170

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
(

171

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

172

(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);

173

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

174

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
-------------------- -------------------------1.28
1.281

175

2_ZECIMALE,
3_ZECIMALE

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

176

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;

177

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

178

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.

179

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.

180

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


PROMPT
'Denumire:'
SQL> ACCEPT den
ACCEPT procent
PROMPT
'Procent:'
ACCEPT cotamax PROMPT
'Cota maxima:'
INSERT INTO Taxe VALUES('&den','&procent','&cotamax');
Denumire:
Procent:
Cota maxima:

TAXA NOUA
2
3

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

('&den','&procent','&cotamax')
('TAXA NOUA','2','3')

Ulterior, dup rulare, se va putea selecta.


SQL> SELECT * FROM TAXE
WHERE den = &Denumire ;
DEN
PROCENT COTAMAX
-------------------------------------------------------------------------TAXA NOUA
2
3

181

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

182

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

183

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.

184

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

185

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

186

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.

187

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;

188

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'));

189

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');

190

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

191

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

192

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.

193

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

194

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)

195

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

196

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,

197

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

198

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

199

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;

200

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;

Introduceti comision:

10

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

201

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.

202

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

203

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

204

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'

205

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

206

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;

207

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

208

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

209

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;

210

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.

211

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.


TIP_RESTR,
SQL> SELECT CONSTRAINT_TYPE
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

212

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,

213

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.

214

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

215

BIBLIOGRAFIE
1. [CONN00] T.Connolly Database Systems, ed.Mc Graw Hill,
2000.
2. [DATE94] J.Date An introduction to Database Systems, ed.
Addison Wesley, 1994
3. [FOTA01] M. Fotache SQL. Dialecte DB2, Oracle, Visual
FoxPro, ed. Polirom, 2001
4. [LUBO95] I. Lungu, C. Bodea . a. - Baze de date organizare,
proiectare i implementare , ed. ALL, 1995.
5. [LUIA05] I. Lungu, I. Iacob Aplicaii informatice utiliznd
SGBD Oracle, ed. ProUniversalis, 2005
6. [LUIO02] I. Lungu, M. Iorga, M Velicanu Baze de date. S
nvm sistemul Oracle n 28 de lecii., ed. Economic, 2002
7. [LURO93] I.Lungu, I. Roca, N. Muat, Gh. Sabu Baze de date
relaionale. Utilizarea limbajului SQL*PLUS, ed. ALL, 1993
8. [LUVE00] M.Velicanu, I.Lungu, M.Muntean Teste i probleme
de programare n Visual Foxpro i Oracle, ed.Petrion, 2000.
9. [VELU00] M.Velicanu, I.Lungu .a. Sisteme de gestiune a
bazelor de date, ed.Petrion, 2000.
10. [VELU01] M.Velicanu, I.Lungu, M.Muntean Dezvoltarea
aplicaiilor cu baze de date n Visual Foxpro, ed. ALL, 2001
11. [VELU02] M.Velicanu, I.Lungu, M.Muntean, M.Iorga, S.Ionescu
Oracle platform pentru baze de date, ed. Petrion, 2002.
12. [VELU03] M.Velicanu, I.Lungu, M.Muntean, S. Ionescu Sisteme
de baze de date, ed.Petrion, 2003.
13. www.oracle.com
14. www.oracle-base.com

216

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

217

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

218

D. Operatori logici
Operator
<, >, =, >=, <=, !=, <>
NOT
AND
OR
[NOT] IN(list)
ANY
ALL
[NOT] BETWEEN X AND
Y
EXISTS
[NOT] LIKE

IS [NOT] NULL

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

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.

219

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

220

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