Sunteți pe pagina 1din 190

CAPITO LU L1

<

INTRODUCERE IN ORACLE
Acest capitol introductiv scoate in evidenta facilitatile oferite de Oracle si de produsele sale punandu-le in contextul instrumentelor si tehnologiilor pe care le veti invata in acest curs.Acest capitol explica de asemenea principiile de baza ale bazelor de date relationale.

CE ESTE ORACLE?
Oracle consta dintr-un set complet de constructori de aplicatii si produse pentru utilizatori,cautand sa asigure solutii complete in tehnologia informatiei. Aplicatiile Oracle sunt portabile peste un numar mare de statii de lucru si sisteme de operare, de la calculatoare personale la procesoare paralele. Oracle este inzestrat cu un flexibil Sistem de Management al Bazelor de Date(DBMS)-Serverul Oracle-pentru stocarea si managementul informatiei utilizate de aplicatii. Ultimul server Oracle ,ORACLE 7,conduce o baza de date cu toate avantajele unei structuri relationale,avand in plus capacitatea de a stoca si executa obiecte de tip baza de date precum proceduri si mecanisme de siguranta.

Despre Serverul ORACLE


Serverul Oracle cuprinde un DBMS care controleaza:

Stocarea de date in sfera bazelor de date dedicate Recuperarea de date pentru aplicatii utilizand tehnici de optimizare adecvate Securitatea bazelor de date si a taskurilor permise pentru anumiti utilizatori Consistenta si protectia datelor,incluzand arhivarea taskurilor si mecanisme de cautare Comunicarea si integritatea informatiilor,cand bazele de date sunt distribuite intr-o retea.

Aplicatiile Oracle trebuie rulate pe acelasi computer la fel ca si Serverul Oracle.

Alternativ,aplicatiile si utilitarele utilizate de ele pot sa fie rulate pe un sistem local pentru utilizator (sistemul 'client'),in timp ce Oracle DBMS ruleaza pe un altul (sistemul 'server'). In acest mediu 'client-server',un numar mare de resurse de calcul pot fi rulate.De exemplu,o aplicatie 'Oracle Forms' poate rula pe un computer personal client,in timp ce accesarea datelor este condusa conventional de un Server Oracle pe un computer central.

PRODUSELE ORACLE
Instrum. CDE ========================== || ------------------ || || | Rapoarte Oracle| || || ------------------ || Oracle Card || ------------------ || || | Grafice Oracle | || Oracle Case || ------------------ || || ------------------ || SQL*Plus || | Forme Oracle | || || ------------------ || Pro*Oracle || ------------------ || || | Cart Oracl | || Text Retrieval || -----------------| || ========================== Alte produse ^ ^ | | | | | | --------------------------------------------------------------| | | | | ORACLE7 SERVER | | | | | --------------------------------------------------------------| | | | | -----------------------------| | | Hard Disk |

| | ------------------------------

Optiuni Oracle Server In plus fata de 'Standard Oracle7' care dispune de o multime comprehensiva de facilitati asupra bazelor de date,mai sunt cateva facilitati suplimentare. Acestea includ: Optiunea procedurala Asigura un "motor" PL/SQL versiunea 2 in interiorul serverului Oracle,care are bilitatea de a stoca proceduri b.d.,functii si mecanism de siguranta pentru utilizarea de catre aplicatii . Optiunea distribuita Suporta tranzactii care actualizeaza informatia din mai multe baze de date dintr-o retea de baze de date distribuita,utilizand executia in doua faze. Paralel Server Option Suporta sisteme cuplate liber. Oracle de incredere ("Trusted Oracle") Pune la dispozitie o multime de facilitati aditionale de inalta securitate. Produsele Oracle Printre multele dezvoltari de aplicatii si produse pentru utilizatori accesibile in familia Oracle,exista o posibilitate comuna pentru a accesa baza de date. Daca direct sau indirect,aceasta este realizata prin Limbajul cu Structura de Interogare(SQL),va fi un subiect pe care noi il vom trata in acest curs. Produsele Oracle contin: Oracle TextRetrieval O tehnologie care adauga capabilitati de refacere completa a textului intr-o baza de date Oracle. Pro*Oracle O serie de precomilatoare care permit accesul bazelor de date Oracle la limbajele de programare C, Cobol,Fortran,PL/1,Pascal si Ada. Oracle Card O interfata utilizator pentru producerea aplicatiilor cu baze de date usor de folosit ce incorporeaza grafice si facilitati multimedia.

Oracle CASE O familie de instrumente care ajuta la analiza , designul si generarea aplicatiilor Oracle. SQL*Plus Un instrument care permite o utilizare directa si interactiva a limbajului SQL pentru a accesa serverul Oracle,utilizand comenzi ad-hoc sau prin rularea fisierelor de comanda. Mediul de dezvoltare auxiliar(CDE) Instrumentul de dezvoltare a aplicatiilor principale formeaza un set inchis integrat numit 'Mediul de Dezvoltare Auxiliar'.Elementele de baza ale CDE includ limbajul procedural al lui Oracle,PL/SQL,facilitati grafice si comunicare intre produse. Principalele instrumente CDE sunt: Oracle Forms V4 Permite ca aplicatii sofisticate bazate pe utilizarea ecranului sa fie construite repede si usor si permite utilizatorului sa ceara si sa manipuleze date intr-o structura cu forma convenabila ,la fel de bine ca afisarea imaginilor vizuale,si facilitati de accesare prevazute de alte produse CDE. Oracle Reports V2 Un puternic instrument de scriere a rapoartelor pentru constructia si executia rapoartelor sofisticate cu fonturi de text si imagini multiple. Oracle Graphics V2 Permite construirea si afisarea aplicatiilor vizuale, incluzand harti,grafice,imagini si desene. Oracle Book V1 Prevede abilitatea de a crea si vizualiza documente care includ hipertexte,sunete digitale si videoclipuri.

SQL,SQL*PLUS si PL/SQL

SQL,SQL*PLUS si PL/SQL sunt facilitatile Oracle care vor fi discutate in acest curs.Este important de inteles in fiecare caz diferentele lor,rolul si locul lor in familia Oracle. *SQL

este limbajul utilizat pentru a accesa o baza de date relationala, inclusiv Oracle. poate fi utilizat de fiecare instrument Oracle,cand accesul la baza de date este necesar.

*PL/SQL

este limbajul Procedural al lui Oracle pentru scrierea aplicatiilor si pentru manipularea datelor in afara bazei de date. poate include un subset al comenzilor SQL,cand accesul la baza de date este cerut este accesibil in fiecare din produsele CDE.De asemenea in insusi serverul Oracle(daca optiunea procedurala este instalata).

*SQL*Plus

este un produs Oracle in care limbajele SQL si PL/SQL pot fi utilizate. de asemenea are propriul limbaj de comanda pentru controlul comportarii produsului si pentru formatarea rezultatelor interogarilor SQL.

In concluzie,SQL si PL/SQL sunt limbaje care sunt utilizate intr-un numar de produse Oracle .SQL*PluS este unul din produsele pe care acestea se afla. Noi vom discuta acum principiile de baza ale bazelor de date relationale, pentru care Oracle este un exemplu.

ABORDAREA RELATIONALA
-------------------------------------------------| S# SNAME STATUS CITY | |------------------------------------------------| | S1 SMITH 20 LONDON | | S2 JONES 10 PARIS | | S3 BLAKE 30 PARIS | -------------------------------------------------PARTI --------------------------------------------------------| P# PNAME COLOUR WEIGHT CITY | |-------------------------------------------------------| | P1 NUT RED 12 LONDON | | P2 BOLT GREEN 17 PARIS | | P3 SCREW BLUE 17 ROME | | P4 SCREW RED 14 LONDON | --------------------------------------------------------^

coloana

ORDINI ------------------| S# P# QTY | |-----------------| | S1 P1 300 | | S1 P2 200 | rand--------->| S1 P3 400 | | S2 P1 300 | | S2 P2 400 --|----camp | S3 P3 200 | -------------------

Abordarea relationala Principiile modelului relational au fost pentru prima data expuse de Dr. E. F.Codd,care in iunie 1970 a publicat un articol numit 'Un model relational de date pentru marile banci de date'.In acest articol Dr. Codd a propus modelul 'relational' pentru sistemele de baze de date. Baza de date relationala este perceputa de utilizatorii sai ca o colectie de tabele bidimensionale care sunt usor de inteles.Sunt doar patru concepte de inteles:

tabele coloane randuri campuri

Modelul relational imita procesele unei ramuri a algebrei cunoscuts sub numele de 'Algebra relationala'. Aceste procese implica:

o colectie de obiecte cunoscute sub numele de RELATII o multime de operatori ce actioneza asupra relatiilor pentru a produce noi relatii.

O Relatie poate fi inteleasa ca o Tabela.Modificarea datelor este reali- zata prin operatiile relationale aplicate asupre tabelelor.
RESTRICTIE ------------------------------------------| | | | | | |#########################################| | |

| | | | |#########################################| | | |#########################################| | | | | -------------------------------------------

PROIECTIE

------------------------------------------| ### ######## | | ### ######## | | ### ######## | | ### ######## | | ### ######## | | ### ######## | | ### ######## | | ### ######## | | ### ######## | | ### ######## | | ### ######## | | ### ######## | -------------------------------------------

Operatori relationali Operatorii relationali sunt definiti mai jos: Relatia Descrierea Restrictia este o operatie care preia si afiseaza datele din relatie.Este posibil sa se afiseze toate randurile sau doar randurile care indeplinesc o conditie sau mai multe conditii .Aceasta este de multe ori numita 'submultime orizontala' Proiectia este operatia care afiseaza anumite coloane din relatie si de aceea este numita 'submultime verticala'. Produs este rezultatul obtinut cand randurile a doua multimi de date sunt concatenate conform conditiilor specificate. Join este rezultatul obtinut cand randurile a doua multimi de date sunt concatenate conform conditiilor specificate.

Reuniunea afiseaza toate randurile care apar in una ,in cealalta sau in ambele din cele doua relatii. Intersectia afiseaza toate randurile care apar in ambele din cele doua relatii. Diferenta afiseaza randurile care apar numai intr-o singura relatie (SQL utilizeaza operatorul minus ).

PRODUS -------------------------------------| SMITH | | CLERK | | SMITH | CLERK | | JONES | produs | MANAGER|------>| SMITH | MANAGER | | ADAMS | ---------| | | ----------| JONES | CLERK | | JONES | MANAGER | | | | | ADAMS | CLERK | | ADAMS | MANAGER | ------------------JOIN --------------------------------| CLARK | 10 | | 10 | ACCOUNTING | | MILLER | 10 | J | 20 | RESEARCH | | SMITH | 20 |-->| 30 | SALEH | | TURNER | 30 | | 40 | OPERATIONHS| --------------------------------------------------------------| CLARK | 10 | 10 | ACCOUNTING| | MILLER| 10 | 10 | ACCOUNTING| | SMITH | 20 | 20 | RESEARCH | | TURNER| 30 | 30 | SALES | -------------------------------

Proprietati ale bazelor de date relationale


O baza de date relationala apare ca o colectie de relatii(tabele) catre utilizator. Formatul coloanei/randului este familiar si usor pentru vizualizarea datelor . Exista o multime de operatori pentru partitionarea si combinarea relatiilor(selectia,proiectia,produsul,joinul,uniunea, intersectia, diferenta). Nu sunt pointeri expliciti;conexiunile sunt facute numai pe baza datelor. Limbajul utilizat pentru interogarea bazei de date este non-procedural si similar limbii engleze. Utilizatorul nu specifica calea de acces si nu are nevoie sa stie cum este informatia aranjata fizic. Comenzile pentru refacerea datelor si acelea pentru realizarea schimbarilor in baza de date sunt incluse intr-un singur limbaj SQL.

Exista o independenta totala a datelor.

Proprietatile relatiilor tabelare O singura tabela are urmatoarele proprietati:


Nu exista randuri duplicate Nu exista nume de coloana duplicate Ordinea randurilor este neimportanta Ordinea coloanalor este neimportanta Valorile sunt atomice(nedecompozabile).

CAPITO LU L2
INTRODUCERE IN SQL
Acest capitol realizeaza o introducere in limbajul de interogare utilizat pentru a accesa o baza de date Oracle. Multimea comenzilor SQL sunt conturate ca blocuri de interogare de baza.In particular, noi discutam declaratiile SQL folosite la:

executia calculelor specificarea alternativa a capetelor de coloana concatenarea coloanelor sortarea rindurilor introducerea criteriilor de cautare.

Privire de ansamblu asupra SQL Un sistem de management al bazei de date necesita un limbaj de interogare pentru a permite utilizatorului sa acceseze datele.SQL (limbaj de interogare structurata) este limbajul utilizat de majoritatea sistemelor de baza de date relational. Limbajul SQL a fost dezvoltat intr-un prototip de sistem de management a bazelor de date relationale - System R -de IBM la mijlocul anilor 1970.In 1979, Corporatia Oracle introduce prima implementare a SQL in varianta comerciala. Trasaturi caracteristice SQL

SQL este prezentat in limba engleza. Foloseste cuvintele select, insert,delete ca parti ale setului de comenzi. SQL este un limbaj neprocedural :specifica ce informatii doresti,nu cum sa le obtii.Cu alte cuvinte SQL nu iti cere sa specifici metoda de acces la date.Toate cererile SQL folosesc optimizarea cererilor- o parte a RDBMS- pentru a determina rapid remedierea datelor specifi- cate.Aceste trasaturi usureaza obtinerea rezultatelor dorite. Procesarea SQL asupra inregistrarilor nu se poate face decit asupra unei singure inregistrari la un moment dat.Cea mai comuna forma a unui set de inregistrari este un tabel. SQL poate fi folosit de un sir de utilizatori incluzand DBA, programatori de aplicatii ,personal de management si multe alte tipuri de utilizatori. SQL pune la dispozitie comenzi pentru o varietate de tascuri incluzand: o date interogate o inserarea,extragerea si stergerea rindurilor intr-un tabel. o crearea,modificarea si stergerea obiectelor de tip baza de date o controlul accesului la baza de date si la obiectele de tip baza de date. o garantarea consistentei bazei de date

La inceput sistemele de management a bazei de date a utilizat un limbaj separat pentru fiecare categorie in parte.SQL le-a unificat pe toate acestea intr-un singur limbaj. SQL a devenit un limbaj standard industrial pentru bazele de date relatio- nale . Institutul National American de Standarde(ANSI) a adoptat SQL ca limbaj standard pentru RDBMS in anul 1986.Organizatia Internationala de Standarde (ISO) a adoptat deasemenea SQL ca limbaj standard pentru RDBMS.Toate RDBMS-urile suporta unele forme de SQL si toti vinzatorii de RDBMS intentioneaza sa se alinieze la standardele ANSI.

Setul de comenzi SQL


Comanda + Descriere: SELECT

este comanda cea mai utilizata ; este folosita pentru obtinerea datelor din bazele de date INSERT aceste trei comenzi sunt utilizate pentru a introduce noi UPDATE rinduri,pentru a schimba rindurile existente si stergerea DELETE rindurilor nedorite din tabelele bazelor de date respective. (Ele sunt cunoscute in ansamblu ca DML sau comenzi ale limbajului de manipulare a datelor.) CREATE aceste trei comenzi sunt utilizate dinamic pentru a crea , ALTER utiliza si sterge orice structura de date,de exemplu,tabele, DROP expuneri ,indecsi.(Ele sunt cunoscute sub numele colectiv DDL sau comenzi ale limbajelor de definire a datelor). GRANT aceste doua comenzi sunt utilizate pentru a da sau a lua REVOKE drepturile de acces pentru bazele de date si structurile din Oracle. N.B. Acestea sunt o parte a comenzilor SQL. Pentru o lista mai completa de comenzi se recomanda - Manualul de Referinta a Limbajului SQL- .

Scrierea comenzilor SQL

Cand scriem comenzi SQL ,este important sa ne reamintim cateva reguli simple pentru construirea unor declaratii valide care sunt si usor de citit si de editat:

Comenzile SQL pot fi pe una sau mai multe linii. Clauzele sunt uzual plasate pe linii separate. Tabelarea poate fi folosita. Cuvintele de comanda nu pot fi separate pe mai multe linii. Comenzile SQL nu sunt 'case sensitive'. O comanda SQL este introdusa la promptul SQL si liniile subsecventelor sunt numarate. O singura declaratie poate fi considerata curenta cat timp ea este in buffer si poate fi rulata intr-un numar de moduri : o plasand un punct si virgula(;) la sfarsitul ultimei clauze. o plasand un punct si virgula /slash la ultima linie in buffer. o plasand un slash(/) la promptul SQL. o scriind un R[UN] (comanda SQL) la promptul SQL.
Fiecare din urmatoarele declaratii sunt valide: SELECT * FROM EMP; SELECT * FROM EMP ; SELECT * FROM EMP; In acest manual comenzile SQL sunt sparte in clauze pentru claritate.

Blocul de interogare de baza Declaratia SELECT regaseste informatia din baza de date implementand toti operatorii din algebra relationala . In cele mai simple forme trebuie sa contina: 1. O clauza SELECT ,care listeaza coloanele pentru afisare astfel incat este esentiala o Proiectie. 2. O clauza FROM care specifica tabela implicata.

Pentru a lista toate numerele departamentelor,numele angajatilor si numarul managerilor in tabela EMP introduceti urmatoarele: SELECT FROM DEPTNO -----20 30 30 20 30 30 10 20 10 30 20 30 20 10 DEPTNO,ENAME,MGR EMP; ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER MGR ----7902 7698 7698 7839 7698 7839 7839 7566 7698 7788 7698 7566 7782

De remarcat ca numele coloanelor sunt separate prin spatiu.


Este posibil sa selectam toate coloanele din tabela prin specificarea unui asterix ('*') dupa cuvantul SELECT . SELECT FROM EMPNO ----7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 ENAME ------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD * EMP; JOB MGR ------- ---CLERK 7902 SALESMAN 7698 SALESMAN 7698 MANAGER 7839 SALESMAN 7698 MANAGER 7839 MANAGER 7839 ANALYST 7566 PRESIDENT SALESMAN 7698 CLERK 7788 CLERK 7698 ANALYST 7566 HIREDATE SAL --------- --------13-JUL-83 800.00 15-AUG-83 1,600.00 26-MAR-84 1,250.00 31-OCT-83 2,975.00 05-DEC-83 1,250.00 11-JUN-84 2,850.00 14-MAY-84 2,450.00 05-MAR-84 3,000.00 09-JUL-84 5,000.00 04-JUN-84 1,500.00 04-JUN-84 1,100.00 23-JUL-84 950.00 05-DEC-83 3,000.00 COMM DEPTNO ------- -----20 300.00 30 500.00 30 20 1.400.00 30 30 10 20 10 .00 30 20 30 20

Alte elemente in clauza SELECT Este posibil sa se includa si alte elemente in clauza SELECT.

Expresii aritmetice Alias-uri de coloane Coloane concatenate Literali

Toate aceste optiuni ajuta utilizatorul sa ceara date si sa le manipuleze in functie de scopurile interogarii ; de exemplu,executia calculelor,legarea coloanelor impreuna,sau afisarea sirurilor de litere din text. Expresii aritmetice O expresie este o combinatie de una sau mai multe valori,operatori si functii care sa evalueaza la o valoare. Expresiile aritmetice pot contine nume de coloane ,valori numerice constante si operatori aritmetici:
Operatori --------+ * / SELECT FROM Descriere --------adunare scadere inmultire impartire ENAME, SAL*12, COMM EMP;

Daca expresia aritmetica contine mai mult decat un operator, prioritatile sunt *,/,la inceput,apoi +,- (de la stanga la dreapta pentru operatorii de aceeasi prioritate). In urmatorul exemplu,inmultirea (250*12) este evaluata prima;apoi valoarea salariului este adunata la rezultatul multiplicarii(3000). Astfel pentru randul lui SMITH avem :800+3000=3800.
SELECT ENAME,SAL + 250 * 12 FROM EMP;

Parantezele pot fi utilizate pntru specificarea ordinii de executie a operatorilor ,daca,de exemplu ,adunarea e dorita inainte de inmultire:
SELECT ENAME,(SAL + 250) * 12

FROM

EMP;

Aliasuri de coloana Cand se afiseaza rezultatul unei interogari,SQL*Plus in mod normal utilizeaza numele coloanelor selectate ca titlu.In multe cazuri acest nume poate fi criptic sau fara inteles. Puteti schimba un titlu de coloana utilizand un 'ALIAS'. Un alias de coloana da unei coloane un nume de titlu alternativ la iesire. Specificati aliasul dupa coloana in lista selectata.Prin default, titlurile alias vor fi fortate la litere mari si nu pot contine blankuri,numai daca aliasul este inclus intre ghilimele(" "). Pentru a afisa titlul de coloana ANNSAL pentru salariul anual insemnand SAL*12,utilizati un alias de coloana:
SELECT FROM ENAME,SAL*12 ANNSAL,COMM EMP;

Odata definit ,un alias poate fi utilizat de comenzile SQL care sunt tratate in capitolele 10 si 11. Nota: Intr-o declaratie SQL ,un alis de coloana poate fi utilizat numai in clauza SELECT. Operatorul de concatenare Operatorul de concatenare (||) permite coloanelor sa fie legate cu alte coloane,expresiilor aritmetice sau valorilor constante sa creeze o expresie de caractere. Coloanele din cealalta parte a operatorului sunt combinate pentru a obtine o singura coloana.

Pentru a combina EMPNO si ENAME si sa se dea aliasul EMPLOYEE expresiei, introduceti:


SELECT FROM EMPNO||ENAME EMP; EMPLOYEE

EMPLOYEE ------------------------------------------------------7369SMITH 7499ALLEN 7521WARD 7566JONES 7654MARTIN 7698BLAKE 7782CLARK 7788SCOTT 7839KING 7844TURNER 7876ADAMS 7900JAMES 7902FORD 7934MILLER

Literali Un literal este orice caracter ,expresie ,numar inclus in lista lui SELECT care nu este un nume de coloana sau un alias de coloana. Un literal in lista lui SELECT este reprezentat de fiecare rand returnat la iesire.Sirurile de literali dintr-un text cu un format oarecare pot fi incluse in rezultatul interogarii si sunt tratate ca o coloana lista selectata. Literalii de tip data calendaristica si caracter pot fi inchisi intre ghilimele simple(');literlalii de tip numar nu au nevoie de ghilimele simple('). Urmatoarea declaratie contine literali selectati prin concatenare si printr-un alias de coloana:
SELECT FROM EMPNO||'-'||ENAME EMPLOYEE, 'WORKS IN DEPARTMENT', DEPTNO EMP; DEPTNO -----20

EMPLOYEE 'WORKS IN DEPARTMENT' ------------------ -------------------7369-SMITH WORKS IN DEPARTMENT

7499-ALLEN 7521-WARD 7566-JONES 7654-MARTIN 7698-BLAKE 7782-CLARK 7788-SCOTT 7839-KING 7844-TURNER 7876-ADAMS 7900-JAMES 7902-FORD 7934-MILLER

WORKS WORKS WORKS WORKS WORKS WORKS WORKS WORKS WORKS WORKS WORKS WORKS WORKS

IN IN IN IN IN IN IN IN IN IN IN IN IN

DEPARTMENT DEPARTMENT DEPARTMENT DEPARTMENT DEPARTMENT DEPARTMENT DEPARTMENT DEPARTMENT DEPARTMENT DEPARTMENT DEPARTMENT DEPARTMENT DEPARTMENT

30 30 20 30 30 10 20 10 30 20 30 20 10

Tratarea valorilor nule Daca unui rand ii lipseste o valoare pentru o anumita coloana ,despre acea valoare se spune ca este nula. O valoare nula este o valoare care este sau incorecta,sau necunoscuta,sau inaplicabila.O valoare nula nu este la fel ca 'zero'.Zero este un numar.Valoarea nula ocupa un octet in reprezentarea interna. Valoarea nula este tratata corect de catre SQL. Daca orice valoare de coloana intr-o expresie este nula atunci rezultatul este nul.In urmatoarea declaratie numai Salesman are un rezultat al salariului:
SELECT FROM ENAME,SAL*12 + COMM ANNUAL_SAL EMP;

ENAME ANNUAL_SAL --------- ---------SMITH ALLEN 19500 WARD 15500 JONES MARTIN 16400 BLAKE CLARK SCOTT KING TURNER 18000 ADAMS JAMES FORD MILLER

Daca dorim sa obtinem un rezultat pentru toti angajatii,este necesar sa convertim valoarea nula la un numar . Noi folosim functia NVL pentru a converti o valoare nula la o valoare nenula. Folositi functia NVL pentru a converti valoarea nula de la declaratia precedenta la 0.
SELECT FROM ENAME, SAL*12+NVL(COMM,0) ANNUAL_SAL EMP;

ENAME ANNUAL_SAL --------- ---------SMITH 9600 ALLEN 19500 WARD 15500 JONES 35700 MARTIN 16400 BLAKE 34200 CLARK 29400 SCOTT 36000 KING 60000 TURNER 18000 ADAMS 13200 JAMES 11400 FORD 36000 MILLER 15600

NVL asteapta doua argumente: 1. o expresie 2. o valoare nenula De notat ca puteti folosi functia NVL pentru a converti un numar nul , data calendaristica sau sir de caractere la un alt numar , data calendaristica sau sir de caractere de acceasi lungime si de acelasi tip de date asteptate.
NVL(DATECOLUMN,'01-JAN-88') NVL(NUMBERCOLUMN,9) NVL(CHARCOLUMN,'STRING')

Prevenirea selectiei rindurilor duplicate

Daca nu se indica altfel, SQL*Plus afiseaza rezultatul unei interogari fara eliminarea intrarilor duplicate . Pentru a lista toate numerele de departament din tabela EMP, introduceti:
SELECT FROM DEPTNO -----20 30 30 20 30 30 10 20 10 30 20 30 20 10 DEPTNO EMP;

Clauza DISTINCT Pentru eliminarea valorilor duplicate din rezultat, includeti restrictia DISTINCT in comanda SELECT. Pentru a elimina valorile duplicate afisate in exemplul urmator introduceti:
SELECT FROM DEPTNO -----10 20 30 DISTINCT EMP; DEPTNO

Coloane multiple pot fi specificate dupa restrictia DISTINCT si restrictia DISTINCt afecteaza toate coloanele selectate.

Pentru a afisa valorile distincte ale lui DEPTNO si JOB,introduceti:


SELECT FROM DEPTNO -----10 10 10 20 20 20 30 30 30 DISTINCT DEPTNO,JOB EMP; JOB --------CLERK MANAGER PRESIDENT ANALYST CLERK MANAGER CLERK MANAGER SALESMAN

Aceasta afiseaza o lista a tuturor combinatiilor diferite de ocupatie si numere de departamente. De notat ca restrictia DISTINCT poate sa fie referita numai o singura data si trebuie sa urmeze imediat dupa cuvantul de comanda SELECT. Clauza ORDER BY In mod normal ordinea rindurilor intoarse in rezultatul unei cereri este nedefinita .Clauza ORDER BY poate fi utilizata pentru a sorta rindurile. Daca o folosim, clauza ORDEY BY trebuie sa fie intotdeauna ultima in declaratia SELECT. Pentru a sorta dupa ENAME, introduceti:
SELECT FROM ORDER BY ENAME --------ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING ENAME,JOB,SAL*12,DEPTNO EMP ENAME; JOB SAL*12 DEPTNO ------- -------- -----CLERK 13200 20 SALESMAN 19200 30 MANAGER 34200 30 MANAGER 29400 10 ANALYST 36000 20 CLERK 11400 30 MANAGER 35700 20 PRESIDENT 60000 10

MARTIN MILLER SCOTT SMITH TURNER WARD

SALESMAN CLERK ANALYST CLERK SALESMAN SALESMAN

15000 15600 36000 9600 18000 15000

30 10 20 20 30 30

Ordonarea de default a datelor


Ordinea sortarii de default este ascendenta:

Valorile numerice cele mai mici primele Valorile de tip date calendaristice cele mai mici primele. Valorile de tip caracter in ordinea alfabetica.

Inversarea ordinii de default


Pentru a inversa aceasta ordine cuvintul de comanda DESC este specificat dupa numele coloanei in clauza ORDER BY. Pentru a inversa ordinea coloanei HIREDATE, deci datele cele mai tirzii sa fie afisate primele,introduceti:
SELECT FROM ORDER BY ENAME --------JAMES KING BLAKE TURNER ADAMS CLARK WARD SCOTT MARTIN FORD MILLER JONES ALLEN SMITH ENAME,JOB,HIREDATE EMP HIREDATE DESC; JOB --------CLERK PRESIDENT MANAGER SALESMAN CLERK MANAGER SALESMAN ANALYST SALESMAN ANALYST CLERK MANAGER SALESMAN CLERK HIREDATE --------23-JUL-84 09-JUL-84 11-JUN-84 04-JUN-84 04-JUN-84 14-MAY-84 26-MAR-84 05-MAR-84 05-DEC-83 05-DEC-83 21-NOV-83 31-OCT-83 15-AUG-83 13-JUN-83

Ordonarea dupa mai multe coloane


Este posibil sa se ordoneze dupa mai multe coloane.Limita este numarul de coloane din tabela.In clauza ORDER BY se specifica coloanele pentru ordonat separate prin virgula.Daca una sau toate coloanele trebuie sa fie inversate specificati DESC dupa fiecare coloana. Pentru a ordona dupa doua coloane si afisa in ordinea inversa a salariului, introduceti:
SELECT FROM ORDER BY DEPTNO -----10 10 10 20 20 20 20 20 30 30 30 30 30 30 DEPTNO,JOB,ENAME EMP DEPTNO,SAL DESC; ENAME ------KING CLARK MILLER SCOTT FORD JONES ADAMS SMITH BLAKE ALLEN TURNER WARD MARTIN JAMES

JOB -----------PRESIDENT MANAGER CLERK ANALYST ANALYST MANAGER CLERK CLERK MANAGER SALESMAN SALESMAN SALESMAN SALESMAN CLERK

Pentru a ordona dupa o coloana nu este necesar sa o avem SELECT-ata.

ORDER BY si valorile nule


In Oracle7,valorile nule sunt afisate ultimele pentru secventele ascendente si sint raportate primele cind rindurile sunt sortate in ordine descendenta. Atentie: Clauza ORDER BY este utilizata intr-o interogare cind se doreste sa se afiseze rindurile intr-o ordine specifica .Fara clauza ORDER BY randurile sunt returnate intro ordine convenita de ORACLE si va trebui sa ne bazam pe el- ordinea determinata

fiind consistenta de la cerere la cerere.De notat ca ordinea de afisare a rindurilor nu influenteaza ordinea interna a rindurilor asa cum sunt stocate in tabela. Clauza WHERE Clauza WHERE corespunde operatorului 'Restrictie' din algebra relationala. Contine o conditie pe care rindurile trebuie sa o indeplineasca in ordinea afisarii lor. Clauza WHERE ,daca este folosita , trebuie sa urmeze clauzei FROM :
SELECT FROM WHERE coloane tabela anumite conditii sunt intilnite

Clauza WHERE poate compara valori in coloana ,valori literale,expresii aritmetice sau functii. Clauza WHERE asteapta trei elemente: 1. Un nume de coloana 2. Un operator de comparatie 3. Un nume de coloana, constanta sau lista de valori. Operatorii de comparatie sunt utilizati in clauza WHERE si pot fi impartiti in doua categorii: logici si SQL. Operatorii logici Acesti operatori verifica urmatoarele conditii:
Operator -------= > >= < <= Semnificatie -----------egal cu mai mare decit mai mare sau egal mai mic decit mai mic sau egal

Sirurile de caractere si datele calendaristice in clauza WHERE

Coloanele din ORACLE pot avea urmatoarele tipuri:caracter,numar sau data calendaristica. Sirurile de caractere si datele calendaristice din clauza WHERE trebuie sa fie inchise in ghilimele simple('). Sirurile de caractere trebuie sa se supra- puna cu valoarea coloanei daca nu, trebuie modificate de o functie. Utilizati "Functii pe Caractere" din capitolul 4. Pentru a afisa numele,numerele,ocupatia si departamentele tuturor functionarilor, introduceti:
SELECT FROM WHERE ENAME, EMPNO, JOB, DEPTNO EMP JOB = 'CLERK'; JOB DEPTNO ------- -----CLERK 20 CLERK 20 CLERK 30 CLERK 10

ENAME EMPNO --------- ----SMITH 7369 ADAMS 7876 JAMES 7900 MILLER 7934

Pentru a gasi toate numele de departamente cu numerele de departament mai mare ca 20 ,introduceti:
SELECT FROM WHERE DNAME ---------SALES OPERATIONS DNAME, DEPTNO DEPT DEPTNO >20; DEPTNO -----30 40

Compararea unei coloane cu alta in cadrul aceluiasi rand


Puteti compara o coloana cu o alta coloana in acelasi rand,la fel ca si cu o valoare constanta. De exemplu ,presupunem ca dorim sa obtinem acei angajati al caror comision est mai mare decat salariul lor:
SELECT ENAME, SAL, COMM

FROM WHERE ENAME -----MARTIN

EMP COMM> SAL; SAL -------1,250.00 COMM -------1,400.00

Operatori SQL Sint patru operatori SQL care opereaza pe toate tipuril de date:
Operatori SQL Operator -------BETWEEN..AND... IN(list) LIKE IS NULL Semnificatie -----------intre doua valori(inclusiv) compara cu o lista de valori compara cu un model de tip caracter est o valoare nula

Operatorul BETWEEN Realizeaza teste pentru valori intre,si inclusiv,o valoare minima si o valoare maxima. Presupunind ca dorim sa vedem angajatii ai caror salariu este intre 1000 si 2000:
SELECT FROM WHERE ENAME,SAL EMP SAL BETWEEN 1000 AND 2000;

ENAME SAL ------- ---------ALLEN 1,600.00 WARD 1,250.00 MARTIN 1,250.00 TURNER 1,500.00 ADAMS 1,100.00 MILLER 1,300.00

De notat ca valorile specificate sunt inclusive si ca limita minima trebuie specificata prima. Operatorul IN Testeaza valorile dintr-o lista specificata. Presupunem ca dorim sa gasim angajatii care au unul din cele trei numere de marca(MGR):
SELECT FROM WHERE EMPNO ----7369 7788 7876 7902 ENAME ----SMITH SCOTT ADAMS FORD EMPNO, ENAME, SAL, MGR EMP MGR IN (7902,7566,7788); SAL MGR --------- ----800.00 7902 3,000.00 7566 1,100.00 7788 3,000.00 7566

Daca, caracterele sau datele calendaristice sunt utilizate,ele trebuie introduse intre ghilimele(' '). Operatorul LIKE Uneori nu se cunosc valorile exacte pe care le cautam.Utilizand operatorul LIKE este posibil sa selectam randurile care se potrivesc cu un model specificat de caractere.Operatia de petter-matching a caracterelor poate fi asemanata cu o cautare 'wild-card'.Doi simboli se pot utiliza la construirea sirului de cautare.
Simbol -----% Reprezentare -----------orice secventa de zero sau mai multe caractere un singur caracter oarecare

Pentru a lista toti angajatii al caror nume incepe cu un S,introduceti:


SELECT FROM WHERE ENAME ENAME EMP ENAME LIKE 'S%';

-------SMITH SCOTT

Caracterul '_' poate fi utilizat pentru cautarea unui anumit numar de carac- tere. De exemplu pentru a lista toti angajatii care au un nume exact de patru caractere lungime:
SELECT FROM WHERE ENAME ----WARD KING FORD ENAME EMP ENAME LIKE '____';

Semnele '%' si '_'pot fi utilizate in orice combinatie de caractere. Operatorul IS NULL Operatorul IS NULL face teste specifice pentru valorile care sunt NULL.
SELECT FROM WHERE ENAME -----KING MGR ---ENAME,MGR EMP MGR IS NULL;

Negarea expresiilor
Urmatorii operatori fac teste de negatie: Operator --------!= ^= <> NOT NUMECOL= NOT NUMECOL> Operatori SQL Operator -------NOT BETWEEN Descriere --------nu se afla intre doua valori date Descriere ---------diferit de(VAX,UNIX,PC) diferit de(IBM) diferit de(toate o/s) diferit de mai mic sau egal

NOT IN NOT LIKE IS NOT NULL

nu se afla intr-o lista data de valori diferit de sirul nu este o valoare nula

Pentru a gasi angajatii ai caror salariu nu este intr-un interval,introdu- ceti:


SELECT FROM WHERE ENAME --------SMITH JONES BLAKE CLARK SCOTT KING JAMES FORD ENAME,SAL EMP SAL NOT BETWEEN 1000 AND 2000; SAL -------800.00 2,975.00 2,850.00 2,450.00 3,000.00 5,000.00 950.00 3,000.00

Pentru a afla acei angajati a caror meserie nu incepe cu M,introduceti: SELECT FROM WHERE ENAME -------SMITH ALLEN WARD MARTIN SCOTT KING TURNER ADAMS JAMES FORD MILLER ENAME,JOB EMP JOB NOT LIKE 'M%'; JOB -------CLERK SALESMAN SALESMAN SALESMAN ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK

Pentru a afla toti angajatii care au un manager(MGR),introduceti: SELECT FROM WHERE ENAME,MGR EMP MGR IS NOT NULL;

ENAME MGR ------- ----SMITH 7902 ALLEN 7698 WARD 7698 JONES 7839 MARTIN 7698

BLAKE CLARK SCOTT TURNER ADAMS JAMES FORD MILLER

7839 7839 7566 7698 7788 7698 7566 7782

Nota: Daca o valoare NULL este utilizata intr-o comparatie ,atunci operatorul de comparatie trebuie sa fie IS sau IS NOT NULL. Daca acesti operatori nu sunt uti lizati si valoarea NULL este comparata,atunci rezultatul este intotdeauna FALSE De exemplu, COMM!=NULL este intotdeauna falsa.Rezultatul este fals deoarece o valoare NULL poate sa nu fie egala sau diferita cu orice alta valoare alta decat NULL. De notat ca o astfel de eroare nu este semnalata,rezultatul fiind intotdea- una fals.

Interogarea datelor cu conditii multiple


Operatorii AND sau OR pot fi utilizati pentru a compune expresii logice. Predicatul AND este adevarat numai daca ambele conditii sunt 'adevarate'; predicatul OR este adevarat daca cel putin una din conditii este 'adevarata'. In urmatoarele doua exemple,conditiile sunt aceleasi,dar predicatele difera Priviti cum rezultatul este dramatic modificat.
Pentru a gasi toti functionarii care castiga intre 1000 si 2000,introduceti: SELECT FROM WHERE AND EMPNO,ENAME,JOB,SAL EMP SAL BETWEEN 1000 AND 2000 JOB = 'CLERK'; SAL -------1,100.00 1,300.00

EMPNO ENAME JOB ---------- -------7876 ADAMS CLERK 7934 MILLER CLERK

Pentru a afla toti angajatii care sunt si functionari si/sau

functionari care castiga intre 1000 si 2000,introduceti: SELECT FROM WHERE OR EMPNO ----7369 7499 7521 7654 7844 7876 7900 7934 ENAME -------SMITH ALLEN WARD MARTIN TURNER ADAMS JAMES MILLER EMPNO,ENAME,JOB,SAL EMP SAL BETWEEN 1000 AND 2000 JOB = 'CLERK'; JOB ------CLERK SALESMAN SALESMAN SALESMAN SALESMAN CLERK CLERK CLERK SAL -------800.00 1,600.00 1,250.00 1,250.00 1,500.00 1,100.00 950.00 1,300.00

Puteti combina AND sau OR in acceasi expresie logica. Cand AND sau OR apar in aceeasi clauza WHERE, toti operatorii AND sunt evaluati mai intai si apoi toti operatorii OR. Vom spune ca operatorii AND au o precedenta mai mare decat OR. Deoarece AND are o precedenta mai mare decat OR urmatoarea declaratie SQL intoarce toti managerii cu salarii peste 1500$ si toti vanzatorii.
SELECT FROM WHERE AND OR EMPNO ----7499 7521 7566 7654 7698 7782 7844 EMPNO,ENAME,JOB,SAL,DEPTNO EMP SAL> 1500 JOB = 'MANAGER' JOB = 'SALESMAN'; JOB -------SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER SALESMAN SAL DEPTNO -------- -----1,600.00 30 1,250.00 30 2,975.00 20 1,250.00 30 2,850.00 30 2,450.00 10 1,500.00 30

ENAME ------ALLEN WARD JONES MARTIN BLAKE CLARK TURNER

Daca doriti sa selectati toti managerii si vanzatorii cu salarii peste 1500$ puteti introduce: SELECT FROM WHERE AND OR EMPNO,ENAME,JOB,SAL,DEPTNO EMP SAL >1500 (JOB = 'MANAGER' JOB = 'SALESMAN');

EMPNO ENAME JOB SAL DEPTNO ----- ------ --------- -------- -----7499 ALLEN SALESMAN 1,600.00 30

7566 7698 7782

JONES BLAKE CLARK

MANAGER MANAGER MANAGER

2,975.00 2,850.00 2,450.00

20 30 10

Parantezele specifica ordinea in care operatorii vor fi evaluati. In al doilea exemplu operatorul OR este evaluat inaintea operatorului AND.

TIPURI DE DATE CARACTER SI CONDITII

WHERE ENAME = 'SCOTT'

ENAME (VARCHAR2) ___________ | | | SCOTT V V| | ___| | SCOTT|____ | | | MILLER | | | ~~~~ ~~ ~~~

Oracle nu face umplerea cu blancuri la compararea cu coloanele VARCHAR2

WHERE ENAME = 'SCOTT'

ENAME (CHAR) -----------| | | SCOTT V V| | ....| | SCOTT|V V| | |. | | MILLER| V| ~~~~ ~~~~ ~~

Oracle face umplerea cu blancuri la compararea cu coloanele CHAR.

Tipurile de date caracter si conditii Tipurile de baza ale datelor stocate intr-o tabela oracle sunt:caracter, valoare numerica sau data calendaristica.Vom discuta toate variantele in detaliu mai

tarziu.De cate ori rezultatele unei conditii implica date de tip caracter, acestea pot varia in functie de tipul coloanei;ORACLE inzestreaza coloanela cu tipul CHAR pentru valori de lungime fixa si cu tipul VARCHAR2 pentru valori de lungime variabila.

Pentru coloanele cu tipul VARCHAR2 ,Oracle nu umple sirul de comparare si de aceea va face o potrivire exacta.In primul exemplu,doar un singur rand este intors pentru conditia:
WHERE ENAME = 'SCOTT'

cand un alt rand stocat in coloana ENAMe are mai multe caractere decat sirul de comparat. Pentru coloanele cu tipul CHAR ,oricum,Oracl face umplere cand valorile coloanelor sunt initial stocate,facandu-le pe toate de aceeasi lungime. Aceeasi conditie va intoarce ambele randuri pentru SCOTT ,indiferent de cate spatii de sfarsit au fost adaugate cand valorile au fost stocate in tabela. Oracle umple cu blancuri sirul de comparat in cel deal doilea caz si de aceea spatiile stocate sunt nesemnificative. Precedenta operatorilor Toti operatorii sunt aranjati intr-o ierarhie ceea ce le determina precedenta .Intr-o expresie operatiile sunt executate in ordinea precedentei lor de la mare la mica. Cand operatorii au precedenta egala atunci ei se evalueaza de la stanga la dreapta. 1. Toti operatorii de comparatie si SQL au precedenta egala: =,!=,<,>,<=,>=,BETWEEN...AND,IN,LIKE,IS NULL. 2. NOT(pentru a inversa rezultatul unei expresii logice.De ex: WHERE not(sal>2000)) 3. AND 4. OR.

De fiecare data cand sunteti in dubiu despre care dintre doua operatii vor fi executate mai intai cand o expresie este evaluata, sunteti liberi sa utilizati parantezele pentru a clarifica semnificatia dorita si pentru a va asigura ca SQL*Plus face ceea ce doriti. Sa presupunem ca doriti sa gasiti toti managerii, din orice departament,si toti functionarii din departamentul 10:
SELECT * FROM EMP WHERE JOB='MANAGER' OR (JOB = 'CLERK' AND DEPTNO = 10);

Parantezele de deasupra sunt necesare, AND are o precedenta mai mare decat OR ,dar ele clarifica semnificatia expresiei.

SELECT-Sumar
Urmatoarele clauze sunt inchise in comanda SELECT:
SELECT FROM WHERE ORDER BY [DISTINCT] [*,coloana alias],...] tabela conditie(ii) [coloana,expr] [ASC/DESC];

SELECT selecteaza cel putin o coloana Alias poate fi folosit pentru coloanele din lista selectata * desemneza toate coloanele DISTINCT

poate fi utilizat pentru eliminarea duplicatelor FROM Tabela desemneaza tabela din care provin coloanele WHERE restrictioneaza cererea la randurile care indeplinesc o conditie.Poate contine valori de coloane,expresii si literali AND/OR poate fi utilizat intr-o clauza WHERE pentru a construi conditii mai complexe. AND are prioritate peste OR. () pot fi utilizate pentru a forta prioritatea ORDER BY intotdeauna apare la sfarsit .Specifica ordinea de sortare.Una sau mai multe coloane pot fi specificate aici. ASC ordinea ascendenta este ordinea de sortar ( implicita) si nu trebuie specificat. DESC inverseaza ordinea de sortare de default si trebuie specificat dupa un nume de coloana. Clauzele pot fi introduse pe linii separate in buffer si tabelarea este utilizata pentru claritate si in editare. Logarea la SQL*Plus

Aceasta sectiune explica cum sa ne logam la SQL*Plus si liniile de iesire ale tipurilor de comenzi ce pot rezulta in cadrul sau. SQL*Plus SQL*Plus este un program scris de Corporatia Oracle,ce produce un mediu pentru comenzile SQL ce pot fi tastate direct sau rulate dintr-un fisier de comanda.In plus ,comenzile SQL pot fi derivate.Ele sunt folosite pentru:

formatarea rezultatelor setarea optiunilor editarea si stocarea declaratiilor SQL

Odata ce v-ati logat la sistemul vostru de operare,sunt 3 moduri pentru a va loga la SQL*Plus: 1. SQLPLUS o Veti vedea dupa aceasta un mesaj ca acesta: o SQL*Plus: Version 3.1.1 Production on Mon Oct 4 1993 Copyright (c) 1992,Oracle Corporation,California,USA. All rights reserved. Enter Username: o Introduceti numele vostru de user si apasati RETURN: SQL*Plus va afisa promptul :"Enter Password:". Introduceti parola voastra si apasati din nou RETURN. o Pentru protectia voastra ,parola nu va apare pe ecran. SQL*Plus va afisa promptul sau: SQL> o Aceasta indica linia de comanda .Acolo sunt doua feluri de comenzi si puteti introduce pe acesta linie de comanda:comenzi SQL sau comenzi SQL*Plus. 2. SQLPLUS username o Veti fi indemnati sa va dati parola. 3. SQLPLUS username/password o Veti fi logati la SQL*Plus.In acest caz parolz v a fi afisata. Alegeti metoda pe care o preferati.

Editarea declaratiilor SQL utilizand comenzi SQL*Plus 1. Cand veti introduce o comanda SQL,aceasta este stocata intr-o zona de memorie utilizata de buferul SQL si ramane acolo pana ce veti introduce o noua comanda. 2. Daca apasati [RETURN] inainte de a completa o comanda,SQL*Plus va afisa un numar de linie. 3. Terminatorul pentru declaratiile SQL este un ';'. 4. Cat timp declaratia SQL este in bufer,sunt cateva operatii de editare directe care pot fi executate utilizand comenzi SQL*Plus:

Comanda Abrevierea ROL ---------------------------------------------------------------------APPEND text A text adauga 'text' la sfarsitul liniei curente. CHANGE C/old/new schimba vechiul text cu noul text in linia curenta. CHANGE C/text/ sterge 'text'-ul din linia curenta CLEAR BUFFER CL BUFF sterge toate liniile din buferul SQL. DEL sterge linia curenta. INPUT I insereaza un numar nedefinit de linii. INPUT I text insereaza o linie constituita din 'text'-ul respectiv LIST L listeaza toate liniile din buferul SQL. LIST n Ln listeaza o linie (specificata de n) LIST m, n L m n listeaza un numar de linii(de la m la n). RUN R afiseaza si executa comanda SQL curenta din buffer. / executa comanda SQL care este curenta in bufer.

Diversitatea comenzilor SQL*Plus Comenzile SQL (precum SELECT) sunt mijloace de acces la date prin kernelul Oracle.Comenzile SQL sunt utilizate in special pentru controlul mediului, formatarea rezultatelor interogarilor si controlul fisierelor.Comenzile identificate aici sunt amestecate si trebuie sa le folositi in urmatoarele exercitii.

Comenzile SQL sunt introduse la promptul SQL> pe o linie ,ele nu vor deschide un buffer. Comanda + Descriere SAVE numefis permite salvarea intr-un fisier a continutului buferului SQL. GET numefis incarca continutul unui fisier salvat in prealabil in buffer. START numefis ruleaza un fisier de comanda salvat in prealabil. Fisierele de comanda sunt tratate in capitolul 10. ED numefis utilizeaza un editor de default pentru a edita continutul unui fisier salvat. EXIT paraseste SQL*Plus.

Capitolul 2 Exercitii-Introducere in SQL


Aceste exercitii intentioneaza sa dezvaluie toate subiectele neobservate la o lectura anterioara.Daca aveti timp incercati intrebarea 13.
Workshop 1. Selectati toate informatiile din tabela SALGRADE. GRADE ----1 2 3 LOSAL ----700 1201 1401 HISAL ----1200 1400 2000

4 5 2. EMPNO ----7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934

2001 3001

3000 9999

Selectati toate informatiile din tabela EMP. ENAME ----SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER JOB ------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK MGR ---7902 7698 7698 7839 7698 7839 7839 7566 7698 7788 7698 7566 7782 HIREDATE -------13-JUN-83 15-AUG-83 26-MAR-84 31-OCT-83 05-DEC-83 11-JUL-84 14-MAY-84 05-MAR-84 09-JUL-84 04-JUN-84 04-JUN-84 23-JUL-84 05-DEC-83 21-NOV-83 SAL COMM DEPTNO -------- ------- -----800.00 20 1,600.00 300.00 30 1,250.00 500.00 30 2,975.00 20 1,250.00 1,400.00 30 2,850.00 30 2,450.00 10 3,000.00 20 5,000.00 10 1,500.00 .00 30 1,100.00 20 950.00 30 3,000.00 20 1,300.00 10

14 inregistrari selectate. 3. Listati toti angajatii care au salariul intre 1000 si 2000. SAL -------1,600.00 1,250.00 1,250.00 1,500.00 1,100.00 1,300.00 6 inregistrari selectate. 4.Listati numerele de departament si numele in ordinea numelor departamentelor. DEPTNO -----10 40 20 30 5. DNAME ---------ACCOUNTING OPERATIONS RESEARCH SALES

ENAME DEPTNO ----- -----ALLEN 30 WARD 30 MARTIN 30 TURNER 30 ADAMS 20 MILLER 10

Afisati toate tipurile diferite de job-uri.

JOB --------ANALYST CLERK MANAGER PRESIDENT SALESMAN

6.

Listati detaliile angajatilor din departamentele 10 si 20 in ordinea alfabetica a numelui. ENAME ----ADAMS CLARK FORD JONES KING MILLER SCOTT SMITH JOB ----CLERK MANAGER ANALYST MANAGER PRESIDENT CLERK ANALYST CLERK MGR ---7788 7839 7566 7839 HIREDATE --------04-JUN-84 14-MAY-84 05-DEC-83 31-OCT-83 09-JUL-84 7782 21-NOV-83 7566 05-MAR-84 7902 13-JUN-83 SAL -------1,100.00 2,450.00 3,000.00 2,975.00 5,000.00 1,300.00 3,000.00 800.00 COMM DEPTNO ---- -----20 10 20 20 10 10 20 20

EMPNO ----7876 7782 7902 7566 7839 7934 7788 7369

8 inregistrari selectate. 7.Listati numele si ocupatiile tuturor functionarilor in departamentul 20. ENAME -----SMITH ADAMS 8. JOB ----CLERK CLERK

Afisati toti angajatii ai caror nume contine TH sau LL in interior.

ENAME -----SMITH ALLEN MILLER 9. Listati urmatoarele detalii pentru toti angajatii care au un manager. JOB -------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST SALESMAN CLERK CLERK ANALYST CLERK SAY -------800.00 1,600.00 1,250.00 2,975.00 1,250.00 2,850.00 2,450.00 3,000.00 1,500.00 1,100.00 950.00 3,000.00 1,300.00 13 inregistrari selectate. 10. ENAME Afiseaza numele si totalul remuneratiei pentru toti angajatii. REMUNERATION

ENAME -----SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT TURNER ADAMS JAMES FORD MILLER

------- -----------SMITH 9600 ALLEN 19500 WARD 15500 JONES 35700 MARTIN 16400 BLAKE 34200 CLARK 29400 SCOTT 36000 KING 60000 TURNER 18000 ADAMS 13200 JAMES 11400 FORD 36000 MILLER 15600 14 inregistari selectate. 11. Afiseaza toti salariatii care au fost angajati in anul 1983. DEPTNO -----20 30 20 30 20 10 HIREDATE --------13-JUN-83 15-AUG-83 31-OCT-83 05-DEC-83 05-DEC-83 21-NOV-830 6 inregistrari selectate. 12. Afisati numele,salariul anual si comisionul pentru toti vanzatorii ai caror salariu lunar este mai mare decat comisionul lor.Iesirea va fi ordonata dupa salariu , cele m ai mari primele. Daca doi sau mai multi angajati au acelasi salariu trebuie sortati dupa nume in odinea celor mai mari salarii. ENAME -----ALLEN TURNER WARD ANNUAL_SAL COMM ---------- -------19200 300.00 18000 .00 15000 500.00

ENAME ------SMITH ALLEN JONES MARTIN FORD MILLER

Incercati-va aptitudinile cu acesta. 13. Selectati informatiile dupa cum sunt selectate.

Cine,cand si cum -------------------------------------------------------------------SMITH HAS HELD THE POSITION OF CLERK IN DEPT 20 SINCE 13-JUN-83 ALLEN HAS HELD THE POSITION OF SALESMAN IN DEPT 30 SINCE 15-AUG-83 WARD HAS HELD THE POSITION OF SALESMAN IN DEPT 30 SINCE 26-MAR-84 JONES HAS HELD THE POSITION OF MANAGER IN DEPT 20 SINCE 31-OCT-83 MARTIN HAS HELD THE POSITION OF SALESMAN IN DEPT 30 SINCE 05-DEC-83 BLAKE HAS HELD THE POSITION OF MANAGER IN DEPT 30 SINCE 11-JUN-84 CLARK HAS HELD THE POSITION OF MANAGER IN DEPT 10 SINCE 14-MAY-84 SCOTT HAS HELD THE POSITION OF ANALYST IN DEPT 20 SINCE 05-MAR-84

KING TURNER ADAMS JAMES FORD MILLER

HAS HAS HAS HAS HAS HAS

HELD HELD HELD HELD HELD HELD

THE THE THE THE THE THE

POSITION POSITION POSITION POSITION POSITION POSITION

OF OF OF OF OF OF

PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK

IN IN IN IN IN IN

DEPT DEPT DEPT DEPT DEPT DEPT

10 30 20 30 20 10

SINCE SINCE SINCE SINCE SINCE SINCE

09-JUL-84 04-JUN-84 04-JUN-84 23-JUL-84 05-DEC-83 21-NOV-83

14 inregistrari selectate.

Capitolul 2 - Rezolvari

1. 2. 3.

SELECT FROM SELECT FROM SELECT FROM WHERE SELECT FROM ORDER BY SELECT FROM SELECT FROM WHERE ORDER BY SELECT FROM WHERE AND SELECT FROM WHERE OR SELECT FROM

* SALGRADE; * EMP; ENAME, DEPTNO, SAL EMP SAl BETWEEN 1000 AND 2000; DEPTNO, DNAME DEPT DNAME; DISTINCT JOB EMP; * EMP DEPTNO IN (10,20) ENAME; ENAME,JOB EMP JOB = 'CLERK' DEPTNO = 20; ENAME EMP ENAME LIKE '%TH%' ENAME LIKE '%LL%'; ENAME, JOB, SAL EMP

4.

5. 6.

7.

8.

9.

WHERE 10. 11. SELECT FROM SELECT FROM WHERE SELECT FROM WHERE AND JOB ORDER BY SELECT

MGR IS NOT NULL; ENAME, SAL*12+NVL(COMM,0) REMUNERATION EMP; ENAME, DEPTNO, HIREDATE EMP HIREDATE LIKE '%83'; ENAME, SAL*12 ANNUAL SAL, COMM EMP SAL >COMM = 'SALESMAN' SAL DESC, ENAME; ENAME|| ' HAS HELD THE POSITION OF '|| JOB|| ' IN DEPT '|| DEPTNO|| ' SINCE '|| HIREDATE "Who, what and when" EMP;

12.

13.

FROM

CAPITO LU L3

Rularea cererilor standard cu variabile substituite.


In acest capitol sunt descrise variabilele substituite.Variabilele substituite sunt folosite in declaratiile SQL si permite utilizarea valorilor specificate la rulare. Variabile in SQL *Plus In plus fata de variabilele pe care le vom vedea in limbajul PL/SQL, SQL*Plus este inzestrat cu doua tipuri de variabile ale sale: Variabile legate Utilizate pentru stocarea valorilor individuale ce pot fi asignate si citite in timpul rularii(vor fi discutate mai tarziu in acest curs).

Variabile substituite Utilizate pentru stocarea partilor de text de comanda ,care sunt "editate" in comenzi inainte de executia lor. Variabile substituite cu un singur ampersand. Puteti utiliza 'variabile substituite' intr-un fisier de comanda sau intr-o declaratie SQL pentru a reprezenta valori ce vor fi aflate la executie. O variabila poate fi vazuta ca un container in care valoarea este stocata temporar. O variabila substituita este prefixata de un singur ampersand(&) si o valoare care ii este asignata. Urmatoarea declaratie obliga utilizatorul sa dea un numar de departament la executie:

SELECT FROM WHERE

EMPNO,ENAME,SAL EMP DEPTNO = &DEPARTAMENT_NUMBER; 10

Enter value for department_number: EMPNO ----7782 7839 7934 ENAME SAL --------- ----------CLARK 2,450.00 KING 5,000.00 MILLER 1,300.00

Exemplul anterior utilizeaza conditia WHERE DEPTNO=10. Cu un singur ampersand utilizatorul este obligat sa dea o valoare de fiecare data cand comanda este executata,deoarece variabila nu este definita si de fiacare data valoarea introdusa nu este salvata . O valoare de tip caracter sau data are nevoie sa fie inchisa in ghilimele simple cand sunt introduse la cerere.Pentru a evita ghilimelele simple ce tre- buie sa fie introduse la executie ,puteti pune variabilele in ghilimele simple. In urmatoarea declaratie ,variabila este pusa intre ghilimele simple, asa ca ghilimele nu mai sunt necesare la introducerea valorii respective:

SELECT FROM WHERE

ENAME,DEPTNO,SAL*12 EMP JOB = ' <JOB_TITLE';

Enter value for job_title:MANAGER ENAME ----JONES BLAKE CLARK DEPTNO SAL*12 ------ -------20 35700 30 34200 10 29400

Cat timp variabila este variabila 'nedefinita' ,valoarea va fi ceruta de fiecare data cand declaratia este executata. Este posibil sa fie cerut numele unei coloane sau chiar numele unei tabele in timpul executiei. In urmatorul exemplu vi se cere o expresie aritmetica:

SELECT FROM

DEPTNO, <ARITHMETIC_EXPRESION EMP;

Enter value for arithmetic_expression:sal/12 DEPTNO -----20 30 30 20 30 30 10 20 10 30 20 30 20 10 SAL/12 ------66.6667 133.333 104.167 247.917 104.167 237.5 204.167 250 416.667 125 91.6667 79.1667 250 108.333

Variabile substituite cu dublu ampersand.

Daca variabila este prefixata de dublu ampersand(&&),SQL*Plus va cere valoarea pentru variabila doar o singura data .SQL*Plus stocheaza prima valoare furnizata si o foloseste din nou de fiecare data cand declaratia SQL este rulata

SELECT FROM WHERE

ENAME,DEPTNO,JOB EMP DEPTNO = &&DEPTNO_PLEASE;

Enter value for deptno_please: 10 ENAME ----CLARK KING MILLER DEPTNO -----10 10 10 JOB -------MANAGER PRESIDENT CLERK

Puteti folosi comanda SQL*Plus DEFINE pentru a determina daca variabila este deja definita.Daca variabila este deja definita se afiseaza valoarea asignata.

SQL> DEFINE DEFINE DEPTNO_PLEASE = "10" (CHAR)

Comanda DEFINE este de asemenea folosita pentru a crea o variabila utilizator. Substitutia datelor ca o comanda text Cand informatia dintr-o comanda substituita este introdusa intr-o co- manda inaintea executiei sale,variabila poate fi folosita pentru a inzestra orice parte a structurii comenzii exceptand numele insusi al comenzii.De exemplu:

SELECT WHERE

* FROM &CONDITION

SALGRADE

Enter value for CONDITION: losal>2000

Variabila CONDITION ,de mai sus,trece intreaga conditie a clauzei WHERE intr-o comanda.Mai departe intregul cod al comenzii(incepand cu cuvantul SELECT) poate fi trecut intr-o variabila.
SELECT &THE_REST;

Comanda DEFINE O valoare poate fi asignata unei variabile folosind comanda DEF[INE] a lui SQL*PLUS.Valoarea definita trebuie referita intr-o construc- tie SELECT sau un fisier de comenzi , prefixind numele variabilei cu &. Variabilele pot fi golite folosind UNDEF[INE]. In urmatorul exemplu , o variabila a fost definita folosind o expresie aritmetica ce calculeaza remuneratia. In urmatoarele constructii, variabila REM e referita de un numar de ori. Variabila e apoi golita fo- losind UNDEFINE.

SQL> DEFINE SQL>SELECT SQL>FROM SQL>ORDER BY SQL >undefine

REM ='SAL*12+NVL(COMM,0)' ENAME, JOB, <REM EMP <REM; REM

ENAME JOB SAL*12+NUL(COMM,0) -----------------------------------------------SMITH CLERK 9600 JAMES CLERK 11400 ADAMS CLERK 13200 WARD SALESMAN 15500 MILLER CLERK 15600 MARTIN SALESMAN 16400 TURNER SALESMAN 18000 ALLEN SALESMAN 19500 CLARK MANAGER 29400 BLAKE MANAGER 34200 JONES MANAGER 35700 SCOTT ANALYST 36000 FORD ANALYST 36000 KING PRESIDENT 60000

'' de la expresii sunt optionale , daca expresia nu contine spatii. Ghilimelele pot fi deasemenea folosite si sunt optionale dar folositoare daca expresia contine blancuri sau apostrofi. Pornirea unui fisier cu comenzi care contine substitutii de variabile Presupunind ca doriti o serie de rapoarte care sa listeze angajatii cu functii diferite - de exemplu , una pentru SALESMEN , una pentru CLERKS, una pentru MANAGERS si tot asa.Cunoasteti cum sa folositi substitutia de variabile pentru a obtine aceste rapoarte dintr-o singura constructie SELECT. Cu toate acestea , exista o tehnica alternativa pe care s-o folositi si anume sa scrieti constructia SELECT intr-un fisier si apoi folosind comanda START sa-l executati. Aceasta tehnica impune folosirea unor substitutii speciale de variabile. Exista 9 asemenea variabile si ele au intregii de la 1 la 9 ca nume. Pentru folosirea acestor variabile , puneti un '&' urmat de un intreg (1-9) in comanda SQL.Aceste variabile pot fi folosite de ori de cite ori doriti si in orice ordine . De fiecare data cind comanda e rulata, fiecare '&1' din comanda e inlocuit de primul parametru dupa START fisier, fiecare '&2' e inlo- cuit de al doilea parametru s.a.m.d. Pentru a crea un fisier de comenzi care ia un parametru specificind functia care trebuie afisata , introduceti:

SELECT EMPNO,ENAME,SAL FROM EMP WHERE JOB = ' <1' ; SQL>SAVE JOB1 SQL*PLUS intoarce mesajul:

Created file job1 Apoi rulati comanda cu parametrul 'CLERK'. SQL*PLUS inlocuieste variabila cu valoarea parametrului. SQL> EMPNO ----7369 7876 7900 START JOB1 ENAME ----SMITH ADAMS JAMES CLERK SAL --800 1100 950

Observati ca nu se pot folosi variabile cind executati o comanda cu RUN. Trebuie sa introduceti comanda in fisier si sa o rulati cu START comanda. Comanda ACCEPT Comanda ACCEPT permite unei variabile sa fie create si unei valori , care e introdusa sa fie memorata in ea. Aceasta variabila poate fi apoi referita in constructia SQL. ACCEPT este folosita deseori intr-un fisier de comenzi . Sunt citeva avantaje rezultate din folosirea lui ACCEPT pentru definirea substitutiei de variabile:

Tipurile de date pot fi verificate Prompturile pot fi mai explicative Valorile de raspuns pot fi ascunse

Sintaxa comenzii este:


ACC[EPT] variabila [ NUMBER/CHAR] [PROMPT/NOPROMPT 'text'][HIDE]

Sintaxa + Descrierea NUMBER/CHAR determina tipul variabilei.Daca valoarea introdusa este nevalida , va fi afisat un mesaj. PROMPT 'text' afiseaza daca text e specificat NOPROMPT face ACCEPT sa sara o linie asteptind intrarea HIDE suprima raspunsul utilizatorului. folositor pentru parole

Exemple

SQL> ACCEPT SALARY NUMBER PROMPT 'Salary figure :' Salary figure : 30000 SQL>ACCEPT PASSWORD CHAR PROMPT 'Password :' HIDE Password : SQL>ACCEPT COMM NUMBER NOPROMPT 500 SQL>DEFINE DEFINE SALARY =30000(NUMBER) DEFINE PASSWORD ="FREEBIES(CHAR) DEFINE COMM =500(NUMBER)

Rezumat Cind SQL*Plus intilneste &variabila: 1. Daca &variabila este deja definita, definitia deja existenta e folosita. 2. Daca & variabila nu e definita: o Utilizatorul e gata pentru definitie o Definitia furnizata de utilizator e apoi folosita o Definitia furnizata de utilizator e apoi pierduta Cind SQL Plus intilneste &&variabila : La fel ca pasii 1 si 2 de deasupra cu exceptia faptului ca valoarea variabilei e salvata. Observatie: &1 parametru e tratat ca &&. Pentru a afla daca o variabila e deja definita, folositi comanda DEF[INE]: DEF DEPARTAMENT daca e definit, da definitia lui DEPARTAMENT daca nu specifica 'nedefinit'

Pentru a defini o variabila , se poate folosi deasemenea comanda DEF[INE]. DEF COMM = Ghilimelele nu sunt necesare , dar ajuta daca "NVL (COMM,0)" expresia contine blancuri imbricate sau apostrofi. Cit timp ramin variabilele definite? Pina cind le UNDEF[ine] sau le redefinim sau pina iesim din SQL*PLUS. Alte 2 modalitati de definire a unei variabile:
SQL>ACCEPT variabila [tip] [PROMPT text][HIDE] SQL>COL[UMN] nume coloana /alias NEW_VALUE variabila (tratata in capitolul 11)

Cap.3 Exercitii -Rulind cereri cu parametrii.


Acest exercitiu va ofera oportunitatea sa creati fisiere care pot fi rulate interactiv , si care folosesc substitutii de variabile pentru crearea unor criterii de selectie. TEME
1. Generati o constructie prin care sa afisati angajatii cu date de angajare intre 2 date date. Rulati de 2 ori cererea. Modificati cererea pentru a folosi &&variabila .Rulati-o de citeva ori. Observati diferenta. 2. Obtineti o cerere care sa accepte o functie data. Pentru testare executati cererea de citeva ori. ENAME JOB SAL MGR DEPTINO ---------------------------------------------SCOTT ANALYST 3,000.00 7566 20 FORD ANALYST 3,000.00 7566 20 3. Definiti o variabila reprezentind expresia folosita pentru calculul remuneratiei anuale a angajatilor.Folositi variabile intr-o constructie care gaseste toti angajatii care cistiga 30.000 $ pe an sau mai mult. ENAME SAL*12+NUL(COMM,0) ----------------------------------

JONES BLAKE SCOTT KING FORD

35700 34200 36000 60000 36000

Cap.3 Solutii
1. SELECT FROM WHERE SELECT FROM WHERE SELECT FROM WHERE ENAME,HIREDATE EMP HIREDATE BETWEEN'&FIRST_DATE'AND'&LAST_DATE'; ENAME,JOB,SAL,MGR,DEPTNO EMP JOB ='&JOB'; ENAME,&REM EMP &REM >30000;

2.

3.

CAPITO LU L4
FUNCTII
In acest capitol, sunt introduse functiile.Functiile fac ca cererile de baza sa devina mai puternice si sint folosite pentru manipularea valorilor.Acest capitol acopera functiile numerice si pe caracter. Functiile de conversie si care opereaza pe tipuri de date sunt tratate in cap.5. In final functiile de grup sunt tratate in cap.6. INTRODUCERE Functiile sint folosite pentru manipularea datelor.Ele accepta unul sau mai multe argumente si intorc o valoare.Un argument este o constanta , variabila sau o referire de coloana.Formatul pentru functie este urmatorul: function_name(arg1,arg2,...)

Functiile pot fi folosite pentru:

a calcula a modifica datele individuale a manipula iesirea pentru grupuri de siruri a schimba formatul datelor pentru afisare a converti tipurile de date

Exista diferite tipuri de functii:


CHARACTER NUMBER DATE CONVERSION FUNCTION THAT ACCEPT ANY DATA TYPE AS INPUT GROUP

Unele functii opereaza pe un singur sir , altele pe grupuri de siruri. Cele mai folosite functii sunt prezentate in acest manual. Puteti recurge la SQL*Plus REFERENCE GUIDE pentru lista completa a functiilor. Functiile care se aplica unui singur sir vor fi discutate in capitolul prezent si in cap.5.Functiile de grup vor fi tratate in cap.6. Functii care se aplica unui singur sir.

actioneaza asupra fiecarui sir returnat din cerere intoarce un rezultat pentru fiecare sir asteapta unul sau mai multe argumente pot fi imbricate pot fi folosite acolo unde se folosesc variabile , coloane sau expresii , de exemplu , in constructiile :SELECT,WHERE,ORDER BY.

Explicatia notatiei: Notatie + Semnificatie: col un nume de coloana dintr-o baza de date value(valoare)

orice valoare literale(caracter/data/numar) n reprezinta un sir 'string' reprezinta caracterul string chars reprezinta un numar de caractere specificate date reprezinta o coloana date sau o valoare date Functii numerice si pe caracter Acestea accepta la intrare un caracter si poate returna si caracter si valoare numerica. Urmatoarele functii prezentate sunt: LOWER(col/value) forteaza caracterele alfa care sunt scrise cu litere mari sau mixte in caractere scrise cu litere mici. Pentru a afisa cu litere mici numele departamentului ca si sirul ' SQL COURSE' introduceti:
SELECT LOWER (DNAME),LOWER('SQL course') FROM DEPT; LOWER(DNAME) LOWER(SQL COURSE) -----------------------------------research sql course sales sql course operations sql course accounting sql course

UPPER(col/value) forteaza caracterele alfa care sunt scrise cu litere mici , sau o combinatie de litere mici si mari in caractere scrise cu litere mari. In urmatorul exemplu , functia UPPER e folosita pentru a forta intrarea utilizatorului la litere mari.
SELECT ENAME FROM EMP WHERE ENAME =UPPER('&ENAME');

Enter value for ename :smith ENAME ----SMITH

INITCAP(col/value) forteaza prima litera a fiecarui cuvint in litera mare Pentru afisarea numelor departamentelor si locatiile , introduceti:
SELECT FROM INITCAP(DNAME), DEPT; INITCAP(LOC)

INITCAP(DNAME) INITCAP(LOC) ---------------------------Accounting New York Research Dallas Sales Chicago Operations Boston

CONCAT(char 1,char2) intoarce char1 concatenat cu char2 (Alternativa a operatorului ||)


SELECT CONCAT (ename,job) "JOB" FROM EMP WHERE EMPNO =7900; JOB ----------JAMESCLERK

Functiile LPAD si RPAD aduc sirurile de caractere la o lungime specificata. LPAD(col/value,n,'string') adauga la coloana sau la valoarea literala spre stinga pina la lungimea totala n. Primele spatii sunt umplute cu 'string'. Daca 'string' e omis atunci sunt umplute cu blancuri.
SELECT LPAD(DNAME,20,'*'),LPAD(DNAME,20),LPAD(DEPTNO,20,'.') FROM DEPT; LPAD(DNAME,20,'*') LPAD(DNAME,20) LPAD(DEPTNO,20,'.') -----------------------------------------------------------************RESEARCH RESEARCH.....................20 ***************SALES SALES.....................30

**********OPERATIONS **********ACCOUNTING

OPERATIONS.....................40 ACCOUNTING.....................10

Observati ca a doua coloana e completata in stinga cu spatii, implicit , si ca a treia coloana este de tipul numar. RPAD(col/value,n,'string') adauga la coloana sau la valoarea literala spre dreapta pina la lungimea totala n. Ultimele pozitii sunt umplute cu 'string' sau daca acesta e omis cu blancuri.

SELECT RPAD(DNAME,20,'*'),RPAD(DNAME,20),RPAD(DEPTNO,20,'.') FROM DEPT; RPAD (DNAME,20,'*') RPAD(DNAME,20) RPAD(DEPTNO,20,'.') -----------------------------------------------------------RESEARCH************ RESEARCH 20.................. SALES*************** SALES 30.................. OPERATIONS********** OPERATIONS 40.................. ACCOUNTING********** ACCOUNTING 10..................

In acest caz a doua coloana are in dreapta blancuri puse implicit. Urmatoarele functii presupun ca caracterele din string sunt numerotate de la stinga la dreapta , incepind cu 1. SUBSTR(col/value,pos,n) intoarce un string de n caractere lungime dintr-o coloana sau valoare literala , incepind de la pozitia pos. Daca n e omis, e extras sirul din pozitia pos la sfirsit. Urmatorul exemplu afiseaza urmatoarele "substringuri":

4 caractere din literalul 'ORACLE' incepind de la al doilea caracter continutul lui DNAME incepind cu al doilea caracter 5 caractere din DNAME incepind cu al treilea caracter
SELECT SUBSTR('ORACLE',2,4),SUBSTR(DNAME,2), SUBSTR(DNAME,3,5) FROM DEPT; SUBSTR('ORACLE',2,4) SUBSTR(DNAME,2) SUBSTR(DNAME,3,5)

--------------------------------------------------------RACL ESEARCH SEARC RACL ALES LES RACL PERATIONS ERATI RACL CCOUNTING COUNT

Observati ca valorile sint aliniate la stinga.Aceasta deoarece SQL*Plus intotdeauna afiseaza de la stinga, implicit. INSTR(col/value,'string') gaseste pozitia caracterului in care apare prima data 'string'. INSTR(col/value,'string',pos,n) gaseste pozitia caracterului pentru a n-a aparitie a lui string in coloana sau valoarea literala incepind din pozitia pos.
SELECT DNAME,INSTR(DNAME,'A'), INSTR(DNAME,'ES'),INSTR(DNAME,'C',1,2) FROM DEPT; DNAME INSTR(DNAME,'A') INSTR(DNAME,'ES') INSTR(DNAME,'C',1,2) --------------------------------------------------------------------ACCOUNTING 1 0 3 RESEARCH 5 2 0 SALES 2 4 0 OPERATIONS 5 0 0

O folosire obisnuita a lui INSTR este de a determina daca inceputul utilizatorului contine un caracter particular sau mai multe. In exemplul anterior , de exemplu, expresia INSTR(DNAME,'ES') e 0 pentru ACCOUNTING deoarece acesta nu contine sirul dat. LTRIM si RTRIM sterg caracterele specificate din sir. LTRIM (col/value,'char/s') sterge de la stinga prima aparitie a caracterului specificat(sau o combinatie a caracterelor specificate). Daca nu e specificat nici un caracter sterge toate blancurile din stinga.
SELECT DNAME,LTRIM(DNAME,'A'),LTRIM(DNAME,'AS'), LTRIM(DNAME,'ASOP') FROM DEPT; DNAME LTRIM(DNAME,'A') LTRIM(DNAME,'AS') LTRIM(DNAME,'ASOP') ------------------------------------------------------------------RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES LES LES OPERATIONS OPERATIONS OPERATIONS ERATIONS

ACCOUNTING

CCOUNTING

CCOUNTING

CCOUTING

RTRIM (col/value,'char/s') sterge de la dreapta, aparitiile lui char (sau combinatie de caractere specificate) .Daca nu e specificat 'char/s' atunci sterge blancurile.
SELECT DNAME, RTRIM(DNAME,'G'),RTRIM(DNAME,'GHS') RTRIM(DNAME,'N') FROM DEPT; DNAME RTRIM(DNAME,'G') RTRIM(DNAME,'GHS') RTRIM(DNAME,'N') --------------------------------------------------------------RESEARCH RESEARCH RESEARC RESEARCH SALES SALES SALE SALES OPERATIONS OPERATIONS OPERATION OPERATIONS ACCOUNTING ACCOUNTIN ACCOUNTIN ACCOUNTING

RTRIM poate fi in mod particular folositor in a sterge blancurile de la sfirsit la coloane.De exemplu , presupunind ca in transferul datelor la tabela 'emp' blancurile au fost adaugate neintentionat dupa fiecare ENAME.Urmatoarea comanda va sterge toate blancurile finale:
UPDATE EMP SET ENAME =RTRIM(ENAME); Observatie: comanda UPDATE e tratata complet mai tirziu.

SOUNDEX(col/value) intoarce un sir de caractere reprezentind pronuntia(sunetul) cuvintului pentru fiecare coloana sau valoare literala.Aceasta functie intoarce o reprezentare fonetica a fiecarui cuvint si ne permite sa comparam cuvinte care sunt scrise diferit, dar se pronunta(suna) la fel.
SELECT FROM WHERE ENAME, SOUNDEX(ENAME) EMP SOUNDEX(ENAME) = SOUNDEX('FRED');

ENAME SOUNDEX(ENAME) ----------------------------FORD F630

LENGTH(col/value) intoarce numarul de caractere(sau digiti) din coloana sau din valoarea literala.
SELECT LENGTH('SQL COURSE'),LENGTH(DEPTNO),LENGTH(DNAME)

FROM DEPT; LENGTH('SQLCOURSE') LENGTH(DEPTNO) LENGTH(DNAME) ------------------------------------------------10 2 8 10 2 5 10 2 10 10 2 10

Observati ca LENGTH la fel ca si functia INSTR intoarce o valoare numerica. Functiile TRANSLATE si REPLACE sunt folosite pentru substitutia caracterelor. TRANSLATE(col/value,from,to) translateaza la iesire caracterele 'from' la cele 'to'.Mai mult de un caracter , se poate potrivi. Toate operatiile lui 'from' sunt inlocuite de corespondentul din 'to'. Daca caracterul corespunzator din 'to'nu e rezervat , caracterul din 'from'e sters(vezi functiile imbricate).
SELECT ,ENAME,TRANSLATE(ENAME,'C','P'),JOB TRANSLATE(JOB,'AR','IT') FROM EMP WHERE DEPTNO=10; ENAME TRANSLATE(ENAME,'C','P') JOB TRANSLATE(JOB,'AR','IT') ----------------------------------------------------------------CLARK PLARK MANAGER MINIGET KING KING PRESIDENT PTESIDENT MILLER MILLER CLERK CLETK

REPLACE(col/value,string,replacement_string) intoarce col/value cu orice aparitie a 'string-ului', inlocuita cu replacement_string.Daca 'replacement_string' e omis, toate operatiile lui 'string'sunt sterse.Daca sunt emise si 'string' si 'replacement_string'atunci se semnaleaza eroare.
SELECT JOB , REPLACE(JOB,'SALESMAN','SALESPERSON'), ENAME ,REPLACE(ENAME,'CO','PX') FROM EMP;

JOB REPLACE(JOB,'SALESMAN','SALESPERSON') ENAME REPLACE(ENAME,'CO','PX') -------------------------------------------------------------------ANALYST

ANALYST SALESMAN SALESMAN MANAGER

SCOTT SALESPERSON SALESPERSON MANAGER

SPXTT TURNER ALLEN CLARK

TURNER ALLEN CLARK

Functia REPLACE suplimenteaza functionalitatea furnizata de functia TRANSLATE.TRANSLATE furnizeaza caractere singulare , unul cite unul , pentru substitutie.REPLACE va permite sa substituiti un sir cu altul ca si sa stergeti un sir (daca nu specificati 'replacement _string'). Observati ca 'string' si 'replacement_string' pot fi de orice lungime. REPLACE poate sa faca si conversia caracter la caracter REPLACE('C', IP). FUNCTII IMBRICATE Functiile singulare aplicate liniilor(sirurilor) pot fi imbricate la orice adincime.Daca functiile sunt imbricate, ele sunt evaluate din interior spre exterior. Sa presupunem ca vreti sa aflati nr. de ori in care un caracter apare intr-un sir.Cum veti proceda? Puteti imbrica functiile LENGHT si TRANSLATE pentru a obtine rezultatul dorit. Urmatorul exemplu va permite sa numarati de cite ori apare S intr-un sir.

SELECT DNAME,LENGTH(DNAME),LENGTH(DNAME) LENGTH(TRANSLATE(DNAME,'AS,'A')) FROM DEPT; DNAME LENGTH(DNAME)LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A')) -------------------------------------------------------------------------RESEARCH 8 1 SALES 5 2 OPERATIONS 10 1 ACCOUNTING 10 0

Pasii pentru a obtine rezultatul sunt: 1. Folositi LENGTH pentru a identifica nr. de caractere din sir. 2. Apoi folositi TRANSLATE pentru a lua fiecare aparitie a lui S din sir.
3. 4. 5. 6. SELECT TRANSLATE(DNAME,'AS','A') FROM DEPT;

7. 8. 9. 10. 11. 12. 13. 14.

TRANSLATE(DNAME,'AS',A') -----------------------REEARCH ALE OPERATION ACCOUNTING

15. Observati ca A e inlocuit cu A si S nu are un caracter corespunzator cu care sa fie inlocuit . S e inlocuit cu nimic - e sters din sir. A serveste de plasare ? 16. Acum, scadeti din lungimea initiala a sirului pe cea din care am scos toate aparitiile lui S. LENGTH(DNAME)LENGTH(TRANSLATE(DNAME,'AS','A')) 17. Rezultatul e o valoare reprezentind nr. de aparitii ale lui S in sir. O tehnica alternativa este de a folosi functia REPLACE. 1. Folositi REPLACE pentru a sterge fiecare aparitie a lui S din sir. Valoarea intoarsa va reprezenta nr. de caractere care au ramas dupa ce S a fost sters. Cu alte cuvinte , o valoare minus nr. de operatii ale lui S in sir.
2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 14. 15. 16. 17. 18. 19. SELECT DNAME, LENGTH(DNAME), LENGTH(REPLACE(DNAME,'S')) FROM DEPT; DNAME LENGTH(DNAME) ENGTH(REPLACE(DNAME,'S')) ---------------------------------------------------ACCOUTING 10 10 RESEARCH 8 7 SALES 5 3 OPERATIONS 10 9

13. Apoi scadeti din lungimea totala , lungimea sirului fara S.


SELECT DNAME,LENGTH(DNAME), LENGTH(DNAME) LENGTH(REPLACE(DNAME,'S')) FROM DEPT;

DNAME LENGTH(DNAME) LENGTH(DNAME)LENGTH(REPLACE(DNAME,'S')) 20. -----------------------------------------------------------------21. ACCOUTING 10 0 22. RESEARCH 8 1 23. SALES 5 2 24. OPERATIONS 10 1 25.

26. Rezultatul e o valoare care reprezinta nr. de operatii ale lui S in sir .

FUNCTII NUMERICE Acestea accepta intrare numerica si intorc ca rezultat un numar. Aceasta sectiune descrie citeva din functiile numerice. ROUND(col/value,n) rotujeste coloana , expresie sau valoare la n zecimale. Daca n e omis nu are zecimale , daca e negativ , numarul din stinga punctului zecimal e rotunjit.
SELECT ROUND(45.923,1), ROUND(45.923), ROUND(45.323,1), ROUND(42.323,-1), ROUND(SAL/32,2)

FROM EMP WHERE DEPTNO =10; ROUND(45.923,1)ROUND(45.923)ROUND(45.323,1)Round(42.323,-1)ROUND(SAL/32,2) -----------------------------------------------------------------------45.9 46 45.3 40 76.56 45.9 46 45.3 40 156.23 45.9 46 45.3 40 40.63 TRUNC(col/value,n) trunchiaza coloana sau valoarea la n zecimale, sau daca nu e om is , fara zecimale.Daca n e negativ , numarul din stinga punctului zecimal e trunchiat la zero. SELECT TRUNC(45.923,1), TRUNC(45.923), TRUNC(45.323,1), TRUNC(42.323,-1), TRUNC(SAL/32,2)

FROM EMP WHERE DEPTNO= 10; TRUNC(45.923,1)TRUNC(45.923)TRUNC(45.323,1)TRUNC(42.323,-1)TRUNC(SAL/32,2) ---------------------------------------------------------------------------45.9 45 45.3 40 76.56 45.9 45 45.3 40 156.25 45.9 45 45.3 40 40.62 CEIL (col/value) gaseste cel mai mic coloana, expresie sau valoare. SELECT FROM WHERE intreg mai mare sau egal cu

CEIL(SAL),CEIL(99.9),CEIL(101.76),CEIL(-11.1) EMP SAL BETWEEN 3000 AND 5000;

CEIL(SAL) CEIL(99.9) CEIL(101.26) CEIL(-11.1) ------------------------------------------------3000 100 102 -11 5000 100 102 -11 3000 100 102 -11

FLOOR (col/value) gaseste cel mai mare intreg mai mic sau egal coloana expresie sau valoare. SELECT FLOOR(SAL), FLOOR(99.9),FLOOR(101.76),FLOOR(-11.1) FROM EMP WHERE FLOOR(SAL) BETWEEN 3000 AND 5000; FLOOR (SAL) FLOOR(99.9) FLOOR(101.76) FLOOR(-11.1) ----------------------------------------------------3000 99 101 -12 5000 99 101 -12 3000 99 101 -12 POWER(col/value,n) ridica coloana, expresia sau valoarea la puterea n. Poate fi negativa. SELECT FROM WHERE SAL,POWER(SAL,2), POWER(SAL,3), POWER(50,5) EMP DEPTNO=10;

cu

SAL POWER(SAL,2) POWER(SAL,3) POWER(50,5) ---------------------------------------------2450.00 6002500 14706125000 312500000 5000.00 25000000 125000000000 312500000 1300.00 1690000 2197000000 312500000 EXP(n) SELECT FROM EXP(4) -----54.59815 SQRT(col/value) gaseste radacina patrata a coloanei Daca col/value e NULL sau negativ intors rezultatul NULL. sau valorii. atunci e intoarce e ridicat la puterea n e=2.71828183. EXP(4) DUAL;

SELECT SAL, SQRT(SAL),SQRT(40), SQRT(COMM) FROM EMP WHERE COMM>0; SAL SQRT(SAL) SQRT(40) SQRT(COMM) ----------------------------------------------1600.00 40 6.32455532 17.3205081 1250.00 35.3553391 6.32455532 22.3606798 1250.00 35.3553391 6.32455532 37.4165739 SIGN(col/value) intoarce -1 daca e coloana, expresie sau valoare e un nr. negativ , intoarce 0 daca e zero,+1 daca e nr.pozitiv.

SELECT SAL -COMM,SIGN(SAL-COMM),COMM-SAL, SIGN(COMM-SAL) FROM EMP WHERE DEPTNO=30;

SAL-COMM SIGN(SAL-COMM) COMM-SAL SIGN(COMM-SAL) --------------------------------------------------1300 1 -1300 -1 750 1 -750 -1 - 150 -1 150 1 1500 1 -1500 -1 Frecvent , functia SIGN este folosita pentru a testa daca o valoare este mai mica ca , mai mare ca sau egala cu a doua valoare. Urmatorul exemplu tipareste toti mai mare decit comisionul lor. SELECT ENAME ,SAL,COMM FROM EMP WHERE SIGN (SAL-COMM)=1; ENAME SAL COMM ----------------------------ALLEN 1600 300 WARD 1250 500 TURNER 1500 0 ABS(col/value) gaseste valoarea absoluta a coloanei sau valorii. angajatii al caror salariu este

SELECT SAL,COMM,COMM-SAL,ABS(COMM-SAL),ABS(-35) FROM EMP WHERE DEPTNO =30; SAL COMM COMM-SAL ABS(COMM-SAL) ABS(-35) ------------------------------------------------------1600.00 300.00 -1300 1300 35 1250.00 500.00 -750 750 35 1250.00 1400.00 150 150 35 2850.00 35 1500.00 00 -1500 1500 35 950.00 35 MOD(value1,value2) SELECT FROM WHERE ORDER BY gaseste restul impartirii lui 'value1'la 'value2'. MOD(SAL,COMM), MOD(100,40)

SAL , COMM , EMP DEPTNO =30 COMM;

SAL COMM MOD(SAL,COMM) MOD(100,40) -------------------------------------------------------2,850.00 20 950.00 20 1,600.00 300.00 100 20 1,250.00 500.00 250 20 1,250.00 1,400.00 1250 20 1,500.00 00 1500 20

Alte citeva functii matematice: LOG(m,n) intoarce logaritmul cu baza m si argument n. SIN(n) intoarce sinusul lui n SINH(n) intoarce sinusul hiperbolic al lui n TAN(n) intoarce tangenta lui n TANH(n) intoarce tangenta hiperbolica a lui n COS(n) cosinus de n COSH(n) cosinus hiperbolic al lui n

Exercitii-cap.4- Folosirea functiilor


Aceste exercitii acopera folosirea functiilor nu doar in constructiile SELECT dar si in WHERE si ORDER BY. Daca sunt folosite aliasuri ale coloanelor in rezultat , folositi-le in constructia SELECT a propozitiei SQL. TEME
1. Listati pentru toti angajatii 15 % si exprimat ca un nr. de DEPTNO ENAME PCTSAL --------------------------20 SMITH 920 30 ALLEN 1840 30 WARD 1438 20 JONES 3421 30 MARTIN 1438 30 BLAKE 3278 10 CLARK 2818 20 SCOTT 3450 10 KING 5750 30 TURNER 1725 20 ADAMS 1265 30 JAMES 1093 20 FORD 3450 10 MILLER 1495 14 selectate. 2. Obtineti urmatoarea iesire: numele si salariul dolari. marit cu

EMPLOYEE_AND_JOB ---------------SMITH CLERK ALLEN SALESMAN WARD SALESMAN JONES MANAGER MARTIN SALESMAN BLAKE MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT TURNER SALESMAN ADAMS CLERK JAMES CLERK FORD ANALYST MILLER CLERK 3. Obtineti urmatoarea iesire EMPLOYEE -------SMITH(Clerk) ALLEN(Salesman) WARD(Salesman) JONES(Manager) MARTIN(Salesman) BLAKE(Manager) CLARK(Manager) SCOTT(Analyst) KING(President) TURNER(SAlesman) ADAMS(Clerk) JAMES(Clerk) FORD(Analyst) MILLER(Clerk) 4. Faceti o cautare pentru a obtine o lista functia 'job' specificata de utilizator. a angajatilor cu

Enter value for job :clerk EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----------------------------------------------------------7369 SMITH CLERK 7902 17-DEC-80 1000 20 7876 ADAMS CLERK 7788 12-JAN-83 1100 20 7900 JAMES CLERK 7698 03-DEC-81 1092.5 30 7934 MILLER CLERK 7782 23-JAN-82 1300 10 5. S- a descoperit ca nu toti angajatii din departamentul 30 sunt barbati .Obtineti urmatoarea iesire: ENAME DEPTNO JOB ---------------------------ALLEN 30 Salesperson WARD 30 Salesperson MARTIN 30 Salesperson BLAKE 30 Manager TURNER 30 Salesperson

JAMES

30

Clerk

SOLUTII Cap.4
1. SELECT 2. SELECT 3. SELECT 4. SELECT 5. SELECT DEPTNO,ENAME, ROUND(SAL*1.15) PCTSAL FROM EMP; RPAD(ENAME,10)||LPAD(JOB,10) EMPLOYEE_AND_JOB FROM EMP; ENAME ||'('||initcap(job)||')' EMPLOYEE FROM EMP; * FROM EMP WHERE UPPER(JOB)=UPPER('&JOB'); ENAME,DEPTNO,INITCAP (REPLACE(JOB,'SALESMAN','SALESPERSON')) JOB FROM EMP WHERE DEPTNO =30;

Capitolul 5
Alte functii singulare aplicate liniilor unei baze de date
In acest capitol vom trata functiile (de tip) referitoare la date calendaristice 'DATE', functiile de conversie si functii care accepta orice tip de data de intrare. Functiile de tip data calendaristica Aceste functii se aplica asupra datelor ORACLE. Toate functiile de tip data calendaristica intorc valoarea tipului DATE cu exceptia lui MONTHS_BETWEEN care intoarce o valoare numerica. Stocarea datelor calendaristice ORACLE ORACLE stocheaza datele calendaristice intr-un format numeric intern reprezentind:

Secolul Anul Luna Ziua Ora Minutele Secundele

Formatul implicit de afisare sau intrare pentru o data calendaristica e DD-MONYY.Datele calendaristice ORACLE pot varia intre 1 ian 4712 ien si 31 dec 4712 e.n Sysdate Sysdate intoarce data curenta si timpul.Puteti folosi SYSDATE la fel ca folosirea oricarui nume de coloana. De exemplu , puteti afisa data curenta selectind SYSDATE dintr-o tabela. Este obisnuit sa se selecteze SYSDATE dintr-o tabela 'dummy' numita DUAL. Tabela DUAL apartine utilizatorului 'SYS' si poate fi accesata de toti utilizatorii.Contine o singura coloana ,DUMMY si o linie cu valoarea 'x'. Tabela DUAL e folositoare cind doriti sa obtineti o singura valoare-de exemplu , valoarea unei constante , pseudo-coloane sau expresii care nu e derivata dintr-o tabela cu data 'user'. Pentru a afisa date curenta:
SELECT SYSDATE FROM SYS.DUAL;

Puteti selecta usor SYSDATE din EMP, dar 14 linii cu aceeasi SYSDATE vor fi intoarse , una pentru fiecare linie din tabela EMP. DUAL e preferata pentru ca e suficienta o singura linie intoarsa. Folosirea operatorilor aritmetici Pornind de la faptul ca data calendaristica e memorata ca un numar , e posibil sa se faca calcule cu date calendaristice, folosind operatori aritmetici ca + sau -.Puteti aduna sau scadea constante numerice ca si date calendaristice. Operatiile pe care le puteti face sunt: data + numar aduna un numar de zile la data, reintorcind o data calendaristica data - numar scade un numar de zile dintr-o data, producind o data calendaristica date - date

scade o data dintr-o data , obtinind un nr. de zile. date + numar/24 aduna un nr. de ore pentru a obtine o data calen- daristica.
SELECT FROM WHERE HIREDATE,HIREDATE+7, HIREDATE-7,SYSDATE - HIREDATE EMP HIREDATE LIKE '%JUN%';

HIREDATE HIREDATE+7 HIREDATE-7 SYSDATE-HIREDATE ------------------------------------------------------13-jun-83 20-jun-83 06-jun-83 1982.70628 11-jun-84 18-jun-84 04-jun-84 1618.70628 04-jun-84 11-jun-84 28-may-84 1625.70628 04-jun-84 11-jun-84 28-may-84 1625.70628

Scazind din SYSDATE ,HIREDATE din tabela EMP intoarce nr.de zile de la angajarea fiecarui om. MONTHS_BETWEEN(data1,data2) gaseste nr. de luni intre data1 si data2. Rezultatul poate fi pozitiv sau negativ. Daca data1 e mai tarzie decat data2 , REZULTATUL E POZITIV, daca data2 este mai tirzie decit data1 , REZULTATUL E NEGATIV.

SELECT FROM WHERE

MONTHS_BETWEEN (SYSDATE,HIREDATE), MONTHS_BETWEEN('01-jan-84','05-nov-88') EMP MONTHS_BETWEEN(SYSDATE,HIREDATE)>59;

MONTHS_BETWEEN(SYSDATE,HIREDATE) MONTHS_BETWEEN('01-jan-84','05-nov-88') ----------------------------------------------------------------------65.0873622 -58.129032 63 -58.129032 60.5067171 -58.129032 59.3454267 -58.129032 59.3454267 -58.129032 59.8292977 -58.129032 6 records selected

Partea neintreaga a rezultatului reprezinta o portiune dintr-o luna.

ADD_MONTHS(data,n) aduna n numar de luni calendaristice la 'data'. n trebuie sa fie intreg si poate fi si negativ.
SELECT HIREDATE, ADD_MONTHS(HIREDATE,3),ADD_MONTHS(HIREDATE,-3) FROM EMP WHERE DEPTNO =20; HIREDATE ADD_MONTHS(HIREDATE,3) ADD_MONTHS(HIREDATE,-3) ---------------------------------------------------------------13-jun-83 13-sep-83 13-mar-83 31-oct-83 31-jan-84 31-jul-83 05-mar-84 05-jun-84 05-dec-83 04-jun-84 04-sep-84 04-mar-84 05-dec-83 05-mar-84 05-sep-83

NEXT_DAY(data1,,char) data urmatoarei zile a saptaminii(char) urmind data1. Char trebuie sa fie un numar reprezentind o zi sau un caracter.
SELECT HIREDATE,NEXT_DAY(HIREDATE,'FRIDAY'),NEXT_DAY(HIREDATE,6) FROM EMP WHERE DEPTNO =10; HIREDATE NEXT_DAY(HIREDATE,'FRIDAY') NEXT_DAY(HIREDATE,6) -----------------------------------------------------------------14-may-84 18-may-84 18-may-84 09-jul-84 13-jul-84 13-jul-84 21-nov-83 25-nov-83 25-nov-83

LAST_DAY(data1) gaseste data reprezentind ultima zi a lunii care contine data 1.


SELECT SYSDATE,LAST_DAY(SYSDATE),HIREDATE,LAST_DAY(HIREDATE), LAST_DAY('15-FEB-88') FROM EMP WHERE DEPTNO =20; SYSDATE LAST_DAY(SYSDATE) HIREDATE LAST_DAY(HIREDATE) LAST_DAY('15-feb88') --------------------------------------------------------------------------04-DEC-89 31-DEC-89 17-DEC-80 31-DEC-80 29-FEB-88 o4-dec-89 31-dec-89 02-apr-81 30-apr-81 29-feb-88 04-dec-89 31-dec-89 09-dec-82 31-dec-82 29-feb-88 04-dec-89 31-dec-89 12-jan-83 31-jan-83 29-feb-88 04-dec-89 31-dec-89 03-dec-81 31-dec-81 29-feb-88

Functia ROUND poate fi aplicata pe date calendaristice. Round(data1) intoarce data1 cu timpul setat la 12:00AM(noaptea). Aceasta e folositor cind comparam date care au timpuri diferite. ROUND (data1,'MONTH') intoarce prima zi a lunii continind data1 daca data1 este in prima parte a lunii, altfel intoarce prima zi a urmatoarei luni. ROUND(data 1,' YEAR') intoarce prima zi a anului continind data1, daca data1 este in prima jumatate a anului, altfel intoarce prima zi a urmatorului an.
SELECT SYSDATE,ROUND(SYSDATE,'MONTH'),ROUND(SYSDATE,'YEAR') FROM SYS.DUAL; SYSDATE ROUND(SYSDATE,'MONTH') ROUND(SYSDATE,'YEAR') ---------------------------------------------------------04-dec-89 01-dec-89 01-jan-90

TRUNC(data1,'char') gaseste prima zi a lunii care e continuta in data1, cind char='MONTH'.Daca char= 'YEAR', gaseste prima zi a anului care contine data1.
SELECT SYSDATE,TRUNC(SYSDATE,'MONTH'),TRUNC(SYSDATE,'YEAR') FROM SYS.DUAL; SYSDATE TRUNC(SYSDATE,'MONTH') TRUNC(SYSDATE,'YEAR') ----------------------------------------------------------o4-dec-89 01-dec-89 01-jan-89

TRUNC e folositor cind vreti sa stergeti timpul dintr-o data. Timpul component al zilei este sters implicit. Functii de conversie

SQL furnizeaza un numar de functii care controleaza conversiile datelor calendaristice.Aceste functii de conversie , convertesc o valoare de la un tip de data la alt tip. TO_CHAR(numar/data,{'fmt'}) converteste numar sau data la caractere in format 'fmt'. TO_NUMBER(char) converteste 'char' care contine un numar in 'NUMBER'. TO_DATE('char','fmt') converteste valoarea 'char' reprezentind o data calendaristica, intr-o valoare data in felul 'fmt' specificat. Daca fmt e omis , formatul e DD-MON-YY. TO_CHAR

Functia TO_CHAR este folosita frecvent pentru a schimba un format de data de la cel implicat la un format de afisare alternativ. TO_CHAR (data,'date picture') specifica ca data va fi convertita la un nou format de iesire. Pentru a converti date curente de la formatul implicit (DD-MON-YY) la un nou format 'date picture':
SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY') FROM SYS.DUAL; TO_CHAR (SYSDATE,'DAY,DDTHMONTHYYYY') ------------------------------------TUESDAY ,05TH SEPTEMBER 1989

Observati ca:

'Date picture', care trebuie incadrate de apostrofi poate contine orice format dintre cele tratate mai jos.Coloana si 'date picture' trebuie separate de virgula. DAY si MONTH la iesire sunt automat aduse la lungimea 9 adaugind blancuri. Pentru a sterge blancurile adaugate folositi prefixul FM(FILL MODE).

SELECT TO_CHAR (SYSDATE,'fmDAY,ddth Month YYYY')

FROM

SYS.DUAL;

TO_CHAR(SYSDATE,'FMDAY,DDTHMONTHYYYY') -------------------------------------Tuesday , 5th September 1989

FM poate fi folosit pentru a sterge zerourile de la inceput din formatul ddth ex:05TH este schimbat in 5th. Cazul in care 'date picture' este introdusa este cazul in care va fi afisata. TO_CHAR poate fi deasemenea folosita pentru extragerea timpului din zi , si afisarea lui intr-un format specificat. Pentru afisarea timpului dintr-o zi:
SELECT TO_CHAR (SYSDATE.'HH:MI:SS') FROM SYS.DUAL; TO_CHAR(SYSDATE,'HH:MI:SS') --------------------------08:16:24

Functia TO_CHAR este de asemenea folosita pentru conversia unei valori de tip data numerica la o valoare de tip data caracter.
TO_CHAR(numar,'number picture') SELECT TO_CHAR (SAL,'$9,999') FROM EMP; TO_CHAR(SAL,'$9,999') -------------------$1,000 $1,600 $1,250 $2,975

Observati ca formatul este optional.Daca'date picture' e omis, data este convertita la o valoare de tip caracter in format Oracle, implicit DD-MON-YY. Daca 'number picture ' nu e specificat, numarul e convertit intr-o valoare de tip caracter. Observati de asemenea ca formatele nu afecteaza actuala reprezentare interna a valorii coloanei.Ele afecteaza doar cum valoarea coloanei este afisata cind e regasita cu o constructie SELECT. Formate pentru date calendaristice

Elementele unui format de data calendaristica sunt: SCC or CC Secol;Prefixul 'S'face ca datele i.e.n. sa fie prefixate de'-'. YYYY or SYYYY An;Prefixul 'S' face ca datele i.e.n. sa fie prefixate de '-'. YYY or YY or Y Ultimele 3,2,1 cifre din an Y,YYY An cu virgula in pozitie specificata. SYEAR or YEAR An in litere ;Prefixul 'S' face ca pt.anii i.e.n. sa se puna '-'. BC or AD Indicatorul BC/AD(pt.i.e.n. sau e.n.). B.C.or A.D. Indicatorul BC/AD cu puncte. Q Sfert de an. MM Luna. MONTH Numele lunii adaugind blancuri pina la lungimea 9. MON

Numele lunii abreviat la 3 litere. WW or W Saptamina a anului sau a lunii. DDD or DD or D Zi a anului, lunii,saptaminii. DAY Numele zilei ,adaugind blancuri pina la lungimea de 9 caractere. DY Numarul zilei abreviat la 3 litere. J Nr.de zile din decembrie 31,4713 i.e.n. AM or PM Indicator meridian. A.M. or P.M. Indicator meridian cu puncte. HH or HH12 Ora din zi (1-12). HH24 Ora din zi (0-23). MI Minute. SS

Secunde. SSSSS Secunde dupa miezul noptii(0-86399). /.,etc. E reprodusa punctuatia in rezultat. "..." Sirul cu apostrofi reprodus in rezultat.

Prefixul de mai jos poate fi adaugat astfel: fm 'FILL mode'.Prefixind MONTH sau DAY, suprima blancurile, lasind un rezultat de lungime variabila ,FM va suprima zerourile de inceput din formatul ddth.Nu e folositor cu alte coduri.A doua aparitie a lui 'fm' pune blan- curile din nou. Sufixele de mai jos pot fi adaugate astfel: TH nr.ordinal(ex:''DDTH" transformat in "4TH"). SP nr.transformat in sir (ex.DDSP"pt"FOUR"). SPTH sau thsp confirma numerele ordinale cu transformarea numar- cadru (ex.DDSPTH pt.FOURTH).

Observatie: ? Codurile sunt case sensitive si vor afecta afisarea datelor calendaristice astfel:
DAY Day Month ddth ddTh MONDAY Monday July 14th 14th

Formatul de date RR Daca-l folositi in locul lui YY, secolul variaza in acord cu anul specificat cu 2 cifre si ultimii 2 digiti ai anului curent. Tabloul de mai jos rezuma comportamentul elementului RR.

FORMATUL DE DATE RR(ORACLE 7)


Pentru anii in alte secole
---------------------------------------------------------------------| | | Daca cei 2 digiti ai anului sint | | Daca cei --------------------------------------------------------| 2 digiti | | 0-49 50-99 | | ai anului --------------------------------------------------------| curent | | | | sunt | 0 | data intoarsa este data intoarsa este | | | | in secolul crt. in secolul anterior | | | 49 | celui crt. | | | ---------------------------------------------------------| | 50 | data intoarsa este data intoarsa este in| | | | in secolul dupa secolul crt. | | | 99 | cel crt. | ------------------------------------------------------------------------

EXEMPLE:
-------------------------------------------------------------| Anul crt. Valoarea formatata Anul interpretat | | (DD_ MON_RR) | -------------------------------------------------------------| 1994 27-oct-95 1995 | -------------------------------------------------------------| 1994 27-oct-17 2017 | -------------------------------------------------------------| 2001 27-oct-95 1995 | -------------------------------------------------------------| 2001 27-oct-17 2017 | --------------------------------------------------------------

Formatul pentru numere Elementele modelului pt.formatul de numere sunt:


Format Semnificatie Exemple -----------------------------------------------------------9 numere(nr.de 9 999999 1234 determina lung de afisare) 0 $ . , MI afis.zerourile de la inceput semnul dolar punct zecimal in pozitie specificata semnele minus la dreapta(valori negative) paranteze pentru numere negative 099999 $999999 999999.99 999,999 001234 $1234 1234.00 1,234

999999MI 999999PR

1234<1234>

PR EEEE

notatie stiintifica (formatul trebuie sa aiba 4E) 99.999EEEE inmultire cu 10 (n=numar de 9 dupa V) 9999V99

1.234E+03 123400

V B

afiseaza valori zero ca blancuri nu 0 B9999.99 1234.00 -----------------------------------------------------------------

Observatie: Formatele numerice afisate mai jos in tablou pot fi folosite cu comanda SQL*PLUSCOLUMN(vezi cap.10).
TO_NUMBER

In exemplul urmator , functia TO_NUMBER e folosita pentru a transforma un numar memorat sub forma unui caracter intr-un tip numar.

SELECT EMPNO, ENAME,JOB,SAL FROM EMP WHERE SAL>TO_NUMBER('1500');

TO_DATE

Pentru a afisa toti angajatii cu data angajarii 4 iulie 1984, puteti folosi functia TO_DATE:
SELECT EMPNO,ENAME, HIREDATE FROM EMP WHERE HIREDATE =TO_DATE('June 4,1984','Month dd, YYYY'); EMPNO ENAME HIREDATE -----------------------7844 TURNER 04-jun-84

Constanta e convertita intr-o data si apoi comparata cu valoarea HIREDATE. Functia TO_DATE e frecvent folosita pentru a transforma o valoare in ORACLE intrun format diferit de cel implicit. De exemplu , cind inserati o data , Oracle asteapta o data in formatul implicit DD_MON_YY. Daca nu vreti sa folositi formatul implicit , trebuie sa folositi functia TO_DATE si masca formatului dorit. De exemplu: Pentru a introduce in tabela EMP - o linie cu un format nestandard introduceti:
INSERT INTO EMP(EMPNO,DEPTNO,HIREDATE) VALUES(777,,20,TO_DATE('19/08/90','DD/MM/YY'));

Comanda INSERT e tratata in detaliu mai tirziu. Functii care accepta orice tip de data la intrare

DECODE

DECODE este cea mai puternica functie SQL. Aceasta faciliteaza interogarile, facind munca unui 'case' sau a unei constructii'if-thenelse'. Syntax:
DECODE (col/expression, search1,rezult1,[search2,rezult2,....,] default)

Col/expression e comparata cu fiecare valoare'search'si intoarce 'rezult' daca col/expression este egal cu valoarea 'search'. Daca nu e gasita nici o egalitate, functia DECODE intoarce valoarea 'default'.Daca valoarea'default' e omisa, NULL e intors pentru cazurile de nepotrivire.
ARGUMENTE

DECODE trebuie sa aiba minim 4 parametrii ca argumente. COL/EXPRESSION numele coloanei sau expresie pentru a fi evaluate SEARCH1 prima valoare pentru testare RESULT1 valoarea intoarsa daca se potriveste cu SEARCH1. SEARCH1 si RESULT1 pot fi repetate de cite ori e necesar-[SEARCH2, RESULT2,...] DEFAULT valoarea pentru a fi reintoarsa daca nu exista nici o potrivire. Observatie:

col/expression pot fi orice tip de data SEARCH poate fi acelasi tip ca expression /col Valoarea intoarsa este fortata la acelasi tip ca al treilea argument (result1)

Exemplul urmator decodifica tipurile 'CLERK'si' MANAGER';altele nu testate.Acestea devin implicite pentru UNDEFINE.
SELECT ENAME, JOB, DECODE(JOB,'CLERK','WORKER', 'MANAGER','BOSS', 'UNDEFINED') DECODED_JOB FROM EMP; ENAME JOB DECODED_JOB ------------------------------SMITH CLERK WORKER ALLEN SALESMAN UNDEFINED WARD SALESMAN UNDEFINED JONES MANAGER BOSS MARTIN SALESMAN UNDEFINED BLAKE MANAGER BOSS CLARK MANAGER BOSS SCOTT ANALYST UNDEFINED KING PRESIDENT UNDEFINED TURNER SALESMAN UNDEFINED ADAMS CLERK WORKER JAMES CLERK WORKER FORD ANALYST UNDEFINED MILLER CLERK WORKER

Pentru a afisa procentajele in functie de coloane GRADE din tabela SALGRADE:


SELECT GRADE, DECODE(GRADE,'1','15%' '2','10%', '3','8%', '5%')BONUS FROM SALGRADE; GRADE BONUS --------------1 15% 2 10% 3 8% 4 5% 5 5%

Acest exemplu ilustreaza ca valoarea intoarsa e fortata la tipul celui de al treilea argument, la folosirea functiei DECODE. Il sfatuim pe utilizator sa specifice ordinea in care informatia e afisata introducind o valoare la fiecare rulare:

select * from emp order by decode (&orderby, 1, sal, 2, ename, sal); Enter value for orderby:2 order by decode (2,1,sal,2,ename,sal) * ERROR at line 2:ORA -1722: invalid number

Observati ca aceata comanda produce o eroare fiindca tipul lui 'ename'(char) difera de cel al lui 'sal'(numar) care e al treilea argument. In exemplul de mai jos , dorim sa introducem salariul crescut in functie de meseria fiecarui angajat.
SELECT JOB,SAL,DECODE(JOB,'ANALYST',SAL*1.1, 'CLERK',SAL*1.15, 'MANAGER',SAL*0.95, SAL) DECODED_SALARY FROM EMP;

JOB SAL DECODED_SALARY -------------------------------CLERK 800 920 SALESMAN 1,600 1600 SALESMAN 1,250 1250 MANAGER 2,975 2826.25 SALESMAN 1,250 1250 MANAGER 2,850 2707.5 MANAGER 2,450 2327.5 ANALYST 3,000 3300 PRESIDENT5,000 5000 SALESMAN 1,500 1500 CLERK 1,100 1265 CLERK 950 1092.5 ANALYST 3,000 3300 CLERK 1,300 1495

NVL(col/value,val) converteste o valoare NULL la 'val' Tipul datei trebuie sa se potriveasca cu (col/value si val).
SELECT SAL*12+NVL(COMM,0),NVL(COMM,1000),SAL*12+NVL(COMM,1000)

FROM WHERE

EMP DEPTNO=10;

SAL*12+NVL(COMM,0) NVL(COMM,1000) SAL*12+NVL(COMM,1000) ---------------------------------------------------------29400 1000 30400 60000 1000 61000 15600 1000 16600

GREATEST(col(value1,col/value2....) -intoarce cel mai mare dintr-o lista de valori.Toate 'col/value2' sint convertite la tipul col/value1 inaintea comparatiei.

SELECT FROM WHERE

GREATEST(1000,2000),GREATEST(SAL,COM) EMP DEPTNO=30;

GREATEST(1000,2000) GREATEST(SAL,COMM) ------------------------------------------2000 1600 2000 1250 2000 1400 2000 2000 1500 2000 6 records selected.

LEAST(col/value1,col/value2....) intoace cea mai mica valoare. Toate col/value 2 sint convertite la tipul col/value1 inainte de comparatie.
SELECT FROM WHERE LEAST(1000,2000),LEAST(SAL,COMM) EMP DEPTNO=30;

LEAST(1000,2000) LEAST(SAL,COMM) --------------------------------1000 300 1000 500 1000 1250 1000 1000 0 1000 6 records selected.

VSIZE(col/value) - intoarce nr.de biti din reprezentarea interna ORACLE a lui col/value'.

SELECT DEPTNO,VSIZE(DEPTNO),VSIZE(HIREDATE),VSIZE(SAL), VSIZE(ENAME)

FROM WHERE

EMP DEPTNO=10;

DEPTNO VSIZE(DEPTNO) VSIZE(HIREDATE) VSIZE(SAL) VSIZE(ENAME) --------------------------------------------------------10 2 7 3 5 10 2 7 2 4 10 2 7 2 6

FUNCTII IMBRICATE REVIZITATE


Amintim ca functiile pot fi imbricate la orice nivel si functiile interioare sunt evaluate intii mergind pina la functia cea mai exterioara.Este bine sa se tina nr. de paranteze de inceput (deschidere) si de sfirsit(inchidere).Trebuie sa fie acelasi numar din fiecare tip de paranteze. Functiile de mai jos sint imbricate si sint evaluate dupa cum urmeaza.
SELECT ENAME,NVL(TO_CHAR(MGR),'UNMANAGEABLE') FROM EMP WHERE MGR IS NULL; ENAME NVL(TO_CHAR(MGR),'UNMANAGEABLE') ----------------------------------------------KING UNMANAGEABLE

1. Coloana MGR e convertita la caracter cu functia TO_CHAR 2. Functia NVL inlocuieste NULL mgr cu un sir de caractere 'UNMANAGEABLE'. Functiile imbricate pot fi de asemenea folosite pentru a afisa date de vineri , la doua luni de azi in formatul Day dd Month YYYY.
SELECT SYSDATE, TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'Day dd Month YYYY') FROM SYS.DUAL; SYSDATE TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'DAYDDMONTHYYYY') -----------------------------------------------------------------------04-dec-89 Friday 09 Februarie 1990

1. Functia ADD_MONTHS aduna 2 luni la luna curenta(decembrie) 2. 3. Functia NEXT_DAY gaseste vineri la 2 luni de SYSDATE 4. 5. Functia TO_CHAR converteste coloana data la tipul CHAR pentru 6. afisarea in formatul Day dd Month YYYY 7.

Capitolul 5 Exercitii - Functii

Aceste exercitii acopera functiile pe cele din capitolul 4.

discutate in

acest capitol, ca si

1. 2. 3. 4. 5.

Afisati pt.fiecare angajat din departamentul 20 numele si data angajarii. Fiti siguri ca specificati aliasul 'DATE_HIRED' dupa expresia voastra altfel coloana respectiva va fi pierduta. Se foloseste o lungime de 80 de caractere care este lungimea implicita 6. pentru coloane de caracter. 7. ENAME DATE_HIRED 8. --------------------------9. SMITH June,Thirteenth 1983 10. JONES October,Thirty-First 1983 11. SCOTT March,Fifth 1984 12. ADAMS June,Fourth 1984 13. FORD December,Fifth 1983 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Afisati pt.fiecare angajat numele, data angajarii si adaugati un an la data angajarii pt.fiecare. Ordonati iesirea in ordinea crescatoare a datei angajarii la care s-a adaugat un an. ENAME HIREDATE REVIEW --------------------------SMITH 13-jun-83 13-jun-84 ALLEN 15-aug-83 15-aug-84 JONES 31-oct-83 31-oct-84 MILLER 21-nov-83 21-nov-84 MARTIN 05-dec-83 05-dec-84

27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.

FORD 05-dec-83 SCOTT 05-mar-84 WARD 26-mar-84 CLARK 14-may-84 TURNER 04-jun-84 ADAMS 04-jun-84 BLAKE 11-jun-84 KING 09-jun-84 JAMES 23-jun-84 14 records selected

05-dec-84 05-mar-85 26-mar-85 14-may-85 04-jun-85 04-jun-85 11-jun-85 09-jun-85 23-jun-85

Afisati lista angajatilor , pentru fiecare afisind salariul daca acesta e mai mare ca 1500, daca e egal cu 1500 afiseaza 'On Target', daca e mai mic decit 155, afiseaza 'BELOW 1500'. 42. ENAME SALARY 43. -----------------44. ADAMS Below 1500 45. ALLEN 1600 46. BLAKE 2850 47. CLARK 2450 48. FORD 3000 49. JAMES Below 1500 50. JONES 2975 51. KING 5000 52. MARTIN Below 1500 53. MILLER Below 1500 54. SCOTT 3000 55. SMITH Below 1500 56. TURNER On Target 57. WARD Below 1500 58. 59. 14 records selected 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. Scrieti o cerere care intoarce ziua din saptamina (ex:MONDAY), pt. fiecare data introdusa in formatul DD.MM.YY. Enter value for anydate:12.11.88 DAY -----------------------SATURDAY

Scrieti o cerere pt. a determina cit timp au fost angajati ai companiei .Folositi DEFINE pentru a evita repetarea tipului functiilor. Enter value for employee_name:king ENAME LENGTH OF SERVICE

80. 81. 82. 83.

------------------------------KING 4 YEARS 4 MONTHS

84. Dindu-se un sir in formatul 'nn/nn', verificati daca primele 85. si ultimele 2 caractere sunt numere si daca caracterul din 86. mijloc este '/'. 87. Afisati expresia 'Yes' daca e asa , sau 'No' altfel. Folositi 88. urmatoarele valori pentru a testa solutia voastra: 89. '12/34',01/la','99/88' 90. VALUE VALID? 91. ----------92. 12/34 YES 93. 94. 95. Angajatii pe 15 ale fiecarei luni sau inainte sint platiti 96. in ultima vineri a acelei luni . Cei angajati dupa data de 97. 15 sunt platiti in ultima vineri a urmatoarei luni. 98. Afisati o lista a angajatilor , cu data de angajare si prima 99. data de plata.Sortati in functie de data angajarii. 100. ENAME HIREDATE PAYDAY 101. --------------------------102. SMITH 13-jun-83 24-jun-83 103. ALLEN 15-aug-83 26-aug-83 104. JONES 31-oct-83 25-nov-83 105. MILLER 21-nov-83 30-dec-83 106. MARTIN 05-dec-83 30-dec-83 107. FORD 05-dec-83 30-dec-83 108. SCOTT 05-mar-84 30-mar-84 109. WARD 26-mar-84 27-apr-84 110. CLARK 14-may-84 25-may-84 111. TURNER 04-jun-84 29-jun-84 112. ADAMS 04-jun-84 29-jun-84 113. BLAKE 11-jun-84 29-jun-84 114. KING 09-jul-84 27-jul-84 115. JAMES 23-jul-84 31-aug-84 116. 117. 14 records selected 118. 119.

CAPITOLUL 5 SOLUTII

1. 2.

SELECT

ENAME, TO_CHAR(HIREDATE,'fmMonth,Ddspth YYYY')

3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59.

FROM WHERE

date_hired EMP DEPTNO=20;

SELECT ENAME,HIREDATE,ADD_MONTHS(HIREDATE,12) REVIEW FROM EMP ORDER BY ADD_MONTHS(hiredate,12); SELECT ENAME, DECODE(SIGN(1500-SAL),1,'BELOW 1500',0,'On Target',SAL) SALARY FROM EMP ORDER BY ENAME; SELECT FROM TO-CHAR(TO_DATE('&ANYDATE','DD.MM.YY'),'DAY') DAY SYS.DUAL;

DEFINE TIME=MONTHS_BETWEEN(SYSDATE,HIREDATE) SELECT ENAME, FLOOR(&TIME/12)||'YEARS'|| FLOOR(MOD(&TIME,12))||'MONTHS' "LENGTH OF SERVICE" FROM EMP WHERE ENAME=UPPER('&EMPLOYEE_NAME'); SELECT '12/34' VALUE DECODE( TRANSLATE('12/34','1234567890', '9999999999'), '99/99','YES',NO') "VALID?" SYS.DUAL; ENAME, HIREDATE, DECODE(SIGN(TO_CHAR(HIREDATE,'DD')-15 1,NEXT-DAY(LAST-DAY(ADD_MONTHS(HIREDATE,1)), 'FRIDAY')-7, NEXT-DAY(LAST_DAY(HIREDATE),'FRIDAY')-7) PAYDAY EMP HIREDATE; ENAME,HIREDATE, NEXT_DAY(LAST_DAY(ROUND(HIREDATE,'MONTH'))-7 'FRIDAY') PAYDAY EMP HIREDATE;

FROM SELECT

FROM ORDER BY sau SELECT FROM ORDER BY

Capitolul 6
Functii de grup
Acest capitol explica cum informatiile concise pot fi obtinute pen- tru grupuri de siruri folosind functiile de grup. Vom discuta cum puteti divide sirurile dintr-o tabela in seturi mai mici si cum sa specificati criteriile de cautare intr-un grup de siruri. Functiile de grup se aplica unui set de siruri.Ele intorc rezultate bazate pe grupuri de siruri , spre deosebire de un rezultat pe sir care e returnat de functii singulare.De regula , toate sirurile din tabela sunt tratate ca un grup.Clauza GROUP BY din cadrul lui SELECT e folosita pentru a imparti sirurile in grupuri mai mici. Functiile de grup sunt listate mai jos:
Valoare returnata

AVG({DISTINCT/ALL}) valoarea medie a lui n, ignorind valorile nule. COUNT({DISTINCT/ALL} expr*) nr. de siruri unde expresia e evaluata la altceva decit NULL. (*) face ca COUNT sa numere toate sirurile selectate, incluzind duplicatele si sirurile cu NULL. MAX({DISTINCT/ALL}expr) maximul valorilor expr. MIN({DISTINCT/ALL}expr)D minimul valorilor expresiei expr. STDDEV({DISTINC/ALL}n) deviatia standard a lui n , ignorind valorile nule. SUM({DISTINC/ALL}n) suma valorilor lui n , ignorind valorile nule.

VARIANCE({DISTINCT/ALL}n) variatia lui n , ignorind valorile nule. Toate functiile de deasupra opereaza pe un nr. de siruri (de ex., o intreaga tabela) si sunt cunoscute ca functii de grup sau agregate. DISTINCT face ca functia de grup sa considere doar valorile(nedupli- cate). ALL considera fiecare valoare , incluzind si toate duplicatele. Implicit este ALL. Tipul datelor argumentelor poate fi CHAR,NUMBER sau DATA unde expr e listata. Toate fuctiile de grup cu exceptia lui COUNT(*) ignora valorile nule. Folositi NVL ca de obicei pentru a include null.

FUNCTII DE GRUP
Folosirea functiilor de grup Pentru a calcula salriul mediu al tuturor angajatilor, introducem :
SELECT AVG(SAL) FROM EMP; AVG(SAL) -------2073.21429

Notati ca liniile din tabela EMP sint considerate ca un singur grup. O functie de grup poate fi aplicata pe un subset de linii din tabela prin folosirea clauzei WHERE. Pentru a gasi salariul minim cistigat de un functionar, introducem :
SELECT MIN(SAL) FROM EMP WHERE JOB = 'CLERK'; MIN(SAL) -------800

Pentru a numara angajatii din departamentul 20, introducem :

SELECT COUNT(*) FROM EMP WHERE DEPTNO = 20; COUNT(*) -------5

Clauza GROUP BY Clauza GROUP BY poate fi folosita pentru a imparti liniile dintr-o tabela in grupuri mai mici. Functiile de rup pot fi folosite pentru a intorece informatii sumare pentru fiecare grup. Pentru a calcula salariul mediu pentru fiecare functie diferita, introducem:

SELECT JOB, AVG(SAL) FROM EMP GROUP BY JOB; JOB ------ANALYST CLERK MANAGER PRESIDENT SALESMAN AVG(SAL) ----------3000 1037.5 2758.33333 5000 1400

Excluderea liniilor cind folosim GROUP BY Liniile pot fi excluse mai intii cu o clauza WHERE, inainte de a le imparti in grupuri. Pentru a determina salariul mediu pentru fiecare functie in afara de manager, introducem :
SELECT JOB, AVG(SAL) FROM EMP WHERE JOB != 'MANAGER' GROUP BY JOB; JOB ------ANALYST CLERK PRESIDENT SALESMAN AVG(SAL) ----------3000 1037.5 5000 1400

Solutii

1. 2.

SELECT MIN(SAL) MINIMUM FROM EMP; SELECT MAX(SAL), MIN(SAL), AVG(SAL) FROM EMP; SELECT JOB, MAX(SAL) MAXIMUM, MIN(SAL) MINIMUM FROM EMP GROUP BY JOB; SELECT COUNT(*) MANAGERS FROM EMP WHERE JOB = 'MANAGER'; SELECT JOB, AVG(SAL) AVSAL, AVG(SAL * 12 + NVL(COMM, 0)) AVCOMP FROM EMP GROUP BY JOB; SELECT MAX(SAL) - MIN(SAL) DIFFERENCE FROM EMP; SELECT DEPTNO, COUNT(*) FROM EMP GGROUP BY DEPTNO HAVING COUNT(*) > 3; SELECT EMPNO FROM EMP GROUP BY EMPNO HAVING COUNT(*) > 1; SELECT MGR, MIN(SAL) FROM EMP GROUP BY MGR HAVING MIN(SAL) >= 1000 ORDER BY MIN(SAL);

3.
4. 5.

6.
7. 8. 9. 10. 11.

12.
13. 14. 15.

16.
17. 18. 19. 20. 21.

22.
23. 24.

25.
26. 27. 28. 29.

30.
31. 32. 33. 34.

35.
36. 37. 38. 39. 40.

CAPITOLUL 7
EXTRAGEREA DATELOR DIN MAI MULT DE O TABELA

Join Join-ul este folosit cind o cerere SQL necesita date din mai multe tabele din baza de date. Liniile dintr-o tabela pot fi unite cu liniile din alta tabela in functie de valorile comune existente in coloanele corespunzatoare. Sint doua tipuri de conditie de join : 1. Equi-join 2. Non-equi-join

Equi-join

Pentru a determina angajatii din departamente, vom compara valorile din coloana DEPTNO a angajatului cu aceleasi valori din DEPTNO din tabela DEPT. Relatia dintre tabela EMP si DEPT este un equi-join, in care valorile din coloana DEPTNO din ambele tabele sint egale. (Operatorul de comparatie folosit este =.) O conditie de join este specificata in clauza WHERE:
SELECT column(s) FROM tables WHERE join condition is ...

Pentru a face join pe cele doua tabele EMP si DEPT, introducem:

SELECT ENAME, JOB, DNAME FROM EMP, DEPT WHERE EMP>DEPTNO + DEPT>DEPTNO; ENAME ------CLARK MILLER KING SMITH SCOTT JONES ADAMS FORD ALLEN JOB -----MANAGER CLERK PRESIDENT CLERK ANALYST MANAGER CLERK ANALYST SALESMAN DNAME ------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES

BLAKE TURNER JAMES MARTIN WARD

MANAGER SALESMAN CLERK SALESMAN SALESMAN

SALES SALES SALES SALES SALES

Vom observa ca acum fiecare angajat are listat numele departamentului lui. Liniile din EMP sint combinate cu liniile din DEPT si sint intoarse doar liniile pentru care valorile EMP.DEPTNO si DEPT.DEPTNO sint eale. Observati ca, conditia de join specifica numele coloanei precedat de numele tabelei.Aceasta este o necesitate cind numele coloanelor sint aceleasi in ambele tabele.Este necesar sa specificam exact ce coloane sint referite. Aceasta necesitate este de asemenea aplicata coloanelor care pot fi ambigue in clauzele SELECT sau ORDER BY. Pentru a recunoaste diferentele dintre coloana DEPTNO din EMP si coloana DEPTNO din DEPT, introducem:
SELECT DEPT.DEPTNO, ENAME, JOB, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO ORDER BY DEPT.DEPTNO; DEPTNO -------10 10 10 20 20 20 20 20 30 30 30 30 30 30 ENAME ------CLARK MILLER KING SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD JOB -----MANAGER CLERK PRESIDENT CLERK ANALYST MANAGER CLERK ANALYST SALESMAN MANAGER SALESMAN CLERK SALESMAN SALESMAN DNAME ------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

Observati ca fiecarui numar de departament din tabela DEPT i se face join pentru a se potrivi cu numerele de departament din tabela EMP.De exemplu, trei angajati lucreaza in departamentul 10 - Accounting - deci exista trei potri- viri.Prin urmare ACCOUNTING este afisat pentru fiecare angajat din acel depar- tament.

Folosirea alias-urilor de tabela

Poate fi foarte plictisitor sa tiparesti numele tabelelor repetat.Etichete temporare (sau alias-uri) pot fi folosite in clauza FROM.Aceste nume temporare sint valide doar in instructiunea SELECT curenta.Alias-urile de tabele trebuie de asemenea sa fie specificate in clauza SELECT.Aceasta creste efectiv viteza cererii, in care contextul contine informatii foarte exacte. Alias-urile de tabela sint folosite in urmatorul context:
SELECT E.ENAME, D.DEPTNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO ORDER BY D.DEPTNO;

Alias-urile de tabele pot fi de lungime de maxim 30 de caractere, dar mai scurte sint mai bune.De asemenea incercati sa le faceti cit mai explicite. Daca un alias de tabela este folosit pentru un nume particular de tabela in clauza FROM, atunci acel alias trebuie sa fie substituit pentru numele tabelei in contextul din SELECT.
Produs
----------------------------------------------------------------------EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO | ----------------------------------------------------------------------|=======================================================================| ----------------------------------------------------------------------| 7788 SCOTT ANALYST 7566 05-MAR-84 3000 20 |------------------------------------------------------------------------| |=======================================================================| | ----------------------------------------------------------------------| | | | | ---------------------------------------------------------------------| | | | | | ------------------------------| | DEPTNO DNAME LOC | | ------------------------------|--------| 10 ACCOUNTING NEW YORK | |--------| 20 RESEARCH DALLAS | |--------| 30 SALES CHICAO | |--------| 40 OPERATIONS BOSTON | |

-------------------------------

In absenta unei conditii WHERE, fiecare linie din EMP este unita in ordine cu fiecare linie din DEPT. Se vor afisa 53 de linii.
Produs

Cind o conditie de join este invalida sau este omisa, rezultatul este omis si toate combinatiile de linii vor fi listate. Un produs tinde sa genereze un numar mare de linii si rezultatul sau este rar folosit.Trebuie intotdeauna inclusa o conditie de join intr-o clauza WHERE, in afara de cazul in care este necesara combinarea tuturor liniilor din toate tabelele. Non-Equi-Join Relatia dintre tabelele EMP si SALGRADE este un non-equi-join, in care nici o coloana din EMP nu corespunde direct cu o coloana din SALGRADE.Relatia este obtinuta folosind un operator, altul decit operatorul de egalitate (=).Pentru a evalua gradatia unui anajat, salariul lui trebuie sa fie intre salariul minim si salariul maxim. Operatorul BETWEEN este folosit pentru a construi conditia, introducem:
SELECT E.ENAME, E.SAL, S.GRADE FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL; ENAME --------SMITH ADAMS JAMES WARD MARTIN MILLER ALLEN TURNER JONES BLAKE CLARK SCOTT FORD KING SAL ------800.00 1,100.00 950.00 1,250.00 1,250.00 1,300.00 1,600.00 1,500.00 2,975.00 2,850.00 2,450.00 3,000.00 3,000.00 5,000.00 GRADE --------1 1 1 2 2 2 3 3 4 4 4 4 4 5

Alti operatori cum ar fi <= si >= pot fi folositi, oricum BETWEEN este cel mai simplu.Nu uitati sa specificati mai intii valoarea minima si ultima va- loarea maxima

cind folositi BETWEEN.Din nou sint folosite alias-uri de tabele, nu din cauza posibilelor ambiguitati, dar din motive de performanta. Reguli pentru join-ul tabelelor Pentru a face join pe cele trei tabele este necesar sa construim doua condi- tii de join.Pentru a face join pe patru tabele sint necesare minim trei condi- tii de join. O regula simpla este: numarul minim de conditii de join = numarul de tabele - 1 Aceasta regula nu poate fi aplicata daca tabela are o cheie primara, care identifica in mod unic fiecare linie (cheile primare sint explicate mai tirziu in manual). Sintaxa
SELECT [DISTINCT] {[tabela].* | expresie [alias], ...} FROM tabela [alias], ... WHERE [conditie de join] ... AND [conditie de linie] ... OR [alta conditie de linie] GROUP BY {expresie | coloana} HAVING {conditie de grup} ORDER BY {expresie | coloana} [ASC | DESC]

Observatii

Se pot specifica conditii de join impreuna cu alte conditii (non join); De asemenea trebuie sa fiti atenti la precedenta operatorilor cind folo- siti predicatul OR.

Exercitii - Join-uri simple

Aceste exxercitii au intentia de a va capata experienta practica in extrage- rea datelor din mai mult decit o tabela si includ teme discutate in capitolele anterioare.
Tema

1. Afisati numele tuturor angajatilor si numele departamentului lor, in ordi- nea numelui departamentelor.
2. 3. 4. 5. ENAME -------CLARK MILLER DNAME --------ACCOUNTING ACCOUNTING

6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.

KING SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD

ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

Vor fi selectate 14 inregistrari.

20. Afisati numele tuturor angajatilor, numarul si numele departamentului.


21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. ENAME -------CLARK MILLER KING SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD DEPTNO --------10 10 10 20 20 20 20 20 30 30 30 30 30 30 DNAME --------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

Vor fi selectate 14 inregistrari.

41. Afisati numele, localitatea si departamentul angajatilor al caror salariu lunar este mai mare ca 1500.
42. 43. 44. 45. 46. 47. 48. 49. 50. 51. ENAME -------CLARK KING JONES FORD SCOTT ALLEN BLAKE LOCATION ---------NEW YORK NEW YORK DALLAS DALLAS DALLAS CHICAGO CHICAGO DNAME --------ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH SALES SALES

52.

Vor fi selectate 7 inregistrari.

53. Afisati lista salariilor, gradatiilor angajatilor.


54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. ENAME ---------SMITH ADAMS JAMES WARD MARTIN MILLER ALLEN TURNER JONES BLAKE CLARK SCOTT FORD KING JOB ------CLERK CLERK CLERK SALESMAN SALESMAN CLERK SALESMAN SALESMAN MANAGER MANAGER MANAGER ANALYST ANALYST PRESIDENT SAL ------800.00 1,100.00 950.00 1,250.00 1,250.00 1,300.00 1,600.00 1,500.00 2,975.00 2,850.00 2,450.00 3,000.00 3,000.00 5,000.00 GRADE ---------1 1 1 2 2 2 3 3 4 4 4 4 4 5

70. Listati doar angajatii cu gradatia 3.


71. 72. 73. 74. ENAME ---------ALLEN TURNER JOB ------SALESMAN SALESMAN SAL ------1,600.00 1,500.00 GRADE ---------3 3

75. Listati toti angajatii din Dallas.


76. 77. 78. 79. 80. 81. 82. ENAME ---------SMITH SCOTT JONES ADAMS FORD SAL ------800.00 3,000.00 2,975.00 1,100.00 3,000.00 LOCATION ---------DALLAS DALLAS DALLAS DALLAS DALLAS

Alte exercitii daca aveti timp: 83. Afisati numele angajatilor, functia, salariul, gradatia si numele departamentului pentru toti angajatii din companie in afara de functionari.Sortati dupa salariu, afisind mai intii salariul cel mai mare.
84. 85.

86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99.

ENAME -------KING FORD SCOTT JONES BLAKE CLARK ALLEN TURNER MARTIN WARD

JOB --------PRESIDENT ANALYST ANALYST MANAGER MANAGER MANAGER SALESMAN SALESMAN SALESMAN SALESMAN

SAL -------5,000.00 3,000.00 3,000.00 2,975.00 2,850.00 2,450.00 1,600.00 1,500.00 1,250.00 1,250.00

GRADE --------5 4 4 4 4 4 3 3 2 2

DNAME --------ACCOUNTING RESEARCH RESEARCH RESEARCH SALES ACCOUNTING SALES SALES SALES SALES

Vor fi selectate 10 inregistrari.

100. Afisati urmatoarele detalii pentru angajatii care cistiga 36000$ pe an sau care sint functionari.
101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. ENAME --------FORD SCOTT MILLER JAMES ADAMS SMITH JOB ANNUAL_SAL ------- -------------ANALYST 36000 ANALYST 36000 CLERK 15600 CLERK 11400 CLERK 13200 CLERK 9600 DEPTNO --------20 20 10 30 20 20 DNAME GRADE --------- -------RESEARCH 4 RESEARCH 4 ACCOUNTING 2 SALES 1 RESEARCH 1 RESEARCH 1

Vor fi selectate 6 inregistrari.

Solutii
1. 2. 3. SELECT ENAME, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO; SELECT ENAME, E.DEPTNO, DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO; SELECT ENAME, LOC LOCATION, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND SAL > 1500; SELECT ENAME, JOB, SAL, GRADE FROM EMP, SALGRADE WHERE SAL BETWEEN LOSAL AND HISAL; SELECT ENAME, JOB, SAL, GRADE FROM EMP, SALGRADE WHERE SAL BETWEEN LOSAL AND HISAL

4.
5. 6. 7.

8.
9. 10. 11. 12.

13.
14. 15. 16.

17.
18. 19. 20.

21.

AND GRADE = 3; SELECT ENAME, SAL, LOC LOCATION FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND LOC = 'DALLAS'; SELECT ENAME, JOB, SAL, GRADE, DNAME FROM EMP, SALGRADE, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND SAL BETWEEN LOSAL AND HISAL AND JOB != 'CLERK' ORDER BY SAL DESC; SELECT ENAME, JOB, SAL * 12 ANNUAL_SAL, D.DEPTNO, DNAME, GRADE FROM EMP E, SALGRADE, DEPT D WHERE E.DEPTNO = D.DEPTNO AND SAL BETWEEN LOSAL AND HISAL AND (SAL * 12 + NVL(COMM, 0) = 3600 OR E.JOB = 'CLERK') ORDER BY E.JOB;

22.
23. 24. 25. 26.

27.
28. 29. 30. 31. 32. 33.

34.
35. 36. 37. 38. 39. 40.

CAPITOLUL 8
ALTE METODE DE JOIN
Acest capitol prezinta diferite metode de constructie a conditiilor de join. Join extern Daca o linie nu satisface o conditie de join, atunci linia respectiva nu va apare in rezultatul cererii.De fapt, in conditia de equi-join pentru EMP si DEPT, departamentul 40 nu apare.Aceasta se intimpla deoarece nu este nici un angajat in departamentul 40.
-----------------------------------------------------------------------| JOIN EXTERN | | | | -----------------------------------------------------| | | EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO | | | ------------------------------------------------------ ? | | |======================================================|-----| | -----------------------------------------------------| | | | | | --------------------------------------------------------------| | | | | | | -------------------------------| | | | DEPTNO DNAME LOC | | | | -------------------------------| | | |================================| | | | -------------------------------|

| |---------| 40 OPERATIONS BOSTON | | | -------------------------------| | | ------------------------------------------------------------------------

Nu exista nici un angajat in departamentul 40, dar el poate fi afisat facind join intre departamentul 40 cu o linie vida. Liniile ce lipsesc pot fi returnate daca este folosit un operator de join extern in conditia de join.Operatorul este semnul plus inclus intre paranteze (+) si este plasat in partea tabelei deficiente in informatii.Operatorul are ca efect crearea uneia sau mai multor linii vide cu care una sau mai multe linii din tabela nedeficitara in informatii poate face join. O linie vida este creata pentru fiecare linie adaugata in tabela nedefici- tara in informatii.
SELECT E.ENAME, D.DEPTNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO(+) = D.DEPTNO AND D.DEPTNO IN (30, 40); ENAME --------ALLEN BLAKE TURNER JAMES MARTIN WARD DEPTNO --------30 30 30 30 30 40 DNAME --------SALES SALES SALES SALES SALES OPERATIONS

Operatorul de join extern pote apare doar intr-o parte a expresiei si anume in partea in care lipsesc informatii.Vor fi intoarse acele linii dintr-o ta- bela care nu au corespondent direct in cealalta tabela. Alte restrictii pentru join extern sint:

nu se poate face join extern a unei tabele cu mai mult de o tabela ce di- fera de prima intr-o singura declaratie SELECT; o conditie ce include un join extern nu poate folosi operatorul IN sau nu i se poate fi unita cu alte conditii prin operatorul OR.

Join-ul unei tabele cu ea insasi

Este posibila folosirea etichetelor de tabele (alias-urilor) pentru a face join unei tabele cu ea insasi, ca si cum ar fi doua tabele separate.Aceasta permite ca liniilor dintr-o tabela sa li se faca join cu liniile din aceeasi tabela. Urmatoarea cerere listeaza toti angajatii care cistiga mai putin ca sefii lor :
SELECT E.ENAME EMP_NAME, E.SAL EMP_SAL, M.ENAME MGR_NAME, M.SAL MGR_SAL FROM EMP E, EMP M WHERE E.MGR = E.EMPNO AND E.SAL < M.SAL;

EMP_NAME ----------ALLEN WARD MARTIN TURNER JAMES MILLER ADAMS JONES BLAKE CLARK SMITH

EMP_SAL ----------1600 1250 1250 1500 950 1300 1100 2975 2850 2450 800

MGR_NAME ----------BLAKE BLAKE BLAKE BLAKE BLAKE CLARK SCOTT KING KING KING FORD

MGR_SAL ---------2850 2850 2850 2850 2850 2450 3000 5000 5000 5000 3000

Observati ca, clauza FROM se refera la EMP de doua ori si ca urmare EMP are asociata cite un alias pentru ambele cazuri - E si M.Este ajutator ca alias- urile asociate sa fie cu inteles, de exemplu E inseamna angajati (employees) si M inseamna sefi (managers). Clauza join poate fi exprimata: "unde numarul sefului angajatului este acelasi cu numarul angajatului se- fului lui". Operatori de multimi In cadrul acestui capitol vor fi discutate reuniunea, intersectia si dife- renta. Reuniunea, intersectia si diferenta sint folositoare in constructia cereri- lor care se refera la tabelediferite.Ele combina rezultatele a doua sau mai multe declaratii select in unul singur.O cerere poate fi formata din doua sau mai multe declaratii SQL inlantuite prin operatori de multimi.Operatorii de multimi sint numiti join-uri verticale, deoarece join-ul nu se face in raport cu liniile din cele doua tabele, ci in raport cu coloanele.

In urmatoarele trei exemple, cererile sint aceleasi, dar operatorul este diferit in fiecare caz, generindu-se rezultate diferite pentru cereri. Reuniunea Pentru a lista toate liniile diferite generate de fiecare din cereri, introducem:
SELECT JOB FROM EMP WHERE DEPTNO = 10 UNION SELECT JOB FROM EMP WHERE DEPTNO = 30; JOB ----CLERK MANAGER PRESIDENT SALESMAN

UNION ALL Pentru a lista toate liniile (inclusiv duplicatele) generate de fiecare din cereri, introducem:
SELECT JOB FROM EMP WHERE DEPTNO = 10 UNION ALL SELECT JOB FROM EMP WHERE DEPTNO = 30; JOB ----PRESIDENT MANAGER CLERK MANAGER SALESMAN SALESMAN SALESMAN SALESMAN CLERK

Intersectia Pentru a lista doar liniile generate de ambele cereri, introducem:


SELECT JOB FROM EMP WHERE DEPTNO = 10 INTERSECT SELECT JOB FROM EMP WHERE DEPTNO = 30; JOB ----CLERK MANAGER

Diferenta Pentru a lista toate liniile generate de prima cerere care nu sint in a doua cerere, introducem:
SELECT JOB FROM EMP WHERE DEPTNO = 10 MINUS SELECT JOB FROM EMP WHERE DEPTNO = 30; JOB ----PRESIDENT

Este posibil sa se construiasca cereri cu mai multi operatori de multimi. Daca sint folositi mai multi operatori de multimi, ordinea executiei pentru declaratiile SQL este de sus in jos.Parantezele pot fi folosite pentru a face ordinea executiei alternativa. ORDER BY ORDER BY poate fi folosita o data intr-o cerere ce foloseste operatori de multimi.Daca este folosita, clauza ORDER BY trebuie plasata la sfirsitul cererii.Deoarece pot fi selectate coloane diferite in fiecare SELECT nu se pot numi coloanele in clauza ORDER BY.In scimb, coloanele din ORDER BY trebuie sa fie referite prin pozitiile relative din lista din SELECT.

SELECT EMPNO, ENAME, SAL FROM EMP UNION SELECT ID, NAME, SALARY FROM EMP_HISTORY ORDER BY 2;

Observati ca in clauza ORDER BY un numar (2) este folosit pentru a indica pozitia coloanei ENAME in lista din SELECT.Aceasta inseamna ca liniile vor fi sortate in ordine ascendenta a numelui angajatilor. Reguli pentru folosirea operatorilor de multimi 1. Declaratiile SELECT trebuie sa aiba acelasi numar de coloane. 2. Coloanele corespunzatoare trebuie sa aiba acelasi tip (corespondenta este pozitionala). 3. Liniile duplicate sint automat eliminate (nu poate fi folosit DISTINCT). 4. Numele coloanelor din prima cerere apar in rezultat. 5. Clauza ORDER BY apare la sfirsitul declaratiei. 6. ORDER BY se face doar dupa pozitia coloanei (nu dupa numele coloanei). 7. Operatorii de multimi pot fi folositi in subcereri. 8. Blocurile de cerere sint executate de sus in jos. 9. Operatorii de multimi multipli pot fi folositi cu paranteze, daca este necesara schimbarea secventei executiei. Exercitii Aceste exercitii va vor da posibilitatea sa descoperiti diferite metode de join si sa capatati experienta la folosirea operatorilor de multimi. Tema

1. Afisati departamentul care nu are nici un angajat.


2. 3. 4. DEPTNO -------40 DNAME -------OPERATIONS

5. Afisati toti angajatii (nume si numar) impreuna cu numele si numarul se- fului.
6. 7. 8. EMPNO -------ENAME --------MGRNO -------MGR_NAME ------------

9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.

7788 7902 7499 7521 7654 7844 7900 7934 7876 7566 7698 7782 7369

SCOTT FORD ALLEN WARD MARTIN TURNER JAMES MILLER ADAMS JONES BLAKE CLARK SMITH

7566 7566 7698 7698 7698 7698 7698 7782 7788 7839 7839 7839 7902

JONES JONES BLAKE BLAKE BLAKE BLAKE BLAKE CLARK SCOTT KING KING KING FORD

Vor fi selectate 13 inregistrari.

24. Modificati solutia de la intrebarea 2 pentru a afisa KING care nu are sef.
25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. EMPNO -------7839 7788 7902 7499 7521 7654 7844 7900 7934 7876 7566 7698 7782 7369 ENAME --------KING SCOTT FORD ALLEN WARD MARTIN TURNER JAMES MILLER ADAMS JONES BLAKE CLARK SMITH MGRNO -------7566 7566 7698 7698 7698 7698 7698 7782 7788 7839 7839 7839 7902 MGR_NAME -----------JONES JONES BLAKE BLAKE BLAKE BLAKE BLAKE CLARK SCOTT KING KING KING FORD

Vor fi selectate 14 inregistrari.

43. Gasiti functia care a fost ocupata in prima jumatate a anului 1983 si aceeasi functie a fost ocupata in timpul aceleiasi perioade in 1984.
44. 45. 46. 47. 48. JOB -----CLERK Va fi selectata o inregistrare.

Incercati si urmatoarele daca aveti timp: 49. Gasiti toti angajatii care au venit in companie inaintea sefilor lor.
50. EMPLOYEE HIREDATE MANAGER HIREDATE

51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62.

----------ALLEN WARD MARTIN TURNER MILLER JONES BLAKE CLARK SMITH

----------15-AUG-83 26-MAR-84 05-DEC-83 04-JUN-84 21-NOV-83 31-OCT-83 11-JUN-84 14-MAY-84 13-JUN-83

---------BLAKE BLAKE BLAKE BLAKE CLARK KING KING KING FORD

----------11-JUN-84 11-JUN-84 11-JUN-84 11-JUN-84 14-MAY-84 09-JUL-84 09-JUL-84 09-JUL-84 05-DEC-83

Vor fi selectate 9 inregistrari.

63. Gasiti alta cerere pentru intrebarea 1.


64. 65. 66. DEPTNO --------40 DNAME -------OPERATIONS

Solutii

1. 2. 3. 4. 5. 6.

SELECT D.DEPTNO, DNAME FROM EMP E, DEPT D WHERE E.DEPTNO(+) = D.DEPTNO AND E.EMPNO IS NULL; SELECT EMPS.EMPNO, EMPS.ENAME, MGRS.EMPNO MGRNO, MGRS.ENAME MGR_NAME FROM EMP EMPS, EMP MGRS WHERE EMPS.MGR = MGRS.EMPNO; SELECT EMPS.EMPNO, EMPS.ENAME, MGRS.EMPNO MGRNO, MGRS.ENAME MGR_NAME FROM EMP EMPS, EMP MGRS WHERE EMPS.MGR = MGRS.EMPNO(+); SELECT JOB FROM EMP WHERE HIREDATE BETWEEN '01-JAN-83' AND '30-JUN-83' INTERSECT SELECT JOB FROM EMP WHERE HIREDATE BETWEEN '01-JAN-84' AND '30-JUN-84'; SELECT E.ENAME EMPLOYEE, E.HIREDATE, M.ENAME MANAGER, M.HIREDATE FROM EMP E, EMP M WHERE E.MGR = M.MGRNO AND E.HIREDATE < M.HIREDATE;

7.
8. 9. 10. 11.

12.
13. 14. 15. 16.

17.
18. 19. 20. 21. 22. 23. 24.

25.
26. 27. 28. 29. 30.

31.
32. 33. 34. 35. 36. 37. SELECT DEPTNO, DNAME FROM DEPT MINUS SELECT EMP.DEPTNO, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;

CAPITOLUL 9
SUBCERERI
In acest capitol se vor prezenta alte caracteristici ale declaratiei SELECT, cum ar fi cereri continute in clauza WHERE sau HAVING ale altei decla- ratii SQL. Subcereri ascunse O subcerere este o declaratie SELECT care este ascunsa in interiorul altei declaratii SELECT si care intoarce rezultate intermediare. De exemplu:
SELECT column1, column2, ... FROM table WHERE column = (SELECT column FROM table WHERE condition)

Subcererea este adesea referita ca un subselect sau ca un SELECT interior; in general, subcererea se executa prima si rezultatul sau este folosit pentru a completa conditia cererii principale sau a cererii externe.Folosirea sub- cererilor permite consruirea de comenzi puternice pornind de la unele simple. Cererea ascunsa poate fi foarte folositoare cind este nevoie sa fie selectate linii dintr-o tabela printr-o conditie ce depinde de date din propria tabela. Subcereri ce intorc o linie Pentru a gasi angajatul care cistiga salariul minim din companie (salariul minim este o cantitate necunoscuta), trebuie parcursi doi pasi:

1. Gasirea salariului minim:


2. 3. 4. 5. 6. 7. 8. SELECT MIN(SAL) FROM EMP; MIN(SAL) ---------800

9. Gasirea angajatului care cistiga salariul minim:


10. 11. 12. 13. 14. SELECT ENAME, JOB, SAL FROM EMP WHERE SAL = (cel mai mic salariu care este cunoscut)

Putem combina cele doua cereri ca o subcerere ascunsa:


SELECT ENAME, JOB, SAL FROM EMP WHERE SAL = (SELECT MIN(SAL) FROM EMP); ENAME ------SMITH JOB -----CLERK SAL ----800

Cum sint prelucrate subcererile ascunse ?

O declarartie SELECT poate fi considerata ca un bloc de cerere.Exemplul de mai sus consta din doua blocuri de cerere - cererea principala si cererea in- terioara. Declaratia SELECT interioara sau blocul de cerere este executata prima, producind un rezultat al cererii: 800.Blocul de cerere principal este apoi prelucrat si foloseste valoarea intoarsa de cererea interioara pentru a com- pleta conditia de cautare.Deci, cererea principala in final va arata in felul urmator:
SELECT ENAME, SAL, DEPTNO FROM EMP WHERE SAL = 800;

In exemplul de mai sus, 800 este o valoare unica.Subcererea care a intors valoarea 800 se numeste subcerere ce intoarce o singura linie.Cind o subcerere intoarce doar o linie, va fi folosit un operator logic sau un operator de com- paratie.De exemplu: =, <, >, <=, etc.

Pentru a gasi toti angajatii ce au aceeasi functie ca BLAKE, vom introduce:


SELECT ENAME, JOB FROM EMP WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = 'BLAKE'); ENAME ------JONES BLAKE CLARK JOB ----MANAGER MANAGER MANAGER

Cererea interioara intoarce functia lui BLAKE, care este folosita in partea dreapta a clauzei WHERE di cererea principala (dupa operatorul de comparatie). Subcereri ce intorc mai mult de o linie Urmatoarea cerere gaseste angajatii care au salariul egal cu salariul minim din fiecare departament:
SELECT ENAME, SAL, DEPTNO FROM EMP WHERE SAL IN (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO);

ENAME ------SMITH JAMES MILLER

SAL ----800 950 1300

DEPTNO --------20 30 10

Observati ca, cererea interioara are clauza GROUP BY.Aceasta inseamna ca va intoarce mai mult decit o valoare.Deci este nevoie sa folosim un operator de comparatie multi linie.In acest caz, operatorul IN trebuie sa fie folosit, deoarece rezulta o lista de valori. Rezultatul obtinut nu arata si departamentul in care lucreaza angajatul. Deoarece se compara doar valorile salariilor, cererea interioara poate intoar- ce o valoare simpla, pentru ca el cauta cel mai mic salariu pentru unul din departamente, nu in mod necesar departamentul propriu al angajatului.Prin urmare, cererea poate fi

rescrisa pentru a gasi combinatia salariul angaja- tului si numarul departamentului cu salariul minim si numarul departamentului: Compararea a mai multor valori Urmatoarea cerere ggaseste angajatii care cistiga salariul cel mai mic din departamentul lor:
SELECT ENAME, SAL, DEPTNO FROM EMP WHERE (SAL, DEPTNO) IN (SELECT MIN(SAL), DEPTNO FROM EMP GROUP BY DEPTNO); ENAME ------SMITH JAMES MILLER SAL ----800 950 1300 DEPTNO --------20 30 10

Cererea de mai sus compara o pereche de coloane. Observatie : coloanele din partea stinga a conditiei de cautare sint in pa- ranteze si fiecare coloana este separata printr-o virggula. Coloanele listate in clauza SELECT a subcererii trebuie sa fie in aceeasi ordine ca si lista coloanelor dintre paranteze din clauza WHERE a cererii externe. Coloanele intoarse de cererea interioara trebuie, de asemenea sa se potri- veasca in numar si tip de date cu coloanele cu care ele sint comparate in cererea externa. De exemplu :
...WHERE (numcolumn, charcolumn) = (SELECT datecolumn, numcolumn, charcolumn ...

nu este permis. Erori intilnite Cind o subcerere intoarce mai mult decit o linie si este folosit un opera- tor de comparatie pt o singura linie, SQL*Plus da urmatorul mesaj de eroare:

SELECT ENAME, SAL, DEPTNO FROM EMP WHERE SAL = (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO);

Eroare : subcerere ce trebuie sa intoarca o singura linie intoarce mai mult decit o linie. Nu este selectata nici o inregistrare. Daca cererea interioara nu intoarce nici o linie, va fi dat urmatorul mesaj de eroare :
SELECT ENAME, JOB FROM EMP WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = 'SMITHE');

Eroare : subcerere ce trebuie sa intoarca o singura linie nu intoarce nici o linie. Nu este selectata nici o inregistrare. Operatorii SOME/ANY, ALL

Operatorii ANY sau ALL pot fi folositi pentru subcererile care intorc mai mult de o linie.Ei sint folositi in clauzele WHERE sau HAVING in legatura cu operatorii logici (=, !=, <, >, >=, <+). ANY (sau sinonimul sau SOME) compara o valoare cu fiecare valoare intoarsa de o subcerere. Pentru a afisa angajatii care cistiga mai mult decit cel mai mic salariu din departamentul 30, introducem :
SELECT ENAME, SAL, JOB, DEPTNO FROM EMP WHERE SAL > SOME (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30) ORDER BY SAL DESC; ENAME ------KING SCOTT SAL ----5000 3000 JOB ----PRESIDENT ANALYST DEPTNO -------10 20

FORD JONES BLAKE CLARK ALLEN MILLER WARD ADAMS

3000 2975 2850 2450 1600 1300 1250 1100

ANALYST MANAGER MANAGER MANAGER SALESMAN CLERK SALESMAN CLERK

20 20 30 10 30 10 30 20

Cel mai mic salariu din departamentul 30 este 950$ (a lui James).Cererea principala intoarce angajatii care cistiga un salariu mai mare ca salariul minim din departamentul 30.Asa ca '> ANY' inseamna mai mare ca minim.'=ANY' este echivalent cu IN. Cind se foloseste SOME/ANY, DISTINCT este frecvent folosit pentru a impie- dica sa se selecteze linniile de mai multe ori. ALL compara o valoare cu fiecare valoare intoarsa de o subcerere. Urmatoarea cerere gaseste angajatii care cistiga mai mult ca fiecare angajat din departamentul 30 :
SELECT ENAME, SAL, JOB, DEPTNO FROM EMP WHERE SAL > ALL (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30) ORDER BY SAL DESC; ENAME ------KING SCOTT FORD JONES SAL ----5000 3000 3000 2975 JOB ----PRESIDENT ANALYST ANALYST MANAGER DEPTNO --------10 20 20 20

Cel mai mare salariu din departamentul 30 este 250$ (a lui Blake), asa ca cererea intoarce acei angajati ai caror salariu este mai mare ca salariul maxim din departamentul 30, prin urmare mai mare ca fiecare salariu din de- partament. Operatorul NOT poate fi folosit cu IN, ANY sau ALL. Clauza HAVING cu subcereri ascunse Subcererile ascunse pot fi folosite de asemenea in clauza HAVING. (Observatie : clauza WHERE se refera la o singura linie si clauza HAVING la grupuri de linii specificate in clauza GROUP BY.)

De exemplu, pentru a afisa departamentul(ele) care au un salariu mediu mai mare ca departamentul 30, introducem :
SELECT DEPTNO, AVG(SAL) FROM EMP HAVING AVG(SAL) > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 30) GROUP BY DEPTNO; DEPTNO -------10 20 AVG(SAL) ---------2916.66667 2175

Pentru a construi o cerere care gaseste functia cu cel mai mare salariu mediu, introducem :

SELECT JOB, AVG(SAL) FROM EMP GROUP BY JOB HAVING AVG(SAL) = (SELECT MAX(AVG(SAL)) FROM EMP GROUP BY JOB); JOB ----PRESIDENT AVG(SAL) ---------5000

Mai intii cererea interioara gaseste salariul mediu pentru fiecare grup de functii diferit si functia MAX alege cel mai mare salariu mediu.Acea valoare (5000) este folosita in clauza HAVING.Clauza GROUP BY din cererea principala este necesara pentru ca lista ce urmeaza dupa SELECT-ul din cererea principala contine atit o coloana agregat cit si o coloana non-agragat. Ordonarea datelor cu subcereri Nu poate exista o clauza ORDER BY intr-o subcerere. Regula este ca poate exista doar o singura clauza ORDER BY pentru o decla- ratie SELECT si, daca este specificata, trebuie sa fie ultima clauza din co- manda SELECT. Subcereri ascunse Subcererile pot fi ascunse (folosite in interiorul unei subcereri) :

Afisati numele, functia si data angajarii pentru angajatii al caror salariu este mai mare ca cel mai mare salariu din orice departament de vinzari.
SELECT ENAME, JOB, HIREDATE, SAL FROM EMP WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = (SELECT DEPTNO FROM DEPT WHERE DNAME = 'SALES')); ENAME ------JONES SCOTT KING FORD JOB ----MANAGER ANALYST PRESIDENT ANALYST HIREDATE ---------02-APR-81 09-DEC-82 17-NOV-81 03-DEC-81 SAL ----2975 3000 5000 3000

Limitele de imbricare Limita nivelelor de imbricare pentru o subcerere este 255. Reguli de scriere a cererilor

cererea interioara trebuie sa fie inclusa intre paranteze si trebuie sa fie in partea dreapta a conditiei. subcererile nu pot avea clauza ORDER BY. clauza ORDER BY apare la sfirsitul declaratiei SELECT principale. coloanele multiple din lista din SELECT a cererii interioare trebuie sa fie in aceeasi ordine ca si coloanele ce apar in conditia din clauza cere- rii principale.De asemenea mai trebuie sa corespunda si tipul si numarul coloanelor listate. subcererile sint intotdeauna executate de la cea mai adinca imbricare pina la nivelul principal de imbricare, daca nu sint subcereri corelate (acestea vor fi discutate mai tirziu). pot fi folositi operatorii logici si SQL la fel de bine ca si ANY si ALL. subcererile pot o intoarce una sau mai multe linii; o intoarce una sau mai multe coloane; o folosi GROUP BY sau functii de grup; o fi folosite inlantuite cu predicate multiple AND sau OR in aceesi cerere externa. o uni tabele. o recupera dintr-o tabela diferita de cea a cererii exterioare.

o o o

apare in declaratii SELECT, UPDATE, DELETE, INSERT, CREATE TABLE. fi corelate cu o cerere exterioara. folosi operatori de multimi.

Subcereri corelate O subcerere corelata este o subcerere care este executata o data pentru fiecare linie candidat considerata de cererea principala si care la executie foloseste o valoare dintro coloana din cererea exterioara.Aceasta determina ca subcererea corelata sa fie prelucrata intr-un mod diferit de subcererea ascunsa obisnuita. O subcerere corelata este identificata prin folosirea unei coloane a cererii exterioare in clauza predicatului cererii interioare. Cu o subcerere ascunsa obisnuita, SELECT-ul interior ruleaza primul si se executa o data, intorcind valori ce vor fi folosite de cererea principala.Pe de alta parte, o subcerere corelata se executa o data pentru fiecare linie candidat considerata de cererea externa.Cererea interioara este dirijata de cererea externa. Pasii de executie ai unei subcereri corelate : 1. Se obtine linia candidat. (obtinuta de cererea exterioara) 2. Se executa cererea interioara folosind valoarea liniei candidat. 3. Se folosesc valorile rezultate din cererea interioara pentru a pastra sau pentru a inlatura linia candidat. 4. Se repeta pina nu mai ramine nici o linie candidat. Desi subcererea corelata se executa repetat, o data pentru fiecare linie in cererea principala, aceasta nu inseamna ca subcererile corelate sint mai putin eficiente ca subcererile necorelate obisnuite.Se va vorbi despre eficienta mai tirziu in acest capitol. Putem folosi o subcerere corelata pentru a gasi angajatii care cistiga un salariu mai mare ca salariul mediu al departamentului lor :
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP E WHERE SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO) ORDER BY DEPTNO; EMPNO ------7839 ENAME ------KING SAL -----5000 DEPTNO -------10

7566 7788 7902 7499 7698

JONES SCOTT FORD ALLEN BLAKE

2975 3000 3000 1600 2850

20 20 20 30 30

Putem observa imediat ca este o cerere corelata pentru ca am folosit o co- loana din SELECT-ul extern in clauza WHERE din SELECT-ul interior. Observati ca alias-ul este necesar doar pentru a indeparta ambiguitatea pentru numele coloanelor. Sa analizam exemplul de mai sus folosind tabela EMP : Cererea principala 1. Se selecteaza prima linie candidat - Smith din departamentul 20 cistiga 800 . 2. EMP in clauza FROM are alias-ul E care obtine coloana DEPTNO referita in clauza WHERE a cererii interioare. 3. Clauza WHERE compara 800 cu valoarea intoarsa de cererea interioara.

4. 5.

6. 7. 8.

Cererea interioara Calculeaza AVG(SAL) pentru departamentul angajatului. Valoarea departamentului din clauza WHERE este departamentul candidatului (E.DEPTNO), valoare transmisa cererii interioare din coloana DEPTNO a cererii exterioare. AVG(SAL) pentru departamentul lui Smith - 20 - este 2175 . Linia candidat nu indeplineste conditia, asa ca este indepartata. Se repeta de la pasul 1 pentru urmatoarea linie candidat; ALLEN din departamentul 30 cistiga 1600 .

Selectia liniilor candidat continua cu verificarea conditiei ce apare in re- zultatul cererii. Observatie : o subcerere corelata este semnalata de un nume de coloana, un nume de tabela sau un alias de tabela in clauza WHERE, care se refera la va- loarea unei coloane in fiecare linie candidat din SELECT-ul exterior.De aseme- nea subcererea corelata se executa repetat pentru fiecare linie candidat in cererea principala. Comenzile UPDATE pot contine subcereri corelate :

UPDATE EMP E SET (SAL, COMM) = (SELECT AVG(SAL) * 1.1, AVG(COMM) FROM EMP WHERE DEPTNO = E.DEPTNO) HIREDATE = '11-JUN-85';

Operatori

Cind se folosesc declaratii SELECT ascunse, operatorii logici, precum si ANY si ALL sint toti valizi.In plus poate fi folosit operatorul EXISTS.
Operatorul EXISTS

Operatorul EXISTS este frecvent folosit cu subcererile corelate.El testeaza daca o valoare exista (NOT EXISTS specifica daca ceva nu exista).Daca valoarea exista se intoarce TRUE; daca valoarea nu exista se intoarce FALSE. Pentru a gasi angajatii ce au cel putin un subordonat, introducem :
SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP E WHERE EXISTS (SELECT EMPNO FROM EMP WHERE EMP.MGR = E.EMPNO) ORDER BY EMPNO;

EMPNO ------7566 7698 7782 7788 7839 7902

ENAME ------JONES BLAKE CLARK SCOTT KING FORD

JOB ----MANAGER MANAGER MANAGER ANALYST PRESIDENT ANALYST

DEPTNO -------20 30 10 20 10 20

Sa gasim toti angajatii al caror departament nu este in tabela DEPT :


SELECT EMPNO, ENAME, DEPTNO FROM EMP WHERE NOT EXISTS (SELECT DEPTNO FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO);

Nu va fi selectata nici o inregistrare. Alt mod de a gasi departamentul care nu are nici un angajat este :
SELECT DEPTNO, DNAME FROM DEPT D WHERE NOT EXISTS (SELECT 1 FROM EMP E WHERE E.DEPTNO = D.DEPTNO); DEPTNO -------40 DNAME ------OPERATIONS

Observati ca SELECT-ul interior nu este necesar sa intoarca o valoare spe- cifica, asa ca poate fi selectata o cifra.
De ce sa folosim o subcerere corelata ?

Subcererea corelata este un mod de a 'citi' fiecare linie din tabela si de a compara valorile din fiecare linie cu datele inrudite.Aceasta este folosita oricind o subcerere trebuie sa intoarca un rezultat diferit sau o multime de rezultate pentru fiecare linie candidat considerata de cererea principala.Cu alte cuvinte, o subcerere corelata este folosita pentru a raspunde la intre- bari cu mai multe subpuncte al caror raspuns depinde de valoarea din fiecare linie din cererea parinte. SELECT-ul interior este executat normal o data pentru fiecare linie candi- dat.
Considerente de eficienta

Vom examina cele doua tipuri de subcereri.Trebuie mentionat ca subcererea corelata (cu EXISTS) poate fi cel mai performant mod pentru unele cereri. Performanta va depinde de folosirea indexarilor, de numarul liniilor in- toarse de cereri, de dimensiunea tabelelor si daca sint necesare tabelele temporare pentru a evalua rezultatele temporare.Tabelele temporare generate de ORACLE nu sint indexate si acest lucru conduce la degradarea performantelor pentru subcererile ce folosesc IN, ANY si ALL. Cele de mai sus sint puncte de vedere generale.Performantele sint discutate mai in detaliu in alte cursuri.

NOT EXISTS contra NOT IN

Desi intr-o subcerere o operatie NOT IN poate fi la fel de eficienta ca si NOT EXISTS, NOT EXISTS este mult mai sigur daca subcererea intoarce niste valori NULL, fata de de NOT IN pentru care conditia se evalueaza la FALSE cind in lista de comparatii sint incluse valori NULL. Considerind urmatoarea cerere care gaseste angajatii ce nu au nici un su- bordonat :
SELECT ENAME, JOB FROM EMP WHERE EMPNO NOT IN (SELECT MGR FROM EMP);

Nici o linie nu va fi intoarsa de cererea de mai sus, deoarece coloana MGR contine o valoare NULL. Cererea corecta este :
SELECT ENAME, JOB FROM EMP E WHERE NOT EXISTS (SELECT MGR FROM EMP WHERE MGR = E.EMPNO); ENAME ------SMITH ADAMS ALLEN WARD MARTIN TURNER JAMES MILLER JOB ----CLERK CLERK SALESMAN SALESMAN SALESMAN SALESMAN CLERK CLERK

Exercitii - Subcereri Aceste exercitii va vor permite sa scrieti cereri complete folosind SELECT- uri ascunse si SELECT-uri corelate. Tema

1. Gasiti angajatii care cistiga cell mai mare salariu pentru fiecare tip de functie.Sortati in ordinea descrescatoare a salariului.

2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

JOB ----PRESIDENT ANALYST ANALYST MANAGER SALESMAN CLERK

ENAME ------KING SCOTT FORD JONES ALLEN MILLER

SAL -----5,000.00 3,000.00 3,000.00 2,975.00 1,600.00 1,300.00

Vor fi 6 inregistarri selectate.

12. Gasiti angajatii care cistiga salariul minim pentru functia lor.Afisati rezultatul in ordine crescatoare a salariului.
13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ENAME ------SMITH WARD MARTIN CLARK SCOTT FORD KING JOB ----CLERK SALESMAN SALESMAN MANAGER ANALYST ANALYST PRESIDENT SAL ----800.00 1,250.00 1,250.00 2,450.00 3,000.00 3,000.00 5,000.00

Vor fi 7 inregistari selectate.

24. Gasiti cei mai recenti angajati din fiecare departament.Ordonati dupa data angajarii.
25. 26. 27. 28. 29. 30. DEPTNO -------20 10 30 ENAME ------ADAMS KING JAMES HIREDATE ---------04-JUN-84 09-JUL-84 23-JUL-B4

31. Afisati urmatoarele detalii pentru orice angajat care cistiga un salariu mai mare ca media pentru departamentul lor.Sortati dupa numarul departamentului.
32. 33. 34. 35. 36. 37. 38. ENAME ------KING JONES SCOTT FORD ALLEN SALARY -------5000 2975 3000 3000 1600 DEPTNO -------10 20 20 20 30

39. 40. 41.

BLAKE

2850

30

Vor fi selectate 6 inregistrari.

42. Listati toate departamentele care nu au angajati (folositi o subcerere).


43. 44. 45. DEPTNO -------40 DNAME ------OPERATIONS

46. Afisati urmatoarele informatii pentru departamentul cu cea mai mare nota de plata anuala.
47. 48. 49. DEPTNO -------20 COMPENSATION --------------130500

50. Care sint primii trei angajati in functie de salariul cistigat ? Afisati numele lor si salariul.
51. 52. 53. 54. 55. 56. 57. ENAME ------SCOTT KING FORD SAL ----3,000.00 5,000.00 3,000.00

58. In ce an s-au angajat cei mai multi in companie ? Afisati anul si numarul angajatilor.
59. 60. 61. YEAR -----1984 NUMBER OF EMPS ---------------8

62. Modificati intrebarea 4 pentru a afisa si salariul mediu pentru departa- ment.
63. 64. 65. 66. 67. ENAME ------ALLEN BLAKE JONES SAL ----1600 2850 2975 DEPTNO -------30 30 20 DEPTAVG ---------1566.66667 1566.66667 2175

68. 69. 70. 71. 72.

FORD SCOTT KING

3000 3000 5000

20 20 10

2175 2175 2916.66667

Vor fi selectate 6 inregistrari.

73. Scrieti o subcerere care afiseaza o '*' linga linia celui mai recent angajat.Afisati ENAME, HIREDATE si coloana (maxdate) completata cu '*'.
74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. ENAME ------SMITH ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT TURNER WARD HIREDATE ---------13-JUN-83 04-JUN-84 15-AUG-83 11-JUN-84 14-MAY-84 05-DEC-83 23-JUL-84 31-OCT-83 09-JUL-84 05-DEC-83 21-NOV-83 05-MAR-84 04-JUN-84 26-MAR-84 MAXDATE ---------

Vor fi selectate 14 inregistrari.

Subcereri
1. 2. 3. 4. 5. 6. SELECT JOB, ENAME, SAL FROM EMP WHERE (SAL, JOB) IN (SELECT MAX(SAL), JOB FROM EMP GROUP BY JOB) ORDER BY SAL DESC; SELECT ENAME, JOB, SAL FROM EMP WHERE (SAL, JOB) IN (SELECT MIN(SAL), JOB FROM EMP GROUP BY JOB) ORDER BY SAL; SELECT DEPTNO, ENAME, HIREDATE FROM EMP WHERE (HIREDATE, DEPTNO) IN (SELECT MAX(HIREDATE), DEPTNO FROM EMP GROUP BY DEPTNO) ORDER BY HIREDATE;

7.
8. 9. 10. 11. 12. 13.

14.
15. 16. 17. 18. 19. 20.

21.

22. 23. 24. 25. 26. 27.

SELECT ENAME, SAL SALARY, DEPTNO FROM EMP E WHERE SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO) ORDER BY DEPTNO; SELECT DEPTNO, DNAME FROM DEPT D WHERE NOT EXISTS (SELECT 'anything' FROM EMP WHERE DEPTNO = D.DEPTNO); DEFINE REM = SAL * 12 + NVL(COMM, 0) SELECT DEPTNO, SUM(&REM) COMPENSATION FROM EMP GROUP BY DEPTNO HAVING SUM(&REM) = (SELECT MAX(SUM(&REM)) FROM EMP GROUP BY DEPTNO); SELECT ENAME, SAL FROM EMP E WHERE 3 > (SELECT COUNT(*) FROM EMP WHERE E.SAL < SAL); SELECT TO_CHAR(HIREDATE, 'YYYY') YEAR, COUNT(EMPNO) NUMBER_OF_EMPS FROM EMP GROUP BY TO_CHAR(HIREDATE, 'YYYY') HAVING COUNT(EMPNO) = (SELECT MAX(COUNT(EMPNO)) FROM EMP GROUP BY TO_CHAR(HIREDATE, 'YYYY')); SELECT E.ENAME ENAME, E.SAL, E.DEPTNO, AVG(A.SAL) DEPT_AVG FROM EMP A, EMP E WHERE E.DEPTNO = A.DEPTNO AND E.SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO) GROUP BY E.ENAME, E.SAL, E.DEPTNO ORDER BY AVG(A.SAL); SELECT ENAME, HIREDATE, '*' MAXDATE FROM EMP WHERE HIREDATE = (SELECT MAX(HIREDATE) FROM EMP) UNION SELECT ENAME, HIREDATE, ' ' FROM EMP WHERE HIREDATE <> (SELECT MAX(HIREDATE) FROM EMP)

28.
29. 30. 31. 32. 33.

34.
35. 36. 37. 38. 39. 40. 41.

42.
43. 44. 45. 46. 47.

48.
49. 50. 51. 52. 53. 54. 55.

56.
57. 58. 59. 60. 61. 62. 63. 64.

65.
66. 67. 68. 69. 70. 71. 72.

CAPITOLUL 10
SQL*PLUS SI REPORTING
In acest capitol vom prezenta facilitatile pentru SQL*Plus.In particular, capitolul prezinta modul in care comenzile SQL*Plus pot fi folosite pentru a formata rezultatele cererilor in rapoarte simple. Comenzi SQL si SQL*Plus SQL*Plus este un mediu in care pot apare doua tipuri de comenzi : 1. Comenzi SQL (cum ar fi SELECT). 2. Comenzi SQL*Plus (cum ar fi SAVE). Comenzile SQL*Plus difera de comenzile SQL in urmatoarele moduri : 1. Ele nu sint conectate cu nici o declaratie particulara SELECT. 2. Ele se introduc pe o singura linie.Oricum, un caracter de continuare, li- niuta de unire, poate fi folosit daca comanda este prea lunga pentru a o introduce pe o singura linie. Comenzile SQL*Plus pot fi folosite pentru a influenta prezentarea datelor furnizate de declaratiile SELECT, si din acest motiv sint folositoare pentru producerea rapoartelor, la fel de bine ca si pentru contolul mediului si pentru identificatorul de fisier. Comenzile SQL*Plus sint introduse la promter-ul SQL pe o singura linie, dar ele nu deschid un buffer.Urmatoarele sint citeva comenzi suplimentare. RUNFORM nume_fisier ruleaza o aplicatie a Oracle Forms din interiorul sesiunii tale SQL*Plus. Spool nume_fisier scrie toate comenzile ulterioare si/sau le scrie in fisierul cu numele nume_fisier. Fisierului de spool i se asociaza extensia .LIS (pe unele sisteme extensia .LST). SPO[OL] OFF | OUT

OFF inchide fisierul de spool si OUT opreste procesul de spool-ing si trimite fisierul de spool la imprimanta. DESC[RIBE] nume_de_tabela afiseaza structura tabelei din baza de date. HELP invoca help-ul intern din Oracle. $0 | S comanda HOST comanda invoca o comanda sistem din interiorul SQL*Plus ($ este specific pentru VAX). CONN[ECT] identificator_utilizator parola produce logarea la alt utilizator Oracle din interiorul login-ului curent. PROMPT text afiseaza textul cind se ruleaza un fisier de comenzi. Comenzi SET Comenzile SET controleaza 'mediul' in care ruleaza in mod curent SQL*Plus. In general, comenzile asociaza o valoare unei variabile de sistem sau o trece pe ON sau OFF.Aceste comenzi pot fi folosite in mod implicit pentru fiecare sesiune prin includerea lor intr-un fisier numit LOGIN.SQL, care este citit de fiecare data cind se ruleaza SQL*Plus.Daca o comanda SET aparuta in timpul se- siunii modifica valoarea implicita, aceasta va fi valabila doar pentru acea sesiune.Iesirea (EXIT) din SQL*Plus va reseta variabilele de sistem la valo- rile lor implicite. Comenzile SQL*Plus pot fi prescurtate. Cuvintele subliniate reprezinta starile implicite pentru comenzile de mai jos. ECHO {OFF ON} ON face ca SQL*Plus sa afiseze comenzile asa cum sint ele executate dintr-un fisier de comenzi.OFF suprima acest lucru.

FEED[BACK] {6n OFF ON} n face ca SQL*Plus sa afiseze numarul inre- gistrarilor selectate intr-o cerere cind sint selectate cel putin n inregistrari sau mai multe.ON sau OFF face ca aceasta sa fie sau nu afisata. Trecerea feedback-ului pe ON face ca n sa fie setat la 1.Setarea feed- back-ului la 0 este echivalent cu trecerea sa pe OFF. HEA[DING] {OFF ON} ON face ca SQL*Plus sa afiseze in rapoarte capetele de coloane.OFF suprima capetele de coloane. LIN[ESIZE] {80n} seteaza numarul de caractere pe care SQL*Plus le va afisa pe o linie si de asemenea con- troleaza centrarea si aliniamentul din dreapta a textului.Valoarea maxima pentru n este 500. NEWP[AGE] {1n} seteaza numarul liniilor goale ce vor fi tiparite intre titlul de jos de la fiecare pagina si titlul de sus al paginii urmatoa- re.Valoarea 0 face ca SQL*Plus sa stearga ecranul pe majoritatea terminalelor. NUM[FORMAT] text seteaza formatul implicit pentru afisarea numarului articolelor de date.Text trebuie sa fie un format de numar.Vedeti optiunea COLUMN, clauza FORMAT pentru formatul nu- merelor descris sub titlul 'COLUMN - Optiuni', mai tirziu in acest subcapitol. NUM[WIDTH] {10n} seteaza latimea implicita pentru afisarea valorilor numerice. PAGES[IZE] {24n} seteaza numarul liniilor pe o pagina.Pentru rapoarte tiparite pe hirtie de lungime de 11 inch, valoarea 54 (plus valoarea NEWPAGE 6) lasa margini de 1 inch deasupra si dede- subtul paginii.

VER[IFY] {OFF / ON text} ON face ca SQL*Plus sa afiseze textul unei comenzi inainte si dupa substituirea va- riabilei cu valoarea sa.OFF suprima acest lucru. TIM[ING] {OFF / ON} ON face ca SQL*Plus sa dea statistici de timp la fiecare declaratie SQL ce este rulata.OFF suprima acest lucru pentru fiecare comanda SQL. SPA[CE] {1n} seteaza numarul de spatii dintre coloane pentru o afisare de tabela.Valoarea maxima pentru n este 10. TERM[OUT] {OFF ON} OFF suprima afisarea iesirii generate de comenzi executate dintr-un fisier, asa ca iesirea poate fi prelucrata fara sa apara pe ecran.ON permite ca iesirea sa fie afisata. SQLCASE {MIXED / LOWER / UPPER} LOWER / UPPER convertesc comenzile SQL chiar inainte de executie.Tot textul din interi- orul comenzii este convertit.MIXED lasa tex- tul nemodificat. Pentru a gasi valoarea pentru o variabila SET folosim comanda SHOW. De exemplu, pentru a gasi dimensiunea paginii (pagesize), introducem :
SHOW PAGES[IZE]

Pentru a vedea valorile pentru toate variabilele SET, introducem :


SHOW ALL |---------------------------------------------------------------------| | | | RAPOARTE SQL*PLUS | | | | Titlu | | | | | | |

| |------------------------------|------------------------------| | | | | | | | | Thu April 10 | Page 1 | | | | | | | | | | | | | | COMPANY REPORT | | | | | | | | | | | | ----------------------------| | | | ----------------------------| | | | ----------------------------| | | | ===== | | | | | | | | | | | | ----------------------------| | | | ----------------------------| | | | ===== | | | | | | | | | | | | ----------------------------| | | | ----------------------------| | | | ----------------------------| | | | ----------------------------| | | | ----------------------------| | | | | ===== | | | | | ===== | | | | | | | | | | | Confidential | | | | | | | | | | | | | | | | |------------------|---------------------------------|--------| | | | | | | | | | | Formate de coloana Calcule | | | | | |---------------------------------------------------------------------|

COLUMN - Optiuni Comanda COLUMN stabileste optiunile de afisare pentru o coloana.Formatul este :
COL[UMN] nume_coloana / alias lista_optiuni

Observatii asupra optiunilor pentru COLUMN :

1. nume_coloana trebuie sa se refere la un alias de coloana, daca un alias de coloana este folosit in clauza SELECT. 2. Optiunile pot apare in orice ordine. 3. O data ce apare o declaratie de coloana, ea ramine activa tot timpul cit sesiunea SQL*Plus ramine deschisa.Ea continua sa fie setata in timp ce sint afisate alte tabele (fara aceasta coloana). 4. Optiunile pentru COLUMN pot fi sterse in timpul unei sesiuni. 5. Pentru a gasi setarea optiunilor curente pentru o coloana, introducem :
COL nume_coloana / alias

Alte citeva optiuni pentru COLUMN sint : WRAP permite specificarea catre SQL*Plus ca ori de cite ori TRUNC continutul actual al unei coloane depaseste latimea specifi- cata, informatia aditionala este impachetata (WRAP) prin rotunjire in linia urmatoare sau trunchiata (TRUNC).WRAP este valoarea implicita. WORD_WRAPPED muta un cuvint de intrare pe linia urmatoare, in loc sa-l desparta pe doua linii.Un cuvint nu va fi despartit pe doua linii daca nu este mai mare ca latimea coloanei. HEADING specifica un cap pentru o coloana. NULL sir seteaza NULL-uri in coloana la sirul specificat. PRINT

NOPRINT coloana va fi afisata / nu va fi afisata pe rapotrul de iesire. NEW_VALUE var Valoarea coloanei este inscrisa in variabila specificata in momentul in care coloana este selectata (SELECT).

Optiuni de format in comanda COLUMN


Formatul de afisare a coloanelor
An 9 0 $ . , MI PR EEEE V B alfanumeric, de lungime n pozitie numerica forteaza zerouri principale floating dollar punct zecimal virgula semnul minus la dreapta 999999 099999 $999999 999999.99 999,999 999999MI 1234 001234 $1234 1234.00 1,234 1234<1234> 1.234E+03 123400

numere negative intre paranteze 999999PR notatie stiintifica multiplicare cu 10 la n (n = numar de 9 dupa V) valorile zero devin blank-uri 99.999EEEE 9999V99 B9999.99

NOTA: 1. Formatul 999999 - afiseaza blank-uri pentru zerouri! 2. Formatul B9999.99 - daca punctul zecimal e inclus in formatul de afi- sare, formatul B este cerut pentru a face valori- le nule blank-uri. 3. Formatul B999999 - Formatul B nu are efect pentru ca 999999 fara 'B' descrie zerourile ca blank-uri.

MESAJE DE EROARE

### %

...valoare prea mare pentru format ...tip gresit al valorii pentru format

Exemple de format al coloanelor


COLUMN COLUMN COLUMN COLUMN COLUMN COLUMN DEPTNO FORMAT 099 HEADING 'Dept.' JOB FORMAT A9 HEADING 'Job' JUSTIFY RIGHT EMPNO FORMAT 9999 HEADING 'Empl|No' SAL FORMAT 99,999.99 HEADING 'Monthly|Salary' COMM FORMAT 99,990.99 HEADING 'Y-T-D|Commission' - NULL 'No Comm' REM FORMAT 999,999.99 HEADING 'Total Rem.'

SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM FROM EMP;

Rezultatul cererii afiseaza caracteristici ale optiunilor de formatare a coloanelor. Fiecare coloana are un titlu diferit. Justificarea titlului a fost schimbata din cea implicita, si in unele cazuri separata peste un numar de linii, folosind o bara verticala (|), Optiunea NULL a fost folo- sita sa forteze un sir de caractere sa fie afisat cand un null ar trebui in mod normal sa apara. Clauza SELECT poate contine alias-uri de coloane, coloane cu un prefix de tabela, expresii si siruri literale care determina numele coloanei speci- ficat in comanda COLUMN a SQL*PLUS.
Daca aceasta este lista de articole a SELECT-ului ------------------------sal emp.sal e.sal sal*12+nvl(comm,0) sal*12 annsal sysdate empno||'-'||ename To_char(Hiredate,'ddth MONYYYY') Folositi acest nume de coloana in comanda COLUMN -----------------------------sal sal sal sal*12+nvl(comm,0) annsal sysdate empno||'-'||ename To_char(Hiredate,'ddth MONYYYY')

To_char(sysdate,'Day Mon YY')Today

Today

Comenzile TTITLE si BTITLE


Comenzile TTITLE si BTITLE sunt folosite pentru a produce titluri pe o pagina.
Comanda ------TTITLE 'sir de caractere' Descriere --------tipareste data curenta in coltul din stanga sus al fiecarei pagini, numarul paginii in coltul din dreapta sus si centreaza titlul pe linia de dedesupt. tipareste textul centrat in partea de jos a fiecarei pagini. In ambele cazuri un racter '|' va face ca urmatorul text sa fie centrat pe linia urmatoare. TTITLE BTITLE TTITLE OFF anteBTITLE OFF COLUMN COLUMN COLUMN COLUMN COLUMN COLUMN afiseaza TTITLE-ul sau BTITLE-ul curent anuleaza afisarea unui titlu definit rior sau a unei note de subsol.

BTITLE 'sir de caractere' ca-

DEPTNO FORMAT 099 HEADING 'Dept.' JOB FORMAT A9 HEADING 'Job' JUSTIFY RIGHT EMPNO FORMAT 9999 HEADING 'Empl|No' SAL FORMAT 99,999.99 HEADING 'Monthly|Salary' COMM FORMAT 99,990.99 HEADING 'Y-T-D|Commission' - NULL 'No Comm' REM FORMAT 999,999.99 HEADING 'Total Rem.'

TTILTE 'COMPANY REPORT|Produced by Personnel Dept' BTITLE 'Company Confidential' SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM FROM EMP;

Comenzile TTITLE si BTITLE pot include un numar de clauze, facand posibil ca aparitia titlului sa fie specificata mai detaliat.
TTI[TLE] [printspec OFF ON] BTI[TLE] [printspec OFF ON] printspec defineste titlul si poate contine mai multe clauze. printspec defineste not de subsol si poate contine mai multe clauze.

Clauze in Printspec
COL n sare tiparirea pozitiei n a liniei curente

(inapoi daca coloana a fost trecuta). SKIP n sare de la startul unei noi linii de n ori. Daca n este omis, sare o linie; daca n este 0, inapoi la inceputul liniei curente. sare inainte n pozitii de tiparit (inapoi daca n este negativ). aliniere stanga, centru sau dreapta pe linia curenta. Articolele de date ce urmeaza acestei clauze sunt aliniate ca un grup, pana la sfarsitul comenzii TTILTE sau pana la rul LEFT, CENTER, RIGHT sau COLUMN.(CENTER si RIGHT folosesc valoarea lui SET LINESIZE pentru a calcula pozitiile articolelor de date). FORMAT o urmeaza, pana la urmatoarea clauza FORMAT sau pana la sfarsitul comenzii.Specificarea formatului este la fel cu cea a clauzei FORMAT a comenzii COLUMN. O singura specificare de format poate fi efectiva la un moment dat. Daca este al unui tip de date gresit pentru un articol particular, nu are efect asupra acelui articol particular. Daca nu este efectiva nici o clauza FORMAT potrivita, valorile numerice sunt tiparite in acord cu formatul SET NUMFORMAT, sau daca SET NUMFORMAT nu a fost folosit, in acord cu formatul implicit. Valorile datei sunt tiparite in formatul implicit. SQL.PNO prefixul SQL. De exemplu, pentru a folosi variabila PNO scrieti: TTITLE RIGHT 'page' SQL.PNO Aceasta va produce 'page 1' la marginea din dreapta a liniei daca 1 este pagina curenta. Variabila sistem pentru numarul paginii curente a raportului. Va puteti referi la valoarea unei variabile sistem dandu-i defineste formatul articolelor de date care

TAB n LEFT,CENTER and RIGHT urmato-

Eliminarea valorilor duplicate si spargerea unui raport in sectiuni

Liniile unui raport pot fi sparte in sectiuni, folosind comanda BREAK. Prin spargerea unei coloane, afisarea valorilor duplicate este eliminata. Puteti deasemenea sa lasati linii goale sau sa incepeti o noua pagina intre sectiuni. Pana cand va aparea o 'spartura' , valorile coloanelor se schimba de fiecare data, trebuie sa va reamintiti sa 'ORDER BY' coloana declaratia SELECT sau raportul dumneavoastra va fi rupt in sectiuni de neinteles. Poate fi o singura comanda BREAK activa la un moment dat; prin urmare, daca cereti break-uri multiple ele trebuie sa fie specificate ca o singura comanda BREAK. Trebuie sa listati coloanele sparte in ordinea importantei, 'sparturile' majore mai intii. Optiuni BREAK Break-urile pot fi active la :

Column Row Page Report

BREAK ON [column/alias ROW][SKIP n DUP PAGE] ON...[ON REPORT]

Un BREAK ON REPORT va permite calcule finale sumare. La orice "break", urmatoarele optiuni pot fi specificate:
Optiune ------PAGE SKIP n DUP[LICATE] Descriere --------renunta la o pagina cand o valoare in coloana se schimba. sare n linii cand valoarea se schimba. duplica valorile. Implicit este: NODUP[LICATE].

Exemple:

BREAK ON REPORT ON DEPTNO PAGE ON JOB SKIP 2 BREAK ON REPORT ON DEPTNO PAGE ON JOB DUP

Pentru a curata break-urile emiteti comanda:

CLEAR BREAKS

Pentru a tipari break-urile curente emiteti comanda:


BREAK

Urmatorul exemplu ilustreaza folosirea BREAK-urilor:


COLUMN COLUMN COLUMN COLUMN COLUMN Comm' COLUMN TTILTE BTITLE DEPTNO FORMAT 099 HEADING 'Dept.' JOB FORMAT A9 HEADING 'Job' JUSTIFY RIGHT EMPNO FORMAT 9999 HEADING 'Empl|No' SAL FORMAT 99,999.99 HEADING 'Monthly|Salary' COMM FORMAT 99,990.99 HEADING 'Y-T-D|Commission' - NULL 'No REM FORMAT 999,999.99 HEADING 'Total Rem.' 'COMPANY REPORT|Produced by Personnel Dept' 'Company Confidential'

BREAK ON DEPTNO SKIP 1 ON JOB ON REPORT SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM FROM EMP ORDER BY DEPTNO,JOB;

Calcule Sumare Comanda COMPUTE executa calcule pe break-uri stabilite de comanda BREAK.
COMPUTE clauza(e) OF coloana(e) ON break(uri) Comanda ------OF ON tabeDescriere --------specifica coloana sau expresia a carei valoare va fi calculata. specifica articolul de date sau elementul de la care sa fie folosit ca break. Clauza -----AVG COU[NT] Calcule ------valoare medie contorizeaza valori nenule Aplicate pe tipul de coloana ---------------------------numar toate tipurile

MAX[IMUM] MIN[IMUM] NUM[BER] STD SUM VAR[IANCE]

valoare maxima valoare minima contorizare a liniilor deviatia standard suma valorilor nenule variatie

numar, caracter numar, caracter toate tipurile numar numar numar

Pot fi multe comenzi COMPUTE, cu toate ca adesea este mai usor sa specificati toate calculele cerute intr-o singura comanda. De exemplu:
COMPUTE SUM AVG OF SAL COMM ON DEPTNO REPORT

va calcula salariile medii si totale si comisionul figurate in sectiunea DEPTNO si la sfarsitul REPORT-ului. Fisierul de comenzi SQL*PLUS 1. compunere SELECT declaratie 2. SAVE nume fisier 3. ED nume fisier
4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. SET COL TTITLE BTITLE BREAK SET UP SQL*PLUS ENVIRONMENT

SELECT ... SQL /

TTITLE OFF COL DEPTNO CLEAR RESET SQL*Plus

27. 28. 29.

COL EMPNO CLEAR Etc.

ENVIRONMENT

30. CTRL Z VAX SPECIFIC 31. EX[IT] or QUIT 32. START nume fisier

CAPITOLUL 10 Exercitiu - Raport sub forma de tabel


1. Produce un raport care arata asemanator cu urmatorul. Asigurati-va la formatul coloanelor de date, la capul de tabel, si la specificatia ti- tlului paginii si notei de subsol. 2. Adaugati o comanda BREAK la script-ul SQL astfel ca raportul dumneavoas- tra sa sara o linie la sfarsitul detaliilor fiecarui departament, si e- limina duplicatele numelor de slujbe.

Capitolul 10 Solutie
SET SET SET SET ECHO OFF PAGESIZE 24 FEEDBACK OFF LINESIZE 78 FORMAT A10 HEADING 'Department' FORMAT A9 HEADING 'Job' FORMAT 9999 HEADING 'Emp.|No.' FORMAT A8 HEADING 'Name' FORMAT A5 HEADING 'Hire|Date' FORMAT B99,999.99 HEADING 'Monthly|Salary' FORMAT 9,990.99 HEADING 'Annual|Comm' FORMAT 999,999.99 HEADING 'Total' ON A SKIP 1 ON B

COL A COL B COL C COL D COL E COL F COL G COL H BREAK

TTITLE 'EMPLOYEE REPORT' BTITLE 'CONFIDENTIAL' SELECT DNAME A, JOB B, EMPNO C, ENAME D, TO_CHAR(HIREDATE,'MM/YY') E, SAL F, COMM G, SAL*12+NVL(COMM,0) H FROM EMP E,DEPT D WHERE E.DEPTNO = D.DEPTNO

ORDER BY DNAME,JOB / CLEAR COLUMNS TTITLE OFF BTITLE OFF SET FEDBACK ON SET PAGES 24 CLEAR BREAKS ,/pre>

CAPITOLUL 11
TRAVERSAREA ARBORILOR
Acest capitol detaliaza recuperarea datelor bazate pe o relatie ierarhi- ca naturala intre doua linii ale tabelei. Traversarea arborilor Tabela EMP are o structura arborescenta reprezentand linia de raport a conducerii. Parcurgerea arborelui
KING EMPNO=7839 | --------------------------------| | | MGR=7839 CLARK JONES BLAKE | | | | -----------------------------| | | | | | | | MILLER SCOTT FORD ALLEN WARD MARTIN TURNER JAMES | | | | ADAMS SMITH

O baza de date relationala nu contine inregistrarile intr-un mod ierarhic. Oricum, unde exista o legatura ierarhica intre liniile unei singure tabele, este un proces numit 'parcurgere de arbore' care face posibil ca ierarhia sa fie construita.Ierarhia poate fi creata privind la legatura dintre valorile echivalente in coloanele EMPNO si MGR(Aceasta legatura a fost deja exploa- tata cu join-ul unei tabele cu ea insesi). Numarul MGR al unui angajat este EMNO-ul sefului sau. Cand este realizata o parcurgere de arbore, nu va asteptati sa vedeti rezultatul cererii asemanator cu figura afisata mai sus. Numerele LEVEL (de nivel) sunt stabilite cand apare parcurgerea arborelui si reprezinta cat de indepartate sunt nodurile (liniile) de radacina (nodul de start).

Pentru a construi un arbore de traversare din tabela EMP, introduceti:


SELECT LEVEL, DEPTNO, ENAME, JOB, SAL FROM EMP CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL; Comanda Descriere --------------SELECT LEVEL Clauza SELECT standard, cu pseudo-coloana care afiseaza cat de departe este fiecare nod de nodul de start. FROM WHERE CONNECT BY Puteti sa SELECT FROM o singura tabela. Limiteaza liniile care sunt vizitate in timpul parcurgerii. Specifica coloanele unde exista legatura intre linii. Aceasta clauza este ceruta pentru o parcurgere de arbore. Stabileste directia in care este parcurs arborele. Daca PRIOR apare inainte de MGR, atunci valorile in coloana MGR sunt vizitate primele, apoi sunt gasite valorile echivalente din EMPNO, care este in susul arborelui. Daca apare inainte de EMPNO atunci arborele este in jos. START WITH Specifica unde sa inceapa arborele. Nu poate incepe la un nivel(LEVEL). Aceasta clauza este optionala chiar cand este ceruta o parcurgere de arbore. Apare la sfarsit de obicei.

PRIOR

PRIOR

ORDER BY

In exemplul de mai sus, structura ierarhica a organizatiei este reflectata in parcurgerea arborelui. Structura raportata conducere/angajati poate fi identificata cu claritate. Puteti folosi clauza ORDER BY pentru a sorta liniile returnate.Urmatoarea comanda este perfect legitima:
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL FROM EMP CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL ORDER BY DEPTNO;

Oricum, este recomandat sa nu folositi clauza ORDER BY la parcurgerea arbo- relui pentru ca ordonarea implicita a arborelui poate fi distrusa. In exemplul de mai jos, ordinea in care liniile lui SCOTT, ADAMS, FORD si SMITH sunt afisate s-a schimbat, si ADAMS pare sa se raporteze la FORD cand SCOTT este de fapt seful sau. Iesirea (rezultatul) nu reflecta ierarhia "adevarata".
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL FROM EMP CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL ORDER BY DEPTNO;

Parcurgerea arborilor
SELECT ENAME, LEVEL, JOB FROM EMP CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL EXCLUDERI : WHERE ENAME!='SCOTT' JONES | ---------------------------| | SCOTT (se sterge) FORD | | ADAMS SMITH CONNECT BY PRIOR EMPNO=MGR AND ENAME!='SCOTT' JONES | ---------------------------| | SCOTT (se sterge) FORD | | ADAMS (se sterge) SMITH

TERMINOLOGIE Sunt cativa termeni mai degraba neobisnuiti cand parcurgeti arborele. Nu este nevoie sa-i amintim pe toti, decat pentru informatie:
NODE ROOT acelasi lucru cu o linie un nod care nu este in proprietatea nimanui

PARENT CHILD TERMINAL NODE sau LEAF BRANCH

un nod care are alte noduri la un nivel inferior un nod care are un PARENT un nod fara fii un nod cu fii si nepoti

Chirurgia arborelui

Clauzele WHERE si CONNECT pot fi folosite pentru a curata arborele, care controleaza ce noduri sunt afisate. Daca clauza WHERE este folosita pentru a elimina un nod, atunci doar acel nod este eliminat. Daca restrictia apare in clauza CONNECT BY atunci intreaga ramura este eliminata. In exemplul urmator, numai linia SCOTT este eliminata, fiii sai sunt inca procesati.
BREAK ON DEPTNO SKIP 1 SELECT LEVEL, DEPTNO, ENAME, JOB, SAL FROM EMP WHERE ENAME != 'SCOTT' CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL;

In exemplul de mai jos, intreaga ramura SCOTT a fost eliminata:


SELECT LEVEL, DEPTNO, ENAME, JOB, SAL FROM EMP CONNECT BY PRIOR EMPNO = MGR AND ENAME != 'SCOTT' START WITH MGR IS NULL;

Notati ca de aceasta data ambele linii, parinte (SCOTT) si fiu (ADAMS), au fost excluse. Alte utilizari ale parcurgerii arborilor Organizarea tabelelor nu este singura aplicatie a unei cereri structura- te pe arbore. Clauza CONNECT BY poate fi folosita de asemenea in:

nota de plata a aplicatiilor materiale, sa produca explozii sau implozii partilor indentate. bilantul aplicatiilor pentru scopuri de consolidare.

CAPITOLUL 12

Crearea si Definirea de structuri tabelare


In acest capitol, discutam aspectele logice ale tabelelor si coloanelor si commenzile necesare pentru a construi tabele cu Constrangeri de Integri- tate. Acesta este primul din doua capitole care acopera subsetul comenzilor SQL cunoscut ca Limbajul de Definire a Datelor(DDL). Structuri de date ORACLE In acest curs vom discuta aspectele logice de creare a tabelelor.Consi- deratiile fizice sunt acoperite in celelalte cursuri.Desi tabelele pot fi create fara a da informatii de asezare fizice, ar trebui notat ca un utili- zator ORACLE trebuie sa fi primit privilegiul de CREATE TABLE de catre admi- nistratorul bazei de date si sa aiba alocat ceva spatiu de tabela pentru a crea tabele. In general, structurile de date ORACLE pot fi rezumate dupa cum urmeaza.

Tabelele pot fi create oricand, chiar cu utilizatori folosind baza de date. Nu este necesar sa specificati dimensiunea nici unei tabele. Aceasta este definita ultima prin cat spatiu a fost alocat bazei de date ca un intreg. Oricum, este important sa estimati cat de mult spatiu va utiliza o tabela. Structurile pot fi modificate online. Tabelele pot capata automat mai mult spatiu daca dimensiunea i- nitiala este umpluta.
Limbajul de Definire a Datelor (LDD)

LDD este un subset al comenzilor SQL folosit pentru a crea, modifica sau muta structurile bazei de date ORACLE, si deasemenea sa inregistreze informatii in Dictionarul de Date (acesta este discutat mai tarziu).
Denumirea unei tabele

Numele pe care-l alegeti pentru o tabela trebuie sa urmeze regulile standard pentru numirea unui obiect al unei baze de date ORACLE. 1. Numele trebuie sa inceapa cu o litera, A-Z sau a-z. 2. Poate contine litere, numerale si caracterele speciale underscore (_). Caracterele $ si # sunt deasemenea legale, dar folosirea lor este descurajata.

3. Numele este acelasi indiferent daca sunt folosite litere mari sau mici, de exemplu, EMP, emp, si eMp sunt toate aceeasi tabela. 4. Poate fi de maxim 30 caractere in lungime. 5. Numele nu trebuie sa duplice numele altui obiect din contul dumneavoastra. 6. Numele nu trebuie sa fie un cuvant rezervat SQL.
NUME ---EMP85 85EMP FIXED_ASSETS FIXED ASSETS UP DATE VALID ? ------da nu; nu incepe cu o litera da nu; contine un blank nu; cuvant rezervat SQL

Ar trebui sa folositi nume de descriere pentru tabele si alte obiecte ale bazei de date. Folositi acelasi nume sa descrie aceeasi entitate in doua tabele diferite. De exemplu, coloana cu numarul departamentului este numita DEPTNO in ambele EMP si DEPT.
Crearea unei tabele

Creati o noua tabela folosind comanda CREATE TABLE. Una dintre cele mai simple forme a acestei comenzi este cand informatia de baza pentru fiecare coloana este definita impreuna cu tipul ei de data si dimensiunea.
Sintaxa: CREATE TABLE nume tabela (nume coloana tip(dimensiune), nume coloana tip(dimensiune), ...); Exemplu: CREATE TABLE DEPT (DEPTNO NUMBER(2), DNAME VARCHAR2(12), LOC VARCHAR2(12));

Numele coloanelor intr-o tabela trebuie sa fie unice.


Tipurile coloanelor

Cand creati o tabela trebuie sa specificati fiecare tip de data al co- loanei. Tabela de mai jos arata cele mai importante tipuri de date.

Tipul de data poate fi urmat de unul sau mai multe numere in paranteze care dau informatii despre latimea coloanei. Latimea coloanei determina la- timea maxima pe care valorile in coloana pot s-o aiba. VARCHAR2 trebuie sa aiba o dimensiune, dar cele implicite sunt disponibile. Tabela de mai jos arata tipurile de date principale in ORACLE7.
Tip de date ----------VARCHAR2(w) CHAR(w) NUMBER NUMBER(w) NUMBER(w,s) Descriere --------Sir de caractere de lungime maxim w. Lungimea maxima este de 2000 caractere. Sir de lungime fixa w. Lungimea implicita este 1. Lungimea maxima este 255. Numere in virgula mobila cu precizie : 38 de cifre semnificative. Numere intregi de precizie w. Numere cu precizia w si scala s. Precizia reprezinta numarul maxim de cifre semnificative permise care nu pot depasi 38. Scala este numarul de pozitii zecimale te in dreapta punctului. DATE Valorile datei din 1 Ianuarie 4712 inainte de Hristos pana in 31 Decembrie 4712 dupa Hristos. Informatia de timp este deasemenea stocata. Sir de caractere de lungime variabila de lungime 2 Gb, sau 2 la puterea 31 minus 1. Este permisa o singura coloana de tipul pe tabela. RAW si LONG RAW Echivalent cu VARCHAR2 si respectiv LONG, dar folosit pentru a stoca date binare ca imagini grafice sau sunete digitizate.

inregistra-

LONG LONG

NOTE:

Tipul de date VARCHAR2 al Oracle7 este sinonim cu versiunea 6 a tipu- rilor de date 'VARCHAR' si 'CHAR'. ORACLE foloseste semantica prin comparatie non-padded daca o valoare VARCHAR2 este folosita intr-o comparatie(vezi Capitolul 2 pentru de- talii).

Daca o valoare scrisa intr-o coloana depaseste scala coloanei, atunci va apare o rotunjire.

Tabela de mai jos arata exemple de specificatii de coloane:


NUMBER(4) NUMBER(8,3) VARCHAR2(1000) CHAR(80) Poate contine toate numerele pana la 4 cifre. Poate contine pana la 8 cifre, dintre care 3 pot fi in dreapta punctului zecimal. Valorile pot contine pana la 1000 caractere. Siruri de caractere de lungime fixa egala cu 80. Valorile mai scurte sunt inlocuite cu blank-uri.

Crearea tabelei EMP

Tabela noastra demonstrativa, EMP, ar fi putut fi creata de o comanda CREATE TABLE ca mai jos:
CREATE TABLE (EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO EMP NUMBER(4) NOT NULL, VARCHAR2(10), VARCHAR2(10), NUMBER(4), DATE, NUMBER (7,2), NUMBER (7,2), NUMBER (2) NOT NULL);

Comanda DESCRIBE a SQL*PLUS-ului poate fi folosita pentru a lista detal ale coloanelor create intr-o tabela:
DESCRIBE EMP

Constrangerea NOT NULL

In exemplul de mai sus, veti observa ca definitiile pentru coloanele EMPNO si DEPTNO sunt urmate de NOT NULL. Aceasta ne asigura ca valoril nule sunt permise pentru aceste coloane, de cand aceste coloane servesc ca chei pentru operatii pe aceasta tabela. Coloanele fara constrangerea NOT NULL permit valori nule. NOT NULL este una dintre constrangerile de integritate care pot fi defi- nite.

OPTIUNEA DEFAULT Unei coloane ii poate fi data o valoare implicita prin optiunea DEFAULT. Aceasta previne aparitia de null-uri (sau erori, daca NOT NULL este specifi- cata) daca o linie este inserata fara o valoare din coloana.Valorile implici- te pot fi literali, o expresie, dar nu numele altei coloane. Functii ca SYSDATE si USER sunt valide. De exemplu:
HIREDATE DATE DEFAULT SYSDATE, SAL NUMBER (7,2) DEFAULT 0

Constrangeri de integritate

Oracle permite constrangerilor de integritate sa fie definite pentru ta- bele si coloanelor sa forteze reguli sigure, inauntrul unei tabele sau intre tabele. Constrangerile sunt folosite:

de serverul Oracle7 sa forteze reguli la nivelul tabelei oricand este inserata o linie, actualizata sau stearsa din acea tabela. Constrange- rea trebuie sa fie satisfacuta pentru ca operatiile sa reuseasca. pentru a preveni stergerea unei tabele daca sunt posesiuni din alte tabele. prin unelte sigure Oracle, ca Oracle Forms, pentru a furniza reguli pentru utilizarea intr-o aplicatie.

Constrangerile sunt clasate dupa cum urmeaza: Constrangeri de tabela Acestea pot referi una sau mai multe coloane si sunt definite SEPARAT de definitiile coloanelor din tabela. Constrangeri de coloana Acestea refera o singura coloana si sunt definite INAUNTRUL specificatiei pentru coloana posesoare. Constrangerile pot fi adaugate unei tabele dupa crearea ei si deasemenea temporar dezactivate (vezi comanda ALTER TABLE in capitolul urmator).Toate detaliile despre constrangeri sunt stocate in Dictionarul de Date. Fiecarei constrangeri ii este repartizat un nume. Iti este mai usor sa suplimentezi una tu singur, astfel ca poate fi

mai usor referita mao tarziu, dar daca nu, atunci un nume este generat automat pe forma:
SYS_Cn

unde n este un numar unic. Cuvantul cheie CONSTRAINT iti permite sa numesti o noua constrangere tu insuti. Tipuri de constrangeri Puteti defini urmatoarele tipuri de constrangeri:

NULL/NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY(integritatea de referinta) CHECK

Constrangerea UNIQUE

Aceasta desemneaza o coloana sau o combinatie de coloane ca o cheie uni- ca.Doua linii in aceeasi tabela nu pot avea aceeasi valoare pentru aceasta cheie.NULL-urile sunt permise daca cheia unica este bazata pe o singura co- loana. Sintaxa constrangerii de tabela :
[CONSTRAINT nume constrangere] UNIQUE (Coloana, Coloana, ...)

Sintaxa constrangerii de coloana :


[CONSTRAINT nume constrangere] UNIQUE

De exemplu, pentru a va asigura ca nu sunt 2 nume de departamente identice la o singura locatie:


CREATE TABLE DEPT (DEPTNO NUMBER, DNAME VARCHAR2(9), LOC VARCHAR2(10), CONSTRAINT UNQ_DEPT_LOC UNIQUE(DNAME,LOC))

In exemplul de mai sus, constrangerea UNQ_DEPT_LOC este o constrangere de tabela. Notati ca virgula precede detaliile. O constrangere unica il face pe ORACLE sa creeze un singur index pentru a manui regula. Indecsii sunt discu- tati mai tarziu.

Constrangere de cheie primara

Ca si la cheile unice, o cheie primara forteaza unicitatea unei coloane sau combinatii de coloane implicate si un index unic este creat pentru a con- duce aceasta. Totusi poate fi o singura cheie primara pe o tabela, si aceasta este cunoscuta ca fiind cheia definitiva prin care liniile in tabela sunt i- dentificate individul. NULL-urile nu sunt permise in coloanele de chei prima- re. Sintaxa constrangerii de tabela :
[CONSTRAINT nume constrangere] PRIMARY KEY (Coloana, Coloana, ...)

Sintaxa constrangerii de coloana :


[CONSTRAINT nume constrangere] PRIMARY KEY

Notati ca aceeasi combinatie de coloane nu poate fi folosita si pentru o cheie primara si pentru una unica. Urmatorul exempludefineste DEPTNO ca o cheie primara folosind o constrangere de coloana:
CREATE TABLE DEPT (DEPTNO NUMBER(2) CONSTRAINT DEPT_PRIM PRIMARY KEY, ...)

Constrangere de cheie externa

Cheile externe furnizeaza reguli de integritate de referinta inauntrul unei tabele sau intre tabele. O cheie exeterna este folosita intr-o relatie cu fiecare cheie primara sau unica oriunde si poate fi folosita, de exemplu, pentru a preveni stergerea unui departament in DEPT daca angajatii exista cu acelasi numar de departament in EMP. Sintaxa constrangerii de tabela :
[CONSTRAINT nume constrangere] FOREIGN KEY (Coloana, Coloana, ...) REFERENCES tabela (Coloana, Coloana, ...)

Sintaxa constrangerii de coloana :


[CONSTRAINT nume constrangere] REFERENCES tabela (Coloana)

Notati ca, cuvintele 'FOREIGN KEY' nu sunt folosite versiunea constrangerii de coloana a sintaxei.
Exemplul 1 -----------| DEPT | -----------(parinte)

| | /|\ DEPTNO -----------| EMP | (fiu) ------------

Pentru a stabili relatia dintre EMP si DEPT astfel incat EMP.DEPTNO este che- ia externa, si fiecare angajat trebuie sa aiba un numar valid de departament care este cunoscut in DEPT:
CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)

Optiunea ON DELETE CASCADE Ca rezultat al constrangerii de tabela de mai sus, (care ar fi putut la fel de bine sa fie definita ca o constrangere de coloana), un departament in DEPT nu ar fi putut fi sters daca liniile exista in EMP cu aceeasi valoare DEPTNO. Alternativ, puteti cere ca angajatii corespunzatori sa fie stersi a- utomat daca departamentul parinte in DEPT este sters. Aceasta este realizata adaugand clauza ON DELETE CASCADE.
CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO) ON DELETE CASCADE

Exemplul 2

-------------EMPNO | EMP | . . -------------. \|/ . . . . . MGR . . . .

Pentru a va asigura ca fiecarei linii de angajat in EMP ii este dat un numar de manager (MGR) pentru un angajat existent valid:

CREATE TABLE EMP (EMPNO NUMBER(4) PRIMARY KEY, ... MGR NUMBER(4) CONSTRAINT EMP_MGR REFERENCES EMP(EMPNO), ...

Constrangerea de verificare (CHECK)

Constrangerea CHECK defineste explicit o conditie pe care fiecare linie trebuie sa o satisfaca(sau sa o faca necunoscuta datorita unui NULL). Conditia poate folosi aceleasi constructii ca acelea intr-o restrictie de cerere, cu urmatoarele exceptii:

subcererile nu sunt permise referirile la pseudo-coloane ca SYSDATE nu sunt permise

Sintaxa: [CONSTRAINT nume constrangere] CHECK (conditie)

Alte optiuni ale constrangerilor


DISABLE poate fi inca citita de uneltele ORACLE pentru a construi reguli intr-o aplicatie si puteti face posibila constrangerea mai tarziu prin comanda ALTER TABLE. CREATE TABLE EMP ( . . . . . , ENAME VARCHAR2(10) CONSTRAINT CHK_UPP_NAM CHECK(ENAME-UPPER(ENAME)) DISABLE, . . . . . . . ) ; EXCEPTIONS INTO nume tabela constrangerea. CREATE TABLE EMP ( . . . . . , Identifica o tabela existenta unde este plasata informatia despre liniile care incalca Adaugand DISABLE unei definitii de constrangere inseamna ca ORACLE nu o forteaza. Constrangerea

ENAME VARCHAR2(10) CONSTRAINT CHK_UPP_NAM CHECK(ENAME-UPPER(ENAME)) EXCEPTIONS INTO CON_VIOLATE, . . . . . . . ) ;

In final, notati ca tabelele referite intr-o constrangere trebuie sa existe in aceeasi baza de date. Daca ele apartin unui utilizator diferit atunci posesorul trebuie specificat ca un prefix.

Iata un exemplu complet al constructiei tabelei EMP cu constrangeri :

CREATE TABLE EMP (EMPNO NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(10), MGR NUMBER(4) CONSTRAINT EMP_MGR REFERENCES EMP(EMPNO), CONSTRAINT EMP_PRIM PRIMARY KEY, CONSTRAINT ENAME_CONS CHECK(ENAME=UPPER(ENAME)),

HIREDATE DATE DEFAULT SYSDATE, SAL NUMBER(7,2) COMM NUMBER(7,2), DEPTNO NUMBER(2) CONSTRAINT CONSTRAINT DEPTNO_CONS NOT NULL, EMP_DEPT FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)) CONSTRAINT SAL_CONS NOT NULL,

Crearea unei tabele cu linii din alta tabela

Exista o a doua forma a declaratiei CREATE TABLE in care tabela este creata cu linii potrivite, derivate din alta tabela: CREATE TABLE DEPT

[(nume-coloana ,. . . .)] AS SELECT declaratie

Tabela va fi creata cu coloane specificate si linii recuperate din declaratia SELECT inserata. Numai constrangerile NULL/NOT NULL sunt mostenite din tabela selectata. Daca toata coloanele in declaratia SELECT au nume bine definite (nu sunt expresii s.a.m.d.) specificatiile coloanei pot fi omise. Daca sunt date specificatiile coloanei, atunci numarul de coloane trebuie sa fie egal cu numarul de articole in lista SELECT.

Pentru a crea o tabela DEPT30 care tine numerele angajatilor, nume, job-uri si salariile angajatilor din departamentul 30, introduceti:

CREATE TABLE DEPT30 AS SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE DEPTNO = 30;

Table created.

Pentru a vedea descrierea lui DEPT30, introduceti:

DESC DEPT30

Pentru a crea o tabela tinand numele angajatului, salariul si detalii de grad, introduceti:

CREATE TABLE EMP_SALS (NAME,SALARY,GRADE)

AS SELECT FROM WHERE

ENAME, SAL, GRADE EMP, SALGRADE EMP.SAL BETWEEN LOSAL AND HISAL;

Table created.

DESC EMP_SALS;

Pentru a afisa continutul tabelei EMP SALS, introduceti:

SELECT FROM ,/pre>

* EMP_SALS;

CAPITOLUL 12 Exercitii Crearea de tabele si de constrangeri


Atelier

1.

Creati o tabela numita PROJECTS, cu coloanele specificate ca mai jos.Pe 2. langa aceasta , definiti PROJID ca, coloana de CHEIE PRIMARA , si asigura3. ti-va ca datele P_END_DATE nu sunt mai recente decat datele P_START_DATE. 4. 5. 6. 7. Creati o a doua tabela, ASSIGNMENTS, ca cea de mai jos. Definiti-i coloana 8. PROJID ca o cheie externa care refera tabela PROJECTS. Coloana EMPNO a ta9. belei dumneavoastra este o viitoare cheie externa a lui EMP. Aceste doua 10. coloane nu ar trebui sa permita valori NULL (PROJID si EMPNO). 11.

12. 13.

Sunt alte constrangeri pe care ar trebui sa le angajam in aceste tabele. 14. Acestea vor fi adaugate intr-un viitor atelier. 15. 16. 17. Folositi comanda DESCRIBE pentru a verifica definitiile coloanelor. (Ne 18. vom uita la constrangeri mai tarziu). 19. 20.

CAPITOLUL 12 -Solutii

Fiecare din constrangerile aratate mai jos ar fi putut fi definite ca oricare constrangere de tabela sau constrangere de coloana.

1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

CREATE TABLE PROJECTS ( PROJID NUMBER(4) CONSTRAINT PROJ_PRIM PRIMARY KEY, P_DESC VARCHAR2(20), P_START_DATE DATE, P_END_DATE DATE, BUDGET_AMOUNT NUMBER(7,2), MAX_NO_STAFF NUMBER(2), CONSTRAINT P_DATE_RULE CHECK(P_START_DATE <= P_END_DATE))

11. 12. 13. 14.

CREATE TABLE ASSIGNMENTS (PROJID NUMBER(4) NOT NULL REFERENCES PROJECTS (PROJID), 15. EMPNO NUMBER(4) NOT NULL REFERENCES EMP (EMPNO), 16. A_START_DATE DATE, 17. A_END_DATE DATE, 18. BILL_RATE NUMBER(4,2), 19. ASSIGN_TYPE VARCHAR2(2))

CAPITOLUL 13
Management-ul de tabela si Dictionarul de Date
In acest capitol secund al Limbajului de Definire a Datelor vom vedea comenzile pentru modificarea si mutarea tabelelor si constrangerilor lor. Deasemenea, vom vedea cum informatii despre baza de date pot fi extrase din Dictionarul de Date. Modificarea unei tabele Folositi comanda ALTER TABLE pentru a schimba definitia unei tabele. Sintaxa:
ALTER TABLE nume-tabela [ ADD ](specificator coloana[constrangere de coloana])[ENABLE clauza ] [MODIFY ] clauza] [DROP optiuni] [DISABLE

Clauza ADD Folositi cuvantul cheie ADD pentru a adauga o coloana si/sau constran- geri pentru o tabela existenta. Pentru a adauga o coloana tabelei EMP care va tine numele sotului angajatului, introduceti:
ALTER TABLE EMP ADD (SPOUSES_NAME CHAR (10));

Table altered. Pentru a vedea descrierea tabelei revizuite, introduceti:


DESCRIBE EMP;

Pentru a adauga o constrangere de tabela unei tabele existente, care specifi- ca daca salariul lunar nu trebuie sa depaseasca 5000$, introduceti:
ALTER TABLE EMP ADD(CHECK(SAL <=5000)); ,/pre>

Clauza MODIFY

Folositi cuvantul cheie MODIFY pentru a modifica definitia unei coloane existente.

ALTER TABLE nume MODIFY (tip coloana [NULL])

Pentru a schimba lungimea lui ENAME la 25 de caractere, introduceti :

ALTER TABLE EMP MODIFY (ENAME CHAR (25));

Table altered.

DESCRIBE EMP;

Sunt 4 schimbari pe care nu le puteti face

1. 2. 3. 4. 5. 6.

Nu puteti schimba o coloana continand null-uri din NULL in NOT NULL. Nu puteti adauga o noua coloana care este NOT NULL. Faceti-o null, umpleti-o complet si apoi schimbati-o in NOT NULL.

Nu puteti sa scadeti dimensiunea unei coloane sau sa-i schimbati tipul de 7. date, numai daca nu contine date. 8. 9. Nu puteti folosi optiunea MODIFY pentru a defini constrangeri pe o coloana 10. exceptand NULL/NOT NULL. 11.

Pentru a modifica alte constrangeri trebuie sa le eliminati si apoi sa le adaugati specificand modificarile.

Clauza DROP

Folositi clauza DROP pentru a muta o constrangere din alta tabela.

Sintaxa: ALTER TABLE nume tabela DROP [CONSTRAINT nume constrangere ] [CASCADE] [PRIMARY KEY ] [UNIQUE (coloana, coloana, ...)]

De exemplu:

ALTER TABLE EMP DROP CONSTRAINT EMP_MGR; ALTER TABLE EMP DROP PRIMARY KEY;

Optiunea CASCADE (in clauza DROP)

Optiunea CASCADE a clauzei DROP face ca orice constrangere dependenta sa fie deasemenea eliminata.

De exemplu:

ALTER TABLE DEPT DROP PRIMARY KEY CASCADE; ar putea deasemenea sa faca ca constrangerea chaii exetrne din EMP>DEPTNO sa fie eliminata.

Clauza ENABLE/DISABLE

Aceasta clauza a comenzii ALTER TABLE permite constrangerilor sa fie facute posibile sau dezactivate fara a le elimina sau recrea.

Sintaxa: [DISABLE] [ENABLE ] [ UNIQUE (coloana, coloana, ...) ] [ PRIMARY KEY ] [ CONSTRAINT nume constrangere ] [CASCADE]

Ca si la clauza DROP, adaugarea cuvantului cheie CASCADE semnifica ca constrangerile dependente sunt deasemenea afectate.

De exemplu:

ALTER TABLE DEPT DISABLE CONSTRAINT DEPT_PRIM CASCADE;

Alte comenzi LDD

Eliminarea unei tabele

Pentru a sterge definitia unei tabele ORACLE, folositi comanda DROP TABLE.

Sintaxa: DROP TABLE nume tabela [CASCADE CONSTRAINTS]

De exemplu:

DROP TABLE EMP;

Stergerea unei tabele duce la pierderea tuturor datelor din ea si a tuturor indecsilor asociati ei. Optiunea CASCADE CONSTRAINTS va sterge deasemenea referirile la constrangerile de integritate dependente.

Note:

Toate datele vor fi deasemenea sterse din tabela. Orice VIEWS sau SYNONYMS vor ramane, dar vor deveni invalide. Orice tranzactii nerezolvate sunt realizate. Numai creatorul tabelei sau DBA poate sa o stearga.

Comanda COMMENT

Folositi comanda COMMENT pentru a insera un comentariu pana la 255 de caractere, despre o tabela sau coloana, in dictionarul de date.

Pentru a adauga un comentariu unei tabele numita EMP, introduceti:

COMMENT ON TABLE EMP IS 'Employee Information';

Pentru a adauga un comentariu pe coloana EMPNO in tabela EMP, introduceti:

COMMENT ON COLUMN EMP.EMPNO IS 'Unique employee number';

Pentru a sterge un comentariu, emiteti comanda COMMENT fara un comentariu:

COMMENT ON COLUMN EMP.EMPNO IS ''; ,/pre> Pentru a vedea comentariul, selectati coloana COMMENTS din una din vederile dictionarului:ALL_COL_COMMENTS sau USER_COL_COMMENTS. Dictionarul de Date este acoperit mai tarziu in acest capitol.

Comanda RENAME

Comanda RENAME este folosita de creatorul lui TABLES, VIEWS si SYNONYMS pentru a scimba numele obiectului bazei de date.

Pentru a redenumi un obiect al bazei de date sintaxa este: RENAME vechi TO nou;

Pentru a redenumi tabela EMP in EMPLOYEE, introduceti: RENAME EMP TO EMPLOYEE;

Pentru a redenumi tabela SALGRADE, introduceti: RENAME SALGRADE TO EMPLOYEE_GRADES;

Este important de notat ca orice aplicatii/programe/rapoarte care se refera la obiecte ce au fost redenumite, trebuie amendate.

Comanda TRUNCATE TABLE

Aceasta comanda va permite sa stergeti toate liniile dintr-o tabela. Notati ca comanda DELETE poate deasemenea realiza aceasta ca o parte a tranzactiei de manipulare a datelor (acoperita in capitolul urmator), dar comanda TRUNCATE TABLE umple o tabela mai eficient ca o actiune de definire de date, pana cand nu este retinuta nici o informatie de rollback.

Sintaxa: TRUNCATE TABLE nume tabela [REUSE STORAGE]

Optiunea REUSE STORAGE pastreaza spatiul din liniile sterse pentru reutilizarea tabelei. Implicit, acest spatiu este eliberat.

Dictionarul de Date Oracle

Dictionarul de Date este una din partile cele mai importante ale lui ORACLE RDBMS. Consta dintr-un set de tabele si vederi care furnizeaza un ghid de referinta accesibil doar la citire, despre baza de date. Dictionarul de Date va va spune:

numele utilizatorilor ORACLE drepturile si privilegiile care le-au fost acordate numele obiectelor bazei de date (tabele, vederi, indecsi, sinonime,secvente,...) constrangeri aplicate tabelei informatii de revizie, ca: cine a accesat si actualizat obiectele bazei de date specificate.

Dictionarul de Date este creat cand este creata baza de date. Oricand baza de date este in operatii, Dictionarul de Date este actualizat de ORACLE RDBMS.

Dictionarul de Date este o referinta pentru toti utilizatorii bazei de date. Este o sursa valoroasa de informatii pentru utilizatori, proiectanti de aplicatii si DBA. Dictionarul de Date este deasemenea critic pentru operatia ORACLE RDBMS, care il reaseaza pentru a inregistra si verifica informatii despre baza de date.

Accesul la Dictionarul de Date

Utilizatori

Accesul la obiectele Dictionarului de Date este prin SQL. Declaratiile SELECT pot fi folosite pentru a cere informatii din Dictionarul de Date.

RDBMS

Nici un utilizator nu ar trebui sa schimbe vreodata (insereze, actualizeze sau stearga) nici o linie sau obiect in Dictionarul de Date, este probabil sa compromita integritatea datelor. RDBMS actualizeaza automat Dictionarul de Date pentru a reflecta schimbarile structurii bazei de date, permisiuni, revizii si alte date. In timpul operatiei bazei de date, RDBMS citeste deasemenea Dictionarul de Date pentru a descoperi obiectele care exista si ca utilizatorii sa aiba acces la ele.

Tabelele si vederile Dictionarului de Date

Tabele

Baza Dictionarului de Date sau fundamentul tabelelor sunt primele obiecte ce trebuie create in baza de date, pentru ca ele trebuie sa fie prezente pentru toate obiectele ce trebuie create. Tabelel Dictionarului de Date sunt create automat de declaratia SQL CREATE DATABASE si nu sunt in posesia utilizatorului SYS. Tabelele de baza sunt rareori accesate direct, deoarece informatia din ele nu este usor de inteles.

Vederi

Vederile Dictionarului de Date (tabele virtuale - acoprite in capitolul 15) contin informatii intr-o forma care este usor de inteles pentru utilizator. Accesul public la Dictionarul de Date este dat prin vederi mai degraba decat prin tabele de baza. SYS poseda deasemenea vederile Dictionarului de Date. Vederile au fost numite pentru a reflecta tipul de utilizare dorit. Vederile sunt clasificate in 3 grupe distingandu-se intre ele prin prefixele USER, ALL si DBA. Cele trei clase de vederi sunt:

USER_xxxxx Obiectele posedate de utilizator pot fi accesate. De eexemplu, vederile cu acest prefix permit utilizatorului sa afiseze informatii despre tabelele create de utilizator si privilegiile acordate de utilizator. ALL_xxxxx Utilizatorii pot accesa obiecte la care le-au fost permise drepturile de acces, in plus fata de obiectele pe care le poseda. DBA_xxxxx Pentru utilizare de catre utilizatori cu privilegiu DBA pot accesa orice obiect in baza de date.

Unele dintre vederile Dictionarului de Date nu utilizeaza prefixele listate mai sus. Aceste vederi includ:

DICTIONARY Listeaza toate tabelele, vederile, Dictionarului de Date, accesibile utilizatorului. DICT_COLUMNS Listeaza coloanele in dictionarul obiectelor accesibile utilizatorului. CONSTRAINT_DEFS Listeaza toate definitiile de constrangeri introduse pentru tabelele accesibile utilizatorului.

CONSTRAINT_COLUMNS Listeaza toate coloanele care sunt accesibile utilizatorului curent si numite in definitiile constrangerilor.

Vederea DICTIONARY

DICTIONARY listeaza toate obiectele Dictionarului de Date accesibile utilizatorului cu o scurta descriere a obiectului.

Urmatoarea declaratie SQL afiseaza continutul tabelei DICTIONARY : SELECT * FROM DICTIONARY;

Multe din vederile Dictionarului de Date au nume lung. Sinonimele publice au fost furnizate, ca abreviatii, pentru accesul convenabil la unele din cele mai comune vederi ale Dictionarului de Date utilizator. Numele Tabelei -------------ALL_CATALOG secvenALL_COL_COMMENTS ALL_COL_PRIVS utilizaproprietar, sau un rol posibil sau PUBLIC este "grantee" ALL_COL_PRIVS_MADE utilizaALL_COL_PRIVS_RECD utilizaPermisiuni pe coloanele pentru care e proprietar sau "grantor" Permisiuni pe coloanele pentru care torul, PUBLIC sau rolul posibil este "granComentarii ---------Toate tabelele, vederile, sinonimele, tele accesibile utilizatorului Comentarii pe coloanele tabelelor si vederile accesibile Permisiuni pe coloanele pentru care torul este "grantor", "grantee",

tee" ALL_CONSTRAINTS ALL_CONS_COLUMNS ALL_DB_LINKS utilizaALL_DEF_AUDIT_OPTS ALL_DEPENDENCIES acceALL_ERROR care Definitii de constrangeri pe tabele accesibile Informatii despre coloanele accesibile in definitiile de constrangeri Legaturile bazei de date accesibile torului Optiuni de revizuire pentru noile obiecte create Dependente dinspre si inspre obiectele sibile utilizatorului Erorile curente pe obiectele stocate la utilizatorul este permis sa creeze (pag. 13-13) ALL_INDEXES accesibile ALL_IND_COLUMNS acceALL_OBJECTS ALL_SEQUENCES utiliALL_SNAPSHOTS utilizatorul ALL_SOURCE utilizatorul are permisiunea sa le creeze ALL_SYNONYMS ALL_TABLES utilizatoruALL_TAB_COLUMNS ALL_TAB_COMMENTS uToate sinonimele accesibile utilizatorului Descrierea tabelelor accesibile lui Coloanele tuturor tabelelor, vederilor si clusterelor Comentarii pe tabele si vederi accesibile Descrierea indecsilor pe tabelele utilizatorului Coloanele cuprinzand indecsi pe tabele sibile Obiectele accesibile utilizatorului Descrierea SEQUENCE-urilor accesibile zatorului Instantanee la care poate privi Sursa curenta a obiectelor create pe care

tilizatorului ALL_TAB_PRIVS utilizatoPermisiuni pe obiecte pentru care rul e "grantor", "grantee" sau proprietar, sau un rol posibil sau PUBLIC garantie ALL_TAB_PRIVS_MADE pe obiectele utilizatorilor ALL_TAB_PRIVS_RECD utilizatoPermisiuni pe obiecte pentru care rul, PUBLIC sau un rol posibil este "grantee" ALL_TRIGGERS curent ALL_TRIGGER_COLS utilizaTRIGGER-uri accesibile utilizatorului Utilizarea coloanelor in trigger-ul torilor sau in trigger-uri pe tabelele utilizatorilor ALL_USERS de date ALL_VIEWS AUDIT_ACTIONS urmaTextul vederilor accesibile utilizatorilor Tabela de descriere pentru actiunea de rire a reviziei tipului de coduri CAT CLU COLS COLUMN_PRIVILEGES utilizatoSinonim cu USER_CATALOG Sinonim cu USER_CLUSTERS Sinonim cu USER_TAB_COLUMNS Permisiuni pe coloane pentru care rul e "grantor", "grantee", proprietar, sau un rol posibil sau PUBLIC este "grantee" DICT DICTIONARY GLOBAL_NAME IND INDEX_HISTOGRAM Sinonim cu DICTIONARY Descrierea tabelelor si vederilor Dictionarului de Date Numele bazei de date globale Sinonim pentru USER_INDEXES Statistica pe chei cu numarare repetata Informatii despre toti utilizatorii bazei Permisiunile utilizatorilor si permisiuni

INDEX_STATS OBJ RESOURCE_COSTS ROLE_ROLE_PRIVS ROLE_SYS_PRIVS ROLE_TAB_PRIVS

Statistica pe arbori-B Sinonim pentru USER_OBJECTS Costul fiecarei resurse Roluri permise rolurile Privilegiile sistem permise rolurilor Privilegii de tabela permise rolurilor

SEQ SESSION_PRIVS SESSION_ROLES posiSYN TABLE_PRIVILEGES

Sinonim pentru USER_SEQUENCES Privilegii pe care utilizatorul le-a setat in mod curent Roluri pe care utilizatorul le-a facut bile in mod curent Sinonim pentru USER_SYNONYMS Alocatii pe obiecte pe care utilizatorul este "grantor", "grantee", posesor, sau un rol facut posibil, sau PUBLIC este "grantee-ul" Sinonim pentru USER_TABLES Inregistrarea urmelor examinate pentru declaratii referitoare la obiecte, si anume: tabel, cluster, vedere, index, secventa, legatura bazei de date [publica], sinonim [public], procedura, trigger, segment rollback, spatiu de tabela, rol, utilizator

TABS USER_AUDIT_OBJECTS

USER_AUDIT_SESSION USER_AUDIT_STATEMENT Inregistrarea urmelor examinate referitoare la alocatie, anulare, examinare, neexaminare si sistem modificat Intrari ale urmelor revizuite, relevante utilizatorului Tabele, vederi, sinonime si secvente te de utilizator USER_CLUSTERS USER_CLU_COLUMNS Descrieri ale clusterelor utilizatorului Maparea coloanelor tabelei pentru a aduna impreuna coloanele

USER_AUDIT_TRAIL USER_CATALOG poseda-

TABLENAMECOMMENTS USER_COL_COMMENTS veUSER_COL_PRIVS utilizaComentarii despre coloanele tabelelor si derile utilizatorului Permisiuni pe coloanele pentru care torul este posesorul, "grantor" sau "grantee" USER_COL_PRIVS_MADE USER_COL_PRIVS_RECD utilizatoUSER_CONSTRAINTS utiUSER_CONS_COLUMNS USER_DB_LINKS Toate permisiunile pe coloanele obiectelor posedate de utilizator Permisiuni pe coloane pentru care rul este "grantee" Definitiile constrangerilor pe tabelele lizatorului Informatii despre coloanele accesibile in definitiile constrangerilor Legaturile bazei de date posedate de utilizator

USER_DEPENDENCIES USER_ERRORS USER_EXTENTS USER_FREE_SPACE accesiUSER_INDEXES USER_IND_COLUMNS utilizatoruUSER_OBJECTS USER_OBJECT_SIZE USER_OBJ_AUDIT_OPTS vede-

Dependente dinspre si inspre obiectele utilizatorilor Erori curente pe obiecte stocate, posedate de utilizator Extensii cuprinzand segmente ale utilizatorului Extensii libere in spatiul tabelelor bile utilizatorului Descrierea indecsilor utilizatorului Coloanele cuprinzand indecsi ai lui sau pe tabele ale utilizatorului Obiecte posedate de utilizator Dimensiuni, in octeti, a diferitelor obiecte pl/sql Optiuni de revizuire pentru tabelele si

rile utilizatorului USER_RESOURCE_LIMITS USER_ROLE_PRIVS USER_SEGMENTS USER_SEQUENCES USER_SNAPSHOTS veUSER_SNAPSHOTS_LOGS USER_SOURCE USER_SYNONYMS USER_SYS_PRIVS USER_TABLES USER_TABLESPACES USER_TAB_COLUMNS clustereUSER_TAB_COMMENTS Afiseaza limita resurselor utilizatorului Roluri permise utilizatorului curent Spatiu de stocare alocat pentru segmentele bazei de date Descrierea SEQUENCE-lor utilizatorului Instantanee pe care utilizatorul le poate dea Toate jurnalele instantanee posedate de utilizator Sursa obiectelor stocate accesibile utilizatorului Sinonimele private ale utilizatorului Privilegii de sistem permise utilizatorului curent Descrierea tabelelor utilizatorului Descrierea spatiilor tabelelor accesibile Coloane ale tabelelor, vederilor si lor utilizatorului Comentarii despre tabelele si vederile posedate de utilizator Permisiuni pe obiecte pentru care utilizatorul este posesorul, "grantor-ul", sau "grantee-ul" Toate permisiunile pe obiecte posedate de utilizator Permisiuni pe obiecte pentru care utilizatorul este "grantee-ul" Tigger-uri posedate de utilizator Folosirea coloanei in trigger-ul lui USER_TS_QUOTAS USER_USERS Cota spatiului de tabela pentru utilizator Informatii despre utilizatorul curent

USER_TAB_PRIVS

USER_TAB_PRIVS_MADE USER_TAB_PRIVS_RECD USER_TRIGGERS USER_TRIGGER_COLS utilizatoru-

USER_VIEWS

Text de vederi posedat de utilizator

Cateva vederi folositoare

Urmatoarele vederi sunt probabile de a fi de interes pentru majoritatea utilizatorilor: Nume vedere ----------DICTIONARY USER_OBJECTS USER_CATALOG accesiUSER_TABLES USER_TAB_COLUMNS USER_COL_COMMENTS vedeUSER_TAB_COMMENTS utilizator USER_SEQUENCES USER_SYNONYM USER_VIEWS USER_INDEXES utilizatoruALL_OBJECTS ALL_TAB_COLUMNS vederiInd Seq Syn Descrierea secventelor posedate de utilizator Sinonimul privat al utilizatorului Textul vederilor posedate de utilizator Descrierea indecsilor proprii lui Obiectele accesibile utilizatoruluI Coloanele pentru toate tabelele si le accesibile utilizatorului Sinonim ------Dict Obj Cat Descriere ---------Lista tuturor obiectelor bazei de date Obiectele posedate de utilizator Tabele, vederi, sinonime, secvente bile utilizatorului Tabs Cols Descrierea tabelelor utilizatorului Coloanele din tabelele si vederile utilizatorului Comentarii pe coloanele tabelelor si rilor utilizatorului Comenzi pe tabele si vederi posedate de

Daca nu stiti definitia unei tabele sau vederi a Dictionarului de Date, sau

daca nu va puteti aminti numele unei coloane intr-o tabela/vedere specifica, atunci folositi comanda DESC[RIBE] pentru a afisa definitia tabelei/vederii.

Pentru a vedea structura lui USER_OBJECTS, introduceti:

SQL>desc user_objects

O descriere a vederii DICTIONARY urmeaza:

SQL>desc dict

Notati ca sinonimul abreviat DICT poate fi folosit cu referire la DICTIONARY. Odata ce stiti structura unei tabele/vederi, puteti selecta informatia dorita:

SELECT FROM WHERE

OBJECT_NAME, OBJECT_TYPE, CREATED USER_OBJECTS OBJECT_NAME = 'EMP'

Folosirea lui SQL pentru a genera SQL

SQL poate fi o unealta puternica pentru a genera alte declaratii

SQL,

facand folosirea informatiei in Dictionarul de Date. Puteti folosi SQL din SQL pentru:

a evita cod repetitiv

a primi ajutor de la Dictionarul de Date a recrea tabele, vederi, index-uri a genera predicate "dinamice", continand parametri din timpul executiei

Amintiti-va, virtual puteti selecta orice. De exemplu, pentru a genera declaratii SQL*PLUS pentru a descrie toate tabelele voastre, folositi urmatorul SQL:

SELECT 'DESC '||OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE' / OR SELECT 'DESC '||TABLE_NAME FROM USER_TABLES;

Exemplele de mai sus genereaza urmatoarea iesire: DESC DEPT DESC EMP DESC SALGRADE

Pentru a executa declaratiile de mai sus, este necesara capturarea lor intr-un fisier care poate fi pornit.

SET ECHO OFF SET PAGES 0 SET FEEEDBACK OFF SPOOL X SELECT 'DESC '||TABLE_NAME FROM USER_TABLES / SPOOL OFF START X.LIS

In exemplul de mai susm PAGE[SIZE] este pus pe 0, pentru a elimina titlurile din varf si de jos, ca si cele de tabel. Notati deasemenea ca extensia LIS este specificata pe comanda START, deoarece START isi asuma o extensie a SQL. Exemple mai sofisticate ale acestei tehnici sunt detailate in Apendicele G, unde cererile din Dictionarul de Date sunt folosite pentru a produce comenzi DML si DDL si iesire.

CAPITOLUL 13 Exercitii Managementul de tabela si Dictionarul de Date


Atelier

1.

Adaugati o coloana LONG numita COMMENTS , PROJECT TABLE-ului dumneavoas2. tra. Deasemenea, adaugati o coloana NUMBER, numita HOURS, tabelului 3. ASSIGNMENTS. 4. 5. 6. Folositi vizualizarea dictionarului USER_OBJECTS pentru a lista obiectele 7. posedate de contul dumneavoastra ORACLE. Cate obiecte posedati? 8. 9. 10. Acum definiti o constrangere pe tabela ASSIGNMENTS pentru a asigura combi11. natii unice de Project ID si numar de angajat. 12. 13. 14. 15. Cereti vederea USER_OBJECTS; posedati acum vreun obiect viitor?

16. pe 17. 18. 19. 20. 21. 22.

Priviti in Dictionarul de Date pentru informatii despre constrangeri tabelele voastre (puteti folosi vederea USER_CONSTRAINTS). Daca aveti timp :

Folositi vizualizarea dictionarului ALL_TABLES pentru a gasi posesorii si 23. numele tabelelor la care puteti avea acces, unde numele tabelei include 24. caracterele "EMP". 25.

CAPITOLUL 13

Solutii

1. 2. 3. 4. 5. 6. 7. 8.

ALTER TABLE PROJECTS ADD (COMMENTS LONG) ALTER TABLE ASSIGNMENTS ADD (HOURS NUMBER)

9. 10. 11. 12. 13.

SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS

14. 15. 16. 17. 18. 19. 20.

ALTER TABLE ASSIGNMENTS ADD CONSTRAINT UNQ_KEY UNIQUE (PROJID,EMPNO)

Ati fi putut alternativ sa adaugati o cheie primara, pana cele doua coloane 21. nu permit null-uri. In fiecare caz, un index unic a fost adaugat listei

22. 23.

voastre de obiecte posedate.

24. 25. 26. 27. 28. 29. 30.

O cerere posibila este: SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME SEARCH_CONDITION FROM USER_CONSTRAINTS

Probabil veti vrea sa folositi comenzile COLUMN pentru a formata rezultatele!

31. 32. 33. 34. 35.

SELECT OWNER, TABLE_NAME FROM ALL_TABLES WHERE TABLE_NAME LIKE '%EMP%'

CAPITOLUL 14
Limbajul de manipulare a datelor
Acest capitol explica cum se fac schimbari liniilor intr-o tabela, cum se adauga noi linii sau cum se sterg. Este introdus conceptul de tranzactie. Consistenta la citire este deasemenea discutata. Inserarea de noi linii intr-o tabela Comanda INSERT este folosita pentru a adauga linii unei tabele Sintaxa comenzii INSERT este:
INSERT INTO nume tabela [ (coloana,coloana,....)] VALUES (valoare,valoare,....);

Este posibila inserarea unei noi linii cu valori in fiecare coloana, in care caz lista de coloane nu este ceruta. Este recomandat ca COLUMN LIST sa fie intotdeauna specificata. Daca lista nu este specificata, software-ul va cere modificari oriunde definitia tabelei este modificata. Pentru a insera un nou departament, introduceti:
INSERT VALUES INTO DEPT (DEPTNO,DNAME,LOC) (50,'MARKETING','SAN JOSE');

Nota aceasta comanda adauga o singura linie unei tabele. Pentru a intra intr-un departament nou, omitand numele departamentului, lista de coloane trebuie specificata:
INSERT VALUES INTO DEPT (DEPTNO,LOC) (50,'SAN JOSE');

Alternativ, daca numele departamentului nu este cunoscut, un NULL ar putea fi specificat:


INSERT VALUES INTO DEPT (DEPTNO,DNAME,LOC) (50,NULL,'SAN JOSE');

Valorile CHARACTER si DATE trebuie puse in ghilimele simple.


Folosirea Variabilelor de Substitutie pentru a insera linii

Dupa cum am mentionat anterior, INSERT este o comanda pentru o singura lini- e. Folosind variabile de substitutie este posibil sa se mareasca viteza de intrare.
INSERT VALUES INTO DEPT (DEPTNO,DNAME,LOC) (&D_NUMBER, '&D_NAME', '&LOCATION');

Cand comanda este rulata, valorile sunt afisate de fiecare data. Inserarea informatiilor de data si timp Cand se insereaza o valoare DATE, formatul DD-MON-YY este de obicei folo- sit. Cu acest format secolul implicit este secolul 20 (19nn). Data deasemenea contine informatii de timp, care daca nu sunt specificate, implicit devin miezul noptii (00:00:00).

Daca o data trebuie introdusa in alt secol si un timp specific este cerut deasemenea, folositi functia TO_DATE:
INSERT VALUES INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) (7658, 'MASON', 'ANALYST', 7566, TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'), 3000, NULL, 20);

Copierea de linii din alta tabela


INSERT INTO tabela [(coloana, coloana, ....)] SELECT lista-select FROM tabela(e)

Aceasta forma a declaratiei INSERT va permite sa inserati cateva linii intr-o tabela unde valorile sunt derivate din continutul tabelelor existente in baza de date. Pentru a copia toate informatiile din departamentul 10 in tabela D10HISTORY, introduceti:
INSERT INTO D10HISTORY (EMPNO,ENAME,SAL,JOB,HIREDATE FROM EMP WHERE DEPTNO=10;

Notati ca cuvantul cheie 'VALUES' nu este folosit aici. Actualizarea liniilor Declaratia UPDATE va permite sa schimbati valori in liniile unei tabele.
UPDATE SET [WHERE tabela[alias] coloana [, coloana...] = {expresie, subcerere} conditie];

De exemplu: Pentru a actualiza linia lui Scott, introduceti:


UPDATE SET EMP JOB='SALESMAN', HIREDATE = SYSDATE,

WHERE

SAL = SAL*1.1 ENAME = 'SCOTT';

1 record updated.

Daca clauza WHERE este omisa, toate liniile din tabela vor fi actualizate. Este posibil sa folositi subcereri inlantuite si subcereri corelate in decla- ratia UPDATE. Sa presupunem ca ati avut o cifra noua de comisioane pentru angajati siguri. De exemplu, tabela COMMISSION de mai jos este folosita pentru a actualiza li- nii sigure ale tabelei EMP:
COMMISSION EMPNO -----7499 7654 7844 7844 7844 COMM ---1100 500 3500 2000 1500 EMP EMPNO ----7499 7654 7844 COMM ----300 1400 0

Schimbarile listate in tabela COMMISSION pot fi aplicate tabelei EMP, folosind o subcerere corelata si o subcerere inlantuita, ca mai jos: Exemplul 1:
UPDATE EMP SET COMM = (SELECT COMM FROM COMMISSION C WHERE C.EMPNO = EMP.EMPNO) WHERE EMPNO IN (SELECT EMPNO FROM COMMISSION); 3 records updated.

Tabela COMMISSION poate contine mai mult decat o intrare pentru fiecare angajat, ca in exemplul de mai jos :
COMISSION EMPNO ----7499 7654 7654 7844 7844 COMM ---1100 500 100 2000 1500

Daca doriti sa inlocuiti (REPLACE) valorile din tabela EMP pentru comision cu comisionul TOTAL pentru fiecare angajat listat in tabela COMISSION, atunci puteti utiliza urmatorul SQL : Exemplul 2:
UPDATE EMP SET COMM = ( SELECT SUM(COMM) FROM COMISSION C WHERE C.EMPNO = EMP.EMPNO) WHERE EMPNO IN (SELECT EMPNO FROM COMISSION); 3 inregistrari modificate. Tabela EMP reflecta comisioanele modificate : EMP EMPNO ----7499 7654 7844 COMM ---1100 600 3500

O alta posibilitate este cea de a adauga (ADD) la valorile comisionului in tabela COMISSION la comisioanele existente in tabela EMP mai mult decat inlocuirea lor. Exemplul 3 realizeaza acest lucru : Exemplul 3:
UPDATE EMP SET COMM = ( SELECT SUM(COMM) + EMP.COMM FROM COMISSION C WHERE C.EMPNO = EMP.EMPNO) WHERE EMPNO IN (SELECT EMPNO FROM COMISSION); Tabela EMP reflecta comisioanele schimbate : EMP EMPNO ----7844 7499 7654 COMM ---3500 1400 2000

Stergerea Coloanelor dintr-o Tabela Comanda DELETE permite stergerea unei sau mai multor linii dintr-o tabela.

DELETE [WHERE

FROM tabela conditie];

Pentru a sterge toate informatiile despre departamentul 10 din tabela EMP, introduceti :
DELETE WHERE FROM EMP DEPTNO = 10;

Daca clauza WHERE este omisa, atunci toate liniile vor fi sterse. TRANZACTII Procesarea unei Tranzactii
Ce este o tranzactie ?

O tranzactie este o operatie asupra unei baze de date care implica una sau mai multe modificari in una sau mai multe tabele. Exista doua clase de tranzactii. Tranzactii DML care contin un numar oarecare de blocuri DML si pe care ORACLE le trateaza ca o singura entitate sau o singura unitate logica de lucru, si tranzactii DDL care contin un singur bloc DDL. Nu pot exista situatii "jumatate de drum" in timpul executiei unei tranzactii, asa incat unele modificari specificate in tranzactie sa fie aplicate bazei de date si altele nu. Pentru fiecare tranzactie ori toate modificarile sunt aplicate bazei de date, ori nici una din modificari nu este indeplinita ( sunt toate abandonate - discarded ). O tranzactie incepe cand prima comanda executabila DML sau DDL este intalnita si se termina in una din urmatoarele situatii :

Intalneste COMMIT/ROLLBACK Comanda DDL se termina Anumite erori (DEADLOCK) EXIT - iesire din SQL*Plus Eroare sistem

Un bloc DDL este executat automat si de aceea implicit incheie o tranzactie.

Dupa incheierea unei tranzactii, urmatorul bloc executabil SQL va lansa automat urmatoarea tranzactie.
Permanentizarea Modificarilor

Pentru ca modificarile sa ramana permanente, ele trebiue executate asupra bazei de date. comanda COMMIT realizeaza permanentizarea modificari- lor; ROLLBACK permite sa abandonam sau sa anulam modificarile. Modifiacrea, sau modificarile, executate asupra bazei de date intre 2 comenzi COMMIT reprezinta o tranzactie. Pana cand tranzactia nu este executata, nici una din modificari nu este vizibila utilizatorilor.
Inlaturarea Modificarilor Nedorite

Modificarile neexecutate pot fi abandonate prin comanda ROLLBACK. ROLLBACK va atribui datelor valorile care acestea le aveau imediat dupa executarea ultimului COMMIT prin anularea tuturor modificarilor facute dupa ultimul COMMIT.
Erorile de Sistem

Cand o tranzactie este intrerupta de o eroare serioasa, de exemplu o eroare de sistem, intreaga tranzactie este anulata. Aceasta previne erorile datorate modificarilor nedorite asupra datelor, si realizeaza intoarcerea tabelelor la starile de dupa ultimul COMMIT. In acest fel SQL*Plus protejea- za integritatea tabelelor. Anularea automata este cauzata cel mai des de catre o eroare de sistem, ca de exemplu o resetare a sistemului sau o cadere de tensiune. Erorile de tastare a comenzilor, ca de exemplu tastarea gresita a unor nume de coloane sau incercarile de a realiza operatii neautorizate asupra tabelelor altor utilizatori, nu intrerup tranzactia si nu realizeaza anu- larea automata. Aceasta se datoreaza faptului ca aceste erori sunt detectate in cursul compilarii (de catre PARSER) ( cand un bloc SQL este scanat si verificat), si nu in timpul executiei. O tranzactie noua este lansata urmand unui COMMIT sau ROLLBACK - adica cand primul bloc executabil DML sau DDL este intalnit. Semnificatia Tranzactiilor ORACLE asigura consistenta datelor bazata pe tranzactii. Tranzacti ile dau utilizatorului mai multa flexibilitate si control la lucrul asupra datelor, si asigura consistenta datelor in cazul unei erori a procesului utilizator sau a unei erori de sistem.

Tranzactiile ar trebui sa contina doar acele comenzi DML care realizeaza o singura modificare asupra datelor. De exemplu un transfer de fonduri (sa spunem 1000$) intre 2 conturi ar trebui sa implice un debit al unui cont de 1000$ si un credit al altui cont de 1000$. Ambele actiuni ar trebui sa se incheie cu succes sau sa dea eroare impreuna. Creditul nu ar trebui executat fara debit. Controlul Tranzactiilor cu Instructiuni SQL Urmatoarele instructiuni SQL sunt utilizate cand apar executii (commit) sau refaceri (rollback) :

COMMIT[WORK] SAVEPOINT nume_savepoint ROLLBACK[WORK] to [SAVEPOINT] nume_savepoint

De notat ca COMMIT si ROLLBACK sunt instructiuni (blocuri) SQL. Cele 3 blocuri SQL utilizate pentru controlul tranzactiilor sunt explicate mai jos: COMMIT[WORK] Sintaxa : COMMIT[WORK];

Permanentizeaza schimbarile in tranzactia curenta Sterge toate punctele de salvare (savepoint) din tranzactie Termina tranzactia Elibereaza toate blocarile (Lock) tranzactiei Cuvantul cheie WORK este optional Utilizatorul trebuie sa expliciteze sfarsitul tranzactiei in programul aplicatie utilizand COMMIT (sau ROLLBACK). Daca nu se executa explicit tranzactia si programul se termina anormal, ultima tranzactie executata va fi anulata. Executii implicite (commit) apar in urmatoarele situatii : o inainte de o comanda DDL o dupa o comanda DDL o la inchiderea mormala a unei baze de date

Blocurile DDL cauzeaza mereu executii (commit) in timpul executiei lor. Daca introduceti un bloc DDL dupa cateva blocuri DML, blocul DDL cauzeaza aparitia unui commit inaintea propriei executii, incheind tranzactia curenta. Astfel daca blocul DDL este executat pana la capat, este si inregistrat.

SAVEPOINT Sintaxa : SAVEPOINT nume_savepoint


Exemplu : SAVEPOINT terminare_actualizari

Poate fi utilizat pentru a imparti o tranzactie in bucati mai mici Punctele de salvare (savepoints) permit utilizatorului sa retina toata munca sa la orice moment din timp, cu optiunea de a inregistra mai tarziu totul sau a anula totul sau o parte din ea. Astfel, pentru o tran- zactie lunga, se pot salva parti din ea, pe masura executiei, la sfarsit inregistrandu-se sau refacandu-se continutul initial. La aparitia unei erori nu trebuie executat din nou fiecare bloc. La crearea unui nou punct de salvare cu acelasi nume ca al unuia dinainte, primul punct este sters. Numarul maxim de puncte de salvare pentru un proces utilizator este implicit 5. Aceasta limita poate fi schimbata.
ROLLBACK[WORK] to [SAVEPOINT] nume_punct_salvare

Instructiunea ROLLBACK este utilizata pentru a reface un lucru. Cuvantul cheie "work" este optional. Intoarcerea la un punct de salvare este de asemenea optionala. Daca se utilizeaza ROLLBACK fara clauza TO SAVEPOINT, atunci : o se termina tranzactia o se anuleaza modificarile din tranzactia curenta o sterge toate punctele de salvare din tranzactie o elibereaza blocarile tranzactiei

Intoarcerea la Nivel de Bloc O parte a unei tranzactii poate fi anulata. Daca un singur bloc DML da eroare, ORACLE V6 va intoarce inapoi doar acel bloc. Aceasta facilitate este cunoscuta ca STATEMENT LEVEL ROLLBACK. Intoarcerea la nivel de bloc inseamna daca un singur segment DML da eroare la executia unei tranzactii, efectul lui este anulat, dar schimbarile realizate de precedentul bloc DML in tranzactie nu vor fi anulate si pot fi inscrise (COMMIT) sau intoarse (ROLLBACK) explicit de catre utilizator.

Daca blocul este unul de tip DDL, inscrierea (commit) care precede imediat acest bloc nu este anulata (schimbarile au fost facute deja permanen- te). ORACLE realizeaza intoarcerea la nivel de bloc prin crearea unui punct de salvare implicit inainte de executarea fiecarei comenzi DML. Utilizatorul nu poate referi caest punct de salvare in mod direct. Astfel, daca va intoarceti la un punct de salvare, atunci:

anulati o parte din tranzactie se retine punctul de salvare pentru intoarcere, dar se pierd toate celelalte punct create dupa punctul de salvare numit. se elibereaza toate blocarile de tabele si linii.

Intoarceri Implicite Intoarcerile implicite apar cand se intalnesc terminari anormale ale executiei (de exemplu cand se intrerupe un proces utilizator). Intoarcerile implicite la nivel de bloc apar la eroarea de executie a unui bloc. Este recomandat ca tranzactiile sa se termine explicit utilizand COMMIT[WORK] ori ROLLBACK[WORK]. Urmatorul exemplu demonstreaza utilizarea unui punct de salvare, si a instructiunilor ROLLBACK si COMMIT.
INSERT INTO DEPT VALUES ( 50, 'TESTING', 'LAS VEGAS' ); SAVEPOINT insert_done; UPDATE DEPT SET DNAME = 'MARKETING'; ROLLBACK TO insert_done ( modificarile sunt abandonate ); UPDATE DEPT SET DNAME = 'MARKETING' ( revizuim comanda UPDATE ) WHERE DNAME = 'SALES'; COMMIT; AUTOCOMMIT

COMMIT sau ROLLBACK pot fi date manual sau automat prin utilizarea optiunii AUTOCOMMIT a comenzii SET. Optiunea AUTOCOMMIT controleaza cand schimbarile intr-o baza de date sunt facute permanente. Exista doua setari : COMANDA + DESCRIEREA SET AUTO[COMMIT] ON COMMIT este utilizat automat la fiecare INSERT, UPDATE sau DELETE SET AUTO[COMMIT] OFF COMMIT poate fi utilizata de utilizator explicit. De asemenea, COMMIT se executa cand apare comanda Z (specifica VAX), cand se executa comenzile DROP, ALTER sau CREATE, sau la iesirea din SQL*Plus. ROLLBACK poate fi executat explicit de catre utilizator pentru refacerea bazei de date. De retinut ca SET este o comanda SQL*Plus. Consistenta la Citire Utilizatorii bazelor de date fac doua tipuri de accesuri asupra bazelor de date:

Operatii de citire ( SELECT ) Operatii de scriere ( INSERT, UPDATE, DELETE )

Cititorului si scriitorului unei baze de date trebuie sa i se garanteze o vedere consistenta asupra bazei de date. Cititorii nu trebuie sa vizulaizeze o data care este in curs de modificare. Si scriitorii trebuie sa fie siguri ca schimbarile intr-o baza de date sunt facute intr-un mod consistent : schimbarile facute de un scriitor sa nu distruga sau sa intre in confilct cu schimbarile pe care le face un alt scriitor. Scopul consistentei la citire este acela de a asigura faptul ca fiecare utilizator vede data ca fiind cea de la ultimul COMMIT, inainte ca o operatie DML sa inceapa. Consistenta la citire este implementata prin tinerea unor copii partiale ale bazei de date in segmente de intoarcere (ROLLBACK). Cand de executa operatii de scriere intr-o baza de date, ORACLE va face o copie a datelor onainte de schimbare si o va scrie intr-un segment de intoarcere.

Toti cititorii, exceptandu-i pe cei care au facut schimbarile, inca mai vad baza de date care exista inainte ca schimbarile sa fie facute - ei vad segmentul de intoarcere de fapt. Oricum, inainte ca schimbarile sa fie facute permanente in baza de date, doar utilizatorul care modifica datele poate sa vada baza de date cu alteratiile incorporate. Toti ceilalti vad baza nemodificata ( fereastra din segmentul de intoarcere ). Aceasta garanteaza citirea unor date consistente care nu fac subiectul unor modificari in curs. Cand un bloc DML se executa, schimbarile facute in baza de date devin vizibile oricarui utilizator care executa SELECT. Modificarile sunt facute 'universale' si acum toti utilizatorii vad baza de date cu modificarile incorporate. Spatiul ocupat de catre 'vechile' date in segmentul de intoarcere este eliberate pentru a fi reutilizat. Daca tranzactia este anulata (ROLLBACK), atunci toate schimbarile sunt 'anulate' :

Versiunea veche ('originala') a bazei de date aflata in segmentul de intoarcere este scrisa inapoi ('recuperata') in baza de date. Toti utilizatorii vad baza de date existenta inainte de inceperea tranzactiei.
Tranzactii de Citire

Implicit, modelul consistent al ORACLE RDBMS garanteaza ca rezultatul executiei unui bloc este consistenet. Oricum, in anumite situatii se poate dori chestionarea unor blocuri multiple asupra datelor din mai multe tabele si se doreste asigurarea ca datele sunt consistente. Adica, re- zultatele in orice tabela sunt consistente in timp in raport cu rezultatele din orice alta tabela. Linia SQL : SET TRANSACTION READ ONLY este utilizata pentru a incepe o tranzactie de citire exclusiv. Consistenta la citire pe care READ ONLY o furnizeaza este implementata in acelasi fel cu consistenta la nivel de bloc - utilizand segmente de intoatcere. Fiecare bloc vede implicit o fereastra consistenta a datelor la momentul inceperii blocului. Aceasta facilitate este foarte folositoare pentru rapoarte care ruleaza mai multe chestionari asupra mai multor tabele in timp ce alti utilizatori actualizeaza aceleasi tabele. Note :

SET TRANSACTION READ ONLY este utilizata pentru a incepe o tran- zactie doar de citire. Doar cereri ( blocuri SELECT ) sunt permise. Comenzile DML nu sunt permise. SELECT FOR UPDATE va genera o eroare. O instructiune COMMIT, ROLLBACK, sau un bloc DDL va termina tran- zactia de citire ( de retinut ca blocurile DDL genereaza implicit suprascrieri - COMMIT ). Cu blocuri DDL, nu este data nici o indi- catie referitoare la faptul ca tranzactia se termina implicit. In timpul tranzactiei de citire, toate cererile se refera la aceeasi copie a bazei de date ( schimbarile sunt efectuate inainte ca tranzactia de citire sa inceapa). Alti utilizatori pot continua sa citeasca sau sa modifice datele.

Urmatoarele seturi de instructiuni pot fi rulate pentru a extrage datele din tabelele EMP si DEPT.
COMMIT; SET TRANSACTION READ ONLY; SELECT DEPTNO, ENAME, JOB FROM EMP; SELECT DEPTNO, DNAME FROM DEPT; COMMIT;

Ultimul COMMIT este necesar pentru a termina explicit tranzactia de citire.

EXERCITII - limbajul de manipulare a datelor


Exercitiile acopera inserarea si modificarea de coloane in tabelele create anterior.
1. Inserati in tabela PROJECTS urmatoarele informatii : PROJID P_DESC P_START_DATE P_END_DATE BUDGET_AMOUNT MAX_NO_STAFF COMMENTS 1 WRITE C030 COURSE 02-JAN-88 07-JAN-88 500 1 BE CREATIVE 2 PROOF READ NOTES 01-JAN-89 10-JAN-89 600 1 YOUR CHOICE

2. Inserati in tabela ASSIGNMENTS urmatoarele coloane: PROJID EMPNO A_START_DATE A_END_DATE BILL_RATE ASSIGN_TYPE HOURS 1 7369 01-JAN-88 03-JAN-88 50.00 WR 15 1 7902 04-JAN-88 07-JAN-88 50.00 WR 20 2 7844 01-JAN-89 10-JAN-89 45.50 PF 30

3. Modificati campul ASSIGNMENT TYPE astfel incat sa se citeasca 'WT' in loc de 'WR'. Un tip ca 'PF' trebuie sa ramana nemodificat. 4. Inserati inca doua proiecte cu atribuiri la alagere.

REZOLVARI:
1. INSERT INTO PROJECTS (PROJID, P_DESC, P_START_DATE, P_END_DATE, BUDGET_AMOUNT, MAX_NO_STAFF) VALUES (1,'WRITE C030 COURSE','02-JAN-88','07-JAN-88',500,2); INSERT INTO PROJECTS (PROJID, P_DESC, P_START_DATE, P_END_DATE, BUDGET_AMOUNT, MAX_NO_STAFF) VALUES (2,'PROOF READ NOTES','01-JAN-89','10-JAN-89',600,1); 2. INSERT INTO ASSIGNMENTS (PROJID, EMPNO, A_START_DATE, A_END_DATE,BILL_RATE, ASSIGN_TYPE, HOURS) VALUES (1,7369,'01-JAN-88','03-JAN-88',50.00,'WR',15); INSERT INTO ASSIGNMENTS (PROJID, EMPNO, A_START_DATE, A_END_DATE,BILL_RATE, ASSIGN_TYPE, HOURS) VALUES (1,7092,'04-JAN-88','07-JAN-88',50.00,'WR',20); INSERT INTO ASSIGNMENTS (PROJID, EMPNO, A_START_DATE, A_END_DATE,BILL_RATE, ASSIGN_TYPE, HOURS) VALUES (2,7844,'01-JAN-89','10-JAN-89',45.50,'PF',30); 3. UPDATE ASSIGNMENTS SET ASSIGN_TYPE='WT' WHERE ASSIGN_TYPE='WR';

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