Documente Academic
Documente Profesional
Documente Cultură
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
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)
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
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
--------------------------------------------------
|------------------------------------------------|
| S1 SMITH 20 LONDON |
| S2 JONES 10 PARIS |
| S3 BLAKE 30 PARIS |
--------------------------------------------------
PARTI
---------------------------------------------------------
|-------------------------------------------------------|
---------------------------------------------------------
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.
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
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
| ADAMS | ---------- | | |
| JONES | MANAGER |
| | |
| ADAMS | CLERK |
| ADAMS | MANAGER |
-------------------
JOIN
CAPITOLUL2
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.
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.
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- .
SELECT
*
FROM
EMP
;
SELECT *
FROM EMP;
Declaratia SELECT regaseste informatia din baza de date implementand toti operatorii
din algebra relationala .
1. O clauza SELECT ,care listeaza coloanele pentru afisare astfel incat este esentiala
o Proiectie.
2. O clauza FROM care specifica tabela implicata.
SELECT DEPTNO,ENAME,MGR
FROM EMP;
SELECT *
FROM EMP;
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 Descriere
--------- ---------
+ adunare
- scadere
* inmultire
/ impartire
Daca expresia aritmetica contine mai mult decat un operator, prioritatile sunt *,/,la
inceput,apoi +,- (de la stanga la dreapta pentru operatorii de aceeasi prioritate).
Aliasuri de coloana
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(" ").
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
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:
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.
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.
Daca orice valoare de coloana intr-o expresie este nula atunci rezultatul este nul.In
urmatoarea declaratie numai Salesman are un rezultat al salariului:
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.
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
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')
Daca nu se indica altfel, SQL*Plus afiseaza rezultatul unei interogari fara eliminarea
intrarilor duplicate .
DEPTNO
------
20
30
30
20
30
30
10
20
10
30
20
30
20
10
Clauza DISTINCT
DEPTNO
------
10
20
30
DEPTNO JOB
------ ---------
10 CLERK
10 MANAGER
10 PRESIDENT
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
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.
SELECT ENAME,JOB,SAL*12,DEPTNO
FROM EMP
ORDER BY ENAME;
Pentru a inversa ordinea coloanei HIREDATE, deci datele cele mai tirzii sa fie afisate
primele,introduceti:
SELECT ENAME,JOB,HIREDATE
FROM EMP
ORDER BY HIREDATE DESC;
Pentru a ordona dupa doua coloane si afisa in ordinea inversa a salariului, introduceti:
SELECT DEPTNO,JOB,ENAME
FROM EMP
ORDER BY DEPTNO,SAL DESC;
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 intr-o 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
SELECT coloane
FROM tabela
WHERE anumite conditii sunt intilnite
Clauza WHERE poate compara valori in coloana ,valori literale,expresii aritmetice sau
functii.
1. Un nume de coloana
2. Un operator de comparatie
3. Un nume de coloana, constanta sau lista de valori.
Operatorii logici
Operator Semnificatie
-------- ------------
= egal cu
> mai mare decit
>= mai mare sau egal
< mai mic decit
<= mai mic sau egal
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.
DNAME DEPTNO
---------- ------
SALES 30
OPERATIONS 40
De exemplu ,presupunem ca dorim sa obtinem acei angajati al caror comision estå mai
mare decat salariul lor:
Operatori SQL
Operator Semnificatie
-------- ------------
BETWEEN..AND... intre doua valori(inclusiv)
IN(list) compara cu o lista de valori
LIKE compara cu un model de tip caracter
IS NULL 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 ENAME,SAL
FROM EMP
WHERE 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
Operatorul IN
Presupunem ca dorim sa gasim angajatii care au unul din cele trei numere de
marca(MGR):
Daca, caracterele sau datele calendaristice sunt utilizate,ele trebuie introduse intre
ghilimele(' ').
Operatorul LIKE
ENAME
--------
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 ENAME
FROM EMP
WHERE ENAME LIKE '____';
ENAME
-----
WARD
KING
FORD
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 ENAME,MGR
FROM EMP
WHERE MGR IS NULL;
ENAME MGR
------ ----
KING
Negarea expresiilor
Operator Descriere
--------- ----------
!= diferit de(VAX,UNIX,PC)
^= diferit de(IBM)
<> diferit de(toate o/s)
NOT NUMECOL= diferit de
NOT NUMECOL> mai mic sau egal
Operatori SQL
Operator Descriere
-------- ---------
NOT BETWEEN nu se afla intre doua valori date
NOT IN nu se afla intr-o lista data de valori
NOT LIKE diferit de sirul
IS NOT NULL nu este o valoare nula
Pentru a gasi angajatii ai caror salariu nu este intr-un interval,introdu- ceti:
SELECT ENAME,SAL
FROM EMP
WHERE SAL NOT BETWEEN 1000 AND 2000;
ENAME SAL
--------- --------
SMITH 800.00
JONES 2,975.00
BLAKE 2,850.00
CLARK 2,450.00
SCOTT 3,000.00
KING 5,000.00
JAMES 950.00
FORD 3,000.00
SELECT ENAME,JOB
FROM EMP
WHERE JOB NOT LIKE 'M%';
ENAME JOB
-------- --------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
MARTIN SALESMAN
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK
SELECT ENAME,MGR
FROM EMP
WHERE MGR IS NOT NULL;
ENAME MGR
------- -----
SMITH 7902
ALLEN 7698
WARD 7698
JONES 7839
MARTIN 7698
BLAKE 7839
CLARK 7839
SCOTT 7566
TURNER 7698
ADAMS 7788
JAMES 7698
FORD 7566
MILLER 7782
Nota:
Predicatul AND este adevarat numai daca ambele conditii sunt 'adevarate'; predicatul OR
este adevarat daca cel putin una din conditii este 'adevarata'.
SELECT EMPNO,ENAME,JOB,SAL
FROM EMP
WHERE SAL BETWEEN 1000 AND 2000
AND JOB = 'CLERK';
SELECT EMPNO,ENAME,JOB,SAL
FROM EMP
WHERE SAL BETWEEN 1000 AND 2000
OR JOB = 'CLERK';
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 EMPNO,ENAME,JOB,SAL,DEPTNO
FROM EMP
WHERE SAL> 1500
AND JOB = 'MANAGER'
OR JOB = 'SALESMAN';
SELECT EMPNO,ENAME,JOB,SAL,DEPTNO
FROM EMP
WHERE SAL >1500
AND (JOB = 'MANAGER'
OR JOB = 'SALESMAN');
EMPNO ENAME JOB SAL DEPTNO
----- ------ --------- -------- ------
7499 ALLEN SALESMAN 1,600.00 30
7566 JONES MANAGER 2,975.00 20
7698 BLAKE MANAGER 2,850.00 30
7782 CLARK MANAGER 2,450.00 10
ENAME
(VARCHAR2)
___________
WHERE ENAME = 'SCOTT' | |
| SCOTT V V|
| ___|
| SCOTT|____
| |
| MILLER |
| |
~~~~ ~~ ~~~
ENAME
(CHAR)
------------
| |
| SCOTT V V|
WHERE ENAME = 'SCOTT' | ....|
| SCOTT|V V|
| |. |
| MILLER| V|
~~~~ ~~~~ ~~
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.
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.
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
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
formatarea rezultatelor
setarea optiunilor
editarea si stocarea declaratiilor SQL
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.
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:
----------------------------------------------------------------------
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.
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.
Workshop
14 inregistrari selectate.
DEPTNO DNAME
------ ----------
10 ACCOUNTING
40 OPERATIONS
20 RESEARCH
30 SALES
JOB
---------
ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN
8 inregistrari selectate.
ENAME JOB
------ -----
SMITH CLERK
ADAMS CLERK
ENAME
------
SMITH
ALLEN
MILLER
13 inregistrari selectate.
ENAME REMUNERATION
------- ------------
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.
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.
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 HAS HELD THE POSITION OF PRESIDENT IN DEPT 10 SINCE 09-JUL-84
TURNER HAS HELD THE POSITION OF SALESMAN IN DEPT 30 SINCE 04-JUN-84
ADAMS HAS HELD THE POSITION OF CLERK IN DEPT 20 SINCE 04-JUN-84
JAMES HAS HELD THE POSITION OF CLERK IN DEPT 30 SINCE 23-JUL-84
FORD HAS HELD THE POSITION OF ANALYST IN DEPT 20 SINCE 05-DEC-83
MILLER HAS HELD THE POSITION OF CLERK IN DEPT 10 SINCE 21-NOV-83
14 inregistrari selectate.
Capitolul 2 - Rezolvari
1. SELECT *
FROM SALGRADE;
2. SELECT *
FROM EMP;
6. SELECT *
FROM EMP
WHERE DEPTNO IN (10,20)
ORDER BY ENAME;
7. SELECT ENAME,JOB
FROM EMP
WHERE JOB = 'CLERK'
AND DEPTNO = 20;
8. SELECT ENAME
FROM EMP
WHERE ENAME LIKE '%TH%'
OR ENAME LIKE '%LL%';
CAPITOLUL3
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.
Puteti utiliza 'variabile substituite' intr-un fisier de comanda sau intr-o declaratie SQL
pentru a reprezenta valori ce vor fi aflate la executie.
SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE DEPTNO = &DEPARTAMENT_NUMBER;
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 ENAME,DEPTNO,SAL*12
FROM EMP
WHERE JOB = ' <JOB_TITLE';
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.
DEPTNO SAL/12
------ -------
20 66.6667
30 133.333
30 104.167
20 247.917
30 104.167
30 237.5
10 204.167
20 250
10 416.667
30 125
20 91.6667
30 79.1667
20 250
10 108.333
SELECT ENAME,DEPTNO,JOB
FROM EMP
WHERE DEPTNO = &&DEPTNO_PLEASE;
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)
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 &THE_REST;
Comanda DEFINE
'' 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
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
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:
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
DEF[INE]:
DEF DEPARTAMENT
daca e definit, da definitia lui DEPARTAMENT daca nu specifica 'nedefinit'
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.
ENAME SAL*12+NUL(COMM,0)
----------------------------------
JONES 35700
BLAKE 34200
SCOTT 36000
KING 60000
FORD 36000
Cap.3 Solutii
1. SELECT ENAME,HIREDATE
FROM EMP
WHERE HIREDATE
BETWEEN'&FIRST_DATE'AND'&LAST_DATE';
2. SELECT ENAME,JOB,SAL,MGR,DEPTNO
FROM EMP
WHERE JOB ='&JOB';
3. SELECT ENAME,&REM
FROM EMP
WHERE &REM >30000;
CAPITOLUL4
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,...)
a calcula
a modifica datele individuale
a manipula iesirea pentru grupuri de siruri
a schimba formatul datelor pentru afisare
a converti tipurile de date
CHARACTER
NUMBER
DATE
CONVERSION
FUNCTION THAT ACCEPT ANY DATA TYPE AS INPUT
GROUP
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.
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
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 ENAME
FROM EMP
WHERE ENAME =UPPER('&ENAME');
ENAME
-----
SMITH
INITCAP(col/value)
forteaza prima litera a fiecarui cuvint in litera mare
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
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;
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.
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;
---------------------------------------------------------------------
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 (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;
-------------------------------------------------------------------
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 spe-
cificate) .Daca nu e specificat 'char/s' atunci sterge blancurile.
SELECT DNAME, RTRIM(DNAME,'G'),RTRIM(DNAME,'GHS')
RTRIM(DNAME,'N')
FROM DEPT;
UPDATE EMP
SET ENAME =RTRIM(ENAME);
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 ENAME, SOUNDEX(ENAME)
FROM EMP
WHERE 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;
SELECT ,ENAME,TRANSLATE(ENAME,'C','P'),JOB
TRANSLATE(JOB,'AR','IT')
FROM EMP
WHERE DEPTNO=10;
REPLACE(col/value,string,replacement_string)
intoarce col/value cu orice aparitie a 'string-ului', inlocuita cu repla-
cement_string.Daca 'replacement_string' e omis, toate operatiile lui 'string'sunt
sterse.Daca sunt emise si 'string' si 'replacement_string'atunci se semnaleaza
eroare.
-------------------------------------------------------------------ANAL
YST
FUNCTII IMBRICATE
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 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. SELECT DNAME, LENGTH(DNAME), LENGTH(REPLACE(DNAME,'S'))
4. FROM DEPT;
5.
6. DNAME LENGTH(DNAME) ENGTH(REPLACE(DNAME,'S'))
7. ----------------------------------------------------
8. ACCOUTING 10 10
9. RESEARCH 8 7
10. SALES 5 3
11. OPERATIONS 10 9
12.
13. Apoi scadeti din lungimea totala , lungimea sirului fara S.
14.
15. SELECT DNAME,LENGTH(DNAME), LENGTH(DNAME)
16. LENGTH(REPLACE(DNAME,'S'))
17. FROM DEPT;
18.
19. 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
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 intreg mai mare sau egal cu
coloana,
expresie sau valoare.
SELECT CEIL(SAL),CEIL(99.9),CEIL(101.76),CEIL(-11.1)
FROM EMP
WHERE SAL BETWEEN 3000 AND 5000;
FLOOR (col/value) gaseste cel mai mare intreg mai mic sau egal cu
coloana expresie sau valoare.
SELECT EXP(4)
FROM DUAL;
EXP(4)
------
54.59815
SQRT(col/value) gaseste radacina patrata a coloanei sau valorii.
Daca col/value e NULL sau negativ atunci e
intors rezultatul NULL.
SELECT SAL,COMM,COMM-SAL,ABS(COMM-SAL),ABS(-35)
FROM EMP
WHERE DEPTNO =30;
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
TEME
1. Listati pentru toti angajatii numele si salariul marit cu
15 % si exprimat ca un nr. de dolari.
14 selectate.
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
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)
SOLUTII Cap.4
Capitolul 5
Toate functiile de tip data calendaristica intorc valoarea tipului DATE cu exceptia lui
MONTHS_BETWEEN care intoarce o valoare numerica.
Secolul
Anul
Luna
Ziua
Ora
Minutele
Secundele
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'.
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.
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 HIREDATE,HIREDATE+7, HIREDATE-7,SYSDATE - HIREDATE
FROM EMP
WHERE HIREDATE LIKE '%JUN%';
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.
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;
------------------------------------------------------------------------
----
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
TRUNC e folositor cind vreti sa stergeti timpul dintr-o data. Timpul component al zilei
este sters implicit.
Functii de conversie
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).
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.
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')
TO_CHAR(SAL,'$9,999')
--------------------
$1,000
$1,600
$1,250
$2,975
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.
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.
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 MONDAY
Day Monday
Month July
ddth 14th
ddTh 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.
------------------------------------------------------------------------
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 |
--------------------------------------------------------------
0 afis.zerourile de
la inceput 099999 001234
MI semnele minus la
dreapta(valori
negative) 999999MI 1234-
PR paranteze pentru
numere negative 999999PR <1234>
V inmultire cu 10
(n=numar de 9 dupa V) 9999V99 123400
Observatie:
TO_NUMBER
TO_DATE
Pentru a afisa toti angajatii cu data angajarii 4 iulie 1984, puteti folosi functia TO_DATE:
De exemplu:
DECODE
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'.
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:
SELECT ENAME,
JOB,
DECODE(JOB,'CLERK','WORKER',
'MANAGER','BOSS',
'UNDEFINED') DECODED_JOB
FROM EMP;
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%
Observati ca aceata comanda produce o eroare fiindca tipul lui 'ename'(char) difera de cel
al lui 'sal'(numar) care e al treilea argument.
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
SELECT SAL*12+NVL(COMM,0),NVL(COMM,1000),SAL*12+NVL(COMM,1000)
FROM EMP
WHERE DEPTNO=10;
SELECT GREATEST(1000,2000),GREATEST(SAL,COM)
FROM EMP
WHERE DEPTNO=30;
GREATEST(1000,2000) GREATEST(SAL,COMM)
-------------------------------------------
2000 1600
2000 1250
2000 1400
2000
2000 1500
2000
6 records selected.
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 EMP
WHERE DEPTNO=10;
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
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
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.
CAPITOLUL 5 SOLUTII
1. SELECT ENAME,
2. TO_CHAR(HIREDATE,'fmMonth,Ddspth YYYY')
3. date_hired
4. FROM EMP
5. WHERE DEPTNO=20;
6.
7.
8. SELECT ENAME,HIREDATE,ADD_MONTHS(HIREDATE,12) REVIEW
9. FROM EMP
10. ORDER BY ADD_MONTHS(hiredate,12);
11.
12.
13. SELECT ENAME,
14. DECODE(SIGN(1500-SAL),1,'BELOW 1500',0,'On
15. Target',SAL)
16. SALARY
17. FROM EMP
18. ORDER BY ENAME;
19.
20.
21. SELECT TO-CHAR(TO_DATE('&ANYDATE','DD.MM.YY'),'DAY')
DAY
22. FROM SYS.DUAL;
23.
24.
25. DEFINE TIME=MONTHS_BETWEEN(SYSDATE,HIREDATE)
26. SELECT ENAME,
27. FLOOR(&TIME/12)||'YEARS'||
28. FLOOR(MOD(&TIME,12))||'MONTHS'
29. "LENGTH OF SERVICE"
30. FROM EMP
31. WHERE ENAME=UPPER('&EMPLOYEE_NAME');
32.
33.
34. SELECT '12/34' VALUE
35. DECODE(
36. TRANSLATE('12/34','1234567890',
37. '9999999999'),
38. '99/99','YES',NO') "VALID?"
39. FROM SYS.DUAL;
40.
41.
42. SELECT ENAME,
43. HIREDATE,
44. DECODE(SIGN(TO_CHAR(HIREDATE,'DD')-15
45. 1,NEXT-DAY(LAST-
DAY(ADD_MONTHS(HIREDATE,1)),
46. 'FRIDAY')-7,
47. NEXT-DAY(LAST_DAY(HIREDATE),'FRIDAY')-7)
48. PAYDAY
49. FROM EMP
50. ORDER BY HIREDATE;
51.
52. sau
53. SELECT ENAME,HIREDATE,
54.
NEXT_DAY(LAST_DAY(ROUND(HIREDATE,'MONTH'))-7
55. 'FRIDAY') PAYDAY
56. FROM EMP
57. ORDER BY HIREDATE;
58.
59.
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.
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
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.
SELECT MIN(SAL)
FROM EMP
WHERE JOB = 'CLERK';
MIN(SAL)
--------
800
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.
JOB AVG(SAL)
------- -----------
ANALYST 3000
CLERK 1037.5
MANAGER 2758.33333
PRESIDENT 5000
SALESMAN 1400
Excluderea liniilor cind folosim GROUP BY
Liniile pot fi excluse mai intii cu o clauza WHERE, inainte de a le imparti in grupuri.
JOB AVG(SAL)
------- -----------
ANALYST 3000
CLERK 1037.5
PRESIDENT 5000
SALESMAN 1400
Solutii
CAPITOLUL 7
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.
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 =.)
SELECT column(s)
FROM tables
WHERE join condition is ...
Pentru a face join pe cele doua tabele EMP si DEPT, introducem:
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.
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:
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.
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.
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:
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.
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.
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
83. Afisati numele angajatilor, functia, salariul, gradatia si numele departa- mentului
pentru toti angajatii din companie in afara de functionari.Sortati dupa salariu,
afisind mai intii salariul cel mai mare.
84.
85.
86. ENAME JOB SAL GRADE DNAME
87. -------- --------- -------- --------- ---------
88. KING PRESIDENT 5,000.00 5 ACCOUNTING
89. FORD ANALYST 3,000.00 4 RESEARCH
90. SCOTT ANALYST 3,000.00 4 RESEARCH
91. JONES MANAGER 2,975.00 4 RESEARCH
92. BLAKE MANAGER 2,850.00 4 SALES
93. CLARK MANAGER 2,450.00 4 ACCOUNTING
94. ALLEN SALESMAN 1,600.00 3 SALES
95. TURNER SALESMAN 1,500.00 3 SALES
96. MARTIN SALESMAN 1,250.00 2 SALES
97. WARD SALESMAN 1,250.00 2 SALES
98.
99. Vor fi selectate 10 inregistrari.
100. Afisati urmatoarele detalii pentru angajatii care cistiga 36000$ pe an sau
care sint functionari.
101.
102.
103. ENAME JOB ANNUAL_SAL DEPTNO DNAME
GRADE
104. --------- ------- -------------- --------- ---------
--------
105. FORD ANALYST 36000 20 RESEARCH 4
106. SCOTT ANALYST 36000 20 RESEARCH 4
107. MILLER CLERK 15600 10 ACCOUNTING 2
108. JAMES CLERK 11400 30 SALES 1
109. ADAMS CLERK 13200 20 RESEARCH 1
110. SMITH CLERK 9600 20 RESEARCH 1
111.
112. Vor fi selectate 6 inregistrari.
Solutii
1. SELECT ENAME, DNAME
2. FROM EMP, DEPT
3. WHERE EMP.DEPTNO = DEPT.DEPTNO;
4.
5. SELECT ENAME, E.DEPTNO, DNAME
6. FROM EMP E, DEPT D
7. WHERE E.DEPTNO = D.DEPTNO;
8.
9. SELECT ENAME, LOC LOCATION, DNAME
10. FROM EMP, DEPT
11. WHERE EMP.DEPTNO = DEPT.DEPTNO
12. AND SAL > 1500;
13.
14. SELECT ENAME, JOB, SAL, GRADE
15. FROM EMP, SALGRADE
16. WHERE SAL BETWEEN LOSAL AND HISAL;
17.
18. SELECT ENAME, JOB, SAL, GRADE
19. FROM EMP, SALGRADE
20. WHERE SAL BETWEEN LOSAL AND HISAL
21. AND GRADE = 3;
22.
23. SELECT ENAME, SAL, LOC LOCATION
24. FROM EMP, DEPT
25. WHERE EMP.DEPTNO = DEPT.DEPTNO
26. AND LOC = 'DALLAS';
27.
28. SELECT ENAME, JOB, SAL, GRADE, DNAME
29. FROM EMP, SALGRADE, DEPT
30. WHERE EMP.DEPTNO = DEPT.DEPTNO
31. AND SAL BETWEEN LOSAL AND HISAL
32. AND JOB != 'CLERK'
33. ORDER BY SAL DESC;
34.
35. SELECT ENAME, JOB, SAL * 12 ANNUAL_SAL, D.DEPTNO, DNAME,
GRADE
36. FROM EMP E, SALGRADE, DEPT D
37. WHERE E.DEPTNO = D.DEPTNO
38. AND SAL BETWEEN LOSAL AND HISAL
39. AND (SAL * 12 + NVL(COMM, 0) = 3600 OR E.JOB = 'CLERK')
40. ORDER BY E.JOB;
41.
CAPITOLUL 8
Join extern
------------------------------------------------------------------------
| 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.
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.
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.
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 :
"unde numarul sefului angajatului este acelasi cu numarul angajatului se- fului lui".
Operatori de multimi
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
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
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.
Exercitii
Tema
5. Afisati toti angajatii (nume si numar) impreuna cu numele si numarul se- fului.
6.
7. EMPNO ENAME MGRNO MGR_NAME
8. -------- --------- -------- ------------
9. 7788 SCOTT 7566 JONES
10. 7902 FORD 7566 JONES
11. 7499 ALLEN 7698 BLAKE
12. 7521 WARD 7698 BLAKE
13. 7654 MARTIN 7698 BLAKE
14. 7844 TURNER 7698 BLAKE
15. 7900 JAMES 7698 BLAKE
16. 7934 MILLER 7782 CLARK
17. 7876 ADAMS 7788 SCOTT
18. 7566 JONES 7839 KING
19. 7698 BLAKE 7839 KING
20. 7782 CLARK 7839 KING
21. 7369 SMITH 7902 FORD
22.
23. Vor fi selectate 13 inregistrari.
24. Modificati solutia de la intrebarea 2 pentru a afisa KING care nu are sef.
25. EMPNO ENAME MGRNO MGR_NAME
26. -------- --------- -------- ------------
27. 7839 KING
28. 7788 SCOTT 7566 JONES
29. 7902 FORD 7566 JONES
30. 7499 ALLEN 7698 BLAKE
31. 7521 WARD 7698 BLAKE
32. 7654 MARTIN 7698 BLAKE
33. 7844 TURNER 7698 BLAKE
34. 7900 JAMES 7698 BLAKE
35. 7934 MILLER 7782 CLARK
36. 7876 ADAMS 7788 SCOTT
37. 7566 JONES 7839 KING
38. 7698 BLAKE 7839 KING
39. 7782 CLARK 7839 KING
40. 7369 SMITH 7902 FORD
41.
42. 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. JOB
45. ------
46. CLERK
47.
48. Va fi selectata o inregistrare.
49. Gasiti toti angajatii care au venit in companie inaintea sefilor lor.
50. EMPLOYEE HIREDATE MANAGER HIREDATE
51. ----------- ----------- ---------- -----------
52. ALLEN 15-AUG-83 BLAKE 11-JUN-84
53. WARD 26-MAR-84 BLAKE 11-JUN-84
54. MARTIN 05-DEC-83 BLAKE 11-JUN-84
55. TURNER 04-JUN-84 BLAKE 11-JUN-84
56. MILLER 21-NOV-83 CLARK 14-MAY-84
57. JONES 31-OCT-83 KING 09-JUL-84
58. BLAKE 11-JUN-84 KING 09-JUL-84
59. CLARK 14-MAY-84 KING 09-JUL-84
60. SMITH 13-JUN-83 FORD 05-DEC-83
61.
62. Vor fi selectate 9 inregistrari.
Solutii
1.
2.
3. SELECT D.DEPTNO, DNAME
4. FROM EMP E, DEPT D
5. WHERE E.DEPTNO(+) = D.DEPTNO
6. AND E.EMPNO IS NULL;
7.
8. SELECT EMPS.EMPNO, EMPS.ENAME,
9. MGRS.EMPNO MGRNO, MGRS.ENAME MGR_NAME
10. FROM EMP EMPS, EMP MGRS
11. WHERE EMPS.MGR = MGRS.EMPNO;
12.
13. SELECT EMPS.EMPNO, EMPS.ENAME,
14. MGRS.EMPNO MGRNO, MGRS.ENAME MGR_NAME
15. FROM EMP EMPS, EMP MGRS
16. WHERE EMPS.MGR = MGRS.EMPNO(+);
17.
18. SELECT JOB
19. FROM EMP
20. WHERE HIREDATE BETWEEN '01-JAN-83' AND '30-JUN-83'
21. INTERSECT
22. SELECT JOB
23. FROM EMP
24. WHERE HIREDATE BETWEEN '01-JAN-84' AND '30-JUN-84';
25.
26. SELECT E.ENAME EMPLOYEE, E.HIREDATE,
27. M.ENAME MANAGER, M.HIREDATE
28. FROM EMP E, EMP M
29. WHERE E.MGR = M.MGRNO
30. AND E.HIREDATE < M.HIREDATE;
31.
32. SELECT DEPTNO, DNAME
33. FROM DEPT
34. MINUS
35. SELECT EMP.DEPTNO, DNAME
36. FROM EMP, DEPT
37. WHERE EMP.DEPTNO = DEPT.DEPTNO;
38.
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:
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. SELECT MIN(SAL)
4. FROM EMP;
5.
6. MIN(SAL)
7. ----------
8. 800
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:
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.
ENAME JOB
------- -----
JONES MANAGER
BLAKE MANAGER
CLARK MANAGER
Cererea interioara intoarce functia lui BLAKE, care este folosita in partea dreapta a
clauzei WHERE di cererea principala (dupa operatorul de comparatie).
Urmatoarea cerere gaseste angajatii care au salariul egal cu salariul minim din fiecare
departament:
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.
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);
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.
De exemplu :
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:
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 :
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;
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 :
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.
DEPTNO AVG(SAL)
-------- ----------
10 2916.66667
20 2175
Pentru a construi o cerere care gaseste functia cu cel mai mare salariu mediu,
introducem :
JOB AVG(SAL)
----- ----------
PRESIDENT 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.
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
Afisati numele, functia si data angajarii pentru angajatii al caror salariu este mai mare ca
cel mai mare salariu din orice departament de vinzari.
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 apare in declaratii SELECT, UPDATE, DELETE, INSERT, CREATE
TABLE.
o fi corelate cu o cerere exterioara.
o 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 dintr-o
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.
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 :
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.
Cererea principala
Cererea interioara
4. Calculeaza AVG(SAL) pentru departamentul angajatului.
5. Valoarea departamentului din clauza WHERE este departamentul candidatului
(E.DEPTNO), valoare transmisa cererii interioare din coloana DEPTNO a ce-
rerii exterioare.
6. AVG(SAL) pentru departamentul lui Smith - 20 - este 2175 œ.
7. Linia candidat nu indeplineste conditia, asa ca este indepartata.
8. Se repeta de la pasul 1 pentru urmatoarea linie candidat; ALLEN din de-
partamentul 30 cistiga 1600 œ.
Selectia liniilor candidat continua cu verificarea conditiei ce apare in re- zultatul cererii.
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.
DEPTNO DNAME
-------- -------
40 OPERATIONS
Observati ca SELECT-ul interior nu este necesar sa intoarca o valoare spe- cifica, asa ca
poate fi selectata o cifra.
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.
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.
Nici o linie nu va fi intoarsa de cererea de mai sus, deoarece coloana MGR contine o
valoare NULL.
ENAME JOB
------- -----
SMITH CLERK
ADAMS CLERK
ALLEN SALESMAN
WARD SALESMAN
MARTIN SALESMAN
TURNER SALESMAN
JAMES CLERK
MILLER 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. JOB ENAME SAL
3. ----- ------- ------
4. PRESIDENT KING 5,000.00
5. ANALYST SCOTT 3,000.00
6. ANALYST FORD 3,000.00
7. MANAGER JONES 2,975.00
8. SALESMAN ALLEN 1,600.00
9. CLERK MILLER 1,300.00
10.
11. Vor fi 6 inregistarri selectate.
12. Gasiti angajatii care cistiga salariul minim pentru functia lor.Afisati rezultatul in
ordine crescatoare a salariului.
13. ENAME JOB SAL
14. ------- ----- -----
15. SMITH CLERK 800.00
16. WARD SALESMAN 1,250.00
17. MARTIN SALESMAN 1,250.00
18. CLARK MANAGER 2,450.00
19. SCOTT ANALYST 3,000.00
20. FORD ANALYST 3,000.00
21. KING PRESIDENT 5,000.00
22.
23. Vor fi 7 inregistari selectate.
24. Gasiti cei mai recenti angajati din fiecare departament.Ordonati dupa data
angajarii.
25.
26. DEPTNO ENAME HIREDATE
27. -------- ------- ----------
28. 20 ADAMS 04-JUN-84
29. 10 KING 09-JUL-84
30. 30 JAMES 23-JUL-B4
31. Afisati urmatoarele detalii pentru orice angajat care cistiga un salariu mai mare ca
media pentru departamentul lor.Sortati dupa numarul departa- mentului.
32. ENAME SALARY DEPTNO
33. ------- -------- --------
34. KING 5000 10
35. JONES 2975 20
36. SCOTT 3000 20
37. FORD 3000 20
38. ALLEN 1600 30
39. BLAKE 2850 30
40.
41. Vor fi selectate 6 inregistrari.
46. Afisati urmatoarele informatii pentru departamentul cu cea mai mare nota de plata
anuala.
47. DEPTNO COMPENSATION
48. -------- ---------------
49. 20 130500
50. Care sint primii trei angajati in functie de salariul cistigat ? Afisati numele lor si
salariul.
51.
52.
53. ENAME SAL
54. ------- -----
55. SCOTT 3,000.00
56. KING 5,000.00
57. FORD 3,000.00
58. In ce an s-au angajat cei mai multi in companie ? Afisati anul si numarul
angajatilor.
59. YEAR NUMBER OF EMPS
60. ------ ----------------
61. 1984 8
62. Modificati intrebarea 4 pentru a afisa si salariul mediu pentru departa- ment.
63. ENAME SAL DEPTNO DEPTAVG
64. ------- ----- -------- ----------
65. ALLEN 1600 30 1566.66667
66. BLAKE 2850 30 1566.66667
67. JONES 2975 20 2175
68. FORD 3000 20 2175
69. SCOTT 3000 20 2175
70. KING 5000 10 2916.66667
71.
72. 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. ENAME HIREDATE MAXDATE
76. ------- ---------- ---------
77. SMITH 13-JUN-83
78. ADAMS 04-JUN-84
79. ALLEN 15-AUG-83
80. BLAKE 11-JUN-84
81. CLARK 14-MAY-84
82. FORD 05-DEC-83
83. JAMES 23-JUL-84 *
84. JONES 31-OCT-83
85. KING 09-JUL-84
86. MARTIN 05-DEC-83
87. MILLER 21-NOV-83
88. SCOTT 05-MAR-84
89. TURNER 04-JUN-84
90. WARD 26-MAR-84
91.
92. Vor fi selectate 14 inregistrari.
Subcereri
1. SELECT JOB, ENAME, SAL
2. FROM EMP
3. WHERE (SAL, JOB) IN (SELECT MAX(SAL), JOB
4. FROM EMP
5. GROUP BY JOB)
6. ORDER BY SAL DESC;
7.
8. SELECT ENAME, JOB, SAL
9. FROM EMP
10. WHERE (SAL, JOB) IN (SELECT MIN(SAL), JOB
11. FROM EMP
12. GROUP BY JOB)
13. ORDER BY SAL;
14.
15. SELECT DEPTNO, ENAME, HIREDATE
16. FROM EMP
17. WHERE (HIREDATE, DEPTNO) IN (SELECT MAX(HIREDATE), DEPTNO
18. FROM EMP
19. GROUP BY DEPTNO)
20. ORDER BY HIREDATE;
21.
22. SELECT ENAME, SAL SALARY, DEPTNO
23. FROM EMP E
24. WHERE SAL > (SELECT AVG(SAL)
25. FROM EMP
26. WHERE DEPTNO = E.DEPTNO)
27. ORDER BY DEPTNO;
28.
29. SELECT DEPTNO, DNAME
30. FROM DEPT D
31. WHERE NOT EXISTS (SELECT 'anything'
32. FROM EMP
33. WHERE DEPTNO = D.DEPTNO);
34.
35. DEFINE REM = SAL * 12 + NVL(COMM, 0)
36. SELECT DEPTNO, SUM(&REM) COMPENSATION
37. FROM EMP
38. GROUP BY DEPTNO
39. HAVING SUM(&REM) = (SELECT MAX(SUM(&REM))
40. FROM EMP
41. GROUP BY DEPTNO);
42.
43. SELECT ENAME, SAL
44. FROM EMP E
45. WHERE 3 > (SELECT COUNT(*)
46. FROM EMP
47. WHERE E.SAL < SAL);
48.
49. SELECT TO_CHAR(HIREDATE, 'YYYY') YEAR,
50. COUNT(EMPNO) NUMBER_OF_EMPS
51. FROM EMP
52. GROUP BY TO_CHAR(HIREDATE, 'YYYY')
53. HAVING COUNT(EMPNO) = (SELECT MAX(COUNT(EMPNO))
54. FROM EMP
55. GROUP BY TO_CHAR(HIREDATE, 'YYYY'));
56.
57. SELECT E.ENAME ENAME, E.SAL, E.DEPTNO, AVG(A.SAL) DEPT_AVG
58. FROM EMP A, EMP E
59. WHERE E.DEPTNO = A.DEPTNO
60. AND E.SAL > (SELECT AVG(SAL)
61. FROM EMP
62. WHERE DEPTNO = E.DEPTNO)
63. GROUP BY E.ENAME, E.SAL, E.DEPTNO
64. ORDER BY AVG(A.SAL);
65.
66. SELECT ENAME, HIREDATE, '*' MAXDATE
67. FROM EMP
68. WHERE HIREDATE = (SELECT MAX(HIREDATE) FROM EMP)
69. UNION
70. SELECT ENAME, HIREDATE, ' '
71. FROM EMP
72. WHERE HIREDATE <> (SELECT MAX(HIREDATE) FROM EMP)
73.
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 aformata rezultatele cererilor in
rapoarte simple.
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 trecepe ON sau OFF.Aceste
comenzi pot fi folosite in mod implicit pentru fiecaresesiune prin includerea lor intr-un
fisier numit LOGIN.SQL, care este citit defiecare data cind se ruleaza SQL*Plus.Daca o
comanda SET aparuta in timpul se-siunii modifica valoarea implicita, aceasta va fi
valabila doar pentru aceasesiune.Iesirea (EXIT) din SQL*Plus va reseta variabilele de
sistem la valo-rile lor implicite.
Pentru a gasi valoarea pentru o variabila SET folosim comanda SHOW. De exemplu,
pentru a gasi dimensiunea paginii (pagesize), introducem :
SHOW PAGES[IZE]
SHOW ALL
|---------------------------------------------------------------------|
|
| | RAPOARTE SQL*PLUS
| |
| | Titlu
| | |
| | |
| | |------------------------------|------------------------------|
| | | | |
| | | Thu April 10 | Page 1 |
| | | | |
| | | | |
| | | COMPANY REPORT |
| | | |
| | | |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | ===== |
| | | |
| | | |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | ===== |
| | | |
| | | |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | ----- -------- ------ ----- --- ------- |
| | | | ===== |
| | | | ===== |
| | | | | |
| | | | Confidential | |
| | | | | |
| | | | | |
| | |------------------|---------------------------------|--------|
| | | |
| | | |
| | Formate de coloana Calcule
| |
| |
|
|---------------------------------------------------------------------|
COLUMN - Optiuni
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).
NOTA:
MESAJE DE EROARE
### ...valoare prea mare pentru format % ...tip
gresit al valorii pentru format
Comenzile TTITLE si BTITLE pot include un numar de clauze, facand posibil ca aparitia
titlului sa fie specificata mai detaliat.
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. TAB n sare inainte n
pozitii de tiparit (inapoi daca n este
negativ). LEFT,CENTER and aliniere stanga, centru sau
dreapta pe linia RIGHT curenta. Articolele de
date ce urmeaza aces- tei clauze sunt
aliniate ca un grup, pana la sfarsitul
comenzii TTILTE sau pana la urmato- rul
LEFT, CENTER, RIGHT sau COLUMN.(CENTER si
RIGHT folosesc valoarea lui SET LINESIZE
pentru a calcula pozitiile articolelor de da-
te). FORMAT defineste formatul articolelor de
date care o urmeaza, pana la urmatoarea
clauza FORMAT sau pana la sfarsitul
comenzii.Specificarea for- matului 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 tipa-
rite in formatul implicit. SQL.PNO Variabila
sistem pentru numarul paginii cu- rente
a raportului. Va puteti referi la va-
loarea unei variabile sistem dandu-i 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.
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
Column
Row
Page
Report
Exemple:
BREAK ON REPORT ON DEPTNO PAGE ON JOB SKIP 2 BREAK ON
REPORT ON DEPTNO PAGE ON JOB DUP
CLEAR BREAKS
BREAK
Calcule Sumare
Pot fi multe comenzi COMPUTE, cu toate ca adesea este mai usor sa specificati toate
calculele cerute intr-o singura comanda.
De exemplu:
Capitolul 10 Solutie
SET ECHO OFF SET PAGESIZE 24 SET FEEDBACK OFF SET
LINESIZE 78 COL A FORMAT A10 HEADING 'Department' COL B
FORMAT A9 HEADING 'Job' COL C FORMAT 9999 HEADING 'Emp.|No.'
COL D FORMAT A8 HEADING 'Name' COL E FORMAT A5 HEADING 'Hire|
Date' COL F FORMAT B99,999.99 HEADING 'Monthly|Salary' COL
G FORMAT 9,990.99 HEADING 'Annual|Comm' COL H FORMAT
999,999.99 HEADING 'Total' BREAK ON A SKIP 1 ON B 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
Parcurgerea arborelui
KING EMPNO=7839
---------------------------------
| | | MGR=7839
| ------ -------------------------
| | | | | | | |
| |
| |
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.
FROM EMP
Comanda Descriere
------- ---------
parcurgerii.
parcurgere de arbore.
jos.
curgere de arbore.
ORDER BY Apare la sfarsit de obicei.
Puteti folosi clauza ORDER BY pentru a sorta liniile returnate.Urmatoarea comanda este
perfect legitima:
FROM EMP
ORDER BY DEPTNO;
FROM EMP
ORDER BY DEPTNO;
Parcurgerea arborilor
FROM EMP
WHERE ENAME!='SCOTT'
JONES
----------------------------
| |
| |
ADAMS SMITH
AND ENAME!='SCOTT'
JONES
----------------------------
| |
| |
TERMINOLOGIE
Sunt cativa termeni mai degraba neobisnuiti cand parcurgeti arborele. Nu este nevoie sa-i
amintim pe toti, decat pentru informatie:
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.
FROM EMP
CONNECT BY PRIOR EMPNO = MGR AND ENAME != 'SCOTT'
Notati ca de aceasta data ambele linii, parinte (SCOTT) si fiu (ADAMS), au fost excluse.
CAPITOLUL 12
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.
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).
NUME VALID ?
---- -------
EMP85 da
FIXED_ASSETS da
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.
...);
(DEPTNO NUMBER(2),
DNAME VARCHAR2(12),
LOC VARCHAR2(12));
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.
----------- ---------
de cifre semnificative.
te in dreapta punctului.
stocata.
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.
blank-uri.
ENAME VARCHAR2(10),
JOB VARCHAR2(10),
MGR NUMBER(4),
HIREDATE DATE,
DESCRIBE EMP
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,
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.
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.
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.
SYS_Cn
unde n este un numar unic. Cuvantul cheie CONSTRAINT iti permite sa numesti o noua
constrangere tu insuti.
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.
LOC VARCHAR2(10),
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.
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.
Notati ca, cuvintele 'FOREIGN KEY' nu sunt folosite versiunea constrangerii de coloana
a sintaxei.
------------
------------
|
/|\ 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:
REFERENCES DEPT(DEPTNO)
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.
| EMP | . .
-------------- .
\|/ .
. .
. .
MGR . .
. .
Sintaxa:
( . . . . . ,
DISABLE,
. . . . . . . ) ;
( . . . . . ,
. . . . . . . ) ;
CHECK(ENAME=UPPER(ENAME)),
JOB VARCHAR2(10),
REFERENCES EMP(EMPNO),
NOT NULL,
COMM NUMBER(7,2),
NOT NULL,
REFERENCES DEPT(DEPTNO))
Crearea unei tabele cu linii din alta tabela
[(nume-coloana ,. . . .)]
AS SELECT declaratie
AS
SELECT EMPNO,ENAME,JOB,SAL
FROM EMP
Table created.
DESC DEPT30
Pentru a crea o tabela tinand numele angajatului, salariul si detalii
de
grad, introduceti:
(NAME,SALARY,GRADE)
AS
Table created.
DESC EMP_SALS;
SELECT *
FROM EMP_SALS;
,/pre>
CAPITOLUL 12 Exercitii - Crearea de tabele
si de constrangeri
Atelier
25.
28.
29.
30.
CAPITOLUL 12 -Solutii
1.
2.
3.
4. CREATE TABLE PROJECTS
5.
6. ( PROJID NUMBER(4) CONSTRAINT PROJ_PRIM PRIMARY
KEY,
7.
8. P_DESC VARCHAR2(20),
9.
10. P_START_DATE DATE,
11.
12. P_END_DATE DATE,
13.
14. BUDGET_AMOUNT NUMBER(7,2),
15.
16. MAX_NO_STAFF NUMBER(2),
17.
18. CONSTRAINT P_DATE_RULE CHECK(P_START_DATE <= P_END_DATE))
19.
20.
21.
22.
23. CREATE TABLE ASSIGNMENTS
24.
25. (PROJID NUMBER(4) NOT NULL REFERENCES PROJECTS
(PROJID),
26.
27. EMPNO NUMBER(4) NOT NULL REFERENCES EMP
(EMPNO),
28.
29. A_START_DATE DATE,
30.
31. A_END_DATE DATE,
32.
33. BILL_RATE NUMBER(4,2),
34.
35. ASSIGN_TYPE VARCHAR2(2))
36.
CAPITOLUL 13
Sintaxa:
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:
Table altered.
DESCRIBE EMP;
Pentru a adauga o constrangere de tabela unei tabele existente, care specifi- ca daca
salariul lunar nu trebuie sa depaseasca 5000$, introduceti:
Clauza MODIFY
Table altered.
DESCRIBE EMP;
Sintaxa:
De exemplu:
De exemplu:
Sintaxa:
De exemplu:
TABLE.
Sintaxa:
DROP TABLE nume tabela [CASCADE CONSTRAINTS]
De exemplu:
Note:
Comanda COMMENT
Comanda RENAME
Sintaxa:
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
Date va va spune:
Dictionarul de Date este creat cand este creata baza de date. Oricand
baza de
Utilizatori
RDBMS
Tabele
Baza Dictionarului de Date sau fundamentul tabelelor sunt primele
o-
Vederi
15) contin informatii intr-o forma care este usor de inteles pentru
utiliza-
tor. Accesul public la Dictionarul de Date este dat prin vederi mai
degraba
de Date.
USER_xxxxx
Obiectele posedate de utilizator pot fi accesate. De e-
exemplu, vederile cu acest prefix permit
utilizatorului
sa afiseze informatii despre tabelele create de
utiliza-
tor 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.
DICTIONARY
Listeaza toate tabelele, vederile, Dictionarului
de Date, accesibile utilizatorului.
DICT_COLUMNS
Listeaza coloanele in dictionarul obiectelor ac-
cesibile utilizatorului.
CONSTRAINT_DEFS
Listeaza toate definitiile de constrangeri intro-
duse pentru tabelele accesibile
utilizatorului.
CONSTRAINT_COLUMNS
Listeaza toate coloanele care sunt accesibile u-
tilizatorului curent si numite in
definitiile
constrangerilor.
Vederea DICTIONARY
SELECT *
FROM DICTIONARY;
(pag. 13-13)
USER_AUDIT_SESSION
TABLENAMECOMMENTS
utilizatorilor:
SQL>desc dict
ta:
SQL pentru:
OR
DESC DEPT
DESC EMP
DESC SALGRADE
Atelier
12.
13. Cereti vederea USER_OBJECTS; posedati acum vreun obiect
viitor?
14.
15.
16. Priviti in Dictionarul de Date pentru informatii despre
constrangeri pe
17. tabelele voastre (puteti folosi vederea USER_CONSTRAINTS).
18.
19.
Daca aveti timp :
20.
21.
22. 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. ALTER TABLE PROJECTS
3. ADD (COMMENTS LONG)
4.
5. ALTER TABLE ASSIGNMENTS
6. ADD (HOURS NUMBER)
7.
8.
9.
10. SELECT OBJECT_NAME, OBJECT_TYPE
11. FROM USER_OBJECTS
12.
13.
14.
15. ALTER TABLE ASSIGNMENTS
16. ADD CONSTRAINT UNQ_KEY UNIQUE (PROJID,EMPNO)
17.
18.
19.
20.
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. voastre de obiecte posedate.
23.
24. O cerere posibila este:
25.
26.
27. SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
28. SEARCH_CONDITION
29.
30. FROM USER_CONSTRAINTS
tele!
31.
32. SELECT OWNER, TABLE_NAME
33. FROM ALL_TABLES
34. WHERE TABLE_NAME LIKE '%EMP%'
35.
36.
37.
38.
39.
CAPITOLUL 14
Comanda INSERT este folosita pentru a adauga linii unei tabele Sintaxa comenzii
INSERT este:
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 intra intr-un departament nou, omitand numele departamentului, lista de coloane
trebuie specificata:
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.
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 INTO EMP
(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)
VALUES (7658,
'MASON',
'ANALYST',
7566,
TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'),
3000,
NULL,
20);
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.
Actualizarea liniilor
UPDATE tabela[alias]
SET coloana [, coloana...] = {expresie, subcerere}
[WHERE conditie];
De exemplu:
UPDATE EMP
SET JOB='SALESMAN',
HIREDATE = SYSDATE,
SAL = SAL*1.1
WHERE 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 EMP
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 COMM
----- ----
7499 1100
7654 500
7654 100
7844 2000
7844 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.
EMP
EMPNO COMM
----- ----
7499 1100
7654 600
7844 3500
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);
EMP
EMPNO COMM
----- ----
7844 3500
7499 1400
7654 2000
Comanda DELETE permite stergerea unei sau mai multor linii dintr-o tabela.
Pentru a sterge toate informatiile despre departamentul 10 din tabela EMP, introduceti :
TRANZACTII
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
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.
Erorile de Sistem
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.
Urmatoarele instructiuni SQL sunt utilizate cand apar executii (commit) sau refaceri
(rollback) :
COMMIT[WORK]
SAVEPOINT nume_savepoint
ROLLBACK[WORK] to [SAVEPOINT] nume_savepoint
Cele 3 blocuri SQL utilizate pentru controlul tranzactiilor sunt explicate mai jos:
COMMIT[WORK]
Sintaxa : COMMIT[WORK];
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
Exemplu :
SAVEPOINT terminare_actualizari
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.
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.
SAVEPOINT insert_done;
UPDATE DEPT
SET DNAME = 'MARKETING';
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.
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.
Consistenta la Citire
Utilizatorii bazelor de date fac doua tipuri de accesuri asupra bazelor de date:
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' :
Tranzactii de Citire
COMMIT;
SET TRANSACTION READ ONLY;
COMMIT;
PROJID 1 2
P_DESC WRITE C030 COURSE PROOF READ
NOTES
P_START_DATE 02-JAN-88 01-JAN-89
P_END_DATE 07-JAN-88 10-JAN-89
BUDGET_AMOUNT 500 600
MAX_NO_STAFF 1 1
COMMENTS BE CREATIVE YOUR CHOICE
PROJID 1 1 2
EMPNO 7369 7902 7844
A_START_DATE 01-JAN-88 04-JAN-88 01-JAN-89
A_END_DATE 03-JAN-88 07-JAN-88 10-JAN-89
BILL_RATE 50.00 50.00 45.50
ASSIGN_TYPE WR WR PF
HOURS 15 20 30
REZOLVARI:
3. UPDATE ASSIGNMENTS
SET ASSIGN_TYPE='WT'
WHERE ASSIGN_TYPE='WR';
C A P I T O L U L 15
CONCURENTA SI BLOCAREA : O VEDERE GENERALA
Scopul acestui capitol este acela de a arata cum ORACLE gestioneaza blocarea.
Blocari
ORACLE utilizeaza blocarile pentru a controla accesul concurent la date. Blocarile sunt
mecanisme pentru a preveni interactiunea destructiva intre utilizatorii care acceseaza
aceleasi date.
CONCURENTA DATELOR
Utilizatorii care doresc sa citeasca adeleasi date sa nu astepte utilizatorii care scriu
aceleasi blocuri de date.
Utilizatorii care doresc sa scrie datr in baza de date sa nu astepte utilizatorii care
citesc aceleasi date.
Utilizatorii care vor sa scrie date asteapta doar ulilizatorii care modifica aceleasi
linii.
CONSISTENTA LA CITIRE
Nivele de Blocare
Nivel de Linie
Afecteaza liniile individual. Doar blocarile exclusive (x) se aplica la nivel de linie.
Nivel de Tabela
Afecteaza utilizarea intregii tabele.
Tipuri de Blocari
Mod blocare Actiuni Actiuni
Obtinut prin
Prescurtare interzise permise
comenzile SQL
------------------------------------------------------------
--------------
Share Modificari Blocare linii, LOCK
TABLE tabela
-S- RX,SRX,X RS,S,cereri IN
SHARE MODE
blocurilor DDL
Row share Acces exclusiv, Modificari,
SELECT...FOR UPDATE,
-RS- X RS,RX,S,SRX, LOCK
TABLE tabela IN
cereri ROW
SHARE MODE
EXCLUSIVE MODE
EXCLUSIVE (X)
Blocarile exclusive permit cererile de interogare in resursa blocata dar interzic
orice alta acti- vitate in tabela.
SHARE (S)
Blocarile de acest tip permit interogarile dar interzic modificarile intr-o tabela.
ROW SHARE (RS)
Permite accesul concurent la o tabela. Interzice ca alti utilizatori sa blocheze
tabela pentru acces exclusiv.
ROW EXCLUSIVE (RX))
Sunt asemanatoare cu ROW SHARE dar interzic blocarea in mod SHARE.
Aceste blocari sunt generate la modi- ficare,inserare sau stergere.
SHARE ROW
Sunt folosite pentru a vizualiza o tabela pentru a
EXCLUSIVE (SRX)
executa modificari selectiv si pentru a permite altor utilizatori sa vizualizeze
tabela fara a o bloca in modul SHARE sau a modifica linii. Acest mod nu prea
este utilizat.
Abreviatiile din paranteze sunt cele utilizate in Lock Monitor al
SQL*DBA.
Durata Blocarilor
Toate blocarile acumulate de-a lungul unei tranzactii sunt elibe-
rate cand tranzactia se termina.
Toate blocarile acumulate de-a lungul unei tranzactii sunt elibe-
rate cand tranzactia se intoarce .
Toate blocarile acumulate dupa un punct de salvare sunt eliberate
cand tranzactia se intoarce la punctul de salvare.
Blocarea implicita
Blocarile care apar in timpul unui DML normal, fara o cerere specifica de
blocare.
tabela
+--------------+
^ +----------------------+ | Utilizator
A |
| | |
+--------------+
| +----------------------+ |
| | # EXCLUSIVE | <-------------+
UPDATE, INSERT
| +----------------------+ sau
DELETE o linie
| | |
ROW | |
EXCLUSIVE | |
| | |
| +----------------------+
| | # EXCLUSIVE | <-------------+
| +----------------------+ +------
+-------+
| | | | Utilizator
B |
v +----------------------+
+--------------+
UPDATE,
INSERT sau DELETE
Blocarile Datelor
Sintaxa :
SELECT ...
FOT UPDATE [ OF coloana, coloana, ... ] [NOWAIT]
+---------------------------+
| | 1. ROW LOCK(X)
| |
| | 2. TABLE LOCK(RS)
| 1. SELECT...FOR UPDATE OF |
| |
| | 3. TABLE LOCK(RX)
| |
+---------------------------+
Deadlock
De exemplu :
Tranzactia A Tranzactia B
Cand primul bloc este executat, nu exista nici o problema. Oricum, cand ei
vor incerca sa obtina blocarile pentru al doilea bloc, se va astepta in
spatele celuilalt utilizator. Este deadlock deoarece nici macar prin
asteptare problema nu va fi rezolvata.
COMMIT / ROLLBACK
LOG OFF
+--------------------+
ROWID | 00004C90.0001.0001 |
+--------------------+
UPDATE EMP
SET JOB = 'SALESMAN,
HIREDATE=SYSDATE,
SAL=1.1*SAL
WHERE ROWID='&ROW_IDENT'
ROWID 00004C90.0001.0001
De ce sa utilizam ROWID ?
C A P I T O L U L 16
IMAGINI (VIEWS)
Ce este o Imagine ?
O imagine este ca o fereastra prin intermediul careia datele din tebele pot fi
vizualizate sau schimbate.
O imagine este derivata dintr-o alta imagine sau tabela la care este referita ca
tabela de baza a imaginii - o tabela 'reala' cu date care sunt stocate fizic.
O imagine este stocata doar ca o secventa SELECT. Este o tabela virtuala - adica
este o tabela care nu exista fizic, dar ii apare utilizatorului ca si cum ar exista.
O imagine nu are date proprii. Ea manipuleaza datele din tabela de baza asociata.
Coloana1, coloana2, etc. sunt numele date coloanelor in imaginesi trebiue sa corespunda
elementelor din lista selectata.
Pentru a crea o imagine simpla numita D10EMP, care contine unele detalii ale angajatilor
din Departamentul 10, introduceti :
SELECT *
FROM D10EMP
ODRER BY ENAME;
De notat si faptul ca daca o coloana este utilizata intr-o cerere (ANNSAL), o imagine a
unui alias al coloanei ( nume alternativ pentru coloana in imagine ) nu e necesar. De
exemplu :
O imagine nu poate contine clauza ORDER BY. Clauza ORDER BY este specificata
cand se executa SELECT din imagine.
Optiunea OR REPLACE
Aceasta optiune permite ca o imagine sa fie creata chiar daca exista una cu acelasi nume,
astfel inlociundu-se vechea varianta a imaginii pentru proprietarul ei. Aceasta inseamna
ca o imagine poate fi alterata fara a fi abandonata, recreandu-se si redand privilegiile
obiectului.
Optiunea FORCE
Aceasta optiune creaza o imagine chiar daca tabela de baza nu exista, sau sunt prea putine
drepturi pentru tabela respectiva. Oricum, tabela trebiue sa existe inainte ca imaginea sa
poata fi utilizata.
Clauza WITH CHECK OPTION specifica faptul ca INSERT si UPDATE executate pein
intermediul imaginii nu permit crearea de linii noi pe care imaginea nu le poate selecta, si
de aceea mermite constrangerile de integritate si vreificarile validarilor de date sa fie
fortate asupra datelor ce vor fi inserate sau actualizate.
In urmatorul exeplu, o imagine numita D10EMP este creata cu WITH CHECK OPTION.
Aceasta inseamna ca doar linii care au DEPTNO = 10 pot fi inserate, actualizate sau
sterse. Adica nici o secventa DML nu poate sa adreseze imaginea decat daca conditiile
clauzei imaginii sunt indepli- nite.
Daca exista o incercare de a executa actiuni DML asupra liniilor pe care imaginea nu le
poate selecta intr-o claiza WHERE, se afiseaza eroare :
Pentru a crea o imagine care sa restranga accesul la detaliile personale ale unui angajat
valid in tabela EMP, si timpul de acces la orele de servici, atunci introduceti urmatoarea
comanda :
Cand creati o imagine cu WITH CHECK OPTION, trebiue s-i atribuiti un nume
restrictiei WITH CHECK OPTION.
Aceasta restrictie previne inserarea unei coloane in tabela EMP cu un numar care nu
exista in tabela DEPT.
Cand comanda CREATE VIEW este executata in seventa SELECT care urmeaza AS nu
e executata; in loc este doar depozitata in dictionarul de date.
Maxdata
Arraysize
Long
Imaginea text este memorata intr-o coloana de tipul de date Long si ar trebui setat
ARRAYSIZE la o valoare mica ( de ex. 1 ) pentru a vizualiza textul.
Dupa cum am discutat, restrictiile pot fi impuse cu ajutirul clauzei WITH CHECK
OPTION cand o imagine este creata. Mai sunt si alte constrangeri de care trebiue sa fiti
atenti.
1. conditie Join
2. functii de grup
3. clauza GROUP BY
4. comanda DISTINCT
5. ROWNUM (nr de ordine al randului dupa ce acesta a fost adus din baza de date).
Utilizati comanda DROP pentru a sterge o imagine. Aceasta comanda elimina definitia
imaginii din baza de date. Coloanele si liniile nu sunt afectate deoarece sunt stocate in
tabelele de unde a derivat fiecare ima- gine. Imaginile sau alte aplicatii bazate pe o
imagine stearsa devin in- valide.
De notat ca o imagine poate fi derivata dintr-o tabela sau de fapt dintr-o alta imagine !
C A P I T O L U L 17
Utilizatorii si Securitatea
Sistemul de securitate descentralizata a lui ORACLE este explicat in acest capitol. In
special vom explica cum sa utilizati comenzile GRANT si REVOKE pentru a controla
accesul la baza de date si sa inregistrati noi utilizatori cu diferite niveluri de drepturi de
acces.
Privilegiile Sistemului
Sunt mai mult de 80 tipuri de drepturi ale sistemului disponibile pentru atribuite catre
utilizatori si roluri. Unele din cele mai importante sunt listate mai jos. Pentru o
specificare completa, vedeti "Oracle7 Server SQL reference Manual".
Drept Sistem
Operatii autorizate
CREATE SESSION
Permite posesorului conectarea la baza de date.
CREATE TABLE
Permite posesorului crearea de tabele. Uti- lizatorul trebuie de asemenea sa aiba o
cota intr-o "tablespace" (arie a bazei de date).
CREATE VIEW
Permite crearea imaginilor.
CREATE USER
Permite posesorului sa creeze alti utiliza- tori ORACLE (un drept cerut pentru o
functie DBA).
Roluri
Un rol este o colectie de drepturi sistem cu nume. Un utilizator poate avea acces la mai
multe roluri, si mai multi utilizatori pot fi atribuiti aceluiasi rol, dandu-se flexibilitate si
usurinta sistemului de securitate.
Sunt cateva roluri predefinite, ca DBA ( Administrator de Baze de Date ) care include
toate privilegiile sistemului, dar un DBA va crea de obicei roluri pentru cerintele
sistemului.
Daca aveti atribuite mai multe roluri, puteti oscila intre ele in timpul unei sesiuni pentru a
activa sau nu drepturile asociate. Aceasta este realizata prin comanda SET ROLE.
Pentru a activa toate rolurile exeptand un singur rol pentru un uti- lisator :
Un utilizator va avea unele roluri implicite care sunt activate la intrare in sesiune. Acestea
sunt de obicei toate rolurile acordate utilizatorului, dar pot fi schimbate cu comanda
ALTER USER.
ROLURI
Acordarea de drepturi
Utilizatori
fara roluri o o o
/|\ /|\ /|\
/^\ /^\ /^\
| | |
+----+--+-------+-------+
| | | | | |
| +-----|-+--+--|-+-----|-+
| | | | | | | | |
| | +---|-|-+---|-|-++--|-|-+
/\+ | /\+ | /\+ | /\+ |
\/--+ \/--+ \/--+ \/--+
DREPTURI
Acordarea de drepturi
utilizand roluri
o o o Utilizatori
/|\ /|\ /|\
/^\ /^\ /^\
\ | /
\ | /
\ | /
\ | /
++---+---++
| | <------------ ROL
+--+---+--+
| | | |
+-------+ | | +-------+
| | | |
/\ /\ /\ /\
\/ \/ \/ \/
Privilegii
DBA atribuie utilizatorului o parola initiala cand utilizatorul este creat ( via CREATE
USER ). Utilizatorul poate mai tarziu sa-si schimbe parola utilizand comanda ALTER
USER.
Sintaxa :
De exemplu :
De notat ca de asameni comanda poate fi utilizata pentru a scimba parola proprie, alte
optiuni in ALTER USER pot necesita unele drepturi ale sistemului pentru a se incheia cu
succes.
Comanda GRANT
Detineti fiecare tabela, imagine, secventa si sinonim pe care il creati. Daca nu doriti sa
impartiti un astfel de obiect cu alti utiliza- tori ORACLE, doar dumneavoastra si orice
DBA il poate accesa.
Pentru a permite accesul altor utilizatori la obiectele bazei de date, utilizati comanda
GRANT :
GRANT drepturi
ON obiect
TO utilizator;
Tabelul de mai jos arata drepturile care pot fi acordate la tabele si imagini.
Drept Obiect
----- ------
SELECT date in tebele sau imagini
INSERT linii in tabele sau imagini
UPDATE linii sau coloane specificate intr-o tabela sau
imagine
DELETE linii dintr-o tabela sau imagine
ALTER definitii de coloane in tabele
INDEX indexare la o tabela
REFERENCES se refera la o tabela numita in interiorul unei
restrictii de tabela sau coloana.
ALL
Cel mai simplu fel de GRANT este unul care acorda un singur drept unui singur
utilizator.
Pentru a acorda lui ADAMS dreptul de SELECT din tabela DEPT, introduceti :
GRANT SELECT
ON DEPT
TO ADAMS;
Grant succeeded.
Mesajul :
Grant succeeded.
Pentru a acorda dreptul UPDATE pentru anumite coloane lui ADAMS, introduceti :
Pentru a acorda mai multe drepturi odata, introduceti toate drepturile separate prin
virgule. Similar, pentru a acorda mai multe privilegii mai multor utilizatori, introduceti
numele utilizatorilor separate prin virgule.
Pentru a acorda drepturile INSERT si UPDATE asupra DEPT lui ADAMS si JONES,
introduceti :
Grant succeeded.
Pentru a acorda toate privilegiile asupra DEPT lui ADAMS, introdu ceti :
GRANT ALL
ON DEPT
TO ADAMS;
Grant succeeded.
Cand s-a acordat un drept de acces, utilizatorul care primeste dreptul, in mod normal nu
primeste si autorizarea de a transmite acest drept si altora. Pentru a da unui utilizator
dreptul de a transmite dreptul mai departe, utilizati clauza WITH GRANT OPTION.
Pentru a acorda dreptul SELECT asupra EMP lui ADAMS, cu autorizarea de a acorda
acest drept si altora, introduceti :
GRANT SELECT
ON EMP
TO ADAMS
WITH GRANT OPTION;
Grant succeeded.
Dreptul Public
GRANT SELECT
ON EMP
TO PUBLIC;
Secventa
Pentru a permite accesul asupra secventei lui Ford -F_SEQ- lui BLAKE, FORD va
introduce :
Alte Obiecte
Comanda GRANT pate fi utilizata pentru a permite accesul utiliza torilor asupra
procedurilor stocate, functii si pachete (Oracle7 Procedural Option).
Puteti sa permiteti accesului unui rol asupra unui obiect. Fiecare utilizator caruia ii este
asignat acel rol poate utiliza obiectul respectiv.
De exemplu :
Daca primiti mesajul de eroare ORACLE ' table or view does not exist', aceasta poate
insemna doua lucruri :
Comanda REVOKE
Pentru a retrage un drept acordat, utilizati comanda REVOKE. Este similara cu GRANT :
REVOKE drepturi
ON tabela sau imagine
FROM utilizatori;
REVOKE ALL
ON EMP
FROM ADAMS;
Revoke succeeded.
REVOKE SELECT
ON EMP
FROM PUBLIC;
Pentru a afla acre utilizatori au drepturi asupra tabelelor imagi nilor sau secventelor dvs.,
executati o cerere catre imaginea Dictionarului de Date USER_TAB_GRANTS, sau
USER_COL_GRANTS.
Pentru a referi o tabela detinuta de un alt utilizator, trebuie sa prefixati numele tabelei cu
numele utilizatorului care a creat-o urmat de punct (.).
SELECT *
FROM SCOTT.EMP;
Alternativa este de a crea un sinonim ( alt nume ) pentru tabela sau imaginea data.
Pentru a referi tabela EMP a lui SCOTT doar cu numele 'EMP', introduceti :
Acum, cand executati o cerere asupra tabelei EMP a lui Scott, doar introduceti :
SELECT *
FROM EMP;
Doar DBA poate crea sinonime PUBLICe la care toti utilizatorii sa aiba acces.
CAPITOLUL 18
OBIECTE in BAZELE de DATE : SECVENTIALE si
INDEXATE
Acest paragraf descrie cum se poate indexa o tabela pentru a imbunatati timpul de
raspuns in cazul unei interogari.
Dupa ce o secventa a fost creata ea poate fi folosita pentru a genera numere unice
de secventa.
SELECT dept_seq.NEXTVAL
FROM SYS.DUAL ;;
NEXTVAL
-------------
10
SELECT dept_seq.NEXTVAL
FROM SYS.DUAL ;;
NEXTVAL
-------------
20
1 record created
SQL> SELECT * FROM DEPT;
1 record created.
Proprietarul unei secvente poate atribui altor useri drepturi de ALTER sau
SELECT asupra secventei, si WITH GRANT OPTION ramine valida.
Detalii in UNIT-ul 17.
Tiparirea Secventelor
Indexarea
Indexarea in sistemul ORACLE are doua principale scopuri:
Proprietarul unei tabele poate crea indexi pentru ea. Orice user ORACLE care
detine dreptul de access INDEX poate creea un index.
Odata creat, ORACLE va folosi index-ul ori de cite ori este posibil pentru a
accelera accesul datelor. Acest lucru se face in mod automat si deobicei nu este
necesara interventia userului care poate sa nu stie de existenta acestul index.
Tipuri de INDEX
TYPE DESCRIERE
----------
----------------------------------------------------------
UNIQUE asigura ca valorile din coloanele specificate sunt
unice
NON UNIQUE asigura obtinerea cit mai repede a rezultatului
(implicit)
SINGLE COLUMN exista numai o coloana in index
CONCATENATED mai mult de 16 coloane specificate in index.
Oracle decide cind este adecvat sa foloseasca indexi. Oracle tine seama de
coloanele indexate si de tipul indexului si decide functie de urmatoarele reguli:
SELECT *
FROM EMP
WHERE ENAME = 'JHONES';
SELECT *
FROM EMP
WHERE HIREDATE+7 = '01-JAN-84';
Utilizarea indexarii functie de cost
De exemplu:
Daca numai EMP.DEPTNO este indexata , atunci DEPT este tabela conducatoare.
Acest lucru este normal deoarece DEPT intoarce mai multe linii decit EMP. Daca
ambele sunt indexate, Oracle alege tabela conducatoare cintarind rangurile celor
doua sisteme. Daca rangurile sunt egale atunci Oracle alege tabela care este listata
ultima in clauza FROM.
Asa ca trebuie listate tabele mari cu cel mai mic numar de linii la sfirsitul clauzei
FROM.
Unit 18 Exercitii
Solutii:
3.
4. CREATE INDEX ASG_PROJID
5. ON ASSIGNMENTS (PROJID);
6.
7.
8. SELECT TABE_NAME, INDEX_NAME
9. FROM USER_INDEXES;
10.
CAPITOLUL 19
INTRODUCERE IN PL/SQL
CE ESTE PL/SQL ?
Un limbaj procedural
Un vehicul pentru procesarea tranzactiilor
O tehnologie disponibila in citeva aplicatii ORACLE
O extensie SQL
Ce este PL/SQL ?
PL/SQL (Procedural Language /SQL) este o extensie la SQL, incorporind multe
facilitati ale limbajalor de programare din ultimii ani. El permite ca manipularea
datelor si procedurile de interogare din SQL sa fie incluse in blocuri stucturate si
proceduri, PL/SQL devenind astfel un puternic limbaj de procesare al
tranzactiilor.
1. Stuctura de bloc
PL/SQL este un limbaj structurat, adica programele pot fi impartite in
blocuri logice, fiecare continind resursele necesare in acel bloc. variabilele
pot fi declarate local in cadrul unui bloc in care vor fi folosite, iar tratarea
erorilor (sau Exceptiile) se poate face in blocul in care apar.
2. Controlul executiei
3. Portabilitatea
4. Integrarea
5. Performantele
Structura PL/SQL
Fiecare unit al PL/SQL contine unul sau mai multe blocuri. Aceste blocuri pot fi
complet separate sau lipite unul de altul. Astfel, un bloc poate fi numai o mica
parte a altui bloc, care la rindul lui poate fi numai o parte din intreegul program.
Uzual sunt blocurile fara un nume. Aceste blocuri sunt declarate in punctul
din aplicatie unde vor fi folosite, si transferate modulului PL/SQL la
momentul executiei. Blocurile anonime pot apare in cadrul unui program
precompilat (sau program OCI) si cu SQL*Plus sau SQL*DBA. Partile de
executie din SQL*Forms contin asemenea blocuri.
o Sub-programe
In acest curs ne vom concentra mai mult asupra blocurilor anonime. Definirea
unui bloc anonim este urmatoarea:
---------------------------------------------------
| DECLARE |
| Definitia obiectelor PL/SQL care vor |
| fi folosite in acest bloc. |
---------------------------------------------------
| BEGIN |
| Actiuni executabile |
---------------------------------------------------
| EXCEPTION |
| Tratarea erorilor (cazuri de exceptie) |
| ce trebuie facut daca o actiune cauzeaza |
| o eroare |
| END; |
---------------------------------------------------
EXCEPTION
WHEN no_data_found THEN
INSERT INTO error_table
VALUES ('Product Tennis Rackets
not found');
END;
Facilitati PL/SQL
Urmatoarea parte a unit-ului discuta avantajele (facilitatile) ale PL/SQL comune
fiecarui mediu de lucru unde limbajul este instalat.
o Variabile si Constante
o SQL suport
SELECT, INSERT, UPDATE, DELETE, COMMIT, SAVEPOINT si
ROLLBACK sunt instructiuni suportate.
o Controlul Executiei
o Functii Interne
o Tratarea Exceptiilor
CAPITOLUL 20
REPREZENTAREA DATELOR
In acest unit vom discuta tipurile de date suportate de PL/SQL, variabile scalare,
si cum pot fi manipulate datele si expresiile. Acest unit introduce de asemenea
modul de utilizare al PL/SQL cu SQL*Plus, care este o cale interactiva
convenabila pentru testarea blocurilor pe care le veti scrie.
Exemplu:
Delimitatori
Delimitatorii sunt simboluri sau simboluri compuse, care au o semnificatie
speciala pentru PL/SQL. Veti recunoaste multe dintre acestia ca operatori
pentru SQL.
Simboluri simple - Acestea sunt formate dintr-un singur caracter
------------------------------------------------------------------
+ operatorul de adunare
- operatorul de scadere/negare
* operatorul de multiplecare
/ operatorul de impartire
= operator relational
> operator relational
< operator relational
) delimitator de lista sau expresii
( -||-
; delimitator de instructiuni
, separator de obiect
. selector de componenta
@ delimitator de access la distanta
' delimitator de sir
: delimitator de masina
Simboluri Compuse - Sunt formate din doua caractere
------------------------------------------------------------------
---
** exponential
<> relational
!= -||-
^= -||-
<= -||-
>= -||-
:= asignare
=> asociere
.. rang
|| concatenare
<< eticheta
>> -||-
-- comentariu
/* -||-
*/ -||-
Blocurile Incluse
Anumite blocuri pot fi incluse in altele, in orice fel in care instructiunea o
permite( nu se recomanda sa se include blocuri in cadrul unor bucle).
Partea executabila a unui bloc poate fi sparta in blocuri mai mici, si de
asemenea sectiunea EXCEPTION poate include alte blocuri.
Exemplu:
BEGIN
-- actiuni in bucla principala
DECLARE
-- declaratii de obiecte
BEGIN
-- actiuni ale blocului
EXCEPTION
-- ce'i de facut daca apare o eroare in acest
bloc.
END;
-- alte actiuni in blocul principal
EXCEPTION
WHEN errors_trickle_through THEN
BEGIN
-- minuire a erorilor in blocul propriu
EXCEPTION
-- ce'i de facut daca tratarea unei erori
-- merge gresit !!
END;
END;
Domeniul OBIECTELOR
"Domeniul" unui obiect este zona unui program in care acest obiect poate
fi folosit. Scurt zis este 'Timpul de viata'. Aceste reguli se aplica toturor
obiectelor declarate, incluzind variabile, cursor, constante si exceptii
definite de utilizator.
Domeniul unui obiect este blocul complet in care obiectul este declarat,
inclusiv oricare sub-bloc inclus in acest bloc. Obiectele declarate in sub-
blocuri sunt valabile pina cind sub-blocul se termina.
Exemplu:
DECLARE
X NUMBER; ----------------|
BEGIN |
|
... |
domeniul
|
lui
DECLARE |
x
Y NUMBER; -----| |
| domeniul lui y |
BEGIN | |
... | |
END; -----| |
|
... |
END; ---------------|
DECLARE
x NUMBER; -- variabila x din blocul
principal
BEGIN
...
DECLARE
x NUMBER; -- variabila x din sub-bloc
BEGIN
...
END;
...
END;
Doua obiecte pot avea acelasi nume, dar definite in doua blocuri diferite.
Acolo unde se intilneste aceasta situatie, ca in exemplul anterior, atunci
numai obiectul declarat un sub-bloc ( acesta este blocul curent) poate fi
folosit.
Reguli de VIZIBILITATE
In exemplul anterior, variabila 'x' din sub-bloc dezactiveaza folosirea
variabilei 'x' din blocul principal pina cind variabile intilnesc sfirsitul de
valabilitate. In cadrul sub-blocului, variabila 'x' din blocul principal exista
dar nu este vizibila.
Declararea VARIABILELOR
Variabilele PL/SQL pot fi declarate si optional le pot fi asignate o valoare
initiala, in sectiunea DECLARE a unui bloc. Alte variabile referite in partea
declarativa trebuie declarate separat in declaratiile anterioare.
Sintaxa:
Exemple:
v_count NUMBER NOT NULL := 0;
v_salary NUMBER(7,2);
v_annsal NUMBER(9,2) := month_sal * 12;
-- mount_sal trebuie sa existe deja
postcode CHAR(7);
surname VARCHAR2(25) := 'Skywalker' ;
v_message VARCHAR2(80) := 'May the course be
woth you!' ;
Declararea CONSTANTELOR
Constantele permit asignarea unei valori unui identificator, pentru o
viitoare referire in cadrul unui bloc. Orice incercare de a modicica valoarea
unei constante va cauza producerea unei erori PL/SQL.
Sintaxa:
identificator CONSTANT tipdata [(precision,scala)] :=
expresie ;
Exemple:
ATRIBUIRILE si EXPRESIILE
Instructiunile de atribuire PL/SQL permit unei valori de a fi atribuite sau
reatribuite unei variabile dupa sectiunea DECLARE din bloc. Variabila
care va primi noua valoare trebuie explicit numita in partea stinga a
operatorului de asignare. Asta este, nu se poate face referinta indirecta
via o alta variabila.(Unele unitati PL/SQL cum ar fi SQL*Forms includ
unele facilitati pentru adresare indirecta.)
Sintaxa:
identificator := expresie ;
Unde 'identificator' este numele variabilei tinta, sau cimp, pentru a primi
valoarea 'expresie'.
'Expresie' poate fi literal, numele unei alte variabile existente, sau alta
expresie necesara pentru a determina valoarea ce va fi asignata. De
obicei, cele mai multe din expresiile disponibile in inderogarile SQL ,
clauza SELECT sunt disponibile aici. Functiile si expresiile permise in
PL/SQL vor fi discutate mai tirziu in acest UNIT.
Exemple:
Exemple:
switch1 := TRUE;
switch2 := FALSE;
Exemple:
:screen_field1 := ann_sal ;
:warp_factor := 9 ;
:global.var1 := 'YES' ;
Exemple:
sal_message VARCHAR2(12) := 3500;
TO_CHAR
TO_DATE
TO_NUMBER
Exemplu:
Precedenta operatorilor
Operatorii logici, aritmetici si de concatenare folositi in PL/SQL sunt
aceeasi ca in SQL. In plus mai exista un operator exponential (**) .
------------------------------------------------------------------
-----------|
| | OPERATOR | OPERATIE
|
|-----------------------------------------------------------------
-----------|
|Primul | ** , NOT | exponential,
negatie logica|
| | + , - | identitate,
negatie |
| | * , / | inmultire,
impartire |
| | + , - , || | adunare,
scadere, |
| | | concatenare
|
| | = , != , < , > , <= , >= | comparatie
|
| | IN NULL, LIKE, BETWEEN, IN |
|
| | AND | conjunctie
|
|Ultimul| OR | incluziune
|
|-----------------------------------------------------------------
-----------|
Functii interne
Multe din functiile disponibile in SQL sunt de asemenea disponibile si in
PL/SQL. Acestea includ:
o Functii numerice pentru o singura linie
o Functii caracter pentru o singura linie
o Functii de conversie de tip de data
o Functii de timp
o Functii diverse
Exemplu:
SQL> DECLARE
2 x NUMBER(7,2);
3 BEGIN
4 SELECT sal INTO x FROM emp WHERE empno = 7788;
5 IF x < 3000 THEN UPDATE emp SET sal = 3000
6 WHERE empno = 7788;
7 END IF;
8 END;
9 .
Exemplu:
o dupa rularea unui bloc PL/SQL, veti vedea fiecare mesaj de tipul
'PL/SQL procedure successfully completed'
( procedura PL/SQL terminata cu succes )
Parse-time Error MEssages
( mesaje de eroare, aparute dinamic in timpul procesarii.)
An 'Unhandled Exception' Message
( Mesaj de eroare netratata.)
o Instructiunile PL/SQL nu pot scrie pe ecran !
Mesajele sunt scrise intr-o tabela si dupa acea se parcurge
tabela
Scrie mesajele intr-o variabila de asociere si apoi foloseste
comanda PRINT dupa ce blocul a rulat.
Se apeleaza o procedura care afiseaza mesajele pe ecran
Table MESSAGES
Coloana Descrierea
------------ -------------------------------------
NUMCOL1 NUMBER (9,2)
NUMCOL2 NUMBER (9,2)
CHARCOL1 VARCHAR2(60)
CHARCOL2 VARCHAR2(60)
DATECOL1 DATE
DATECOL2 DATE
1. Creati un bloc, cu patru variabile:
V_BOOL1 Boolean
V_BOOL2 Boolean
V_CHAR Character ( lungime variabila)
V_NUM Number
Variabila Valoare
-------------
-----------------------------------------
V_CHAR Literar `42 este raspunsul'
V_NUM Primele doua caractere din V_CHAR
V_BOOL1 TRUE si FALSE functie de cum este
V_NUM
fata de 100
V_BOOL2 Opus lui V_BOOL1
2. Scrieti si rulati un bloc PL/SQL care accepta soua numere din variabile
PL/SQL. Primul din numere trebuie "ridicat la putere" cu cel de-al doilea numar,
in cadrul blocului, si rezultatul scris intr-o variabila PL/SQL. INregistrati rezultatul
in tabela MESSAGES, si alternativ in variabila de asociere SQL*Plus.
(Operatorul exponential in PL/SQL este '**' ).
Unit 20 SOLUTII
1.
2. DECLARE
3. V_BOOL1 BOOLEAN;
4. V_BOOL2 BOOLEAN;
5. V_CHAR VARCHAR2(16); -- cel
putin 16 caractere
6. V_NUM NUMBER(2);
7. BEGIN
8. V_CHAR := '42 este raspunsul';
9. V_NUM := SUNSTR(V_CHAR,1,2); -- conversie
dinamica la mumar
10. V_BOOL1 := V_NUM < 100;
11. V_BOOL2 := NOT V_BOOL1;
12. END;
13.
14.
15. DECLARE
16. V_RESULT NUMBER(9,2);
17. BEGIN
18. V_RESULT := &main_var ** &exponent ;
19. -- sau
POWER(&main_var,&exponent);
20. INSERT INTO messages(numcol1) VALUES ( V_RESULT
) ;
21. END;
22.
Sau o solutie alternativa folosind SQL*Plus :
23.
24. BIND VARIABILES .............
25. VARIABILE V_RESULT NUMBER
26. BEGIN
27. :V_RESULT := &main_var ** &exponent;
28. END;
29. PRINT V_RESULT
CAPITOLUL 21
INTERACTIUNEA CU ORACLE
In acest unit se va trata modalitatea de access la baza de date si de controlarea
tranzactiilor, prin instructiuni SQL in PL/SQL. De asemenea veti vedea cum erorile
cauzate de SQL pot fi tratate de catre rutinele de tratare a exceptiilor.
Oricum, cind vrem sa extragem informatii din baza de date, sau sa facem
modificari atunci trebuie sa folosim SQL. PL/SQL suporta toate facilitatile DML
si toate comenzile de control al tranzactiilor din SQL. Si, bineinteles,
instructiunea SELECT poate fi folosita pentru a atribui variabilelor valori din
liniile in tabele.
DECLARE
empno NUMBER(4) := 7788;
BEGIN
UPDATE emp SET sal = 9000;
WHERE empno = empno;
-- unde coloana este egala cu ea insasi
......
END;
In exemplul anterior fiecare linie din tabela 'emp' trebuie reactualizata. Fiecare
adresare in instructiunea UPDATE catre 'empno' este tratata ca nume de coloana.
De aceea, alegeti nume de variabile PL/SQL care nu intra in conflict cu numele
coloanelor din tabela pe care doriti sa o folositi.
INSERT
UPDATE
DELETE
[LOCK TABLE]
Exemple:
DECLARE
v_empno NUMBER(4) := 7788 ;
BEGIN
UPDATE emp SET sal = 9000 ;
WHERE empno = v_empno ;
...
END;
Exemplu:
DECLARE
v_empno NUMBER (4) := 7788;
BEGIN
UPDATE emp SET val = 9000;
WHERE empno = v_empno;
...
END;
Exemplul de mai sus tinteste liniile pentru UPDATE care au valoarea 'empno' de
7788. Daca zero sau mai multe linii satisfac conditia, comanda este inca incheiata
cu succes.
Ori de cite ori sunt executate comenzi SQL, o zona de memorie este deschisa in
care comanda poate fi interpretata si executata. Un cursor este un identificator
pentru aceasta zona.
Comenzile SQL ce fac parte din partea executabila a unui bloc sunt executate in
'cursorul implicit' care are identificatorul 'SQL'. Acest cursor este gestionat
automat pentru utilizatori de catre PL/SQL.
Exemplu:
DECLARE
rows_deleted NUMBER;
BEGIN
DELETE FROM dept WHERE deptno = 50;
rows_deleted := SQL%ROWCOUNT ;
Controlul Tranzactiilor
COMMIT [ WORK ]
ROLLBACK [TO savepoint]
SAVEPOINT
SET TRANSACTION
BEGIN
...
SAVEPOINT ok_so_far;
...
END;
ROLLBACK TO ok_so_far;
Exemplul urmator "rools back" toate toate tranzactiile, incluzind orice modificare
facute in exteriorul blocului, faca functia UPDATE nu gaseste nici o linie. Altfel,
se transmit toate schimbarile in tranzactie.
BEGIN
UPDATE emp SET sal = 8000 WHERE job = 'CAPTAIN' ;
IF SQL%NOTFOUND
THEN ROLLBACK;
ELSE COMMIT;
END IF;
END;
PL/SQL trateaza aceste erori prin tratarea exceptiilor, care pot fi trasate in
sectiunea EXCEPTION a blocului. Dar despre aceste tratatea acestor exceptii
vom vorbi mai tirziu in cadrul acestui unit. In mod normal ar trebui folosit
SELECT pentru a obtine o singura linie. Urmatoarele clauze sunt permise:
Atributele %TYPE
identificator numetabela.coloana%TYPE
Exemplu:
DECLARE
v_deptno dept.deptno%TYPE;
v_loc dept,loc%TYPE;
BEGIN
SELECT deptno, loc
INTO v_deptno, v_loc
FROM dept ...
END;
Asa cum am vazut pe scurt mai inainte, exceptiile sunt identificatori in PL/SQL
care pot dispare in timpul executiei unui bloc pentru a termina partea principala a
actiunii. Un bloc se va termina INTOTDEAUNA cind apare o exceptie, dar se
poate specifica un mod de tratare pentru a realiza actiunea finala inainte ca blocul
sa se termine. daca exceptia este tratata, atunci exceptia nu se propaga si in afara
blocului.
Predefinite
Acestea sunt predefinite de PL/SQL si au asociate coduri specifice de eroare.
Definite de utilizator
Sunt declarate in bloc de utilizator. Acestea vor fi folosite numai daca se cere
acest lucru, dar pot fi de asemenea asociate cu coduri de eroare daca se doreste
acest lucru.
In acest unit ne vom concentra asupra exceptiilor interne predefinite. Acestea sunt
urmatoarele:
Identificatori exceptie
Daca orice tip de exceptie este generat controlul este trecut sectiunii EXCEPTION a
blocului in care exceptia apare. Daca exceptia nu e minuita aici sau daca nu exista nici o
sectiune EXCEPTION atunci blocul se termina cu o exceptie `Unhandled` care poate
avea repercursiuni in mediul de inchidere.
EXEMPLU:
BEGIN
...
END;
Sintaxa:
Exemplu:
DECLARE
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
BEGIN
FROM emp
...
EXCEPTION
END;
Notati ca, citiva identificatori exceptie pot fi definiti pentru bloc fiecare cu setul propriu
de actiuni. Totusi cind o exceptie apare numai un identificator va fi procesat inainte de a
parasi blocul.
Exemplu:
BEGIN
SAVEPOINT so_far_so_good;
EXCEPTION
during block`);
END;
SQLCODE
intoarce nr. erorii asociata cu exceptia care a aparut (in cazul lui
NO_DATA_FOUND acesta va fi codul ANSI +100).Daca e folosit un singur
identificator EXCEPTION, functia va intoarce 0.
SQLERRM
intoarce mesajul complet de eroare asociat cu exceptia (incluzind nr. erorii)
Exemplu:
DECLARE
BEGIN
...
EXCEPTION
error_message :=SUBSTR(SQLERM,1,100);
error_code :=SQLCODE;
END;
SQLERRM are un parametru optional care accepta numarul erorii a carui mesaj e
returnat.
NOTA: SQLERRM si SQLCODE nu pot fi folosite direct ca parti ale unei declaratii
INSERT; valorile lor trebuie sa fie trecute prima data unei variabile.
Totusi cind o exceptie este generata si blocul curent nu are un identificator pentru el
exceptia se propaga. Aceasta inseamna ca exceptia se reproduce ea insasi in blocuri de
inchidere succesive pina cind un identificator e gasit. Daca nici unul dintre blocuri nu
minuieste exceptia atunci o exceptie Unhandled este produsa in mediul gazda.
Aceasta saritura intre sectiunile EXCEPTION de la blocurile interne catre cele externe
produce actiunile executabile ramase in aceste blocuri sa fie trecute (actiunile intre END-
ul unui subbloc si keyword-ul EXCEPTION al blocului de inchidere nu sint procesate).
EXEMPLU:
BEGIN
...
BEGIN
...
END;
...
EXCEPTION
END;
Un avantaj al acestei comportari este ca anumite declaratii care cer minuirea propriilor
erori poate fi inclus in propriul bloc lasind minuirea exceptiilor generale blocurilor de
inchidere.
EXEMPLU:
DECLARE
e_mess CHAR(80)
BEGIN
DECLARE
v1 NUMBER(4);
BEGIN
EXCEPTION
President!');
END;
DECLARE
v1 NUMBER (4);
BEGIN
SELECT empno INTO v1 FROM emp WHERE job = 'MANAGER';
EXCEPTION
Manager');
END;
EXCEPTION
END;
Exercitii
Alterati blocul dvs. produs la Cap. 20 Ex. 2.Redefiniti variabila PL/SQL ca
NUMBER(1).Ce se intimpla daca 2 valori de intrare are valorile 4 si 2?
Scrieti un script PL/SQL care primeste la rulare un singur parammetru, unde este
furnizt un tip de slujba.
Ex. @UNI3_FILE MANAGER
Blocul PL/SQL din fisier trebuie sa SELECT-ezr rinduri din tabela EMP care are tipul
job-ului in coloana JOB. (Va referiti la parametru ca '&1'). Trimiteti un mesaj in tabela
MESSAGES, in functie de faptul ca se returneaza unul,niciunul sau mai multe rinduri.
Ex.
V_RESULT NU MBER(9.2) ;
V_MESSAGE CHAR(60);
BEGIN
EXCEPTION
VALUES (V_MESSAGE);
END;
DECLARE
JOBTYPE emp.job%TYPE;
BEGIN
COMMIT;
EXCEPTION
COMMIT;
COMMIT;
END;
Structuri de control
In acest capitol se explica structurile de control ale unui program PL/SQL. Acestea sint
expresiile conditionale, salturile si buclele.
Exemple:
var <= var2
bool_var
Instructiunea IF
Instructiunea IF are o structura similara cu echivalentul din limbajele procedurale. Ea
permite executarea unor actiuni selectiv, bazat pe indeplinirea unor conditii. Structura sa
generala este prezentata mai jos. Sintaxa:
IF conditie THEN actiuni [ ELSIF conditie THEN actiuni ]
[ ELSE actiuni ]
END IF;
unde "actiuni" pot fi una sau mai multe instructiuni PL/SQL sau SQL, fiecare terminata
cu punct-virgula. Aceste "actiuni" pot include alte instructiuni IF cu aceiasi structura,
ceea ce inseamna ca instruciunea poate contine IF, ELSE, ELSIF imbricate.
Instructiunea IF simpla
Sa incepem cu un exemplu care implica numai o conditie, fara nici una din clauzele
optionale:
IF v_ename = 'SCOTTY' THEN beam_me_up := 'YES';
COMMIT;
END IF;
Cele doua actiuni sind executate numai daca conditia este adevarata (TRUE). Daca
conditia este falsa (FALSE sau NULL) atunci cele doua instructiuni sint excluse. In
oricare din caz, executia continua cu urmatoarea instructiune din program de dupa END
IF.
Notati ca daca constructia 'END IF' nu este prezenta la sfirsitul instructiunii, atunci
PL/SQL ca cauta in instructiunile urmatoare cautind 'END IF'. Ca si in alte limbaje
procedurale aceasta poate provoca afisarea unor mesaje de eroare confuze.
Urmatorul exemplu arata cum pot fi executate instructiuni alternative prin intermediul
clauzei ELSE. Actiunile specificate prin ELSE sint executate daca conditiila este FALSE
sau NULL, dupa care programul continua cu instructiunile ce urmeaza dupa END IF.
COMMIT;
ROLLBACK;
END IF;
Oricare set de actiuni poate include instructiuni IF inlantuite pentru a executa teste
ulterioare inainte ca o actiune specifica sa fie executata. Fiecare instructiune IF inlantuita
trebuie sa fie terminata de END IF-ul corespunzator.
Exemplu:
END IF;
COMMIT;
END IF;
COMMIT;
END IF;
Adesea, actiunile de executat in clauza ELSIF pot contine doar un alt IF. In aceasta
situatie, este mult mai convenabil sa folositi clauza ELSIF, care elimina necesitatea de a
inlantui END IF la sfirsitul fiecarui set ulterior de conditii/actiuni:
status := 'NEM.'
END IF;
Datorita posibilitatii de a imbrica actiuni, clauza ELSIF poate fi utilizata recursiv, daca
doriti:
IF choise = 1 THEN actiune := 'Run Payroll' ;
END IF;
Structura:
LOOP
-- actiuni de executat in
-- cadrul ciclului
END LOOP;
-- actiuni de executat
-- in cadrul ciclului
END LOOP;
De fiecare data cind programul ajunge la constructia END LOOP, controlul este redat
expresiei LOOP corespunzatoare. Acest ciclu necontrolat va fi, bineinteles, infinit daca
nu se folosesc instructiuni de control in interiorul ciclului, care sa provoace saltul in afara
ciclului.
Instructiunea EXIT
Un ciclu poate fi terminat din interior, daca este utilizata instructiunea EXIT. EXIT
permite transferul controlului instructiunii urmatoare de dupa END LOOP, permitind
astfel incheierea imediata a ciclului.
Sintaxa:
EXIT poate fi executat fie ca o actiune dintr-un IF, sau ca o instructiune individuala in
cadrul unui ciclu. In acest caz, o clauza WHEN poate fi atasata la instructiunea IF,
permitind terminarea conditionata a ciclului.
Exemplul 1:
LOOP
counter := counter + 1;
INSERT INTO numbered_rows VALUES (counter);
...
EXIT;
END IF;
END LOOP;
Exemplul 2:
LOOP
...
...
END LOOP;
Sintaxa:
Unde 'variabila_control' este numele unei variabile intregi ale carei valori vor fi
incrementate/decrementate automat la fiecare iteratie a ciclului. Aceasta variabila este
creata de catre ciclu, si nu poate fi scrisa de nici o instructiune din cadrul ciclului. Durata
de viata se termina la terminarea ciclului.
'valoare_inferioara' si 'valoare_superioar' sint expresii intregi, care determina valorile pe
care le va lua variabila de control.
Exemplu:
FOR i IN 1 .. 2000
LOOP
preserve_i := i;
...
END LOOP;
Observati ca daca valoarea lui 'i' este necesara dupa terminarea ciclului, atunci ea trebuie
copiata intr-o variabila declarata inainte de terminarea ciclului.
LOOP
-- si valoarea 50 la ultima
END LOOP;
Sintaxa:
WHILE conditie
Conditia este evaluata la inceputul fiecarei iteratii, si ciclul este terminat cind conditia
este FALSE. Daca conditia este FALSE atunci cind ciclul incepe, atunci nici o interatie
nu se executa.
Exemplul 1:
LOOP
-- actiuni
END LOOP;
Exemplul 2:
WHILE bool_var
LOOP
-- actiuni
END LOOP;
Numele etichetei urmeaza aceleasi reguli ca si orice identificatori. O eticheta este plasata
inaintea unei instructiuni, fie pe aceasi linie, fie pe o linie separata.
Ciclurile pot fi etichetate prin plasatea unei etichete inainte de cuvintul LOOP, si dupa
END LOOP, conform:
<< outer_limits >> LOOP
-- actiuni
Daca un ciclu subordonat executa un EXIT, atunci el poate specifica care ciclu sa fie
incheiat prin specificarea etichetei.
Exemplu:
...
LOOP
...
DECLARE
var1 NUMBER;
BEGIN
DECLARE
END;
END;
Variabila var1 care a fost declarata in blocul exterior nu se "vede" in cadrul blocului
interior, deoarece acesta a declarat o variabila cu acelasi nume. Toate referirile la 'var1'
din sub-bloc vor fi deci folosite pentru variabila local declarata.
Totusi, daca blocurile sint etichetate, identificatorii pot fi referiti prefixati de numele
blocului dorit. (Observatie: blocul exterior nu trebuie neaparat etichetat). Un exemplu:
BEGIN
<> DECLARE
var1 NUMBER;
BEGIN
<> DECLARE
BEGIN
block1.var1 := block1.var + 1;
-- este incrementata
END block2;
END block1;
END;
Asa cum s-a aratat, END poate include numele blocului care trebuie terminat.
Instructiunea GOTO
Aceasta instructiune ofera salturi neconditionate la o eticheta in cadrul unui program
PL/SQL. Utilizarea instructiunii trebuie minimizata, deoarece folosirea excesiva poate
duce la programe foarte dezorganizate.
Valabilitatea unei etichete este in intregul bloc in care a fost definita. GOTO poate, deci,
transmite controlul catre puncte etichetate din blocul curent sau catre un punct etichetat
dintr-un alt bloc care contine blocul curent.
Sintaxa:
GOTO eticheta;
Unde 'eticheta' poate fi orice eticheta care marcheaza o pozitie in cadrul blocului curent
sau al altuia ce il cuprinde. GOTO nu poate transmite controlul in interiorul unui sub-
bloc.
Daca rularea UPDATE produce altceva decit un singur rind, atunci se va iesi din
ciclu.( Puteti testa atributul SQL%ROWCOUNT, asa cum este discutat in
capitolul 23).
Solutii la capitolul 22
1.
2. BEGIN
3.
4. FOR v_count IN 1..10
5.
6. LOOP
7.
8. IF v_count NOT IN (6,8) THEN
9.
10. INSERT INTO messages (numcol1) VALUES
(v_count);
11.
12. END IF;
13.
14. END LOOP;
15.
16. COMMIT;
17.
18. END;
19.
20.
21.
22. DECLARE
23.
24. v_ename emp.ename%TYPE;
25.
26. v_hiredate emp.hiredate%TYPE;
27.
28. v_sal emp.sal%TYPE;
29.
30. v_message CHAR(30);
31.
32. BEGIN
33.
34. SELECT ename, hiredate, sal
35.
36. INTO v_ename, v_hiredate, v_sal
37.
38. FROM emp
39.
40. WHERE empno = &EMPLOYEE_NO ;
41.
42.
43.
44. IF v_sal > 1200 THEN
45.
46. v_message := 'Salariu mai mare de 1200';
47.
48. ELSIF v_ename LIKE '%T%' THEN
49.
50. v_message := 'Numele contine "T"';
51.
52. ELSIF TO_CHAR(v_hiredate, 'MON') = 'DEC' THEN
53.
54. v_message := 'Decembrie';
55.
56. ELSE v_message := '** Nimic **';
57.
58. END IF;
59.
60.
61.
62. INSERT INTO messages (charcol1) values (v_message);
63.
64. END;
65.
66.
67.
68. BEGIN
69.
70. FOR v IN 1 .. 10
71.
72. LOOP
73.
74. UPDATE messages SET numcol2 = 100
75.
76. WHERE numcol1 = v;
77.
78. EXIT WHEN SQL%ROWCOUNT <> 1;
79.
80. END LOOP;
81.
82. END;
83.
84.
CAPITOLUL 23
Tipuri de date compuse
In acest capitol se arata cum se declara si utilizeaza variabile compuse in PL/SQL. In
mod normal, inregistrarile permit aceasta facilitate, permitind reprezentarea unei linii de
la o tabela sau un view.
Inregistrari in PL/SQL
CE SUNT? - O variabila care poate tine citeva valori separate - O colectie de cimpuri
adresabile CUM SUNT DECLARATE INREGISTRARILE? - utlizand %ROWTYPE se
utlizand atribute declarate Single-row structura bazata pe o tabela,sau cursor
Inregistrari in PL/SQL
O inregistrare PL/SQL este o variabila care poate contine valori separate,fiecare
adresabila individual. Partile componente ale unei inregistrari se numesc campuri, si au
nume care pot fi referentiate in atribuiri sau expresii. Campurile dintr-o inregistare pot
avea tipuri de date si marimi diferite. Aceasta inseamna ca inregistrarile sunt foarte
avaantajoase cand preluam o linie dintr-un tabel pentru procesare intr-un program
PL/SQL.
Atributul %ROWTYPE
Atributul ROWTYPE este folosit pentru declararea unei inregistrari bazata pe o colectie
de coloane in tabela de baze de date. Campurile cu inregistrarea isi vor obtine numele si
tipul datei lor de la coloanele din tabela sau view referit in declararea inregistrarii.
Cimpurile sint declarate intr-o sectiune bloc DECLARE impreuna cu celelalte tipuri de
variabile pe care le-am vazut.
Sintaxa:
identifier reference%ROWTYPE ;
Unde 'identifier' este numele ales pentru inregistrare ca un intreg, si reference este numele
unei tabele, view sau cursor pe care se bazeaza inregistrarea. Aceasta referinta trebuie sa
vie valida la momentul cind inregistrarea este declarata, adica trebuie sa existe.
Examplu:
DECLARE
emp_rec emp%ROWTYPE
BEGIN
Exemplu:
END IF;
review_date := emp_rec.hiredate +90 ;
O intreaga inregistrare poate fi asignata ca valoare unei alte inregistrari, daca tabelele
folosite pentru definirea lor se potrivesc.
EXEMPLU:
DECLARE
record1 salgrade%ROWTYPE;
record2 salgrade%ROWTYPE;
BEGIN
record2:=record1;
O intrega inregistrare NU poate fi trecuta listei VALUES al instructiunii
INSERT.Trebuie sa parcurgeti fiecare camp separat.
EXEMPLU
Illegal
record 1 salgrade%ROWTYPE;
record 2 salgrade%ROWTYPE;
BEGIN
record2:=record1;
VALUES(emp_rec.empno,emp_rec.job,emp_rec.sal.,SYSDATE);
CAPITOLUL 24
VIATA SECRETA A CURSOARELOR
Acest capitol va arata cum sa declarati si sa controlati explicit cursoarele, care va permit
sa multiplicati linii de interogare pentru a fi executate in PL/SQL. Ne vom ocupa de felul
in care liniile pot fi aduse de la cursor in interiorul unei bucle prin intermediul cursorului
prin bucla.
Ce este un Cursor?
ORACLE foloseste arii de lucru private SQL ,arii care executa declaratii SQL si sa
memoreaza informatii de procesare. Cursorul este o constructie PL/SQL ,care iti permite
sa denumeste aceste arii de lucru si care acceseaza informatia.
Exista doua tipuri de cursor:
cursor implicit
declarand PL/SQL cursor implicit penru toate declaratiile DML si penntru toate
interogarile cu un singur rand
cursor explicit
declarand cursor explicit impreuna cu alti identificatori care sunt folositi in bloc si
manipuland prin declaratii specifice si blocuri excutabile de actiune. Cursoarele
explicite sunt numai interogari si va permit multiple linii care sa proceseze
interogari.
Asa cum vedem , SELECT-uri care apar ca instructiuni separate in PL/SQL poat intoarce
o singura linie. Aceasta inseamna ca de fapt PL/SQL incearca sa extraga doua linii de la
cursorul implicit :una sa satisfaca interogarea , si a doua care sa vada daca viitoarele linii
au fost returnate .
Restul acestui capitol va va explica mult mai pe larg aceste probleme , despre cursorul
explicit.
DECLARE
numeste cursorul,si defineste structura interogarii care sa fie efectuate cu el. La
acest nivel,interogarea este parcursa(coloane,tabele etc) dar nu este executata.
OPEN
exercuta interogarea,legand orice variabila care a fost referentiata. Liniile intoarse
de interogare,numita "set-activ" sunt acum disponibile pentru extragere.
FETCH
memoreaza valorile din linia curenta in variabile.Linia curenta este linia la care
cursorul pointeaza. Fiecare FETCH produce mutarea cursorului sa indice la linia
ur - matoare in setul activ,si deci fiecare FETCH va accesa o linie diferita
returnata de interogare.
CLOSE
porneste un set de lucru de linii produse de OPENul cursorului. Este posibil sa
reOPEN (redeschideti) cursorul, stabilind astfel un set de lucru nou.
Instructiunea CURSOR
Este folosit pentru a declara un cursor explicit.Parametrii pot fi definiti pentru a permite
substitutia valorilor in interogare cand cursorul este OPEN.Variabilele pot fi deasemeni
referite in interogare ,dar trebuie sa fie declarate inaintea instructiunei CURSOR.
Sintaxa:
DECLARE
CURSOR c1 IS
Instructiunea OPEN
Este utilizata in cadrul actiunilor executabile dintr-un bloc, ai stabileste un set activ de
rinduri.
Sintaxa:
Exemplu:
OPEN c1;
Instructiunea FETCH
Este utilizata pentru a extrage rindul curent intr-o variabila PL/SQL, sau intr-o variabila
host, inclusiv cimpurile ecran din SQL*forms. Trebuie amintit ca variabilele host
necesita punct-virgula ca prefix, pentru a fi deosebite de variabilele PL/SQL.
Sintaxa:
Variabilele trebuie sa fie specificate pentru fiecare cimp selectat in cererea de cursor. O
alta posibilitate este definirea unei inregistrari pentru cursor, si transmiterea sa ca o
clauza a FETCH.
Exemplu:
Variabilele incarcate, care au fost declarate inainte de FETCH, pot fi manipulate de alte
instructiuni. FETCH-uri ulterioare vor achizitiona alte rinduri individuale din cerere. De
notat ca primul FETCH care nu obtine nimic, adica daca nu mai ramin rinduri, nu va
cauza o eroare. VAriabilele vor contine valori nule.
Instructiunea CLOSE
Inchide in mod explicit un cursor, permitind redeschiderea sa ulterioara. Aceasta
inseamna ca un set activ poate fi restabilit de mai multe ori.
Sintaxa:
CLOSE cursor-identif ;
Exemple:
1. IF c1%ISOPEN THEN
ELSE
OPEN c1;
2. LOOP
END LOOP;
Aceasta eroare va termina blocul, eventual cu o exceptia netratata. Este deci important sa
se verifice succesul fiecarui FETCH inainte de alte referiri la cursor. (fie prin alte FETCH
sau comenzi SQL)
Exemplu:
OPEN cursor_1 ;
LOOP
END LOOP;
Cursoarele si inregistrarile
Am vazut deja ca inregistrarile pot fi definite sa se potriveasca cu structura coloanelor
unei tabele. Este de asemenea posibil sa definim inregistrari bazat pe lista de coloane
selectata explicit de cursor. Aceasta este convenabil pentru prelucrarea rindurilor din
setul activ, pentru ca se poate extrage direct in inregistrare, si valorile rindului vor fi
incarcate direct in cimpurile corespunzatoare ale inregistrarii.
Exemplu:
DECLARE
CURSOR c1 IS
emp_record c1%ROWTYPE;
BEGIN
OPEN c1;
Exemplul de mai sus arata de asemenea utilizarea FOR UPDATE intr-o cerere cu cursor.
Aceasta inseamna ca rindurile intoarse de cerere sint blocate exclusiv cind instructiunea
OPEN este executata. Deoarece blocarile sint eliberate la sfirsitul unei tranzactii, nu
trebuie sa executati COMMIT intre extrageri dintr-un cursor explicit daca se foloseste
FOR UPDATE.
Exemplu:
Sa luam un exemplu comlet. In blocul de mai jos se prelucreaza fiecare rind din tabela
'dep', mutind departamentul SALES in locatia Dallas, si celelalte departamente la New
York. De asemenea se tine un contor al departamentelor plasate in fiecare locatie.
DECLARE
CURSOR c1 IS
dept_rec c1%ROWTYPE;
sales_count NUMBER:=0 ;
non_sales NUMBER := 0;
BEGIN
OPEN c1;
LOOP
THEN
CURRENT OF c1;
sales_count := sales_count + 1;
THEN
non_sales := non_sales +1 ;
END IF;
END LOOP;
CLOSE c1;
COMMIT;
END;
Cursoare cu parametrii
Parametrii permit transmiterea unor valori unui cursor cind acesta este
deschis, si utilizarea in cererile care se executa.
FROM emp
AND
job = Param2;
Cind cursorul este ulterior deschis, valorile sint transmise pt. fiecare
din parametrii in mod pozitional.
Exemplu:
DECLARE
LOOP
END LOOP;
Exemplu:
DECLARE
CURSOR c1 IS SELECT n1, n2, n3 FROM data_table;
result NUMBER;
BEGIN
END LOOP;
COMMIT;
END;
BEGIN
LOOP
END LOOP;
LOOP
END LOOP;
Expresia cererii este considerata ca o sub-expresie si este prelucrata
intr-un cursor care este intern ciclului FOR.
In afara ca este mai simplu de scris, aceasta metoda este si mult mai
eficienta.
Exemplu:
LOOP
END LOOP;
PL/SQL.
Acestia includ:
Daca toate datele de prelucrat sint stocate in variabile, atunci
folositi constructii PL/SQL ca atribuirea sau IF. Nu folositi
SELECT..FROM SYS.DUAL in mediul PL/SQL,
deoarece produce deschiderea unui cursor si transmiterea unor
cereri catre RDBMS.
Efectuati calcule in SELECT, daca este posibil.
DAca aveti de efectuat prelucrari este mult mai eficient sa le
efectuati
atunci cind SELECT-ati date, si evitati instructiuni ulterioare
care ar fi necesare.
Cursoarele explicite va permite evitarea unui FETCH ulterior.
Atunci cind un singur rind este necesar, cursoarele implicite
executa doua extrageri.
Un cursor explicit va permite sa efectuati o singura extragere.
Evitati treceri repetate prin tabele.
Prelucrarea procedurala permite un control puternic si flexibil al
rindurilor bazei de date,
dar trebuie sa tineti cont ca fiecare INSERT si UPDATE provoaca
re-scanarea tabelei; Daca prelucrati mai multe rinduri dintr-o
tabela, incercati sa o faceti intr-un singur pas.
izat:
WHILE total < 5000
LOOP
FETCH item_cursor INTO old_cost;
UPDATE items SET itemcost = itemcost *1.1
WHERE CURRENT OF item_cursor;
SELECT SUM(itemcost) INTO total FROM items;
END LOOP;
WHILE total < 5000
LOOP
FETCH item_cursor INTO old_cost;
UPDATE items SET itemcost = itemcost *1.1
WHERE CURRENT OF item_cursor;
tottal := total + old_cost *0.1;
END LOOP;
O discutie mult mai detaliata despre eficienta poate fi gasita in
cartea
Exercitii
REzultatul va fi de genul:
------------------------
...
Solutii
1.
DECLARE
ORDER BY sal
v_count NUMBER := 0 ;
totsal NUMBER (9,2) := 0;
v_sal emp.sal%TYPE;
BEGIN
OPEN cur1;
LOOP
2.
CAPITOLUL 25
MAI MULTE DESPRE EXCEPTII
Am vazut deja cum exceptiile predefinite apar si cum le manuim. Acum vom consolida
aceste caracteristici uitandu-ne peste exceptiile definite de utilizator si cum le putem
asocia cu conditii interne.
ex.:
ex.:
RAISE my_exception;
Generarea exceptiilor
Exceptiile in general apar in doua moduri:
Sintaxa :
RAISE exceptie_identificator;
Exceptia generata deliberat poate fi fie una definita de utlizator sau o exceptie interna
predefinita.
Este de dorit a genera o exceptie in conditii in care acea exceptie nu ar aparea normal .
De exemplu,sa presupunem ca o interogare particulara are nevoie sa produca o eroare
daca intoarce orice rand. In mod normal numai cand mai mult de un rand este intors apare
exceptia TOO_MANY_ROWS:
BEGIN
IF SQL%FOUND THEN
RAISE TOO_MANY_ROWS;
END_IF;
EXCEPTION
END;
SINTAXA
identifier EXCEPTION
EXEMPLU
DECLARE
credit_exceeded EXCEPTION;
BEGIN
IF stock_ordered>credit_limit THEN
RAISE credit_exceeded;
END IF
identificator EXCEPTION;
DECLARE
credit_exceeded EXCEPTION;
BEGIN
END IF;
EXCEPTION
Sintaxa:
Exemplu:
DECLARE
fetch_failed EXCEPTION;
.
BEGIN
atunci exceptia
fetch_failed
este ridicata
automat */
EXCEPTION
EXERCITII
1. Produceti un fisier SQL*Plus care accepta trei parametri (&1, &2, &3) reprezentind
numarul departamentului, numele departamentului si locatia. Blocul PL/SQL din acest
fisier trebuie sa produca o exceptie USER-DEFINED daca nr. departamentului este 33
inregistrind un mesaj adecvat in MESSAGES. Daca nu este 33 atunci numarul, numele si
locatia trebuie sa fie inregistrate ca un rind in tabelul NEWDEPT (care are aceleasi
coloane ca DEPT). Fisierul trebuie sa fie executabil in urmatorul mod:
Daca aveti timp: 2. Produceti un bloc pentru a sterge toate rindurile din tabelul
PROJECTS. Definiti o exceptie care sa prinda eroarea interna -2292 (Integrity violation),
si includeti un identificator care trimite un mesaj tabelului MESSAGES daca aceasta
exceptie apare.
SOLUTII
1.
DECLARE
dept_33 EXCEPTION;
BEGIN
IF v_deptno=33 THENRAISE dept_33;
END IF;
EXCEPTION
END;
2.
DECLARE
integ_error EXCEPTION;
EXCEPTION
END;
APPENDIXÿÿA
Pseudo-coloane SQL
CURRVAL
intoarce valoarea curenta in secventa specificata
NEXTVAL
intoarce urmatoarea valoare in secventa specificata
LEVEL
utilizat in comanda SELECT...CONNECT BY;intoarce 1 pentru nodul radacina,2
pentru nodul fiu,etc.
ROWIND
intoarce un sir hexazecimal care reprezinta adresa unui rand.
ROWNUM
intoarce un numar ce indica ordinea randului care a fost selectat din tabela.Primul
rand selectat are un ROWNUM de valoare 1,al doilea are 2,etc.
SYSDATE
intoarce data si timpul curent.
USER
intoarce numele de user al utilizatorului Oracle curent
UID
intoarce un intreg unic asignat fiecarui nume de user (exista un UID pentru fiecare
nume de user).
APPENDIXÿÿB
ADD DROP
ALL* LEVEL*
AS*
BY* NOAUDIT
GRANT*
CHAR* NOCOMPRESS
CLUSTER NOWAIT
COMMENT NUMBER
COMPRESS IDENTIFIED
CONNECT OF*
INCREMENT ONLINE
DATE INDEX OPTION*
DEFAULT* INTEGER*
PRIVILEGES TABLE*
PUBLIC* THEN*
TO*
RAW TRIGGER*
RENAME
RESOURCE UID
REVOKE* UNION*
ROW* UNIQUE*
ROWID UPDATE*
ROWNUM USER*
ROWS*
ROWLABEL VALIDATE
SELECT* VALUES*
SESSION* VARCHAR*
SET* VARCHAR2
SHARE VIEW*
SIZE
SMALLINT* WHENEVER*
START WHERE*
SUCCESSFUL WITH*
SYNONYM
SYSDATE
Cuvinte cheie
Urmatoarele cuvinte cheie au o semnificatie speciala in limbajul SQL suportat de
ORACLE RDBMS dar nu sunt cuvinte rezervate si astfel pot fi folosite ca
identificatori.Aceste cuvinte pot deveni cuvinte rezervate in viitor.
Cuvintele rezervate ANSI sunt indicate printr-un *;cuvintele cheie adaugate in versiunea
6.0 sunt indicate prin +.
EVENTS+ MINVALUE
BEGIN*+ MODULE+
FETCH*+
COBOL*+ NOCYCLE+
COMMIT*+ GO*+ NOMAXVALUE+
CONTENTS+ NOORDER+
CURSOR*+ INT*+
ONLY*+
DATABASE LANGUAGE*+
DECLARE*+ PCTUSED+
MAXLOGFILES+ PRIMARY*+
MAXTRANS+ PROCEDURE*+
READ*+ SQLCOD*+
REAL*+ SQLERROR*+
REFERENCES*+ STATEMENT+
RELEASE+ STORAGE+
RESETLOGS SWITCH+
REUSE+ SYSTEM+
ROLLBACK+
SAVEPOINT+ TABLES+
SCHEME TABLESPACE+
SECTION*+ TEMPORARY*+
SEGMENT+ TEMPORARY*+
SEQUENCE+
SHARED+ USING*+
SOME*+
SORT+ WRITE*+
SPECIFIED+ WORK*+
SQL*+
ABORT
ACCEPT
ACCESSADD
ALL
ALTER
AND
ANY
ARRAY
AS
ASC
ASSERT
ASSIGN
AT
AUTHORIZATION
AVG
BEGIN
BETWEEN
BODY
BOOLEAN
BY
CASE
CHAR
CHAR_BASE
CHECK
CLOSE
CLUSTER
CLUSTERS
COLAUTH
COLUMNS
COMMIT
COMPRESS
CONNECT
CONSTANT
COUNT
CRASH
DATA_BASE
CREATE DATABASE
CURRENT DATE
CURSOR DBA
DEBUGOFF
DEBUGON
DECLARE
DEFAULT
DEFINITION
DELAY
DELETE
DELTA
DESC
DIGITS
DISPOSE
DISTINCT
DO
Document Summary:
DROP
ELSE
ELSIF
END
ENTRY
EXCEPTION_INIT
EXCEPTION
EXISTS
EXIT
FALSE
FETCH
FOR
FORM
FROM
FUNCTION
GENERIC
GOTO
GRANT
GROUP
HAVING
IDENTIFIED
IF
IN
INDEX
INDEXES
INDICATOR
INSERT
INTERSECT
INTO
IS
LEVEL
LIKE
LIMITED
LOOP
MAX
MIN
MINUS
MOD
NEW
NOCOMPRESS
NOT
NULL
NUMBER
NUMBER_BASE
OF
ON
OPEN
OPTION
OR
ORDER
OTHERS
OUT
PACKAGE TABAUTH
PARTITION TABLE
PCTFREE TABLES
PRAGMA TASK
PRIOR TERMINATE
PRIVATE THEN
PROCEDURE TO
PUBLIC TRUE
TIPE
RAISE
RANGE UNION
RECORD UNIQUE
RELEASE UPDATE
REM USE
RENAME
RESOURCE
RETURN VALUES
REVERSE VARCHAR
REVOKE VARCHAR2
ROLLBACK VARIANCE
ROWNUM VIEW
ROWTYPE VIEWS
RUN
WHEN
SAVEPOINT WHERE
SCHEMA WHILE
SELECT WHILE
SEPARATE WITH
SET WITH
SIZE WORK
SPACE
SQL
SQLCODE XOR
SQLERRM
START
STATEMENT
STDDEV
SUBTYPE
SUM
ANEXA C
Aceasta anexa furnizeaza o vedere generala asupra principalelor dife- rente dintre Oracle
7 si Oracle versiunea 6.Diferentele sunt listate in ordinea capitolelor in care apar in acest
manual.
Capitolul 4
Oracle Versiunea 6 SQL-Functii numerice
Capitolul 6
Oracle Versiunea 6 -Formatul datelor
Pentru lucrul cu ani in orice secol altul decit al 20-lea trebuie folosita functia TO_DATE .
Capitolul 8
Oracle Versiunea 6 -Operatori
Operatorul UNION intoarce toate sirurile distincte obtinute dintr-o cerere.Aceasta a fost
marita in Oracle 7 cu operatorul UNION ALL pentru a include sirurile duplicate.
CAPITOLUL 12
Oracle 6 - Limbajul de definire a datelor si a structurilor de date
Unica constringere impusa de Oracle 6 RDBMS este NOT NULL;pentru toate celelalte
constringeri, sintaxa este acceptata si definitiile constringerilor sint stocate in dictionarul
de date, dar nu sint impuse pentru operatiile DML.
Clauza CONSTRAINT din comanda CREATE TABLE are diferite sintaxe.In Oracle 7
sintaxa este:
CHAR
Valorile acestui tip de date sint variabile siruri de carac- tere de lungime de
maxim 255 caractere.Oracle Versiunea 6, de asemenea suporta urmatoarele
variante pentru tipul de date caracter:
CHARACTER
VARCHAR
In Oracle 6 tipul de date LONG este de asemenea suportat.Acesta este similar cu CHAR,
dar poate detine valori pina la lungimi de 65,535 caractere.
CAPITOLUL 15
Oracle 6 - Blocari
Modul in care Oracle 6 foloseste blocarile depinde de daca exista sau nu TPO.
Oricum, in absenta TPO, doar un singur utilizator, la un moment dat, este capabil sa ceara
sa actualizeze o tabela din baza de date.O blocare exclusiva, ascunsa pe linii este plasata
pe tabela cind apare sau o declaratie INSERT, UPDATE sau o declaratie
DELETE.Rezultatul blocarii pe intrarea tabelei inter- zice altor utilizatori de cereri orice
modificare de date pina cind cel ce a blocat tabela nu o va debloca.Ceilalti utilizatori sint
introdusi intr-o coada de asteptare.
CAPITOLUL 16
Oracle 6 - Views (vederi)
CAPITOLUL 17
Oracle 6 - Securitatea si administrarea
Comanda GRANT este folosita pentru a crea noi utilizatori si a le da drep- turi.Cele trei
drepturi de sistem disponibile sint:
CONNECT
capacitatea de a te loga la Oracle si a accesa orice obievte asupra carora ai
drepturi.Pot fi create vederi si sinonime.
RESOURCE
capacitatea de a crea tabele si indexari.
DBA
capacitatea de a crea alti utilizatori si de a ocoli accesul protejat.
CAPITOLUL 18
Oracle 6 - Indexari unice
Indexarile unice nu sint create automat cind sint specificate constringerile de integritate
sau cheia primara.Comanda CREATE UNIQUE INDEX trebuie sa fie data explicit.
CAPITOLUL 19
Oracle 6 - Generalitati
ANEXA D
ORDINEA DE COMPARATIE
Caracterele sint comparate conform cu ordinea de comparatie a calculatorului gazda.Un
caracter este mai mare decit altul daca apare dupa el in ordinea de comparatie.
Multe calculatoare folosesc una din cele doua ordini de comparatie, numite
ASCII(American Standard Code Decimal Interchange Code).Aceste ordini de comparatie
sint prezentate mai jos.
In ASCII, cifrele de la 0 la 9 sint inaintea literlor din alfabet.In EBCDIC, opusul este
adevarat.
In continuare sint prezentate ordinele de comparatie atit pentru ASCII cit si pentru
EBCDIC.
32 blank 59 ;
33 ! 60 <
34 " 61 =
35 # 62 >
36 $ 63 ?
37 % 64 @
39 ' 91 [
40 ( 92 \
41 ) 93 ]
42 * 94 ^
43 + 95 _
44 , 96 '
45 - 97-122 a-z
46 . 123 {
47 / 124 |
58 : 126 ~
Ordinea de comparatie EBCDIC
Urmatorul tabel listeaza ordinea de comparatie EBCDIC :
64 blank 108 %
74 c 109 _
75 . 110 >
76 < 111 ?
77 ( 122 :
78 + 123 #
79 | 124 @
90 ! 126 =
91 $ 127 "
92 * 129-137 a-i
93 ) 145-153 j-r
94 ; 162-169 s-z
95 ª 193-201 A-I
96 - 209-217 j-r
97 / 226-233 S-Z
ANEXA E
HIREDATE DATE,
Cand se creaza tabela se poate specifica optional domeniul pentru coloana respectiva. In
plus, constrangerile pot fi specificate ca aplicandu-se asupra valorilor unei coloane sau
saupra intregii tabele. Restrictiile pot specifica faptul ca coloanele contin numai anumite
valori, valori unice sau nu pot fi nule. Restrictiile sunt implementate in cadrul bazei de
date.
DROP MGR;
Comanda DROP este utilizata pentu a elimina alte obiecte din baza de date.
De exemplu :
INGRES/SQL
INGRES permite ca oricare din aceste caractere speciale sa poata fi folosite singular sau
in combinatie pentru a specifica criteriul de identi ficare partiala:
ename='*'
identifica orice valoare in "ename"
ename='E*'
identifica orice valoare care incepe cu "E"
ename='*ein'
identifica orice valoare care se termina cu "ein"
ename='*[aeiou]*'
identifica orice valoare care are cel putin o vocala
ename='Br??'
identifica orice sir de 5 caractere care incepe cu "Br"
jtitle='**accountant**'
job.title='\*\*accountant\*\*'
Tipurile de date disponibile in INGRES/SQL par a fi cea mai mare di ferenta fata de
majoritatea variantelor de SQL.
7 zecimale
float8(float) real pe 8 bytes -10**78 .. 10**75 precizie
15 zecimale
#99999999999999.99
Destinatiile smallint, float, integer pot fi utilizate in locul notatiei integer2, float8,
integer4 respectiv.
( EMPNO INTEGER2,
ENAME VCHAR(10),
MGR INTEGER2,
SAL MONEY,
COMM MONEY,
DEPTNO INTEGER1);
Comanda pentru utilizarea tabelelor este aceeasi ca cea a altor producatori (instructiunea
INSERT). Instructiunea DROP poate fi utilizata pentru a elimina obiecte din baza de
date.
Vedere de ansamblu
O scurta vedere de ansamblu asupra SQL implementat in 3 RDBMS-uri -DB2, Rdbs si
Ingres.
SQL este limbajul standard pentru RDBMS-uri si toate RDBMS-urile majore suporta
cateva forme ale SQL.
DB2
Database 2 ( DB2 ) este RDBMS-ul IBM-ului pentru mediul MVS.
[AND predicat]
[OR predicat]
GROUP BY coloana(e) ]
[HAVING predicat]
[ORDER BY coloana(e)]
EXEMPLE:
1. SELECT *
2.
3. FROM EMP;
4.
5.
6. SELECT DISTINCT DEPTNO
7.
8. FROM DEPT;
9.
10.
11. SELECT DEPTNO, ENAME
12.
13. FROM EMP
14.
15. WHERE JOB = 'CLERK'
16.
17. ORDER BY JOB DESC;
18.
19.
20. SELECT EMPNO, ENAME, JOB, SAL
21.
22. FROM EMP
23.
24. WHERE ENAME LIKE 'S%';
25.
26.
27. SELECT ENAME, JOB, COMM
28.
29. FROM EMP
30.
31. WHERE COMM IS NULL;
32.
33.
34. SELECT E.EMPNO, E.ENAME, D.DNAME
35.
36. FROM EMP E, DEPT D
37.
38. WHERE E.DEPTNO = D.DEPTNO;
39.
40.
41. SELECT DEPTNO, DNAME
42.
43. FROM EMP
44.
45. WHERE NOT EXISTS
46.
47. (SELECT DEPTNO
48.
49. FROM EMP);
50.
51.
52. SELECT SUM(SAL), DEPTNO
53.
54. FROM EMP
55.
56. GROUP BY DEPTNO
57.
58. HAVING SUM(SAL) 3500;
59.
60.
Ceea ce este mai sus , este doar un specimen simplu al comenzilor SQL care pot fi scrise
folosind SQL-ul lui DB2. Un rand intins ,de alti operatori este suportat de DB2; operatori
de comparatie, operatori booleeni (AND, OR, NOT) , operatori speciali (EXISTS, IN,
BETWEEN, LIKE, IS), operatorul pe multime UNION, etc...
Operator/functie Descriere
---------------- ---------
+,-,*,/ Adunare, scadere, inmultire,
impartire.
timestamp-uri.
|| Concatenare-folosit pentru a
alatura 2
ce.
tere.
data.
caractere.
HOUR/MINUTE/SECOND Extrage portiunea de ore,
minute,se-
teti.
nula.
MAX/MIN/SUM
DB2 nu suporta bogatul set de functii care sunt posibile cu ORACLE. Vezi capitolele 4, 5
si 6.
Integer
Cuvant intreg binar, 31 biti si semn
Smallint
Jumatate de cuvant intreg binar, 15 biti si semn
Decimal (n,m)
Numar zecimal impachetat, n cifre si semn (0<N
Float(n)
Character(n)
Sir de caractere de 8 biti de lungime fixa (0<N
Varchar(n)
Lungimea variabila a celui de mai sus
Graphic(n)
Sir de caractere de 16 biti de lungime fixa (0<N
Vargraphic(n)
Lungimea variabila a celui de mai sus
Date
Data reprezentata ca o secventa de 8 cifre zecimale fara semn impachetate (yyyymmdd),
ocupand 4 octeti, valorile permise sunt in domeniul 1 Ianuarie AD pana la 31 Decembrie
9999 AD.
Time
Timpul, reprezentat ca o secventa de 6 cifre zecimale fara semn impachetate (hhmmss),
o- cupand 3 octeti, valorile permise fiind in domeniul miezul noptii pana la miezul noptii.
De exemplu : 000000 pana la 240000
Timestap
Combinatie de data si timp, reprezentata ca o secventa de 20 de cifre fara semn impache-
tate(yyyymmddhhmmssnnnnnn),ocupand 10 octeti, valorile permise fiind in domeniul
00010101000000000000 pana la 99991231240000000000
Int
pentru Integer
Decimal(n)
pentru Decimal(n,0)
Decimal
pentru Decimal(5)
Dec
pentru Decimal
Float
pentru Float(53)
Real
pentru Float(21)
Double Precision
pentru Float(53)
Character
pentru Character(1)
Char
pentru Character
Long Varchar
pentru Varchar(n)
Graphic
pentru Graphic(1)
Long Vargraphic
pentru Vargraphic(n)
Cand creati tabele, puteti specifica daca Null-urile sunt permise sau nu in acelasi mod ca
si ORACLE SQL cu o exceptie. DB2 permite declaratia NOT NULL WITH DEFAULT.
Aceasta inseamna ca o valoare nu este ceruta pentru aceasta coloana si va fi inlocuita cu o
valoare nula.
ENAME CHAR(10),
JOB CHAR(10),
MGR INTEGER,
HIREDATE DATE,
SAL DECIMAL(7,2),
COMM DECIMAL(7,2),
Comanda ALTER TABLE si comenzile DROP TABLE sunt la fel ca ale lui ORACLE.
Comanda CREATE INDEX este aceeasi deasemenea.
NOTA:
Declaratia Crate Table SQL a lui ORACLE va accepta tipuri de date din DB2 si SQL/DS,
si le converteste intern in tipuri de date ORACLE, dupa cum urmeaza:
DB2 SQL/DS
ORACLE
SMALLINT
NUMBER(38)
INTEGER
NUMBER(38)
DECIMAL(M,N)
NUMBER(M,N)
FLOAT
NUMBER
VARCHAR(N)
CHAR(N)
LONG VARCHAR
LONG
VAX Rdb/VMS
Rdb este RDBMS al lui DEC, care lucreaza in mediul VMS.
[WHERE conditie]
[AND conditie]
[OR conditie]
[GROUP BY coloana(e)]
[HAVING conditie]
[ORDER BY coloana(e)]
Exemple:
1. SELECT ENAME, SAL*1.1 FROM EMP
2. SELECT EMPNO, ENAME, JOB FROM EMP
3.
4. WHERE EMPNO = 7369;
5.
6.
7. SELECT ENAME, HIREDATE, DEPTNO FROM EMP
8.
9. WHERE JOB = "MANAGER"
10.
11. ORDER BY ENAME;
12.
13.
14. SELECT DEPTNO, JOB FROM EMP
15.
16. WHERE ENAME LIKE "% S%";
17.
18.
Dupa cum puteti vedea, sintaxa lui VAX SQL este foarte similara cu DB2 si
ORACLE SQL. Operatorul EXISTS ca si [NOT] NULL, [NOT] BETWEEN,
ALL, opera- tori booleeni, JOIN-uri, subcereri, etc sunt toate suportate.Functiile
COUNT, SUM, AVG, MIN, MAX, sunt deasemenea furnizate.
anexa F
Editare simpla :
ED nume_fisier
linie noua
/---+
\---+
HELP -----+
+-------+-------+-------+-------+
| | | | |
| | | | |
+-------+-------+-------+-------+
| | | | |
| | | | |
+-------+-------+-------+-------+
| | | | |
| | | | |
+-------+-------+-------+-------+
| | | | |
| 1 | 2 | 3 | |
| | | | |
+-------+-------+-------+ ENTER |
| | | |
| 0 | . | |
+---------------+-------+-------+ de PF1 )
Pentru a iesi : CTRL + Z impreuna
ANEXA G
Uneori este util sa avem valorile unei coloane dintr-o tabela intr-un fisier text care poate
fi rulat pentru a insera respectivele valori in tabela. De exemplu cand se distribuie sau se
instaleaza un sistem se doreste funniza rea unui fisier care sa contina informatiile de start-
up pentru o tabela. Asemenea fisier este furnizat odata cu ORACLE pentru tabelele de
demonstratie Emp, Dept si Salgrade.
Desi datele sunt existente in tabela, se poate dori existenta infor matiei in formatul
"INSERT INTO nume_tabela VALUES(,,,,);" SQL din SQL poate fi utilizat pentru a
indeplini aceasta. Urmatorul cod realizeaza blocul INSERT pentru tabela DEPT.
set pages 0
set lines 75
spool insert.sql
deptno || ',' ||
''''||dname||''''||','||
''''||loc||''''||');'
from dept;
spool off
set feed on
set head on
set pages 24
set verify on
start insert.sql
Pentru fiecare linie din tabela DEPT, codul de mai sus genereaza blocurile INSERT de
mai jos :
values (20,'RESEARCH','DALLAS');
values (30,'SALES','CHICAGO');
values (40,'OPERATIONS','BOSTON');
Poate ca ati observat numarul mare de apostrofuri din ultimul exemplu. Un set de 4
apostrofuri genereaza un singur apostrof in blocul final - RETINETI : Sirurile de
caractere trebuie incadrate de apostrofuri !
Astfel :
SQL din SQL este o tehnica ce poate fi utilizata pentru a mari tabelele cu valori stocate in
fisiere text. De asemeni pot fi folosite utilitarele IMPORT/EXPORT.
Generarea unor blocuri INSERT pentru o tabela cu multe coloane este costisitor sa
generam coloana cu coloana. In loc, putem extrage informatia din "Data Dictionary".
Intr-adevar, cand se genereaza SQL bazat pe date existente, "Data Dictionary" este locul
de start. Se poate utiliza acest dictionar pentru a furniza parametrii pentru orice bloc SQL.
Urmatorul exeplu utilizeaza infor- matia din "Data Dictionary" pentru a genera blocuri
CREATE TABLE pentru fiecare tabela a utilizatorului. Acest exemplu ilustreaza cateva
tehnici necesare pentru generarea unui SQL complex. SA NU VA INGRIJORATI CA
VA TREBUI SA UTILI- ZATI ACEST COD DE FIECARE DATA CAND DORITI SA
EXECUTATI UN BACK-UP AL TABE- LELOR DUMDEAVOASTRA ! ORACLE
FURNIZEAZA ALTE UTILITARE CARE EXECUTA ACEST LUCRU.
Crearea Tabelelor.
Este mereu o idee buna sa fiti capabili sa regenerati propriile tabele. Puteti sa lasati SQL
sa genereze blocuri CREATE TABLE pentru aceasta. Ecranul "Data Dictionary" -
user_tab_columns - contine tiate informatiile necesare.
FROM USER_TAB_COLUMNS
Introducere
PL/SQL adauga in versiunea 2 un numar de facilitati noi in limbaj, multe reflectind
imbunatatiri ale RDBMS Oracle, versiunea .7. Acesutea includ:
In plus, versiunea 2 a PL/SQL accepta toate noile functii SQL din Oracle7, si toti
operatorii SQL de comparare si setare (EXIST, UNION, etc)
Subprograme PL/SQL
In general versiunea 2 accepta doua tipuri de blocuri PL/SQL, 'blocul anonim' si
'subprogramele'.
Blocul anonim
Este un bloc fara nume. Blocurile anonime erau singurul tip de bloc in versiunea
1. Aceste blocuri sint declarate in momentul in care sint rulate, si transmise
motorului PL/SQL pentru compilare inainte de a fi rulate.
Subprogramele
Sint blocuri PL/SQL cu nume. Pot fi declarate fie ca proceduri fie ca functii. In
ultimul caz vor intoarce o valoare atunci cind sint apelate.
Cu extinderea procedurala a RDMS, subprogramele pot fi stocate in dictionare de
date, de unde pot fi apelate apoi din mai multe aplicatii cind acel cod este necesar.
(Sint diferite de functiile si procedurile din Form-urile SQL)
Tipuri scalare
Sint tipuri de date care reprezinta o singura valoare. Principalele tipuri sint cele care
corespund coloanelor din bazele de date ORACLE: NUMBER, DATE, CHAR,
VARCHAR2, RAW, ROWID. Exista totusi un numar de subtipuri pentru o definire mai
specifica a variabilelor. In PL/SQL sint permise variabilele Booleene.
NUMBER
VAlori numerice cu precizia maxima de 38 digiti. Valorile sint rotunjite la un
intreg, exceptind cazul cind este data o scala. De exemplu NUMBER(7,2)
inseamna 7 digiti, cu 2 zecimale permise. Precizia implicita este 38.
Sinonime pentru NUMBER sint: DECIMAL, FLOAT, INTEGER, REAL si
SMALLINT. Aceste alternative sint pentru infrumusetare. De exemplu
INTEGER(4) poate fi considerat mult mai descriptiv decit NUMBER(4).
BINARY_INTEGER
Este stocat ca un numar binar cu semn, este mult mai eficient pentru intregii
folositi in expresii. Pot avea valori intre -2147483648 si +2147483647.
NATURAL
Acest subtip al BinaryInteger nu permite numere negative.
positive
La fel ca NATURAL, dar nu accepta valoarea zero
CHAR
Este utilizat pentru a stoca date caracter cu lungime fixa (la fel cu coloanele
CHAR din Oracle7). Lungimea implicita este 1 caracter, maximul permis este
32767. De exemplu CHAR(20).
Nota: Cind variabile CHAR sint comparate, sint evaluate folosind blankuri pentru
umplere.
VARCHAR2
Se foloseste pentru date cu lungime variabila. Lungimea maxima este cea de la
CHAR, dar valorile VARCHAr sint comparate fara umplere cu spatii.
VARCHAR
La fel, dar semnificatia comparatiei se poate schimba intr-o versiune ulterioara.
Date Booleene
Boolean
Pentru a pastra valorile TRUE si FALSE. Rezultatul expresiilor Booleene pot fi
atribuite acestor variabile, si testate apoi in instructiuni conditionale.
Tipul DATE
DATE
Date valide, ca si coloanele ORACLE tip DATE. Domeniu inter 4712bc si
4712ad.
Tipul RAW
RAW
Pentru a stoca date binare, ca si coloanele RAW ale bazelor de date. Lungimea
maxima este 32767.
Date ROWID
ROWID
Pentru a stoca adrese ROWID in formatul international ROWID. (adica fara
conversia dinamica la date character)
De notat ca unele din tipurile de date acceptate de PL/SQL permit lungimi care sint mai
mari decit cele din coloanele corespunzatoare. VARCHAR2 si RAW, ca coloane, permit
maximum 2000 octeti. Coloanele CHAR au maximum 255. Datele caracter din PL/SQL
pot fi totusi scrise in coloane LONG ale bazelor de date daca valoarea lor este prea mare.
Poate fi rescrisa:
record-id record-type ;
Exemplu:
DECLARE
minute INTEGER(2) := 0 ,
hour INTEGER(2) := 0 ) ;
time_rec time_type;
Inregistrarile definite de utilizator si cimpurile lor pot primii valori si pot fi foosite in
expresii in acelasi fel ca si inregistrarile create cu atributul %ROWTYPE. In plus, o
inregistrare definita poate fi utilizata ca tip de date pentru parametrii formali ai unui
subprogram.
Inregistrarile pot fi imbricate. Adica, o inregistrare definita anterior poate fi tip de data a
unui cimp dintr-un alt tip de date inregistrare, producind inregistrari in inregistrari.
Tabele PL/SQL
Daca inregistrarile pot reflecta un rind unic, cu mai multe cimpuri, o tabela PL/SQL
contine o structura cu un singur cimp, dar cu rinduri multiple. O tabela PL/SQL este
bazata pe un tip de coloana, dar permite stocarea unui tabel de valori si accesarea lor
printr-o cheie primara (numarul rindului)
Sintaxa:
INDEX BY BINARY_INTEGER
Unde tipul coloanei poate fi fie un tip utilizat pentru coloane (de exemplu VARCHAR2),
sau o referire la o baza de date cu atributul %TYPE.
Exemplu:
DECLARE
TYPE ename_type IS TABLE OF CHAR(10)
INDEX BY BINARY_INTEGER;
ename_array ename_type;
Numarul de rinduri dintr-o tabela poate creste si descreste dinamic, in functie de numarul
de valori asignate. Puteti atribui mai mmulte valori de rind intr-o singura atribuire:
ename_array(4) := 'troy';
De notat ca rindurile dintr-o baza de date pot fi extrase in rindurile unei tabele PL/SQL
sau invers, dar aceasta trebuie facut pe rind, intr-un ciclu. Daca un rind dintr-o tabela este
referit intr-o variabila acesta trebuie declarat ca BINARY_INTEGER.
Exemplu:
DECLARE
i BINARY_INTEGER := 0;
BEGIN
LOOP
i:=i+1;
ename_array := rec1.ename;
END LOOP;
END;
Anexa
Acestia sunt pasii ce trebuie urmati :
35. Acum obtinem definitia completa a fiecarei coloane pentru fiecare tabla.
36.
37. EX.
38.
39.
40.
41. break on sort1 skip 1
42.
43. select table_name sort1,
44.
45. column_id sort2,
46.
47. ' ' ||
48.
49. column_name ||
50.
51. decode(data_type, 'DATE',' DATE',
52.
53. 'LONG',' LONG'
54.
55. 'CHAR',' CHAR('||data_length||')',
56.
57. 'VARCHAR','VARCHAR('||data_length
58.
59. ||')',
60.
61. 'NUMBER',
62.
63. decode(data_precision,null,' NUMBER',
64.
65. ' NUMBER('||
data_precision||','||
66.
67. data_scale||')
'),
68.
69. '*********** INVALID DATA TYPE
**************')||
70.
71. decode(nulltable ,'N',' NOT NULL',null)||','
72.
73. from user_tab_columns
74.
75. order by table_name,column_id
76.
77. /
78.
79.
80.
81. Acum sa urmarim un exemplu complet. El consta din trei SELECT-uri combinate
cu operatorul UNION. Primul genereaza comanda "CREATE TABLE" ,al doilea
defineste coloanele pentru fiecare tabela mai putin ultima intrare si ultimul
selecteaza ultima coloana . Tiparirea primei si celei de-a doua coloane ('sort1' si
'sort2') a fost eliminata folosind optiunea NOPRINT a comenzii COLUMN.
82.
83. EX.
84.
85.
86.
87. set feedback off echo off head off
88.
89. set pagesize 9999
90.
91. col sort1 noprint
92.
93. col sort2 noprint
94.
95. break on sort1 skip 1
96.
97.
98.
99. spool sqlcreates.sql
100.
101.
102.
103. select distinct table_name sort1,
104.
105. 0 sort2,
106.
107. 'CREATE TABLE '||table_name||' ('
108.
109. from user_tab_columns
110.
111. union
112.
113. select table_name sort1,
114.
115. column_id sort2,
116.
117. ' '||
118.
119. column_name||
120.
121. decode(data_type,'DATE',' DATE',
122.
123. 'LONG',' LONG',
124.
125. 'CHAR',' CHAR('||data_length||')',
126.
127. 'VARCHAR', 'VARCHAR('||
data_length||')',
128.
129. 'NUMBER',
130.
131. decode(data_precision,null,
'NUMBER',
132.
133. 'NUMBER('||
data_precision||','||
134.
135.
data_scale||') '),
136.
137. '******** INVALID DATA TYPE ********')||
138.
139. decode(nullable,'N',' NOT NULL',null)||','
140.
141. from user_tab_columns c
142.
143. where column_id <(select max(column_id)
144.
145. from user_tab_columns
146.
147. where table_name = c.table_name)
148.
149.
150.
151. union
152.
153. select table_nae sort1,
154.
155. column_id sort2,
156.
157. ' '|| column_table||
158.
159. decode(data_type,'DATE',' DATE',
160.
161. 'LONG',' LONG',
162.
163. 'CHAR',' CHAR('||data_length||')',
164.
165. 'VARCHAR', 'VARCHAR('||
data_length||')',
166.
167. 'NUMBER',
168.
169. decode(data_precision,null,
'NUMBER',
170.
171. 'NUMBER('||
data_precision||','||
172.
173.
data_scale||') '),
174.
175. '******** INVALID DATA TYPE ********')||
176.
177. decode(nullable,'N',' NOT NULL',null)||','
178.
179. /'
180.
181. from user_tab_columns c
182.
183. where column_id = (select max(column_id)
184.
185. from user_tab_columns
186.
187. where table_name = c.table_name)
188.
189. order by 1,2
190.
191. /
192.
193. spool off
194.
195. col sort1 clear
196.
197. col sort2 clear
198.
199. set head on feedback on echo on
200.
201. set pagesize 24
202.
203.
204. Acest exemplu, relativ complicat produce urmatorul fisier :
205.
206.
207.
208. CREATE TABLE DEPT (
209.
210. DEPTNO NUMBER (2,0) NOT NULL,
211.
212. DNAME CHAR (14) ,
213.
214. LOC CHAR (13) )
215.
216. /
217.
218.
219.
220. CREATE TABLE EMP (
221.
222. EMPNO NUMBER (4,0) NOT NULL,
223.
224. ENAME CHAR (10) ,
225.
226. JOB CHAR (9),
227.
228. MGR NUMBER (4,0) ,
229.
230. HIREDATE DAATE,
231.
232. SAL NUMBER (7,2),
233.
234. COMM NUMBER (7,2),
235.
236. DEPTNO NUMBER (2,0) NOT NULL)
237.
238. /
239.
240.
241.
242. CREATE TABLE SALGRADE (
243.
244. GRADE NUMBER (1,0) NOT NULL,
245.
246. LOSAL NUMBER (5,0),
247.
248. HISAL NUMBER (5,0) )
249.
250. /
251.
252.
253.
254.
255.
EX.
Contens of dynamic.SQL
select decode('&hiredate',
null,' ',
),
decode('&hiredate',
) c1
from sys.dual
set verify on
set termout on
start dynamic.sql
SQL> /
ENAME
----------
TURNER
ADAMS
start dynamic.sql
SQL> /
old 2: from emp &where_clause
ENAME
------------------
SMITH
JONES
SCOTT
ADAMS
fisierul de raport.