Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
ro/~radulescu/bd/sql7/C A P I T O L U L 1
<
INTRODUCERE IN ORACLE
Acest capitol introductiv scoate in evidenta facilitatile oferite de Oracle si de produsele sale
punandu-le in contextul instrumentelor si tehnologiilor pe care le veti invata in acest
curs.Acest capitol explica de asemenea principiile de baza ale bazelor de date relationale.
CE ESTE ORACLE?
Oracle consta dintr-un set complet de constructori de aplicatii si produse pentru
utilizatori,cautand sa asigure solutii complete in tehnologia informatiei.
Aplicatiile Oracle sunt portabile peste un numar mare de statii de lucru si sisteme de operare,
de la calculatoare personale la procesoare paralele.
Oracle este inzestrat cu un flexibil Sistem de Management al Bazelor de Date(DBMS)Serverul Oracle-pentru stocarea si managementul informatiei utilizate de aplicatii.
Ultimul server Oracle ,ORACLE 7,conduce o baza de date cu toate avantajele unei structuri
relationale,avand in plus capacitatea de a stoca si executa obiecte de tip baza de date precum
proceduri si mecanisme de siguranta.
PRODUSELE ORACLE
Instrum. CDE
==========================
|| ------------------ ||
|| | Rapoarte Oracle| ||
|| ------------------ ||
Oracle Card
|| ------------------ ||
|| | Grafice Oracle | ||
Oracle Case
|| ------------------ ||
|| ------------------ ||
SQL*Plus
|| | Forme Oracle
| ||
|| ------------------ ||
Pro*Oracle
|| ------------------ ||
|| | Cart Oracl
| ||
Text Retrieval
|| -----------------| ||
==========================
Alte produse
^
^
|
|
|
|
|
|
--------------------------------------------------------------|
|
|
|
|
ORACLE7 SERVER
|
|
|
|
|
--------------------------------------------------------------|
|
|
|
|
-----------------------------|
|
|
Hard Disk
|
|
|
------------------------------
Produsele Oracle
Printre multele dezvoltari de aplicatii si produse pentru utilizatori accesibile in familia
Oracle,exista o posibilitate comuna pentru a accesa baza de date.
Daca direct sau indirect,aceasta este realizata prin Limbajul cu Structura de
Interogare(SQL),va fi un subiect pe care noi il vom trata in acest curs.
Produsele Oracle contin:
Oracle TextRetrieval
O tehnologie care adauga capabilitati de refacere completa a textului intr-o baza de
date Oracle.
Pro*Oracle
O serie de precomilatoare care permit accesul bazelor de date Oracle la limbajele de
programare C, Cobol,Fortran,PL/1,Pascal si Ada.
Oracle Card
O interfata utilizator pentru producerea aplicatiilor cu baze de date usor de folosit ce
incorporeaza grafice si facilitati multimedia.
Oracle CASE
O familie de instrumente care ajuta la analiza , designul si generarea aplicatiilor
Oracle.
SQL*Plus
Un instrument care permite o utilizare directa si interactiva a limbajului SQL pentru a
accesa serverul Oracle,utilizand comenzi ad-hoc sau prin rularea fisierelor de
comanda.
SQL,SQL*PLUS si PL/SQL
SQL,SQL*PLUS si PL/SQL sunt facilitatile Oracle care vor fi discutate in acest curs.Este
important de inteles in fiecare caz diferentele lor,rolul si locul lor in familia Oracle.
*SQL
este limbajul utilizat pentru a accesa o baza de date relationala, inclusiv Oracle.
poate fi utilizat de fiecare instrument Oracle,cand accesul la baza de date este necesar.
*PL/SQL
este limbajul Procedural al lui Oracle pentru scrierea aplicatiilor si pentru manipularea
datelor in afara bazei de date.
poate include un subset al comenzilor SQL,cand accesul la baza de date este cerut
*SQL*Plus
In concluzie,SQL si PL/SQL sunt limbaje care sunt utilizate intr-un numar de produse
Oracle .SQL*PluS este unul din produsele pe care acestea se afla.
Noi vom discuta acum principiile de baza ale bazelor de date relationale, pentru care Oracle
este un exemplu.
ABORDAREA RELATIONALA
-------------------------------------------------|
S#
SNAME
STATUS
CITY |
|------------------------------------------------|
|
S1
SMITH
20
LONDON |
|
S2
JONES
10
PARIS
|
|
S3
BLAKE
30
PARIS
|
-------------------------------------------------PARTI
--------------------------------------------------------|
P#
PNAME
COLOUR
WEIGHT
CITY
|
|-------------------------------------------------------|
|
P1
NUT
RED
12
LONDON
|
|
P2
BOLT
GREEN
17
PARIS
|
|
P3
SCREW
BLUE
17
ROME
|
|
P4
SCREW
RED
14
LONDON
|
--------------------------------------------------------^
coloana
ORDINI
------------------| S#
P#
QTY
|
|-----------------|
| S1
P1
300
|
| S1
P2
200
|
rand--------->| S1
P3
400
|
| S2
P1
300
|
| S2
P2
400 --|----camp
| S3
P3
200
|
-------------------
Abordarea relationala
Principiile modelului relational au fost pentru prima data expuse de Dr. E. F.Codd,care in
iunie 1970 a publicat un articol numit 'Un model relational de date pentru marile banci de
date'.In acest articol Dr. Codd a propus modelul 'relational' pentru sistemele de baze de date.
Baza de date relationala este perceputa de utilizatorii sai ca o colectie de tabele
bidimensionale care sunt usor de inteles.Sunt doar patru concepte de inteles:
tabele
coloane
randuri
campuri
Modelul relational imita procesele unei ramuri a algebrei cunoscuts sub numele de 'Algebra
relationala'. Aceste procese implica:
O Relatie poate fi inteleasa ca o Tabela.Modificarea datelor este reali- zata prin operatiile
relationale aplicate asupre tabelelor.
RESTRICTIE
PROIECTIE
------------------------------------------|
|
|
|
|
|
|#########################################|
|
|
|
|
|
|
|#########################################|
|
|
|#########################################|
|
|
|
|
-------------------------------------------
------------------------------------------|
###
########
|
|
###
########
|
|
###
########
|
|
###
########
|
|
###
########
|
|
###
########
|
|
###
########
|
|
###
########
|
|
###
########
|
|
###
########
|
|
###
########
|
|
###
########
|
-------------------------------------------
Operatori relationali
Operatorii relationali sunt definiti mai jos:
Relatia Descrierea
Restrictia
este o operatie care preia si afiseaza datele din relatie.Este posibil sa se afiseze toate
randurile sau doar randurile care indeplinesc o conditie sau mai multe conditii
.Aceasta este de multe ori numita 'submultime orizontala'
Proiectia
este operatia care afiseaza anumite coloane din relatie si de aceea este numita
'submultime verticala'.
Produs
este rezultatul obtinut cand randurile a doua multimi de date sunt concatenate conform
conditiilor specificate.
Join
este rezultatul obtinut cand randurile a doua multimi de date sunt concatenate conform
conditiilor specificate.
Reuniunea
afiseaza toate randurile care apar in una ,in cealalta sau in ambele din cele doua relatii.
Intersectia
afiseaza toate randurile care apar in ambele din cele doua relatii.
Diferenta
afiseaza randurile care apar numai intr-o singura relatie (SQL utilizeaza operatorul
minus ).
PRODUS
-------------------------------------| SMITH |
| CLERK |
| SMITH | CLERK
|
| JONES | produs | MANAGER|------>| SMITH | MANAGER |
| ADAMS |
---------|
|
|
----------| JONES | CLERK
|
| JONES | MANAGER |
|
|
|
| ADAMS | CLERK
|
| ADAMS | MANAGER |
------------------JOIN
--------------------------------| CLARK | 10 |
| 10 | ACCOUNTING |
| MILLER | 10 | J | 20 | RESEARCH
|
| SMITH | 20 |-->| 30 | SALEH
|
| TURNER | 30 |
| 40 | OPERATIONHS|
---------------------------------
Limbajul utilizat pentru interogarea bazei de date este non-procedural si similar limbii
engleze.
Utilizatorul nu specifica calea de acces si nu are nevoie sa stie cum este informatia
aranjata fizic.
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
concatenarea coloanelor
sortarea rindurilor
Limbajul SQL a fost dezvoltat intr-un prototip de sistem de management a bazelor de date
relationale - System R -de IBM la mijlocul anilor 1970.In 1979, Corporatia Oracle introduce
prima implementare a SQL in varianta comerciala.
Trasaturi caracteristice SQL
date interogate
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.
Comanda + Descriere:
SELECT
este comanda cea mai utilizata ; este folosita pentru obtinerea datelor din
bazele de date
INSERT
aceste trei comenzi sunt utilizate pentru a introduce noi
UPDATE
rinduri,pentru a schimba rindurile existente si stergerea
DELETE
rindurilor nedorite din tabelele bazelor de date respective. (Ele sunt
cunoscute in ansamblu ca DML sau comenzi ale limbajului de manipulare a
datelor.)
CREATE
aceste trei comenzi sunt utilizate dinamic pentru a crea ,
ALTER
utiliza si sterge orice structura de date,de exemplu,tabele,
DROP
expuneri ,indecsi.(Ele sunt cunoscute sub numele colectiv DDL sau
comenzi ale limbajelor de definire a datelor).
GRANT
aceste doua comenzi sunt utilizate pentru a da sau a lua
REVOKE
drepturile de acces pentru bazele de date si structurile din Oracle.
N.B. Acestea sunt o parte a comenzilor SQL. Pentru o lista mai completa de
comenzi se recomanda - Manualul de Referinta a Limbajului SQL- .
Scrierea comenzilor SQL
Cand scriem comenzi SQL ,este important sa ne reamintim cateva reguli simple
pentru construirea unor declaratii valide care sunt si usor de citit si de editat:
Declaratia SELECT regaseste informatia din baza de date implementand toti operatorii din
algebra relationala .
In cele mai simple forme trebuie sa contina:
1. O clauza SELECT ,care listeaza coloanele pentru afisare astfel incat este
esentiala o Proiectie.
2. O clauza FROM care specifica tabela implicata.
Pentru a lista toate numerele departamentelor,numele angajatilor si
numarul managerilor in tabela EMP introduceti urmatoarele:
SELECT
FROM
DEPTNO
-----20
30
30
20
30
30
10
20
10
30
20
30
20
10
DEPTNO,ENAME,MGR
EMP;
ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
MGR
----7902
7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782
ENAME
------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
*
EMP;
JOB
MGR
------- ---CLERK
7902
SALESMAN 7698
SALESMAN 7698
MANAGER 7839
SALESMAN 7698
MANAGER 7839
MANAGER 7839
ANALYST 7566
PRESIDENT
SALESMAN 7698
CLERK
7788
CLERK
7698
ANALYST 7566
HIREDATE
SAL
--------- --------13-JUL-83
800.00
15-AUG-83 1,600.00
26-MAR-84 1,250.00
31-OCT-83 2,975.00
05-DEC-83 1,250.00
11-JUN-84 2,850.00
14-MAY-84 2,450.00
05-MAR-84 3,000.00
09-JUL-84 5,000.00
04-JUN-84 1,500.00
04-JUN-84 1,100.00
23-JUL-84
950.00
05-DEC-83 3,000.00
Expresii aritmetice
Alias-uri de coloane
Coloane concatenate
Literali
COMM DEPTNO
------- -----20
300.00
30
500.00
30
20
1.400.00
30
30
10
20
10
.00
30
20
30
20
Expresiile aritmetice pot contine nume de coloane ,valori numerice constante si operatori
aritmetici:
Operatori
--------+
*
/
SELECT
FROM
Descriere
--------adunare
scadere
inmultire
impartire
ENAME, SAL*12, COMM
EMP;
Daca expresia aritmetica contine mai mult decat un operator, prioritatile sunt *,/,la
inceput,apoi +,- (de la stanga la dreapta pentru operatorii de aceeasi prioritate).
In urmatorul exemplu,inmultirea (250*12) este evaluata prima;apoi valoarea salariului este
adunata la rezultatul multiplicarii(3000). Astfel pentru randul lui SMITH avem :
800+3000=3800.
SELECT ENAME,SAL + 250 * 12
FROM
EMP;
ENAME,(SAL + 250) * 12
EMP;
Aliasuri de coloana
Cand se afiseaza rezultatul unei interogari,SQL*Plus in mod normal utilizeaza
numele coloanelor selectate ca titlu.In multe cazuri acest nume poate fi criptic
sau fara inteles.
Pentru a afisa titlul de coloana ANNSAL pentru salariul anual insemnand SAL*12,utilizati un
alias de coloana:
SELECT
FROM
ENAME,SAL*12 ANNSAL,COMM
EMP;
Odata definit ,un alias poate fi utilizat de comenzile SQL care sunt tratate in capitolele 10 si
11.
Nota:
Intr-o declaratie SQL ,un alis de coloana poate fi utilizat numai in clauza SELECT.
Operatorul de concatenare
Operatorul de concatenare (||) permite coloanelor sa fie legate cu alte
coloane,expresiilor aritmetice sau valorilor constante sa creeze o expresie de
caractere.
Coloanele din cealalta parte a operatorului sunt combinate pentru a obtine o singura coloana.
Pentru a combina EMPNO si ENAME si sa se dea aliasul EMPLOYEE expresiei, introduceti:
SELECT
FROM
EMPNO||ENAME
EMP;
EMPLOYEE
EMPLOYEE
------------------------------------------------------7369SMITH
7499ALLEN
7521WARD
7566JONES
7654MARTIN
7698BLAKE
7782CLARK
7788SCOTT
7839KING
7844TURNER
7876ADAMS
7900JAMES
7902FORD
7934MILLER
Literali
Un literal este orice caracter ,expresie ,numar inclus in lista lui SELECT care nu
este un nume de coloana sau un alias de coloana.
Un literal in lista lui SELECT este reprezentat de fiecare rand returnat la iesire.Sirurile de
literali dintr-un text cu un format oarecare pot fi incluse in rezultatul interogarii si sunt tratate
ca o coloana lista selectata.
Literalii de tip data calendaristica si caracter pot fi inchisi intre ghilimele simple(');literlalii de
tip numar nu au nevoie de ghilimele simple(').
Urmatoarea declaratie contine literali selectati prin concatenare si printr-un alias de coloana:
SELECT
EMPNO||'-'||ENAME EMPLOYEE,
'WORKS IN DEPARTMENT',
DEPTNO
EMP;
FROM
EMPLOYEE
'WORKS IN DEPARTMENT'
------------------ -------------------7369-SMITH
WORKS IN DEPARTMENT
7499-ALLEN
WORKS IN DEPARTMENT
7521-WARD
WORKS IN DEPARTMENT
7566-JONES
WORKS IN DEPARTMENT
7654-MARTIN
WORKS IN DEPARTMENT
7698-BLAKE
WORKS IN DEPARTMENT
7782-CLARK
WORKS IN DEPARTMENT
7788-SCOTT
WORKS IN DEPARTMENT
7839-KING
WORKS IN DEPARTMENT
7844-TURNER
WORKS IN DEPARTMENT
7876-ADAMS
WORKS IN DEPARTMENT
7900-JAMES
WORKS IN DEPARTMENT
7902-FORD
WORKS IN DEPARTMENT
7934-MILLER
WORKS IN DEPARTMENT
DEPTNO
-----20
30
30
20
30
30
10
20
10
30
20
30
20
10
O valoare nula este o valoare care este sau incorecta,sau necunoscuta,sau inaplicabila.O
valoare nula nu este la fel ca 'zero'.Zero este un numar.Valoarea nula ocupa un octet in
reprezentarea interna.
Valoarea nula este tratata corect de catre SQL.
Daca orice valoare de coloana intr-o expresie este nula atunci rezultatul este nul.In urmatoarea
declaratie numai Salesman are un rezultat al salariului:
SELECT
FROM
ENAME
ANNUAL_SAL
--------- ---------SMITH
ALLEN
19500
WARD
15500
JONES
MARTIN
16400
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
18000
Daca dorim sa obtinem un rezultat pentru toti angajatii,este necesar sa convertim valoarea
nula la un numar . Noi folosim functia NVL pentru a converti o valoare nula la o valoare
nenula.
Folositi functia NVL pentru a converti valoarea nula de la declaratia precedenta la 0.
SELECT
FROM
ENAME
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
DEPTNO
EMP;
DEPTNO
-----20
30
30
20
30
30
10
20
10
30
20
30
20
10
Clauza DISTINCT
Pentru eliminarea valorilor duplicate din rezultat, includeti restrictia DISTINCT in
comanda SELECT.
DISTINCT
EMP;
DEPTNO
DEPTNO
-----10
20
30
Coloane multiple pot fi specificate dupa restrictia DISTINCT si restrictia DISTINCt afecteaza
toate coloanele selectate.
Pentru a afisa valorile distincte ale lui DEPTNO si JOB,introduceti:
SELECT
FROM
DEPTNO
-----10
DISTINCT DEPTNO,JOB
EMP;
JOB
--------CLERK
10
10
20
20
20
30
30
30
MANAGER
PRESIDENT
ANALYST
CLERK
MANAGER
CLERK
MANAGER
SALESMAN
Daca o folosim, clauza ORDEY BY trebuie sa fie intotdeauna ultima in declaratia SELECT.
Pentru a sorta dupa ENAME, introduceti:
SELECT
FROM
ORDER BY
ENAME,JOB,SAL*12,DEPTNO
EMP
ENAME;
ENAME
--------ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD
JOB
SAL*12 DEPTNO
------- -------- -----CLERK
13200
20
SALESMAN
19200
30
MANAGER
34200
30
MANAGER
29400
10
ANALYST
36000
20
CLERK
11400
30
MANAGER
35700
20
PRESIDENT 60000
10
SALESMAN
15000
30
CLERK
15600
10
ANALYST
36000
20
CLERK
9600
20
SALESMAN
18000
30
SALESMAN
15000
30
Pentru a inversa ordinea coloanei HIREDATE, deci datele cele mai tirzii sa fie afisate
primele,introduceti:
SELECT
FROM
ORDER BY
ENAME,JOB,HIREDATE
EMP
HIREDATE DESC;
ENAME
--------JAMES
KING
BLAKE
TURNER
ADAMS
CLARK
WARD
SCOTT
MARTIN
FORD
MILLER
JONES
ALLEN
SMITH
JOB
--------CLERK
PRESIDENT
MANAGER
SALESMAN
CLERK
MANAGER
SALESMAN
ANALYST
SALESMAN
ANALYST
CLERK
MANAGER
SALESMAN
CLERK
HIREDATE
--------23-JUL-84
09-JUL-84
11-JUN-84
04-JUN-84
04-JUN-84
14-MAY-84
26-MAR-84
05-MAR-84
05-DEC-83
05-DEC-83
21-NOV-83
31-OCT-83
15-AUG-83
13-JUN-83
Pentru a ordona dupa doua coloane si afisa in ordinea inversa a salariului, introduceti:
SELECT
FROM
ORDER BY
DEPTNO
-----10
10
10
20
20
20
20
20
30
DEPTNO,JOB,ENAME
EMP
DEPTNO,SAL DESC;
JOB
-----------PRESIDENT
MANAGER
CLERK
ANALYST
ANALYST
MANAGER
CLERK
CLERK
MANAGER
ENAME
------KING
CLARK
MILLER
SCOTT
FORD
JONES
ADAMS
SMITH
BLAKE
30
30
30
30
30
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK
ALLEN
TURNER
WARD
MARTIN
JAMES
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
Clauza WHERE corespunde operatorului 'Restrictie' din algebra relationala.
coloane
tabela
anumite conditii sunt intilnite
Operatorii de comparatie sunt utilizati in clauza WHERE si pot fi impartiti in doua categorii:
logici si SQL.
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.
Pentru a afisa numele,numerele,ocupatia si departamentele tuturor functionarilor, introduceti:
SELECT
FROM
WHERE
ENAME
EMPNO
--------- ----SMITH
7369
ADAMS
7876
JAMES
7900
MILLER
7934
JOB
DEPTNO
------- -----CLERK
20
CLERK
20
CLERK
30
CLERK
10
DNAME, DEPTNO
DEPT
DEPTNO >20;
DEPTNO
-----30
40
De exemplu ,presupunem ca dorim sa obtinem acei angajati al caror comision est mai mare
decat salariul lor:
SELECT
FROM
WHERE
ENAME
-----MARTIN
SAL
-------1,250.00
COMM
-------1,400.00
Operatori SQL
Sint patru operatori SQL care opereaza pe toate tipuril de date:
Operatori SQL
Operator
-------BETWEEN..AND...
IN(list)
LIKE
IS NULL
Semnificatie
-----------intre doua valori(inclusiv)
compara cu o lista de valori
compara cu un model de tip caracter
est o valoare nula
Operatorul BETWEEN
Realizeaza teste pentru valori intre,si inclusiv,o valoare minima si o valoare
maxima.
Presupunind ca dorim sa vedem angajatii ai caror salariu este intre 1000 si 2000:
SELECT
FROM
WHERE
ENAME,SAL
EMP
SAL BETWEEN 1000 AND 2000;
ENAME
SAL
------- ---------ALLEN
1,600.00
WARD
1,250.00
MARTIN
1,250.00
TURNER
1,500.00
ADAMS
1,100.00
MILLER
1,300.00
De notat ca valorile specificate sunt inclusive si ca limita minima trebuie specificata prima.
Operatorul IN
Testeaza valorile dintr-o lista specificata.
Presupunem ca dorim sa gasim angajatii care au unul din cele trei numere de marca(MGR):
SELECT
FROM
WHERE
EMPNO
----7369
7788
7876
7902
ENAME
----SMITH
SCOTT
ADAMS
FORD
SAL
MGR
--------- ----800.00 7902
3,000.00 7566
1,100.00 7788
3,000.00 7566
Reprezentare
-----------orice secventa de zero sau mai multe caractere
un singur caracter oarecare
ENAME
EMP
ENAME LIKE 'S%';
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
FROM
WHERE
ENAME
EMP
ENAME LIKE '____';
ENAME
----WARD
KING
FORD
ENAME,MGR
EMP
MGR IS NULL;
ENAME
-----KING
MGR
----
Negarea expresiilor
Urmatorii operatori fac teste de negatie:
Operator
--------!=
^=
<>
NOT NUMECOL=
NOT NUMECOL>
Descriere
---------diferit de(VAX,UNIX,PC)
diferit de(IBM)
diferit de(toate o/s)
diferit de
mai mic sau egal
Operatori SQL
Operator
-------NOT BETWEEN
NOT IN
NOT LIKE
IS NOT NULL
Descriere
--------nu se afla intre doua valori date
nu se afla intr-o lista data de valori
diferit de sirul
nu este o valoare nula
ENAME,SAL
EMP
SAL NOT BETWEEN 1000 AND 2000;
ENAME
--------SMITH
JONES
BLAKE
CLARK
SCOTT
KING
JAMES
FORD
SAL
-------800.00
2,975.00
2,850.00
2,450.00
3,000.00
5,000.00
950.00
3,000.00
ENAME,JOB
EMP
JOB NOT LIKE 'M%';
JOB
-------CLERK
SALESMAN
SALESMAN
SALESMAN
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
MILLER
CLERK
ENAME,MGR
EMP
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:
Daca o valoare NULL este utilizata intr-o comparatie ,atunci operatorul de comparatie
trebuie sa fie IS sau IS NOT NULL. Daca acesti operatori nu sunt uti lizati si valoarea
NULL este comparata,atunci rezultatul este intotdeauna FALSE
De exemplu, COMM!=NULL este intotdeauna falsa.Rezultatul este fals deoarece o
valoare NULL poate sa nu fie egala sau diferita cu orice alta valoare alta decat NULL.
De notat ca o astfel de eroare nu este semnalata,rezultatul fiind intotdea- una fals.
Interogarea datelor cu conditii multiple
Operatorii AND sau OR pot fi utilizati pentru a compune expresii logice.
Predicatul AND este adevarat numai daca ambele conditii sunt 'adevarate'; predicatul OR este
adevarat daca cel putin una din conditii este 'adevarata'.
In urmatoarele doua exemple,conditiile sunt aceleasi,dar predicatele difera Priviti cum
rezultatul este dramatic modificat.
Pentru a gasi toti functionarii care castiga intre
1000 si 2000,introduceti:
SELECT
FROM
WHERE
AND
EMPNO
ENAME
EMPNO,ENAME,JOB,SAL
EMP
SAL BETWEEN 1000 AND 2000
JOB = 'CLERK';
JOB
SAL
---7876
7934
------- -------ADAMS
CLERK
MILLER
CLERK
-------1,100.00
1,300.00
EMPNO,ENAME,JOB,SAL
EMP
SAL BETWEEN 1000 AND 2000
JOB = 'CLERK';
ENAME
-------SMITH
ALLEN
WARD
MARTIN
TURNER
ADAMS
JAMES
MILLER
JOB
------CLERK
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK
CLERK
CLERK
SAL
-------800.00
1,600.00
1,250.00
1,250.00
1,500.00
1,100.00
950.00
1,300.00
Puteti combina AND sau OR in acceasi expresie logica. Cand AND sau OR apar in aceeasi
clauza WHERE, toti operatorii AND sunt evaluati mai intai si apoi toti operatorii OR. Vom
spune ca operatorii AND au o precedenta mai mare decat OR.
Deoarece AND are o precedenta mai mare decat OR urmatoarea declaratie SQL intoarce toti
managerii cu salarii peste 1500$ si toti vanzatorii.
SELECT
FROM
WHERE
AND
OR
EMPNO
----7499
7521
7566
7654
7698
7782
7844
EMPNO,ENAME,JOB,SAL,DEPTNO
EMP
SAL> 1500
JOB = 'MANAGER'
JOB = 'SALESMAN';
ENAME
------ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
TURNER
JOB
-------SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
SALESMAN
SAL DEPTNO
-------- -----1,600.00
30
1,250.00
30
2,975.00
20
1,250.00
30
2,850.00
30
2,450.00
10
1,500.00
30
EMPNO,ENAME,JOB,SAL,DEPTNO
EMP
SAL >1500
(JOB = 'MANAGER'
JOB = 'SALESMAN');
7698
7782
BLAKE
CLARK
MANAGER
MANAGER
2,850.00
2,450.00
30
10
Parantezele specifica ordinea in care operatorii vor fi evaluati. In al doilea exemplu operatorul
OR este evaluat inaintea operatorului AND.
TIPURI DE DATE CARACTER SI CONDITII
ENAME
(VARCHAR2)
___________
|
|
| SCOTT V V|
|
___|
| SCOTT|____
|
|
| MILLER
|
|
|
~~~~ ~~ ~~~
ENAME
(CHAR)
-----------|
|
| SCOTT V V|
|
....|
| SCOTT|V V|
|
|. |
| MILLER| V|
~~~~ ~~~~ ~~
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
SELECT
FROM
WHERE
ORDER BY
SELECT
selecteaza cel putin o coloana
Alias
poate fi folosit pentru coloanele din lista selectata
*
desemneza toate coloanele
DISTINCT
poate fi utilizat pentru eliminarea duplicatelor
FROM Tabela
desemneaza tabela din care provin coloanele
WHERE
restrictioneaza cererea la randurile care indeplinesc o conditie.Poate
contine valori de coloane,expresii si literali
AND/OR
poate fi utilizat intr-o clauza WHERE pentru a construi conditii mai
complexe. AND are prioritate peste OR.
()
pot fi utilizate pentru a forta prioritatea
ORDER BY
intotdeauna apare la sfarsit .Specifica ordinea de sortare.Una sau mai
multe coloane pot fi specificate aici.
ASC
ordinea ascendenta este ordinea de sortar ( implicita) si nu trebuie
specificat.
DESC
inverseaza ordinea de sortare de default si trebuie specificat dupa un
nume de coloana.
Clauzele pot fi introduse pe linii separate in buffer si tabelarea este utilizata pentru claritate si
in editare.
Logarea la SQL*Plus
Aceasta sectiune explica cum sa ne logam la SQL*Plus si liniile de iesire ale
tipurilor de comenzi ce pot rezulta in cadrul sau.
SQL*Plus
SQL*Plus este un program scris de Corporatia Oracle,ce produce un mediu pentru comenzile
SQL ce pot fi tastate direct sau rulate dintr-un fisier de comanda.In plus ,comenzile SQL pot fi
derivate.Ele sunt folosite pentru:
formatarea rezultatelor
setarea optiunilor
Odata ce v-ati logat la sistemul vostru de operare,sunt 3 moduri pentru a va loga la SQL*Plus:
1. SQLPLUS
o
2. SQLPLUS username
o
3. SQLPLUS username/password
o
Comanda
Abrevierea
ROL
---------------------------------------------------------------------APPEND text
A text
adauga 'text' la sfarsitul liniei curente.
CHANGE
C/old/new
schimba vechiul text cu noul text in linia
curenta.
CHANGE
C/text/
sterge 'text'-ul din linia curenta
CLEAR BUFFER
CL BUFF
sterge toate liniile din buferul SQL.
DEL
sterge linia curenta.
INPUT
I
insereaza un numar nedefinit de linii.
INPUT
I text
insereaza o linie constituita din 'text'ul
LIST
LIST n
LIST m, n
RUN
L
Ln
L m n
R
din
in
respectiv
listeaza toate liniile din buferul SQL.
listeaza o linie (specificata de n)
listeaza un numar de linii(de la m la n).
afiseaza si executa comanda SQL curenta
buffer.
executa
comanda
SQL care
este curenta
bufer.
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.
2.
EMPNO
----7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
LOSAL
----700
1201
1401
2001
3001
HISAL
----1200
1400
2000
3000
9999
JOB
------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
MGR
---7902
7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782
HIREDATE
-------13-JUN-83
15-AUG-83
26-MAR-84
31-OCT-83
05-DEC-83
11-JUL-84
14-MAY-84
05-MAR-84
09-JUL-84
04-JUN-84
04-JUN-84
23-JUL-84
05-DEC-83
21-NOV-83
14 inregistrari selectate.
SAL
COMM DEPTNO
-------- ------- -----800.00
20
1,600.00
300.00
30
1,250.00
500.00
30
2,975.00
20
1,250.00 1,400.00
30
2,850.00
30
2,450.00
10
3,000.00
20
5,000.00
10
1,500.00
.00
30
1,100.00
20
950.00
30
3,000.00
20
1,300.00
10
3.
ENAME DEPTNO
----- -----ALLEN
30
WARD
30
MARTIN
30
TURNER
30
ADAMS
20
MILLER
10
SAL
-------1,600.00
1,250.00
1,250.00
1,500.00
1,100.00
1,300.00
6 inregistrari selectate.
DNAME
---------ACCOUNTING
OPERATIONS
RESEARCH
SALES
JOB
--------ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN
6.
EMPNO
----7876
7782
7902
7566
7839
7934
7788
7369
ENAME
----ADAMS
CLARK
FORD
JONES
KING
MILLER
SCOTT
SMITH
JOB
----CLERK
MANAGER
ANALYST
MANAGER
PRESIDENT
CLERK
ANALYST
CLERK
MGR
---7788
7839
7566
7839
HIREDATE
--------04-JUN-84
14-MAY-84
05-DEC-83
31-OCT-83
09-JUL-84
7782 21-NOV-83
7566 05-MAR-84
7902 13-JUN-83
SAL
-------1,100.00
2,450.00
3,000.00
2,975.00
5,000.00
1,300.00
3,000.00
800.00
COMM DEPTNO
---- -----20
10
20
20
10
10
20
20
8 inregistrari selectate.
7.Listati numele si ocupatiile tuturor functionarilor
in departamentul 20.
ENAME
-----SMITH
ADAMS
8.
JOB
----CLERK
CLERK
ENAME
-----SMITH
ALLEN
MILLER
9.
ENAME
-----SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
TURNER
ADAMS
JAMES
FORD
MILLER
JOB
-------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
SALESMAN
CLERK
CLERK
ANALYST
CLERK
SAY
-------800.00
1,600.00
1,250.00
2,975.00
1,250.00
2,850.00
2,450.00
3,000.00
1,500.00
1,100.00
950.00
3,000.00
1,300.00
13 inregistrari selectate.
10.
ENAME
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.
11.
ENAME
------SMITH
ALLEN
JONES
MARTIN
FORD
MILLER
DEPTNO
-----20
30
20
30
20
10
HIREDATE
--------13-JUN-83
15-AUG-83
31-OCT-83
05-DEC-83
05-DEC-83
21-NOV-830
6 inregistrari selectate.
ordonata
multi
celor
ANNUAL_SAL
COMM
---------- -------19200
300.00
18000
.00
15000
500.00
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;
3.
SELECT
FROM
WHERE
4.
SELECT
FROM
ORDER BY
DEPTNO, DNAME
DEPT
DNAME;
5.
SELECT
FROM
DISTINCT JOB
EMP;
6.
SELECT
FROM
WHERE
ORDER BY
*
EMP
DEPTNO IN (10,20)
ENAME;
7.
SELECT
FROM
WHERE
AND
ENAME,JOB
EMP
JOB = 'CLERK'
DEPTNO = 20;
8.
SELECT
FROM
WHERE
OR
ENAME
EMP
ENAME LIKE '%TH%'
ENAME LIKE '%LL%';
9.
SELECT
FROM
WHERE
10.
SELECT
FROM
11.
SELECT
FROM
WHERE
12.
SELECT
FROM
WHERE
AND JOB
ORDER BY
13.
SELECT
ENAME||
' HAS HELD THE POSITION OF '||
JOB||
' IN DEPT '||
DEPTNO||
' SINCE '||
HIREDATE "Who, what and when"
EMP;
FROM
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
SELECT
FROM
WHERE
EMPNO,ENAME,SAL
EMP
DEPTNO = &DEPARTAMENT_NUMBER;
10
ENAME
SAL
--------- ----------CLARK
2,450.00
KING
5,000.00
MILLER
1,300.00
SELECT
FROM
WHERE
ENAME,DEPTNO,SAL*12
EMP
JOB = ' <JOB_TITLE';
DEPTNO
SAL*12
------ -------20
35700
30
34200
10
29400
Cat timp variabila este variabila 'nedefinita' ,valoarea va fi ceruta de fiecare data cand
declaratia este executata.
Este posibil sa fie cerut numele unei coloane sau chiar numele unei tabele in timpul executiei.
In urmatorul exemplu vi se cere o expresie aritmetica:
SELECT
FROM
DEPTNO, <ARITHMETIC_EXPRESION
EMP;
SAL/12
------66.6667
133.333
104.167
247.917
104.167
237.5
204.167
250
416.667
125
91.6667
79.1667
250
108.333
SELECT
FROM
WHERE
ENAME,DEPTNO,JOB
EMP
DEPTNO = &&DEPTNO_PLEASE;
DEPTNO JOB
------ --------
CLARK
KING
MILLER
10 MANAGER
10 PRESIDENT
10 CLERK
Puteti folosi comanda SQL*Plus DEFINE pentru a determina daca variabila este deja
definita.Daca variabila este deja definita se afiseaza valoarea asignata.
SQL> DEFINE
DEFINE DEPTNO_PLEASE = "10" (CHAR)
SELECT
WHERE
* FROM
&CONDITION
SALGRADE
&THE_REST;
Comanda DEFINE
SQL> DEFINE
SQL>SELECT
SQL>FROM
SQL>ORDER BY
REM ='SAL*12+NVL(COMM,0)'
ENAME, JOB, <REM
EMP
<REM;
SQL >undefine
REM
ENAME
JOB
SAL*12+NUL(COMM,0)
-----------------------------------------------SMITH
CLERK
9600
JAMES
CLERK
11400
ADAMS
CLERK
13200
WARD
SALESMAN
15500
MILLER
CLERK
15600
MARTIN
SALESMAN
16400
TURNER
SALESMAN
18000
ALLEN
SALESMAN
19500
CLARK
MANAGER
29400
BLAKE
MANAGER
34200
JONES
MANAGER
35700
SCOTT
ANALYST
36000
FORD
ANALYST
36000
KING
PRESIDENT
60000
'' de la expresii sunt optionale , daca expresia nu contine spatii. Ghilimelele pot
fi deasemenea folosite si sunt optionale dar folositoare daca expresia contine
blancuri sau apostrofi.
Pornirea unui fisier cu comenzi care contine substitutii de variabile
Presupunind ca doriti o serie de rapoarte care sa listeze angajatii cu functii
diferite - de exemplu , una pentru SALESMEN , una pentru CLERKS, una
pentru MANAGERS si tot asa.Cunoasteti cum sa folositi substitutia de
variabile pentru a obtine aceste rapoarte dintr-o singura constructie SELECT.
Cu toate acestea , exista o tehnica alternativa pe care s-o folositi si anume sa
scrieti constructia SELECT intr-un fisier si apoi folosind comanda START sa-l
executati.
Aceasta tehnica impune folosirea unor substitutii speciale de variabile. Exista
9 asemenea variabile si ele au intregii de la 1 la 9 ca nume. Pentru folosirea
acestor variabile , puneti un '&' urmat de un intreg (1-9) in comanda
SQL.Aceste variabile pot fi folosite de ori de cite ori doriti si in orice ordine .
De fiecare data cind comanda e rulata, fiecare '&1' din comanda e inlocuit de
primul parametru dupa START fisier, fiecare '&2' e inlo- cuit de al doilea
parametru s.a.m.d.
SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE JOB = ' <1' ;
SQL>SAVE JOB1
SQL*PLUS
intoarce mesajul:
START JOB1
CLERK
ENAME
----SMITH
ADAMS
JAMES
SAL
--800
1100
950
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
[PROMPT/NOPROMPT 'text'][HIDE]
Exemple
Rezumat
Cit timp ramin variabilele definite? Pina cind le UNDEF[ine] sau le redefinim sau pina iesim
din SQL*PLUS.
Alte 2 modalitati de definire a unei variabile:
SQL>ACCEPT variabila [tip] [PROMPT text][HIDE]
SQL>COL[UMN] nume coloana /alias NEW_VALUE variabila (tratata in
capitolul 11)
ENAME
SAL*12+NUL(COMM,0)
---------------------------------JONES
35700
BLAKE
34200
SCOTT
36000
KING
60000
FORD
36000
Cap.3 Solutii
1.
SELECT
FROM
WHERE
ENAME,HIREDATE
EMP
HIREDATE BETWEEN'&FIRST_DATE'AND'&LAST_DATE';
2.
SELECT
FROM
WHERE
ENAME,JOB,SAL,MGR,DEPTNO
EMP
JOB ='&JOB';
3.
SELECT
FROM
WHERE
ENAME,&REM
EMP
&REM >30000;
CAPI T O LU L4
FUNCTII
In acest capitol, sunt introduse functiile.Functiile fac ca cererile de baza sa devina mai
puternice si sint folosite pentru manipularea valorilor.Acest capitol acopera functiile numerice
si pe caracter. Functiile de conversie si care opereaza pe tipuri de date sunt tratate in cap.5. In
final functiile de grup sunt tratate in cap.6.
INTRODUCERE
Functiile sint folosite pentru manipularea datelor.Ele accepta unul sau mai multe argumente si
intorc o valoare.Un argument este o constanta , variabila sau o referire de coloana.Formatul
pentru functie este urmatorul: function_name(arg1,arg2,...)
Functiile pot fi folosite pentru:
a calcula
CHARACTER
NUMBER
DATE
CONVERSION
GROUP
pot fi imbricate
pot fi folosite acolo unde se folosesc variabile , coloane sau expresii , de exemplu , in
constructiile :SELECT,WHERE,ORDER BY.
Explicatia notatiei:
Notatie + Semnificatie:
col
un nume de coloana dintr-o baza de date
value(valoare)
orice valoare literale(caracter/data/numar)
n
reprezinta un sir
'string'
UPPER(col/value)
forteaza caracterele alfa care sunt scrise cu litere mici , sau o combinatie de litere mici
si mari in caractere scrise cu litere mari.
In urmatorul exemplu , functia UPPER e folosita pentru a forta intrarea utilizatorului la litere
mari.
SELECT ENAME
FROM EMP
WHERE ENAME =UPPER('&ENAME');
Enter value for ename :smith
ENAME
----SMITH
INITCAP(col/value)
forteaza prima litera a fiecarui cuvint in litera mare
Pentru afisarea numelor departamentelor si locatiile , introduceti:
SELECT
FROM
INITCAP(DNAME),
DEPT;
INITCAP(LOC)
INITCAP(DNAME) INITCAP(LOC)
---------------------------Accounting
New York
Research
Dallas
Sales
Chicago
Operations
Boston
CONCAT(char 1,char2)
intoarce char1 concatenat cu char2 (Alternativa a operatorului ||)
SELECT CONCAT (ename,job) "JOB"
FROM EMP
WHERE EMPNO =7900;
JOB
----------JAMESCLERK
OPERATIONS********** OPERATIONS
ACCOUNTING********** ACCOUNTING
40..................
10..................
0
0
RESEARCH
SALES
OPERATIONS
O folosire obisnuita a lui INSTR este de a determina daca inceputul utilizatorului contine un
caracter particular sau mai multe. In exemplul anterior , de exemplu, expresia
INSTR(DNAME,'ES') e 0 pentru ACCOUNTING deoarece acesta nu contine sirul dat.
LTRIM si RTRIM sterg caracterele specificate din sir.
LTRIM (col/value,'char/s')
sterge de la stinga prima aparitie a caracterului specificat(sau o combinatie a
caracterelor specificate). Daca nu e specificat nici un caracter sterge toate blancurile
din stinga.
SELECT DNAME,LTRIM(DNAME,'A'),LTRIM(DNAME,'AS'),
LTRIM(DNAME,'ASOP')
FROM DEPT;
DNAME
LTRIM(DNAME,'A') LTRIM(DNAME,'AS') LTRIM(DNAME,'ASOP')
------------------------------------------------------------------RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
LES
LES
OPERATIONS
OPERATIONS
OPERATIONS
ERATIONS
ACCOUNTING
CCOUNTING
CCOUNTING
CCOUTING
RTRIM (col/value,'char/s')
sterge de la dreapta, aparitiile lui char (sau combinatie de caractere spe- cificate) .Daca
nu e specificat 'char/s' atunci sterge blancurile.
SELECT DNAME, RTRIM(DNAME,'G'),RTRIM(DNAME,'GHS')
RTRIM(DNAME,'N')
FROM DEPT;
DNAME
RTRIM(DNAME,'G') RTRIM(DNAME,'GHS') RTRIM(DNAME,'N')
--------------------------------------------------------------RESEARCH RESEARCH
RESEARC
RESEARCH
SALES
SALES
SALE
SALES
OPERATIONS OPERATIONS
OPERATION
OPERATIONS
ACCOUNTING ACCOUNTIN
ACCOUNTIN
ACCOUNTING
UPDATE e tratata
SOUNDEX(col/value)
intoarce un sir de caractere reprezentind pronuntia(sunetul) cuvintului pentru fiecare
coloana sau valoare literala.Aceasta functie intoarce o reprezentare fonetica a fiecarui
cuvint si ne permite sa comparam cuvinte care sunt scrise diferit, dar se
pronunta(suna) la fel.
SELECT
FROM
WHERE
ENAME, SOUNDEX(ENAME)
EMP
SOUNDEX(ENAME) = SOUNDEX('FRED');
ENAME
SOUNDEX(ENAME)
----------------------------FORD
F630
LENGTH(col/value)
intoarce numarul de caractere(sau digiti) din coloana sau din valoarea literala.
SELECT LENGTH('SQL COURSE'),LENGTH(DEPTNO),LENGTH(DNAME)
FROM DEPT;
LENGTH('SQLCOURSE') LENGTH(DEPTNO) LENGTH(DNAME)
------------------------------------------------10
2
8
10
2
5
10
2
10
10
2
10
REPLACE(col/value,string,replacement_string)
intoarce col/value cu orice aparitie a 'string-ului', inlocuita cu replacement_string.Daca 'replacement_string' e omis, toate operatiile lui 'string'sunt
sterse.Daca sunt emise si 'string' si 'replacement_string'atunci se semnaleaza eroare.
SELECT JOB , REPLACE(JOB,'SALESMAN','SALESPERSON'),
ENAME ,REPLACE(ENAME,'CO','PX')
FROM
EMP;
SALESPERSON
SALESPERSON
MANAGER
SCOTT
SPXTT
TURNER
ALLEN
CLARK
TURNER
ALLEN
CLARK
FUNCTII IMBRICATE
Functiile singulare aplicate liniilor(sirurilor) pot fi imbricate la orice adincime.Daca functiile
sunt imbricate, ele sunt evaluate din interior spre exterior.
Sa presupunem ca vreti sa aflati nr. de ori in care un caracter apare intr-un sir.Cum veti
proceda? Puteti imbrica functiile LENGHT si TRANSLATE pentru a obtine rezultatul dorit.
Urmatorul exemplu va permite sa numarati de cite ori apare S intr-un sir.
SELECT DNAME,LENGTH(DNAME),LENGTH(DNAME)
LENGTH(TRANSLATE(DNAME,'AS,'A'))
FROM DEPT;
DNAME
LENGTH(DNAME)LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A'))
-------------------------------------------------------------------------RESEARCH
8
1
SALES
5
2
OPERATIONS
10
1
ACCOUNTING
10
0
SELECT
TRANSLATE(DNAME,'AS','A')
FROM DEPT;
TRANSLATE(DNAME,'AS',A')
-----------------------REEARCH
ALE
OPERATION
ACCOUNTING
20.
------------------------------------------------------------------ACCOUTING
10
0
21.
22.
1
23.
24.
RESEARCH
SALES
OPERATIONS
10
25.
26. Rezultatul e o valoare care reprezinta nr. de operatii ale lui S in sir .
FUNCTII NUMERICE
Acestea accepta intrare numerica si intorc ca rezultat un numar. Aceasta sectiune descrie
citeva din functiile numerice. ROUND(col/value,n) rotujeste coloana , expresie sau valoare la
n zecimale. Daca n e omis nu are zecimale , daca e negativ , numarul din stinga punctului
zecimal e rotunjit.
SELECT
ROUND(45.923,1),
ROUND(45.923),
ROUND(45.323,1),
ROUND(42.323,-1),
ROUND(SAL/32,2)
FROM EMP
WHERE DEPTNO =10;
ROUND(45.923,1)ROUND(45.923)ROUND(45.323,1)Round(42.323,-1)ROUND(SAL/32,2)
-----------------------------------------------------------------------45.9
46
45.3
40
76.56
45.9
46
45.3
40
156.23
45.9
46
45.3
40
40.63
TRUNC(col/value,n)
trunchiaza
sau
daca nu
e om is , fara zecimale.Daca n e negativ , numarul din
stinga
punctului zecimal e trunchiat la zero.
SELECT
TRUNC(45.923,1),
TRUNC(45.923),
TRUNC(45.323,1),
TRUNC(42.323,-1),
TRUNC(SAL/32,2)
FROM EMP
WHERE DEPTNO= 10;
TRUNC(45.923,1)TRUNC(45.923)TRUNC(45.323,1)TRUNC(42.323,1)TRUNC(SAL/32,2)
--------------------------------------------------------------------------45.9
45
45.3
40
76.56
45.9
45
45.3
40
156.25
45.9
45
45.3
40
40.62
intreg
CEIL(SAL),CEIL(99.9),CEIL(101.76),CEIL(-11.1)
EMP
SAL BETWEEN 3000 AND 5000;
CEIL(SAL)
CEIL(99.9) CEIL(101.26) CEIL(-11.1)
------------------------------------------------3000
100
102
-11
5000
100
102
-11
3000
100
102
-11
FLOOR (col/value) gaseste cel mai mare intreg mai mic sau egal
coloana expresie sau valoare.
cu
SAL POWER(SAL,2)
POWER(SAL,3) POWER(50,5)
---------------------------------------------2450.00
6002500
14706125000 312500000
5000.00 25000000
125000000000 312500000
1300.00
1690000
2197000000 312500000
EXP(n)
SELECT
FROM
EXP(4)
-----54.59815
SQRT(col/value)
sau valorii.
atunci e
1250.00
1250.00
35.3553391
35.3553391
SIGN(col/value)
6.32455532
6.32455532
22.3606798
37.4165739
gaseste valoarea
absoluta a coloanei
sau valorii.
SELECT SAL,COMM,COMM-SAL,ABS(COMM-SAL),ABS(-35)
FROM EMP
WHERE DEPTNO =30;
SAL
COMM
COMM-SAL ABS(COMM-SAL)
ABS(-35)
------------------------------------------------------1600.00
300.00 -1300
1300
35
1250.00
500.00
-750
750
35
1250.00
1400.00
150
150
35
2850.00
35
1500.00
00
-1500
1500
35
950.00
35
MOD(value1,value2)
'value2'.
SELECT
FROM
WHERE
ORDER BY
SAL , COMM ,
EMP
DEPTNO =30
COMM;
MOD(SAL,COMM), MOD(100,40)
SAL
COMM
MOD(SAL,COMM)
MOD(100,40)
-------------------------------------------------------2,850.00
20
950.00
20
1,600.00
1,250.00
1,250.00
1,500.00
300.00
500.00
1,400.00
00
100
250
1250
1500
20
20
20
20
TEME
1. Listati pentru toti angajatii
15 % si exprimat ca un nr. de
DEPTNO
ENAME
PCTSAL
--------------------------20 SMITH
920
30 ALLEN
1840
30 WARD
1438
20 JONES
3421
30 MARTIN
1438
30 BLAKE
3278
10 CLARK
2818
20 SCOTT
3450
10 KING
5750
30 TURNER
1725
20 ADAMS
1265
30 JAMES
1093
20 FORD
3450
10 MILLER
1495
14 selectate.
2. Obtineti urmatoarea iesire:
numele si salariul
dolari.
marit cu
EMPLOYEE_AND_JOB
---------------SMITH
CLERK
ALLEN SALESMAN
WARD
SALESMAN
JONES
MANAGER
MARTIN SALESMAN
BLAKE
MANAGER
CLARK
MANAGER
SCOTT
ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS
CLERK
JAMES
CLERK
FORD
ANALYST
MILLER
CLERK
3. Obtineti urmatoarea iesire
EMPLOYEE
-------SMITH(Clerk)
ALLEN(Salesman)
WARD(Salesman)
JONES(Manager)
MARTIN(Salesman)
BLAKE(Manager)
CLARK(Manager)
SCOTT(Analyst)
KING(President)
TURNER(SAlesman)
ADAMS(Clerk)
JAMES(Clerk)
FORD(Analyst)
MILLER(Clerk)
4.
a angajatilor
cu
SOLUTII Cap.4
1. SELECT
2. SELECT
3. SELECT
4. SELECT
5. SELECT
Capitolul 5
Alte functii singulare aplicate liniilor unei baze de date
In acest capitol vom trata functiile (de tip) referitoare la date calendaristice 'DATE', functiile
de conversie si functii care accepta orice tip de data de intrare.
Functiile de tip data calendaristica
Secolul
Anul
Luna
Ziua
Ora
Minutele
Secundele
Sysdate intoarce data curenta si timpul.Puteti folosi SYSDATE la fel ca folosirea oricarui
nume de coloana. De exemplu , puteti afisa data curenta selectind SYSDATE dintr-o tabela.
Este obisnuit sa se selecteze SYSDATE dintr-o tabela 'dummy' numita DUAL.
Tabela DUAL apartine utilizatorului 'SYS' si poate fi accesata de toti utilizatorii.Contine o
singura coloana ,DUMMY si o linie cu valoarea 'x'.
Tabela DUAL e folositoare cind doriti sa obtineti o singura valoare-de exemplu , valoarea
unei constante , pseudo-coloane sau expresii care nu e derivata dintr-o tabela cu data 'user'.
Pentru a afisa date curenta:
SELECT SYSDATE
FROM SYS.DUAL;
Puteti selecta usor SYSDATE din EMP, dar 14 linii cu aceeasi SYSDATE vor fi intoarse , una
pentru fiecare linie din tabela EMP.
DUAL e preferata pentru ca e suficienta o singura linie intoarsa.
Folosirea operatorilor aritmetici
HIREDATE
HIREDATE+7
HIREDATE-7 SYSDATE-HIREDATE
------------------------------------------------------13-jun-83
20-jun-83
06-jun-83
1982.70628
11-jun-84
18-jun-84
04-jun-84
1618.70628
04-jun-84
04-jun-84
11-jun-84
11-jun-84
28-may-84
28-may-84
1625.70628
1625.70628
Scazind din SYSDATE ,HIREDATE din tabela EMP intoarce nr.de zile de la angajarea
fiecarui om.
MONTHS_BETWEEN(data1,data2)
gaseste nr. de luni intre data1 si data2. Rezultatul poate fi pozitiv sau
negativ. Daca data1 e mai tarzie decat data2 , REZULTATUL E POZITIV,
daca data2 este mai tirzie decit data1 , REZULTATUL E NEGATIV.
SELECT
FROM
WHERE
MONTHS_BETWEEN (SYSDATE,HIREDATE),
MONTHS_BETWEEN('01-jan-84','05-nov-88')
EMP
MONTHS_BETWEEN(SYSDATE,HIREDATE)>59;
MONTHS_BETWEEN(SYSDATE,HIREDATE) MONTHS_BETWEEN('01-jan-84','05-nov-
88')
----------------------------------------------------------------------65.0873622
-58.129032
63
-58.129032
60.5067171
-58.129032
59.3454267
-58.129032
59.3454267
-58.129032
59.8292977
-58.129032
6 records selected
NEXT_DAY(data1,,char)
LAST_DAY(data1)
--------------------------------------------------------------------------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(data1,'char')
FROM
SYS.DUAL;
SYSDATE
TRUNC(SYSDATE,'MONTH') TRUNC(SYSDATE,'YEAR')
----------------------------------------------------------o4-dec-89 01-dec-89
01-jan-89
TRUNC e folositor cind vreti sa stergeti timpul dintr-o data. Timpul component al zilei este
sters implicit.
Functii de conversie
Observati ca:
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 intrun format specificat.
Pentru afisarea timpului dintr-o zi:
SELECT TO_CHAR (SYSDATE.'HH:MI:SS')
FROM SYS.DUAL;
TO_CHAR(SYSDATE,'HH:MI:SS')
--------------------------08:16:24
Functia TO_CHAR este de asemenea folosita pentru conversia unei valori de tip
data numerica la o valoare de tip data caracter.
TO_CHAR(numar,'number picture')
SELECT TO_CHAR (SAL,'$9,999')
FROM EMP;
TO_CHAR(SAL,'$9,999')
-------------------$1,000
$1,600
$1,250
$2,975
Observati ca formatul este optional.Daca'date picture' e omis, data este convertita la o valoare
de tip caracter in format Oracle, implicit DD-MON-YY.
Daca 'number picture ' nu e specificat, numarul e convertit intr-o valoare de tip caracter.
Observati de asemenea ca formatele nu afecteaza actuala reprezentare interna a valorii
coloanei.Ele afecteaza doar cum valoarea coloanei este afisata cind e regasita cu o constructie
SELECT.
Formate pentru date calendaristice
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.
? Codurile sunt case sensitive si vor afecta afisarea datelor calendaristice astfel:
DAY
Day
Month
ddth
ddTh
MONDAY
Monday
July
14th
14th
Formatul de date RR
Daca-l folositi in locul lui YY, secolul variaza in acord cu anul specificat cu 2 cifre si ultimii 2
digiti ai anului curent.
Tabloul de mai jos rezuma comportamentul elementului RR.
FORMATUL DE DATE RR(ORACLE 7)
Pentru anii in alte secole
---------------------------------------------------------------------|
|
|
Daca cei 2 digiti ai anului sint
|
| Daca cei
--------------------------------------------------------| 2 digiti |
|
0-49
50-99
|
| ai anului
--------------------------------------------------------| curent
|
|
|
| sunt
|
0
|
data intoarsa este
data intoarsa este
|
|
|
|
in secolul crt.
in secolul anterior |
|
|
49
|
celui crt.
|
|
| ---------------------------------------------------------|
|
50
|
data intoarsa este
data intoarsa este in|
|
|
|
in secolul dupa
secolul crt.
|
|
|
99
|
cel crt.
|
------------------------------------------------------------------------
EXEMPLE:
-------------------------------------------------------------|
Anul crt.
Valoarea formatata
Anul interpretat
|
|
(DD_ MON_RR)
|
-------------------------------------------------------------|
1994
27-oct-95
1995
|
-------------------------------------------------------------|
1994
27-oct-17
2017
|
-------------------------------------------------------------|
2001
27-oct-95
1995
|
-------------------------------------------------------------|
2001
27-oct-17
2017
|
--------------------------------------------------------------
afis.zerourile de
la inceput
099999
001234
semnul dolar
$999999
$1234
punct zecimal in
999999.99
1234.00
pozitie specificata
MI
999,999
1,234
semnele minus la
dreapta(valori
negative)
999999MI
1234-
PR
paranteze pentru
numere negative
999999PR
<1234>
EEEE
notatie stiintifica
(formatul trebuie
sa aiba 4E)
99.999EEEE
inmultire cu 10
(n=numar de 9 dupa V)
9999V99
1.234E+03
123400
Observatie:
Formatele numerice afisate mai jos in tablou pot fi folosite cu comanda
SQL*PLUSCOLUMN(vezi cap.10).
TO_NUMBER
TO_DATE
Pentru a afisa toti angajatii cu data angajarii 4 iulie 1984, puteti folosi functia TO_DATE:
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:
'3','8%',
'5%')BONUS FROM SALGRADE;
GRADE
BONUS
--------------1
15%
2
10%
3
8%
4
5%
5
5%
Acest exemplu ilustreaza ca valoarea intoarsa e fortata la tipul celui de al treilea argument, la
folosirea functiei DECODE. Il sfatuim pe utilizator sa specifice ordinea in care informatia e
afisata introducind o valoare la fiecare rulare:
select * from emp
order by decode (&orderby,
1,
sal,
2,
ename,
sal);
Enter value for orderby:2
order by decode (2,1,sal,2,ename,sal)
*
ERROR at line 2:ORA -1722: invalid number
Observati ca aceata comanda produce o eroare fiindca tipul lui 'ename'(char) difera de cel al
lui 'sal'(numar) care e al treilea argument.
In exemplul de mai jos , dorim sa introducem salariul crescut in functie de meseria fiecarui
angajat.
SELECT JOB,SAL,DECODE(JOB,'ANALYST',SAL*1.1,
'CLERK',SAL*1.15,
'MANAGER',SAL*0.95,
SAL) DECODED_SALARY FROM EMP;
JOB
SAL
DECODED_SALARY
-------------------------------CLERK
800
920
SALESMAN 1,600
1600
SALESMAN 1,250
1250
MANAGER 2,975
2826.25
SALESMAN 1,250
1250
MANAGER 2,850
2707.5
MANAGER 2,450
2327.5
ANALYST 3,000
3300
PRESIDENT5,000
5000
SALESMAN 1,500
1500
CLERK
1,100
1265
CLERK
950
1092.5
ANALYST 3,000
3300
CLERK
1,300
1495
SAL*12+NVL(COMM,0),NVL(COMM,1000),SAL*12+NVL(COMM,1000)
EMP
DEPTNO=10;
SELECT
FROM
WHERE
GREATEST(1000,2000),GREATEST(SAL,COM)
EMP
DEPTNO=30;
GREATEST(1000,2000) GREATEST(SAL,COMM)
------------------------------------------2000
1600
2000
1250
2000
1400
2000
2000
1500
2000
6 records selected.
LEAST(1000,2000),LEAST(SAL,COMM)
EMP
DEPTNO=30;
LEAST(1000,2000) LEAST(SAL,COMM)
--------------------------------1000
300
1000
500
1000
1250
1000
1000
0
1000
6 records selected.
VSIZE(col/value) - intoarce nr.de biti din reprezentarea interna ORACLE a lui col/value'.
SELECT DEPTNO,VSIZE(DEPTNO),VSIZE(HIREDATE),VSIZE(SAL),
VSIZE(ENAME)
FROM
EMP
WHERE DEPTNO=10;
Amintim ca functiile pot fi imbricate la orice nivel si functiile interioare sunt evaluate intii
mergind pina la functia cea mai exterioara.Este bine sa se tina nr. de paranteze de inceput
(deschidere) si de sfirsit(inchidere).Trebuie sa fie acelasi numar din fiecare tip de paranteze.
Functiile de mai jos sint imbricate si sint evaluate dupa cum urmeaza.
SELECT
ENAME,NVL(TO_CHAR(MGR),'UNMANAGEABLE')
FROM EMP
WHERE MGR IS NULL;
ENAME
NVL(TO_CHAR(MGR),'UNMANAGEABLE')
----------------------------------------------KING
UNMANAGEABLE
Functiile imbricate pot fi de asemenea folosite pentru a afisa date de vineri , la doua luni de
azi in formatul Day dd Month YYYY.
SELECT SYSDATE,
TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'Day dd
Month YYYY')
FROM SYS.DUAL;
SYSDATE
TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'DAYDDMONTHYYYY')
------------------------------------------------------------------------04-dec-89 Friday
09 Februarie 1990
1.
2 luni
la luna
curenta(decembrie)
2.
3.
la 2 luni
de SYSDATE
4.
5. Functia TO_CHAR converteste coloana data
6.
afisarea
in formatul
7.
1.
acest capitol, ca si
din capitolul 4.
Afisati pt.fiecare
2.
discutate in
angajat
din departamentul 20
numele si data
3.
angajarii.
4.
Fiti siguri
expresia
5.
voastra
seste
implicita
ca specificati
altfel coloana
o lungime
de 80
respectiva
de caractere
va fi
6.
7.
8.
9.
10.
11.
12.
13.
ENAME
DATE_HIRED
--------------------------SMITH
June,Thirteenth 1983
JONES
October,Thirty-First 1983
SCOTT
March,Fifth 1984
ADAMS
June,Fourth 1984
FORD
December,Fifth 1983
pierduta. Se folo-
14.
15.
16.
Afisati
pt.fiecare angajat
17.
un an
18.
ordinea
19.
un an.
20.
21.
ENAME
HIREDATE REVIEW
---------------------------
crescatoare
in
adaugat
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
SMITH
13-jun-83
ALLEN
15-aug-83
JONES
31-oct-83
MILLER
21-nov-83
MARTIN
05-dec-83
FORD
05-dec-83
SCOTT
05-mar-84
WARD
26-mar-84
CLARK
14-may-84
TURNER
04-jun-84
ADAMS
04-jun-84
BLAKE
11-jun-84
KING
09-jun-84
JAMES
23-jun-84
14 records selected
13-jun-84
15-aug-84
31-oct-84
21-nov-84
05-dec-84
05-dec-84
05-mar-85
26-mar-85
14-may-85
04-jun-85
04-jun-85
11-jun-85
09-jun-85
23-jun-85
37.
38.
39.
40.
daca acesta
41.
afiseaza
1500'.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
e mai mare
salariul
mic
ENAME
SALARY
-----------------ADAMS
Below 1500
ALLEN
1600
BLAKE
2850
CLARK
2450
FORD
3000
JAMES
Below 1500
JONES
2975
KING
5000
MARTIN
Below 1500
MILLER
Below 1500
SCOTT
3000
SMITH
Below 1500
TURNER
On Target
WARD
Below 1500
14 records selected
60.
61.
62.
63.
64.
Scrieti
introdusa in formatul
65.
DD.MM.YY.
66.
67.
68.
69.
70.
Enter value
for anydate:12.11.88
DAY
-----------------------SATURDAY
71.
72.
73.
Scrieti o cerere
74.
pt. a determina
companiei .Folositi
cit timp
au fost angajati
repetarea
ai
tipului
75.
functiilor.
76.
77.
78.
79.
80.
81.
Enter value
for
employee_name:king
ENAME
LENGTH OF SERVICE
------------------------------KING
4 YEARS 4 MONTHS
82.
83.
85.
si ultimele
86.
mijloc
87.
din
2 caractere
sunt numere
si daca caracterul
este '/'.
Folositi
88.
urmatoarele
valori pentru
89.
'12/34',01/la','99/88'
90.
91.
92.
VALUE VALID?
----------12/34 YES
a testa
solutia
voastra:
93.
94.
95. Angajatii pe 15
96.
in ultima
vineri
dupa data
de
97.
15
98.
Afisati
99.
data
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
ENAME
HIREDATE PAYDAY
--------------------------SMITH
13-jun-83 24-jun-83
ALLEN
15-aug-83 26-aug-83
JONES
31-oct-83 25-nov-83
MILLER
21-nov-83 30-dec-83
MARTIN
05-dec-83 30-dec-83
FORD
05-dec-83 30-dec-83
SCOTT
05-mar-84 30-mar-84
WARD
26-mar-84 27-apr-84
CLARK
14-may-84 25-may-84
TURNER
04-jun-84 29-jun-84
ADAMS
04-jun-84 29-jun-84
BLAKE
11-jun-84 29-jun-84
KING
09-jul-84 27-jul-84
JAMES
23-jul-84 31-aug-84
prima
sunt platiti
in ultima vineri
a urmatoarei luni.
de plata.Sortati in functie
si
de data angajarii.
14 records selected
118.
119.
CAPITOLUL 5 SOLUTII
1.
2.
3.
4.
5.
SELECT
FROM
WHERE
ENAME,
TO_CHAR(HIREDATE,'fmMonth,Ddspth YYYY')
date_hired
EMP
DEPTNO=20;
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT
ENAME,
DECODE(SIGN(1500-SAL),1,'BELOW 1500',0,'On
Target',SAL)
SALARY
FROM
EMP
ORDER BY ENAME;
19.
20.
21.
SELECT
TO-CHAR(TO_DATE('&ANYDATE','DD.MM.YY'),'DAY')
22.
FROM
SYS.DUAL;
DAY
23.
24.
25.
26.
27.
28.
29.
30.
31.
DEFINE TIME=MONTHS_BETWEEN(SYSDATE,HIREDATE)
SELECT
ENAME,
FLOOR(&TIME/12)||'YEARS'||
FLOOR(MOD(&TIME,12))||'MONTHS'
"LENGTH OF SERVICE"
FROM
EMP
WHERE
ENAME=UPPER('&EMPLOYEE_NAME');
32.
33.
34.
35.
36.
37.
38.
39.
SELECT
FROM
'12/34' VALUE
DECODE(
TRANSLATE('12/34','1234567890',
'9999999999'),
'99/99','YES',NO') "VALID?"
SYS.DUAL;
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
SELECT
FROM
ORDER BY
51.
52.
sau
ENAME,
HIREDATE,
DECODE(SIGN(TO_CHAR(HIREDATE,'DD')-15
1,NEXT-DAY(LAST-DAY(ADD_MONTHS(HIREDATE,1)),
'FRIDAY')-7,
NEXT-DAY(LAST_DAY(HIREDATE),'FRIDAY')-7)
PAYDAY
EMP
HIREDATE;
53.
54.
55.
56.
57.
SELECT
FROM
ORDER BY
ENAME,HIREDATE,
NEXT_DAY(LAST_DAY(ROUND(HIREDATE,'MONTH'))-7
'FRIDAY') PAYDAY
EMP
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.
Functiile de grup sunt listate mai jos:
Valoare returnata
AVG({DISTINCT/ALL})
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 COUNT(*)
FROM EMP
WHERE DEPTNO = 20;
COUNT(*)
-------5
Clauza GROUP BY
Clauza GROUP BY poate fi folosita pentru a imparti liniile dintr-o tabela in grupuri mai mici.
Functiile de rup pot fi folosite pentru a intorece informatii sumare pentru fiecare grup.
Pentru a calcula salariul mediu pentru fiecare functie diferita, introducem:
AVG(SAL)
----------3000
1037.5
2758.33333
5000
1400
Liniile pot fi excluse mai intii cu o clauza WHERE, inainte de a le imparti in grupuri.
Pentru a determina salariul mediu pentru fiecare functie in afara de manager, introducem :
SELECT JOB, AVG(SAL)
FROM EMP
WHERE JOB != 'MANAGER'
GROUP BY JOB;
JOB
------ANALYST
CLERK
PRESIDENT
SALESMAN
AVG(SAL)
----------3000
1037.5
5000
1400
Solutii
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT JOB,
MAX(SAL) MAXIMUM,
MIN(SAL) MINIMUM
FROM EMP
GROUP BY JOB;
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT JOB,
AVG(SAL) AVSAL,
AVG(SAL * 12 + NVL(COMM, 0)) AVCOMP
FROM EMP
GROUP BY JOB;
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
SELECT EMPNO
FROM EMP
GROUP BY EMPNO
HAVING COUNT(*) > 1;
35.
36.
37.
38.
39.
40.
41.
CAPITOLUL 7
EXTRAGEREA DATELOR DIN MAI MULT DE O TABELA
Join
Join-ul este folosit cind o cerere SQL necesita date din mai multe tabele din baza de date.
Liniile dintr-o tabela pot fi unite cu liniile din alta tabela in functie de valorile comune
existente in coloanele corespunzatoare.
Sint doua tipuri de conditie de join :
1. Equi-join
2. Non-equi-join
Equi-join
Pentru a determina angajatii din departamente, vom compara valorile din coloana DEPTNO a
angajatului cu aceleasi valori din DEPTNO din tabela DEPT. Relatia dintre tabela EMP si
DEPT este un equi-join, in care valorile din coloana DEPTNO din ambele tabele sint egale.
(Operatorul de comparatie folosit este =.)
O conditie de join este specificata in clauza WHERE:
SELECT column(s)
FROM tables
WHERE join condition is ...
JOB
-----MANAGER
CLERK
PRESIDENT
CLERK
ANALYST
MANAGER
CLERK
ANALYST
SALESMAN
MANAGER
SALESMAN
CLERK
SALESMAN
SALESMAN
DNAME
------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
SALES
Vom observa ca acum fiecare angajat are listat numele departamentului lui.
Liniile din EMP sint combinate cu liniile din DEPT si sint intoarse doar liniile pentru
care valorile EMP.DEPTNO si DEPT.DEPTNO sint eale.
Observati ca, conditia de join specifica numele coloanei precedat de numele tabelei.Aceasta
este o necesitate cind numele coloanelor sint aceleasi in ambele tabele.Este necesar sa
specificam exact ce coloane sint referite.
Aceasta necesitate este de asemenea aplicata coloanelor care pot fi ambigue in clauzele
SELECT sau ORDER BY.
Pentru a recunoaste diferentele dintre coloana DEPTNO din EMP si coloana DEPTNO din
DEPT, introducem:
SELECT DEPT.DEPTNO, ENAME, JOB, DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
ORDER BY DEPT.DEPTNO;
DEPTNO
-------10
10
10
20
20
20
20
20
30
30
30
30
30
30
ENAME
------CLARK
MILLER
KING
SMITH
SCOTT
JONES
ADAMS
FORD
ALLEN
BLAKE
TURNER
JAMES
MARTIN
WARD
JOB
-----MANAGER
CLERK
PRESIDENT
CLERK
ANALYST
MANAGER
CLERK
ANALYST
SALESMAN
MANAGER
SALESMAN
CLERK
SALESMAN
SALESMAN
DNAME
------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
SALES
Observati ca fiecarui numar de departament din tabela DEPT i se face join pentru a se potrivi
cu numerele de departament din tabela EMP.De exemplu, trei angajati lucreaza in
departamentul 10 - Accounting - deci exista trei potri- viri.Prin urmare ACCOUNTING este
afisat pentru fiecare angajat din acel depar- tament.
Folosirea alias-urilor de tabela
Poate fi foarte plictisitor sa tiparesti numele tabelelor repetat.Etichete temporare (sau aliasuri) pot fi folosite in clauza FROM.Aceste nume temporare sint valide doar in instructiunea
SELECT curenta.Alias-urile de tabele trebuie de asemenea sa fie specificate in clauza
SELECT.Aceasta creste efectiv viteza cererii, in care contextul contine informatii foarte
exacte.
Alias-urile de tabela sint folosite in urmatorul context:
SELECT E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY D.DEPTNO;
Alias-urile de tabele pot fi de lungime de maxim 30 de caractere, dar mai scurte sint mai
bune.De asemenea incercati sa le faceti cit mai explicite.
Daca un alias de tabela este folosit pentru un nume particular de tabela in clauza FROM,
atunci acel alias trebuie sa fie substituit pentru numele tabelei in contextul din SELECT.
Produs
----------------------------------------------------------------------EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO |
----------------------------------------------------------------------|=======================================================================|
----------------------------------------------------------------------|
7788
SCOTT
ANALYST
7566
05-MAR-84
3000
20
|------------------------------------------------------------------------|
|=======================================================================|
|
----------------------------------------------------------------------|
|
|
|
|
|
---------------------------------------------------------------------|
|
|
|
|
|
------------------------------|
| DEPTNO
DNAME
LOC
|
|
------------------------------|--------| 10
ACCOUNTING
NEW YORK |
|--------| 20
RESEARCH
DALLAS
|
|--------| 30
SALES
CHICAO
|
|--------| 40
OPERATIONS
BOSTON
|
-------------------------------
In absenta unei conditii WHERE, fiecare linie din EMP este unita in ordine cu fiecare linie din
DEPT.
Se vor afisa 53 de linii.
Produs
Cind o conditie de join este invalida sau este omisa, rezultatul este omis si toate combinatiile
de linii vor fi listate.
Un produs tinde sa genereze un numar mare de linii si rezultatul sau este rar folosit.Trebuie
intotdeauna inclusa o conditie de join intr-o clauza WHERE, in afara de cazul in care este
necesara combinarea tuturor liniilor din toate tabelele.
Non-Equi-Join
Relatia dintre tabelele EMP si SALGRADE este un non-equi-join, in care nici o coloana din
EMP nu corespunde direct cu o coloana din SALGRADE.Relatia este obtinuta folosind un
operator, altul decit operatorul de egalitate (=).Pentru a evalua gradatia unui anajat, salariul lui
SAL
------800.00
1,100.00
950.00
1,250.00
1,250.00
1,300.00
1,600.00
1,500.00
2,975.00
2,850.00
2,450.00
3,000.00
3,000.00
5,000.00
GRADE
--------1
1
1
2
2
2
3
3
4
4
4
4
4
5
Alti operatori cum ar fi <= si >= pot fi folositi, oricum BETWEEN este cel mai simplu.Nu
uitati sa specificati mai intii valoarea minima si ultima va- loarea maxima cind folositi
BETWEEN.Din nou sint folosite alias-uri de tabele, nu din cauza posibilelor ambiguitati, dar
din motive de performanta.
Reguli pentru join-ul tabelelor
Pentru a face join pe cele trei tabele este necesar sa construim doua condi- tii de join.Pentru a
face join pe patru tabele sint necesare minim trei condi- tii de join.
O regula simpla este:
numarul minim de conditii de join = numarul de tabele - 1
Aceasta regula nu poate fi aplicata daca tabela are o cheie primara, care identifica in mod unic
fiecare linie (cheile primare sint explicate mai tirziu in manual).
Sintaxa
SELECT [DISTINCT] {[tabela].* | expresie [alias], ...}
FROM tabela [alias], ...
WHERE [conditie de join] ...
AND [conditie de linie] ...
OR [alta conditie de linie]
GROUP BY {expresie | coloana}
HAVING {conditie de grup}
ORDER BY {expresie | coloana} [ASC | DESC]
Observatii
Aceste exxercitii au intentia de a va capata experienta practica in extrage- rea datelor din mai
mult decit o tabela si includ teme discutate in capitolele anterioare.
Tema
1. Afisati numele tuturor angajatilor si numele departamentului lor, in ordinea numelui departamentelor.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
ENAME
-------CLARK
MILLER
KING
SMITH
SCOTT
JONES
ADAMS
FORD
ALLEN
BLAKE
TURNER
JAMES
MARTIN
WARD
DNAME
--------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
SALES
ENAME
-------CLARK
MILLER
KING
SMITH
SCOTT
JONES
ADAMS
FORD
ALLEN
BLAKE
TURNER
JAMES
DEPTNO
--------10
10
10
20
20
20
20
20
30
30
30
30
DNAME
--------ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
37.
38.
39.
40.
MARTIN
WARD
30
30
SALES
SALES
ENAME
-------CLARK
KING
JONES
FORD
SCOTT
ALLEN
BLAKE
LOCATION
---------NEW YORK
NEW YORK
DALLAS
DALLAS
DALLAS
CHICAGO
CHICAGO
DNAME
--------ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
ENAME
---------SMITH
ADAMS
JAMES
WARD
MARTIN
MILLER
ALLEN
TURNER
JONES
BLAKE
CLARK
SCOTT
FORD
KING
JOB
------CLERK
CLERK
CLERK
SALESMAN
SALESMAN
CLERK
SALESMAN
SALESMAN
MANAGER
MANAGER
MANAGER
ANALYST
ANALYST
PRESIDENT
SAL
------800.00
1,100.00
950.00
1,250.00
1,250.00
1,300.00
1,600.00
1,500.00
2,975.00
2,850.00
2,450.00
3,000.00
3,000.00
5,000.00
GRADE
---------1
1
1
2
2
2
3
3
4
4
4
4
4
5
ENAME
---------ALLEN
TURNER
JOB
------SALESMAN
SALESMAN
SAL
------1,600.00
1,500.00
ENAME
SAL
LOCATION
GRADE
---------3
3
77.
78.
79.
80.
81.
82.
---------SMITH
SCOTT
JONES
ADAMS
FORD
------800.00
3,000.00
2,975.00
1,100.00
3,000.00
---------DALLAS
DALLAS
DALLAS
DALLAS
DALLAS
ENAME
-------KING
FORD
SCOTT
JONES
BLAKE
CLARK
ALLEN
TURNER
MARTIN
WARD
JOB
--------PRESIDENT
ANALYST
ANALYST
MANAGER
MANAGER
MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
SAL
-------5,000.00
3,000.00
3,000.00
2,975.00
2,850.00
2,450.00
1,600.00
1,500.00
1,250.00
1,250.00
GRADE
--------5
4
4
4
4
4
3
3
2
2
DNAME
--------ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
SALES
ACCOUNTING
SALES
SALES
SALES
SALES
100.
Afisati urmatoarele detalii pentru angajatii care cistiga 36000$ pe an
sau care sint functionari.
101.
102.
103.
ENAME
JOB
ANNUAL_SAL
104.
--------- ------- --------------------105.
FORD
ANALYST
36000
106.
SCOTT
ANALYST
36000
107.
MILLER
CLERK
15600
108.
JAMES
CLERK
11400
109.
ADAMS
CLERK
13200
110.
SMITH
CLERK
9600
111.
112.
Vor fi selectate 6 inregistrari.
Solutii
1.
2.
3.
4.
DEPTNO
---------
DNAME
---------
GRADE
20
20
10
30
20
20
RESEARCH
RESEARCH
ACCOUNTING
SALES
RESEARCH
RESEARCH
4
4
2
1
1
1
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
CAPITOLUL 8
ALTE METODE DE JOIN
Join extern
Daca o linie nu satisface o conditie de join, atunci linia respectiva nu va apare in rezultatul
cererii.De fapt, in conditia de equi-join pentru EMP si DEPT, departamentul 40 nu
apare.Aceasta se intimpla deoarece nu este nici un angajat in departamentul 40.
-----------------------------------------------------------------------|
JOIN EXTERN
|
|
|
|
-----------------------------------------------------|
|
| EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO |
|
|
------------------------------------------------------ ?
|
|
|======================================================|-----|
|
-----------------------------------------------------|
|
|
|
|
|
--------------------------------------------------------------|
|
|
|
|
|
|
-------------------------------|
|
|
| DEPTNO
DNAME
LOC
|
|
|
|
-------------------------------|
|
|
|================================|
|
|
|
-------------------------------|
|
|---------|
40
OPERATIONS
BOSTON
|
|
|
-------------------------------|
|
|
------------------------------------------------------------------------
Nu exista nici un angajat in departamentul 40, dar el poate fi afisat facind join intre
departamentul 40 cu o linie vida.
Liniile ce lipsesc pot fi returnate daca este folosit un operator de join extern in conditia de
join.Operatorul este semnul plus inclus intre paranteze (+) si este plasat in partea tabelei
deficiente in informatii.Operatorul are ca efect crearea uneia sau mai multor linii vide cu care
una sau mai multe linii din tabela nedeficitara in informatii poate face join.
O linie vida este creata pentru fiecare linie adaugata in tabela nedefici- tara in informatii.
SELECT E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
AND D.DEPTNO IN (30, 40);
ENAME
--------ALLEN
BLAKE
TURNER
JAMES
MARTIN
WARD
DEPTNO
--------30
30
30
30
30
40
DNAME
--------SALES
SALES
SALES
SALES
SALES
OPERATIONS
Operatorul de join extern pote apare doar intr-o parte a expresiei si anume in
partea in care lipsesc informatii.Vor fi intoarse acele linii dintr-o ta- bela care nu
au corespondent direct in cealalta tabela.
nu se poate face join extern a unei tabele cu mai mult de o tabela ce difera de prima intr-o singura declaratie SELECT;
Este posibila folosirea etichetelor de tabele (alias-urilor) pentru a face join unei tabele cu ea
insasi, ca si cum ar fi doua tabele separate.Aceasta permite ca liniilor dintr-o tabela sa li se
faca join cu liniile din aceeasi tabela.
Urmatoarea cerere listeaza toti angajatii care cistiga mai putin ca sefii lor :
SELECT E.ENAME EMP_NAME, E.SAL EMP_SAL,
M.ENAME MGR_NAME, M.SAL MGR_SAL
FROM EMP E, EMP M
WHERE E.MGR = E.EMPNO
AND E.SAL < M.SAL;
EMP_NAME
----------ALLEN
WARD
MARTIN
TURNER
JAMES
MILLER
ADAMS
JONES
BLAKE
CLARK
SMITH
EMP_SAL
----------1600
1250
1250
1500
950
1300
1100
2975
2850
2450
800
MGR_NAME
----------BLAKE
BLAKE
BLAKE
BLAKE
BLAKE
CLARK
SCOTT
KING
KING
KING
FORD
MGR_SAL
---------2850
2850
2850
2850
2850
2450
3000
5000
5000
5000
3000
Observati ca, clauza FROM se refera la EMP de doua ori si ca urmare EMP are asociata cite
un alias pentru ambele cazuri - E si M.Este ajutator ca alias- urile asociate sa fie cu inteles, de
exemplu E inseamna angajati (employees) si M inseamna sefi (managers).
Clauza join poate fi exprimata:
"unde numarul sefului angajatului este acelasi cu numarul angajatului se- fului lui".
Operatori de multimi
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 = 30;
JOB
----CLERK
MANAGER
Diferenta
Pentru a lista toate liniile generate de prima cerere care nu sint in a doua cerere, introducem:
SELECT JOB
FROM EMP
WHERE DEPTNO = 10
MINUS
SELECT JOB
FROM EMP
WHERE DEPTNO = 30;
JOB
----PRESIDENT
Este posibil sa se construiasca cereri cu mai multi operatori de multimi. Daca sint folositi mai
multi operatori de multimi, ordinea executiei pentru declaratiile SQL este de sus in
jos.Parantezele pot fi folosite pentru a face ordinea executiei alternativa.
ORDER BY
ORDER BY poate fi folosita o data intr-o cerere ce foloseste operatori de multimi.Daca este
folosita, clauza ORDER BY trebuie plasata la sfirsitul cererii.Deoarece pot fi selectate
coloane diferite in fiecare SELECT nu se pot numi coloanele in clauza ORDER BY.In scimb,
coloanele din ORDER BY trebuie sa fie referite prin pozitiile relative din lista din SELECT.
SELECT EMPNO, ENAME, SAL
FROM EMP
UNION
SELECT ID, NAME, SALARY
FROM EMP_HISTORY
ORDER BY 2;
Observati ca in clauza ORDER BY un numar (2) este folosit pentru a indica pozitia coloanei
ENAME in lista din SELECT.Aceasta inseamna ca liniile vor fi sortate in ordine ascendenta a
numelui angajatilor.
Reguli pentru folosirea operatorilor de multimi
1. Declaratiile SELECT trebuie sa aiba acelasi numar de coloane.
2. Coloanele corespunzatoare trebuie sa aiba acelasi tip (corespondenta este
pozitionala).
3. Liniile duplicate sint automat eliminate (nu poate fi folosit DISTINCT).
DEPTNO
-------40
DNAME
-------OPERATIONS
EMPNO
-------7788
7902
7499
7521
7654
7844
7900
7934
7876
7566
7698
7782
7369
ENAME
--------SCOTT
FORD
ALLEN
WARD
MARTIN
TURNER
JAMES
MILLER
ADAMS
JONES
BLAKE
CLARK
SMITH
MGRNO
-------7566
7566
7698
7698
7698
7698
7698
7782
7788
7839
7839
7839
7902
MGR_NAME
-----------JONES
JONES
BLAKE
BLAKE
BLAKE
BLAKE
BLAKE
CLARK
SCOTT
KING
KING
KING
FORD
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
EMPNO
-------7839
7788
7902
7499
7521
7654
7844
7900
7934
7876
7566
7698
7782
7369
ENAME
--------KING
SCOTT
FORD
ALLEN
WARD
MARTIN
TURNER
JAMES
MILLER
ADAMS
JONES
BLAKE
CLARK
SMITH
MGRNO
--------
MGR_NAME
------------
7566
7566
7698
7698
7698
7698
7698
7782
7788
7839
7839
7839
7902
JONES
JONES
BLAKE
BLAKE
BLAKE
BLAKE
BLAKE
CLARK
SCOTT
KING
KING
KING
FORD
JOB
-----CLERK
Va fi selectata o inregistrare.
EMPLOYEE
----------ALLEN
WARD
MARTIN
TURNER
MILLER
JONES
BLAKE
CLARK
SMITH
HIREDATE
----------15-AUG-83
26-MAR-84
05-DEC-83
04-JUN-84
21-NOV-83
31-OCT-83
11-JUN-84
14-MAY-84
13-JUN-83
MANAGER
---------BLAKE
BLAKE
BLAKE
BLAKE
CLARK
KING
KING
KING
FORD
Solutii
DEPTNO
--------40
DNAME
-------OPERATIONS
HIREDATE
----------11-JUN-84
11-JUN-84
11-JUN-84
11-JUN-84
14-MAY-84
09-JUL-84
09-JUL-84
09-JUL-84
05-DEC-83
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SELECT JOB
FROM EMP
WHERE HIREDATE BETWEEN '01-JAN-83' AND '30-JUN-83'
INTERSECT
SELECT JOB
FROM EMP
WHERE HIREDATE BETWEEN '01-JAN-84' AND '30-JUN-84';
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
CAPITOLUL 9
SUBCERERI
In acest capitol se vor prezenta alte caracteristici ale declaratiei SELECT, cum ar fi cereri
continute in clauza WHERE sau HAVING ale altei decla- ratii SQL.
Subcereri ascunse
O subcerere este o declaratie SELECT care este ascunsa in interiorul altei declaratii SELECT
si care intoarce rezultate intermediare.
De exemplu:
SELECT column1, column2, ...
FROM table
WHERE column =
(SELECT column
FROM table
WHERE condition)
Pentru a gasi angajatul care cistiga salariul minim din companie (salariul minim este o
cantitate necunoscuta), trebuie parcursi doi pasi:
SELECT MIN(SAL)
FROM EMP;
MIN(SAL)
---------800
ENAME
------SMITH
JOB
-----CLERK
SAL
----800
In exemplul de mai sus, 800 este o valoare unica.Subcererea care a intors valoarea 800 se
numeste subcerere ce intoarce o singura linie.Cind o subcerere intoarce doar o linie, va fi
folosit un operator logic sau un operator de com- paratie.De exemplu: =, <, >, <=, etc.
Pentru a gasi toti angajatii ce au aceeasi functie ca BLAKE, vom introduce:
SELECT ENAME, JOB
FROM EMP
WHERE JOB = (SELECT JOB
FROM EMP
WHERE ENAME = 'BLAKE');
ENAME
------JONES
BLAKE
CLARK
JOB
----MANAGER
MANAGER
MANAGER
Cererea interioara intoarce functia lui BLAKE, care este folosita in partea dreapta a clauzei
WHERE di cererea principala (dupa operatorul de comparatie).
Subcereri ce intorc mai mult de o linie
Urmatoarea cerere gaseste angajatii care au salariul egal cu salariul minim din fiecare
departament:
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE SAL IN
(SELECT MIN(SAL)
FROM EMP
GROUP BY DEPTNO);
ENAME
------SMITH
JAMES
MILLER
SAL
----800
950
1300
DEPTNO
--------20
30
10
Observati ca, cererea interioara are clauza GROUP BY.Aceasta inseamna ca va intoarce mai
mult decit o valoare.Deci este nevoie sa folosim un operator de comparatie multi linie.In acest
caz, operatorul IN trebuie sa fie folosit, deoarece rezulta o lista de valori.
Rezultatul obtinut nu arata si departamentul in care lucreaza angajatul.
Deoarece se compara doar valorile salariilor, cererea interioara poate intoar- ce o valoare
simpla, pentru ca el cauta cel mai mic salariu pentru unul din departamente, nu in mod
necesar departamentul propriu al angajatului.Prin urmare, cererea poate fi rescrisa pentru a
gasi combinatia salariul angaja- tului si numarul departamentului cu salariul minim si numarul
departamentului:
Compararea a mai multor valori
Urmatoarea cerere ggaseste angajatii care cistiga salariul cel mai mic din
departamentul lor:
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE (SAL, DEPTNO) IN
(SELECT MIN(SAL), DEPTNO
FROM EMP
GROUP BY DEPTNO);
ENAME
------SMITH
JAMES
MILLER
SAL
----800
950
1300
DEPTNO
--------20
30
10
nu este permis.
Erori intilnite
Cind o subcerere intoarce mai mult decit o linie si este folosit un opera- tor de comparatie pt o
singura linie, SQL*Plus da urmatorul mesaj de eroare:
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE SAL = (SELECT MIN(SAL)
FROM EMP
GROUP BY DEPTNO);
Eroare : subcerere ce trebuie sa intoarca o singura linie intoarce mai mult decit o linie.
Nu este selectata nici o inregistrare.
Daca cererea interioara nu intoarce nici o linie, va fi dat urmatorul mesaj de eroare :
SELECT ENAME, JOB
FROM EMP
WHERE JOB = (SELECT JOB
FROM EMP
WHERE ENAME = 'SMITHE');
SAL
----5000
3000
3000
JOB
----PRESIDENT
ANALYST
ANALYST
DEPTNO
-------10
20
20
JONES
BLAKE
CLARK
ALLEN
MILLER
WARD
ADAMS
2975
2850
2450
1600
1300
1250
1100
MANAGER
MANAGER
MANAGER
SALESMAN
CLERK
SALESMAN
CLERK
20
30
10
30
10
30
20
Cel mai mic salariu din departamentul 30 este 950$ (a lui James).Cererea principala intoarce
angajatii care cistiga un salariu mai mare ca salariul minim din departamentul 30.Asa ca '>
ANY' inseamna mai mare ca minim.'=ANY' este echivalent cu IN.
Cind se foloseste SOME/ANY, DISTINCT este frecvent folosit pentru a impie- dica sa se
selecteze linniile de mai multe ori.
ALL compara o valoare cu fiecare valoare intoarsa de o subcerere.
Urmatoarea cerere gaseste angajatii care cistiga mai mult ca fiecare angajat din departamentul
30 :
SELECT ENAME, SAL, JOB, DEPTNO
FROM EMP
WHERE SAL > ALL (SELECT DISTINCT SAL
FROM EMP
WHERE DEPTNO = 30)
ORDER BY SAL DESC;
ENAME
------KING
SCOTT
FORD
JONES
SAL
----5000
3000
3000
2975
JOB
----PRESIDENT
ANALYST
ANALYST
MANAGER
DEPTNO
--------10
20
20
20
Cel mai mare salariu din departamentul 30 este 250$ (a lui Blake), asa ca cererea intoarce acei
angajati ai caror salariu este mai mare ca salariul maxim din departamentul 30, prin urmare
mai mare ca fiecare salariu din de- partament.
Operatorul NOT poate fi folosit cu IN, ANY sau ALL.
Clauza HAVING cu subcereri ascunse
GROUP BY DEPTNO;
DEPTNO
-------10
20
AVG(SAL)
---------2916.66667
2175
Pentru a construi o cerere care gaseste functia cu cel mai mare salariu mediu, introducem :
AVG(SAL)
---------5000
Mai intii cererea interioara gaseste salariul mediu pentru fiecare grup de functii diferit si
functia MAX alege cel mai mare salariu mediu.Acea valoare (5000) este folosita in clauza
HAVING.Clauza GROUP BY din cererea principala este necesara pentru ca lista ce urmeaza
dupa SELECT-ul din cererea principala contine atit o coloana agregat cit si o coloana nonagragat.
Ordonarea datelor cu subcereri
JOB
----MANAGER
ANALYST
PRESIDENT
ANALYST
HIREDATE
---------02-APR-81
09-DEC-82
17-NOV-81
03-DEC-81
SAL
----2975
3000
5000
3000
Limitele de imbricare
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 pot
o
uni tabele.
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.
Cu o subcerere ascunsa obisnuita, SELECT-ul interior ruleaza primul si se executa o data,
intorcind valori ce vor fi folosite de cererea principala.Pe de alta parte, o subcerere corelata se
executa o data pentru fiecare linie candidat considerata de cererea externa.Cererea interioara
este dirijata de cererea externa.
Pasii de executie ai unei subcereri corelate :
1. Se obtine linia candidat. (obtinuta de cererea exterioara)
2. Se executa cererea interioara folosind valoarea liniei candidat.
3. Se folosesc valorile rezultate din cererea interioara pentru a pastra sau
pentru a inlatura linia candidat.
4. Se repeta pina nu mai ramine nici o linie candidat.
Desi subcererea corelata se executa repetat, o data pentru fiecare linie in cererea principala,
aceasta nu inseamna ca subcererile corelate sint mai putin eficiente ca subcererile necorelate
obisnuite.Se va vorbi despre eficienta mai tirziu in acest capitol.
Putem folosi o subcerere corelata pentru a gasi angajatii care cistiga un salariu mai mare ca
salariul mediu al departamentului lor :
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP E
WHERE SAL > (SELECT AVG(SAL)
FROM EMP
WHERE DEPTNO = E.DEPTNO)
ORDER BY DEPTNO;
EMPNO
------7839
7566
7788
7902
7499
7698
ENAME
------KING
JONES
SCOTT
FORD
ALLEN
BLAKE
SAL
-----5000
2975
3000
3000
1600
2850
DEPTNO
-------10
20
20
20
30
30
Putem observa imediat ca este o cerere corelata pentru ca am folosit o co- loana din SELECTul extern in clauza WHERE din SELECT-ul interior.
Observati ca alias-ul este necesar doar pentru a indeparta ambiguitatea pentru numele
coloanelor.
Sa analizam exemplul de mai sus folosind tabela EMP :
Cererea principala
Selectia liniilor candidat continua cu verificarea conditiei ce apare in re- zultatul cererii.
Observatie : o subcerere corelata este semnalata de un nume de coloana, un nume de tabela
sau un alias de tabela in clauza WHERE, care se refera la va- loarea unei coloane in fiecare
linie candidat din SELECT-ul exterior.De aseme- nea subcererea corelata se executa repetat
pentru fiecare linie candidat in cererea principala.
Comenzile UPDATE pot contine subcereri corelate :
UPDATE EMP E
SET (SAL, COMM) = (SELECT AVG(SAL) * 1.1, AVG(COMM)
FROM EMP
WHERE DEPTNO = E.DEPTNO)
HIREDATE = '11-JUN-85';
Operatori
Cind se folosesc declaratii SELECT ascunse, operatorii logici, precum si ANY si ALL sint toti
valizi.In plus poate fi folosit operatorul EXISTS.
Operatorul EXISTS
Operatorul EXISTS este frecvent folosit cu subcererile corelate.El testeaza daca o valoare
exista (NOT EXISTS specifica daca ceva nu exista).Daca valoarea exista se intoarce TRUE;
daca valoarea nu exista se intoarce FALSE.
EMPNO
------7566
7698
7782
7788
7839
7902
ENAME
------JONES
BLAKE
CLARK
SCOTT
KING
FORD
JOB
----MANAGER
MANAGER
MANAGER
ANALYST
PRESIDENT
ANALYST
DEPTNO
-------20
30
10
20
10
20
DNAME
------OPERATIONS
Observati ca SELECT-ul interior nu este necesar sa intoarca o valoare spe- cifica, asa ca poate
fi selectata o cifra.
De ce sa folosim o subcerere corelata ?
Subcererea corelata este un mod de a 'citi' fiecare linie din tabela si de a compara valorile din
fiecare linie cu datele inrudite.Aceasta este folosita oricind o subcerere trebuie sa intoarca un
rezultat diferit sau o multime de rezultate pentru fiecare linie candidat considerata de cererea
principala.Cu alte cuvinte, o subcerere corelata este folosita pentru a raspunde la intre- bari cu
mai multe subpuncte al caror raspuns depinde de valoarea din fiecare linie din cererea parinte.
SELECT-ul interior este executat normal o data pentru fiecare linie candi- dat.
Considerente de eficienta
Vom examina cele doua tipuri de subcereri.Trebuie mentionat ca subcererea corelata (cu
EXISTS) poate fi cel mai performant mod pentru unele cereri.
Performanta va depinde de folosirea indexarilor, de numarul liniilor in- toarse de cereri, de
dimensiunea tabelelor si daca sint necesare tabelele temporare pentru a evalua rezultatele
temporare.Tabelele temporare generate de ORACLE nu sint indexate si acest lucru conduce la
degradarea performantelor pentru subcererile ce folosesc IN, ANY si ALL.
Cele de mai sus sint puncte de vedere generale.Performantele sint discutate mai in detaliu in
alte cursuri.
NOT EXISTS contra NOT IN
Desi intr-o subcerere o operatie NOT IN poate fi la fel de eficienta ca si NOT EXISTS, NOT
EXISTS este mult mai sigur daca subcererea intoarce niste valori NULL, fata de de NOT IN
pentru care conditia se evalueaza la FALSE cind in lista de comparatii sint incluse valori
NULL.
Considerind urmatoarea cerere care gaseste angajatii ce nu au nici un su- bordonat :
SELECT ENAME, JOB
FROM EMP
WHERE EMPNO NOT IN (SELECT MGR
FROM EMP);
Nici o linie nu va fi intoarsa de cererea de mai sus, deoarece coloana MGR contine o valoare
NULL.
Cererea corecta este :
SELECT ENAME, JOB
FROM EMP E
WHERE NOT EXISTS (SELECT MGR
FROM EMP
WHERE MGR = E.EMPNO);
ENAME
------SMITH
ADAMS
ALLEN
WARD
MARTIN
TURNER
JAMES
MILLER
JOB
----CLERK
CLERK
SALESMAN
SALESMAN
SALESMAN
SALESMAN
CLERK
CLERK
Exercitii - Subcereri
Aceste exercitii va vor permite sa scrieti cereri complete folosind SELECT- uri ascunse si
SELECT-uri corelate.
Tema
1. Gasiti angajatii care cistiga cell mai mare salariu pentru fiecare tip de
functie.Sortati in ordinea descrescatoare a salariului.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
JOB
----PRESIDENT
ANALYST
ANALYST
MANAGER
SALESMAN
CLERK
ENAME
------KING
SCOTT
FORD
JONES
ALLEN
MILLER
SAL
-----5,000.00
3,000.00
3,000.00
2,975.00
1,600.00
1,300.00
ENAME
------SMITH
WARD
MARTIN
CLARK
SCOTT
FORD
KING
JOB
----CLERK
SALESMAN
SALESMAN
MANAGER
ANALYST
ANALYST
PRESIDENT
SAL
----800.00
1,250.00
1,250.00
2,450.00
3,000.00
3,000.00
5,000.00
24.Gasiti cei mai recenti angajati din fiecare departament.Ordonati dupa data
angajarii.
25.
26.
27.
28.
29.
30.
DEPTNO
-------20
10
30
ENAME
------ADAMS
KING
JAMES
HIREDATE
---------04-JUN-84
09-JUL-84
23-JUL-B4
31.Afisati urmatoarele detalii pentru orice angajat care cistiga un salariu mai
mare ca media pentru departamentul lor.Sortati dupa numarul departamentului.
32.
33.
34.
35.
ENAME
------KING
JONES
SALARY
-------5000
2975
DEPTNO
-------10
20
36.
37.
38.
39.
40.
41.
SCOTT
FORD
ALLEN
BLAKE
3000
3000
1600
2850
20
20
30
30
DEPTNO
-------40
DNAME
------OPERATIONS
DEPTNO
-------20
COMPENSATION
--------------130500
50.Care sint primii trei angajati in functie de salariul cistigat ? Afisati numele
lor si salariul.
51.
52.
53.
54.
55.
56.
57.
ENAME
------SCOTT
KING
FORD
SAL
----3,000.00
5,000.00
3,000.00
58.In ce an s-au angajat cei mai multi in companie ? Afisati anul si numarul
angajatilor.
59.
60.
61.
YEAR
-----1984
NUMBER OF EMPS
---------------8
ENAME
------ALLEN
BLAKE
SAL
----1600
2850
DEPTNO
-------30
30
DEPTAVG
---------1566.66667
1566.66667
67.
68.
69.
70.
71.
72.
JONES
FORD
SCOTT
KING
2975
3000
3000
5000
20
20
20
10
2175
2175
2175
2916.66667
73.Scrieti o subcerere care afiseaza o '*' linga linia celui mai recent
angajat.Afisati ENAME, HIREDATE si coloana (maxdate) completata cu '*'.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
ENAME
------SMITH
ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
TURNER
WARD
HIREDATE
---------13-JUN-83
04-JUN-84
15-AUG-83
11-JUN-84
14-MAY-84
05-DEC-83
23-JUL-84
31-OCT-83
09-JUL-84
05-DEC-83
21-NOV-83
05-MAR-84
04-JUN-84
26-MAR-84
MAXDATE
---------
Subcereri
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
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 a formata rezultatele cererilor in
rapoarte simple.
Comenzi SQL si SQL*Plus
Comenzile SET controleaza 'mediul' in care ruleaza in mod curent SQL*Plus. In general,
comenzile asociaza o valoare unei variabile de sistem sau o trece pe ON sau OFF.Aceste
comenzi pot fi folosite in mod implicit pentru fiecare sesiune prin includerea lor intr-un fisier
numit LOGIN.SQL, care este citit de fiecare data cind se ruleaza SQL*Plus.Daca o comanda
SET aparuta in timpul se- siunii modifica valoarea implicita, aceasta va fi valabila doar pentru
acea sesiune.Iesirea (EXIT) din SQL*Plus va reseta variabilele de sistem la valo- rile lor
implicite.
Comenzile SQL*Plus pot fi prescurtate.
Cuvintele subliniate reprezinta starile implicite pentru comenzile de mai jos.
ECHO {OFF ON}
ON face ca SQL*Plus sa afiseze comenzile asa cum sint ele executate dintrun fisier de comenzi.OFF suprima acest lucru.
FEED[BACK] {6n OFF ON}
n face ca SQL*Plus sa afiseze numarul inre- gistrarilor selectate intr-o
cerere cind sint selectate cel putin n inregistrari sau mai multe.ON sau OFF
face ca aceasta sa fie sau nu afisata. Trecerea feedback-ului pe ON face ca
n sa fie setat la 1.Setarea feed- back-ului la 0 este echivalent cu trecerea
sa pe OFF.
Pentru a gasi valoarea pentru o variabila SET folosim comanda SHOW. De exemplu, pentru a
gasi dimensiunea paginii (pagesize), introducem :
SHOW PAGES[IZE]
|
|------------------|---------------------------------|--------|
|
|
|
|
|
|
|
|
|
|
Formate de coloana
Calcule
|
|
|
|
|
|---------------------------------------------------------------------|
COLUMN - Optiuni
alfanumeric, de lungime n
pozitie numerica
999999
1234
099999
001234
floating dollar
$999999
punct zecimal
999999.99
1234.00
virgula
999,999
1,234
MI
999999MI
1234-
PR
EEEE
notatie stiintifica
99.999EEEE
multiplicare cu 10 la n
(n = numar de 9 dupa V)
9999V99
B9999.99
NOTA:
$1234
<1234>
1.234E+03
123400
SELECT DEPTNO,
JOB,
EMPNO,
SAL,
COMM,
SAL*12+NVL(COMM,0) REM
FROM EMP;
sal
sal
emp.sal
sal
e.sal
sal
sal*12+nvl(comm,0)
sal*12+nvl(comm,0)
sal*12 annsal
annsal
sysdate
sysdate
empno||'-'||ename
empno||'-'||ename
To_char(Hiredate,'ddth
MONYYYY')
To_char(Hiredate,'ddth MONYYYY')
To_char(sysdate,'Day
Mon YY')Today
Today
Descriere
-------
---------
cen-
jos
ca-
TTITLE OFF
anteBTITLE OFF
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
Comm'
COLUMN
Comenzile TTITLE si BTITLE pot include un numar de clauze, facand posibil ca aparitia
titlului sa fie specificata mai detaliat.
TTI[TLE] [printspec OFF ON]
contine
Clauze in Printspec
COL n
SKIP n
ori.
este
LEFT,CENTER and
linia
RIGHT
acesla
urmatosi
da-
te).
FORMAT
care o
sau
forFORMAT
de
in
cu
tipaSQL.PNO
cuvaprefixul
din
curenta.
Liniile unui raport pot fi sparte in sectiuni, folosind comanda BREAK. Prin spargerea unei
coloane, afisarea valorilor duplicate este eliminata. Puteti deasemenea sa lasati linii goale sau
sa incepeti o noua pagina intre sectiuni. Pana cand va aparea o 'spartura' , valorile coloanelor
se schimba de fiecare data, trebuie sa va reamintiti sa 'ORDER BY' coloana declaratia
SELECT sau raportul dumneavoastra va fi rupt in sectiuni de neinteles.
Poate fi o singura comanda BREAK activa la un moment dat; prin urmare, daca cereti breakuri 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
Un BREAK ON REPORT va permite calcule finale sumare. La orice "break", ur- matoarele
optiuni pot fi specificate:
Optiune
-------
Descriere
---------
PAGE
coloana
SKIP n
DUP[LICATE]
Exemple:
BREAK ON REPORT ON DEPTNO PAGE ON JOB SKIP 2
BREAK ON REPORT ON DEPTNO PAGE ON JOB DUP
COLUMN
Comm'
COLUMN
TTILTE
BTITLE
Calcule Sumare
Descriere
--------specifica coloana sau expresia a carei valoare
va
fi calculata.
ON
tabe-
Clauza
------
Calcule
-------
AVG
valoare medie
numar
COU[NT]
contorizeaza valori
nenule
toate tipurile
MAX[IMUM]
valoare maxima
numar, caracter
MIN[IMUM]
valoare minima
numar, caracter
NUM[BER]
contorizare a liniilor
toate tipurile
STD
deviatia standard
numar
SUM
numar
VAR[IANCE]
variatie
numar
Pot fi multe comenzi COMPUTE, cu toate ca adesea este mai usor sa specificati toate
calculele cerute intr-o singura comanda.
De exemplu:
COMPUTE SUM AVG OF SAL COMM ON DEPTNO REPORT
SET
COL
TTITLE
SET UP
SQL*PLUS
ENVIRONMENT
BTITLE
BREAK
SELECT ...
SQL
TTITLE OFF
COL DEPTNO CLEAR
COL EMPNO CLEAR
RESET
SQL*Plus
ENVIRONMENT
Etc.
SET
SET
SET
SET
ECHO OFF
PAGESIZE 24
FEEDBACK OFF
LINESIZE 78
COL A
COL B
COL C
COL D
COL E
COL F
COL G
COL H
BREAK
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
MILLER
SCOTT FORD
|
|
|
|
ADAMS SMITH
O baza de date relationala nu contine inregistrarile intr-un mod ierarhic. Oricum, unde exista o
legatura ierarhica intre liniile unei singure tabele, este un proces numit 'parcurgere de arbore'
care face posibil ca ierarhia sa fie construita.Ierarhia poate fi creata privind la legatura dintre
valorile echivalente in coloanele EMPNO si MGR(Aceasta legatura a fost deja exploa- tata cu
join-ul unei tabele cu ea insesi). Numarul MGR al unui angajat este EMNO-ul sefului sau.
Cand este realizata o parcurgere de arbore, nu va asteptati sa vedeti rezultatul cererii
asemanator cu figura afisata mai sus. Numerele LEVEL (de nivel) sunt stabilite cand apare
parcurgerea arborelui si reprezinta cat de indepartate sunt nodurile (liniile) de radacina (nodul
de start).
Pentru a construi un arbore de traversare din tabela EMP, introduceti:
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL;
Comanda
Descriere
--------------SELECT
LEVEL
nod
FROM
WHERE
timpul
CONNECT BY
intre
PRIOR
arbo-
atunci
primele,
parcurgerii.
PRIOR
in
START WITH
Oricum, este recomandat sa nu folositi clauza ORDER BY la parcurgerea arbo- relui pentru ca
ordonarea implicita a arborelui poate fi distrusa. In exemplul de mai jos, ordinea in care liniile
lui SCOTT, ADAMS, FORD si SMITH sunt afisate s-a schimbat, si ADAMS pare sa se
raporteze la FORD cand SCOTT este de fapt seful sau. Iesirea (rezultatul) nu reflecta ierarhia
"adevarata".
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO = MGR START WITH MGR IS NULL
ORDER BY DEPTNO;
Parcurgerea arborilor
TERMINOLOGIE
Sunt cativa termeni mai degraba neobisnuiti cand parcurgeti arborele. Nu este nevoie sa-i
amintim pe toti, decat pentru informatie:
NODE
ROOT
PARENT
inferior
CHILD
BRANCH
Chirurgia arborelui
Clauzele WHERE si CONNECT pot fi folosite pentru a curata arborele, care controleaza ce
noduri sunt afisate. Daca clauza WHERE este folosita pentru a elimina un nod, atunci doar
acel nod este eliminat. Daca restrictia apare in clauza CONNECT BY atunci intreaga ramura
este eliminata.
In exemplul urmator, numai linia SCOTT este eliminata, fiii sai sunt inca procesati.
BREAK ON DEPTNO SKIP 1
SELECT LEVEL, DEPTNO, ENAME, JOB, SAL
FROM EMP WHERE ENAME != 'SCOTT'
CONNECT BY PRIOR EMPNO = MGR
START WITH MGR IS NULL;
Notati ca de aceasta data ambele linii, parinte (SCOTT) si fiu (ADAMS), au fost excluse.
Alte utilizari ale parcurgerii arborilor
Organizarea tabelelor nu este singura aplicatie a unei cereri structura- te pe arbore. Clauza
CONNECT BY poate fi folosita de asemenea in:
CAPITOLUL 12
In acest capitol, discutam aspectele logice ale tabelelor si coloanelor si commenzile necesare
pentru a construi tabele cu Constrangeri de Integri- tate. Acesta este primul din doua capitole
care acopera subsetul comenzilor SQL cunoscut ca Limbajul de Definire a Datelor(DDL).
Structuri de date ORACLE
In acest curs vom discuta aspectele logice de creare a tabelelor.Consi- deratiile fizice sunt
acoperite in celelalte cursuri.Desi tabelele pot fi create fara a da informatii de asezare fizice,
ar trebui notat ca un utili- zator ORACLE trebuie sa fi primit privilegiul de CREATE TABLE
de catre admi- nistratorul bazei de date si sa aiba alocat ceva spatiu de tabela pentru a crea
tabele.
In general, structurile de date ORACLE pot fi rezumate dupa cum urmeaza.
Tabelele pot capata automat mai mult spatiu daca dimensiunea i- nitiala
este umpluta.
Limbajul de Definire a Datelor (LDD)
LDD este un subset al comenzilor SQL folosit pentru a crea, modifica sau muta
structurile bazei de date ORACLE, si deasemenea sa inregistreze informatii in
Dictionarul de Date (acesta este discutat mai tarziu).
Denumirea unei tabele
Numele pe care-l alegeti pentru o tabela trebuie sa urmeze regulile standard pentru
numirea unui obiect al unei baze de date ORACLE.
1. Numele trebuie sa inceapa cu o litera, A-Z sau a-z.
2. Poate contine litere, numerale si caracterele speciale underscore (_).
Caracterele $ si # sunt deasemenea legale, dar folosirea lor este
descurajata.
3. Numele este acelasi indiferent daca sunt folosite litere mari sau
mici, de exemplu, EMP, emp, si eMp sunt toate aceeasi tabela.
4. Poate fi de maxim 30 caractere in lungime.
5. Numele nu trebuie sa duplice numele altui obiect din contul
dumneavoastra.
VALID ?
-------
EMP85
da
85EMP
FIXED_ASSETS
da
FIXED ASSETS
UP DATE
Ar trebui sa folositi nume de descriere pentru tabele si alte obiecte ale bazei de date. Folositi
acelasi nume sa descrie aceeasi entitate in doua tabele diferite. De exemplu, coloana cu
numarul departamentului este numita DEPTNO in ambele EMP si DEPT.
Crearea unei tabele
Creati o noua tabela folosind comanda CREATE TABLE. Una dintre cele mai simple forme a
acestei comenzi este cand informatia de baza pentru fiecare coloana este definita impreuna cu
tipul ei de data si dimensiunea.
Sintaxa: CREATE TABLE nume tabela
(nume coloana tip(dimensiune),
nume coloana tip(dimensiune),
...);
Exemplu: CREATE TABLE DEPT
(DEPTNO NUMBER(2),
DNAME
VARCHAR2(12),
LOC
VARCHAR2(12));
Cand creati o tabela trebuie sa specificati fiecare tip de data al co- loanei. Tabela de mai jos
arata cele mai importante tipuri de date.
Tipul de data poate fi urmat de unul sau mai multe numere in paranteze care dau informatii
despre latimea coloanei. Latimea coloanei determina la- timea maxima pe care valorile in
coloana pot s-o aiba. VARCHAR2 trebuie sa aiba o dimensiune, dar cele implicite sunt
disponibile.
Tabela de mai jos arata tipurile de date principale in ORACLE7.
Tip de date
----------VARCHAR2(w)
LungiCHAR(w)
Descriere
--------Sir de caractere de lungime maxim w.
mea maxima este de 2000 caractere.
Sir de lungime fixa w. Lungimea implicita
NUMBER(w)
NUMBER(w,s)
semnifiScala
inregistraDATE
inainte
deasemenea
te in dreapta punctului.
Valorile datei din 1 Ianuarie 4712
de Hristos pana in 31 Decembrie 4712 dupa
Hristos. Informatia de timp este
stocata.
LONG
1.
LONG
pe tabela.
RAW si
LONG RAW
NOTE:
NUMBER(8,3)
VARCHAR2(1000)
CHAR(80)
EMP
NUMBER(4) NOT NULL,
VARCHAR2(10),
VARCHAR2(10),
NUMBER(4),
DATE,
NUMBER (7,2),
NUMBER (7,2),
NUMBER (2) NOT NULL);
Comanda DESCRIBE a SQL*PLUS-ului poate fi folosita pentru a lista detal ale coloanelor
create intr-o tabela:
DESCRIBE EMP
In exemplul de mai sus, veti observa ca definitiile pentru coloanele EMPNO si DEPTNO sunt
urmate de NOT NULL. Aceasta ne asigura ca valoril nule sunt permise pentru aceste coloane,
de cand aceste coloane servesc ca chei pentru operatii pe aceasta tabela. Coloanele fara
constrangerea NOT NULL permit valori nule.
NOT NULL este una dintre constrangerile de integritate care pot fi defi- nite.
OPTIUNEA DEFAULT
Unei coloane ii poate fi data o valoare implicita prin optiunea DEFAULT. Aceasta previne
aparitia de null-uri (sau erori, daca NOT NULL este specifi- cata) daca o linie este inserata
fara o valoare din coloana.Valorile implici- te pot fi literali, o expresie, dar nu numele altei
coloane. Functii ca SYSDATE si USER sunt valide.
De exemplu:
HIREDATE DATE DEFAULT SYSDATE,
SAL NUMBER (7,2) DEFAULT 0
Constrangeri de integritate
Oracle permite constrangerilor de integritate sa fie definite pentru ta- bele si coloanelor sa
forteze reguli sigure, inauntrul unei tabele sau intre tabele.
Constrangerile sunt folosite:
pentru a preveni stergerea unei tabele daca sunt posesiuni din alte tabele.
prin unelte sigure Oracle, ca Oracle Forms, pentru a furniza reguli pentru
utilizarea intr-o aplicatie.
Constrangerile pot fi adaugate unei tabele dupa crearea ei si deasemenea temporar dezactivate
(vezi comanda ALTER TABLE in capitolul urmator).Toate detaliile despre constrangeri sunt
stocate in Dictionarul de Date. Fiecarei constrangeri ii este repartizat un nume. Iti este mai
usor sa suplimentezi una tu singur, astfel ca poate fi mai usor referita mao tarziu, dar daca nu,
atunci un nume este generat automat pe forma:
SYS_Cn
unde n este un numar unic. Cuvantul cheie CONSTRAINT iti permite sa numesti o
noua constrangere tu insuti.
Tipuri de constrangeri
NULL/NOT NULL
UNIQUE
PRIMARY KEY
CHECK
Constrangerea UNIQUE
Aceasta desemneaza o coloana sau o combinatie de coloane ca o cheie uni- ca.Doua linii in
aceeasi tabela nu pot avea aceeasi valoare pentru aceasta cheie.NULL-urile sunt permise daca
cheia unica este bazata pe o singura co- loana.
Sintaxa constrangerii de tabela :
[CONSTRAINT nume constrangere] UNIQUE (Coloana, Coloana, ...)
Ca si la cheile unice, o cheie primara forteaza unicitatea unei coloane sau combinatii de
coloane implicate si un index unic este creat pentru a con- duce aceasta. Totusi poate fi o
singura cheie primara pe o tabela, si aceasta este cunoscuta ca fiind cheia definitiva prin care
liniile in tabela sunt i- dentificate individul. NULL-urile nu sunt permise in coloanele de chei
prima- re.
Sintaxa constrangerii de tabela :
[CONSTRAINT nume constrangere] PRIMARY KEY (Coloana, Coloana, ...)
Notati ca aceeasi combinatie de coloane nu poate fi folosita si pentru o cheie primara si pentru
una unica. Urmatorul exempludefineste DEPTNO ca o cheie primara folosind o constrangere
de coloana:
CREATE TABLE DEPT
(DEPTNO NUMBER(2) CONSTRAINT DEPT_PRIM PRIMARY KEY, ...)
Cheile externe furnizeaza reguli de integritate de referinta inauntrul unei tabele sau intre
tabele. O cheie exeterna este folosita intr-o relatie cu fiecare cheie primara sau unica oriunde
si poate fi folosita, de exemplu, pentru a preveni stergerea unui departament in DEPT daca
angajatii exista cu acelasi numar de departament in EMP.
Sintaxa constrangerii de tabela :
[CONSTRAINT nume constrangere] FOREIGN KEY (Coloana, Coloana, ...)
REFERENCES tabela (Coloana, Coloana, ...)
Notati ca, cuvintele 'FOREIGN KEY' nu sunt folosite versiunea constrangerii de coloana a
sintaxei.
Exemplul 1
-----------|
DEPT
| (parinte)
-----------|
|
/|\
DEPTNO
-----------|
EMP
|
(fiu)
------------
Pentru a stabili relatia dintre EMP si DEPT astfel incat EMP.DEPTNO este che- ia externa, si
fiecare angajat trebuie sa aiba un numar valid de departament care este cunoscut in DEPT:
CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO)
REFERENCES DEPT(DEPTNO)
Ca rezultat al constrangerii de tabela de mai sus, (care ar fi putut la fel de bine sa fie definita
ca o constrangere de coloana), un departament in DEPT nu ar fi putut fi sters daca liniile
exista in EMP cu aceeasi valoare DEPTNO. Alternativ, puteti cere ca angajatii corespunzatori
sa fie stersi a- utomat daca departamentul parinte in DEPT este sters. Aceasta este realizata
adaugand clauza ON DELETE CASCADE.
CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO)
REFERENCES DEPT(DEPTNO) ON DELETE CASCADE
Exemplul 2
-------------EMPNO
|
EMP
| . .
-------------.
\|/
.
.
.
.
.
MGR
.
.
. .
Sintaxa:
[CONSTRAINT nume constrangere] CHECK (conditie)
con-
ENAME VARCHAR2(10)
CONSTRAINT ENAME_CONS
CHECK(ENAME=UPPER(ENAME)),
JOB VARCHAR2(10),
MGR NUMBER(4)
CONSTRAINT EMP_MGR
REFERENCES EMP(EMPNO),
CONSTRAINT SAL_CONS
NOT NULL,
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
CONSTRAINT DEPTNO_CONS
NOT NULL,
CONSTRAINT
Pentru a crea o tabela DEPT30 care tine numerele angajatilor, nume, joburi
si salariile angajatilor din departamentul 30, introduceti:
DESC DEPT30
grad, introduceti:
DESC EMP_SALS;
Pentru a afisa continutul tabelei EMP SALS, introduceti:
SELECT
FROM
,/pre>
CAPITOLUL 12
*
EMP_SALS;
Atelier
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CAPITOLUL 12 -Solutii
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CAPITOLUL 13
Management-ul de tabela si Dictionarul de Date
In acest capitol secund al Limbajului de Definire a Datelor vom vedea comenzile pentru
modificarea si mutarea tabelelor si constrangerilor lor. Deasemenea, vom vedea cum
informatii despre baza de date pot fi extrase din Dictionarul de Date.
Modificarea unei tabele
Clauza ADD
Folositi cuvantul cheie ADD pentru a adauga o coloana si/sau constran- geri pentru o tabela
existenta. Pentru a adauga o coloana tabelei EMP care va tine numele sotului angajatului,
introduceti:
ALTER TABLE EMP
ADD (SPOUSES_NAME CHAR (10));
Table altered.
Pentru a vedea descrierea tabelei revizuite, introduceti:
DESCRIBE EMP;
Pentru a adauga o constrangere de tabela unei tabele existente, care specifi- ca daca salariul
lunar nu trebuie sa depaseasca 5000$, introduceti:
ALTER TABLE EMP
ADD(CHECK(SAL <=5000));
,/pre>
Clauza MODIFY
Folositi cuvantul cheie MODIFY pentru a modifica definitia unei
coloane
existente.
DESCRIBE EMP;
1.
2.
3.
4.
Nu puteti adauga o noua coloana care este NOT NULL. Faceti-o null,
umpleti-o complet si apoi schimbati-o in NOT NULL.
5.
6.
7.
8.
9.
10.
11.
Clauza DROP
Folositi clauza DROP pentru a muta o constrangere din alta tabela.
Sintaxa:
ALTER TABLE nume tabela
DROP
[CONSTRAINT nume constrangere ] [CASCADE]
[PRIMARY KEY
]
[UNIQUE (coloana, coloana, ...)]
De exemplu:
De exemplu:
Clauza ENABLE/DISABLE
Aceasta clauza a comenzii ALTER TABLE permite constrangerilor sa fie
facute posibile sau dezactivate fara a le elimina sau recrea.
Sintaxa:
[DISABLE]
[ENABLE ]
[CASCADE]
Ca si la clauza DROP, adaugarea cuvantului cheie CASCADE semnifica ca constrangerile dependente sunt deasemenea afectate.
De exemplu:
Sintaxa:
DROP TABLE nume tabela [CASCADE CONSTRAINTS]
De exemplu:
Note:
Orice VIEWS sau SYNONYMS vor ramane, dar vor deveni invalide.
Comanda COMMENT
Folositi comanda COMMENT pentru a insera un comentariu pana la 255 de
caractere, despre o tabela sau coloana, in dictionarul de date.
Comanda RENAME
Comanda RENAME este folosita de creatorul lui TABLES, VIEWS si
SYNONYMS
pentru a scimba numele obiectului bazei de date.
Sintaxa:
TRUNCATE TABLE nume tabela [REUSE STORAGE]
Optiunea REUSE STORAGE pastreaza spatiul din liniile sterse pentru
reutilizarea tabelei. Implicit, acest spatiu este eliberat.
Dictionarul de Date este una din partile cele mai importante ale lui
ORACLE RDBMS. Consta dintr-un set de tabele si vederi care furnizeaza un
ghid
de referinta accesibil doar la citire, despre baza de date. Dictionarul de
Date va va spune:
Dictionarul de Date este creat cand este creata baza de date. Oricand baza
de
date este in operatii, Dictionarul de Date este actualizat de ORACLE
RDBMS.
Utilizatori
Accesul la obiectele Dictionarului de Date este prin SQL. Declaratiile
SELECT pot fi folosite pentru a cere informatii din Dictionarul de Date.
RDBMS
Nici un utilizator nu ar trebui sa schimbe vreodata (insereze, actualizeze
sau stearga) nici o linie sau obiect in Dictionarul de Date, este probabil
sa
compromita integritatea datelor. RDBMS actualizeaza automat Dictionarul de
Date pentru a reflecta schimbarile structurii bazei de date, permisiuni,
revizii si alte date. In timpul operatiei bazei de date, RDBMS citeste
deasemenea Dictionarul de Date pentru a descoperi obiectele care exista si ca
utilizatorii sa aiba acces la ele.
Tabele
Baza Dictionarului de Date sau fundamentul tabelelor sunt primele obiecte ce trebuie create in baza de date, pentru ca ele trebuie sa fie
prezente pentru toate obiectele ce trebuie create. Tabelel Dictionarului de
Date
sunt create automat de declaratia SQL CREATE DATABASE si nu sunt in
posesia
utilizatorului SYS. Tabelele de baza sunt rareori accesate direct,
deoarece
informatia din ele nu este usor de inteles.
Vederi
USER_xxxxx
Obiectele posedate de utilizator pot fi accesate. De eexemplu, vederile cu acest prefix permit utilizatorului
sa afiseze informatii despre tabelele create de
utilizator si privilegiile acordate de utilizator.
le
ALL_xxxxx
Utilizatorii pot accesa obiecte la care le-au fost permise
drepturile de acces, in plus fata de obiectele pe care
poseda.
DBA_xxxxx
Pentru utilizare de catre utilizatori cu privilegiu DBA pot accesa orice obiect in baza de date.
Unele dintre vederile Dictionarului de Date nu utilizeaza prefixele
DICTIONARY
Listeaza toate tabelele, vederile, Dictionarului
de Date, accesibile utilizatorului.
DICT_COLUMNS
Listeaza coloanele in dictionarul obiectelor accesibile utilizatorului.
CONSTRAINT_DEFS
Listeaza toate definitiile de constrangeri intro-
Vederea DICTIONARY
DICTIONARY listeaza toate obiectele Dictionarului de Date accesibile
utilizatorului cu o scurta descriere a obiectului.
Comentarii
----------
ALL_CATALOG
secven-
ALL_COL_COMMENTS
vederi-
ALL_COL_PRIVS
utilizaproprietar,
le accesibile
Permisiuni pe coloanele pentru care
torul este "grantor", "grantee",
sau un rol posibil sau PUBLIC este
"grantee"
ALL_COL_PRIVS_MADE
utiliza-
ALL_COL_PRIVS_RECD
utiliza"gran-
tee"
ALL_CONSTRAINTS
accesiALL_CONS_COLUMNS
ALL_DB_LINKS
utiliza-
ALL_DEF_AUDIT_OPTS
ALL_DEPENDENCIES
acce-
ALL_ERROR
care
sibile utilizatorului
ALL_INDEXES
accesibile
ALL_IND_COLUMNS
acce-
ALL_OBJECTS
utilizatorului
sibile
Obiectele accesibile utilizatorului
ALL_SEQUENCES
utili-
ALL_SNAPSHOTS
utilizatorul
ALL_SOURCE
u-
zatorului
ALL_SYNONYMS
utilizatorului
ALL_TABLES
utilizatoru-
ALL_TAB_COMMENTS
u-
ALL_TAB_COLUMNS
tilizatorului
ALL_TAB_PRIVS
utilizatoproprietar,
ALL_TAB_PRIVS_MADE
pe
ALL_TAB_PRIVS_RECD
utilizato"gran-
ALL_TRIGGERS
curent
ALL_TRIGGER_COLS
utiliza-
uti-
ALL_USERS
de
ALL_VIEWS
utilizatorilor
AUDIT_ACTIONS
urma-
CAT
Sinonim cu USER_CATALOG
CLU
Sinonim cu USER_CLUSTERS
COLS
Sinonim cu USER_TAB_COLUMNS
COLUMN_PRIVILEGES
utilizatosau
DICT
DICTIONARY
Dictiona-
Sinonim cu DICTIONARY
Descrierea tabelelor si vederilor
rului de Date
GLOBAL_NAME
IND
INDEX_HISTOGRAM
INDEX_STATS
Statistica pe arbori-B
OBJ
RESOURCE_COSTS
ROLE_ROLE_PRIVS
ROLE_SYS_PRIVS
ROLE_TAB_PRIVS
SEQ
SESSION_PRIVS
setat
SESSION_ROLES
posi-
SYN
TABLE_PRIVILEGES
un
USER_AUDIT_OBJECTS
deanume:
roll-
USER_AUDIT_SESSION
USER_AUDIT_STATEMENT
referitoare
neexamina-
USER_AUDIT_TRAIL
u-
USER_CATALOG
poseda-
USER_CLUSTERS
USER_CLU_COLUMNS
TABLENAMECOMMENTS
USER_COL_COMMENTS
ve-
USER_COL_PRIVS
utiliza"gran-
USER_COL_PRIVS_MADE
obiectelor
USER_COL_PRIVS_RECD
utilizato-
USER_CONSTRAINTS
uti-
USER_CONS_COLUMNS
USER_DB_LINKS
utili-
USER_DEPENDENCIES
uti-
USER_ERRORS
posedate
USER_EXTENTS
utilizato-
USER_FREE_SPACE
accesi-
USER_INDEXES
USER_IND_COLUMNS
utilizatoruUSER_OBJECTS
zator
lizatorilor
de utilizator
rului
bile utilizatorului
USER_OBJECT_SIZE
obiecte
USER_OBJ_AUDIT_OPTS
vede-
USER_RESOURCE_LIMITS
USER_ROLE_PRIVS
USER_SEGMENTS
USER_SEQUENCES
USER_SNAPSHOTS
ve-
USER_SNAPSHOTS_LOGS
uti-
USER_SOURCE
utiliza-
USER_SYNONYMS
USER_SYS_PRIVS
utilizatorului
dea
lizator
torului
Sinonimele private ale utilizatorului
Privilegii de sistem permise
curent
USER_TABLES
USER_TABLESPACES
USER_TAB_COLUMNS
clustere-
USER_TAB_COMMENTS
pose-
USER_TAB_PRIVS
utilizato-
"gran-
lor utilizatorului
date de utilizator
USER_TAB_PRIVS_MADE
u-
USER_TAB_PRIVS_RECD
utilizato-
USER_TRIGGER_COLS
utilizatoru-
USER_TS_QUOTAS
USER_USERS
USER_VIEWS
Sinonim
-------
Descriere
----------
DICTIONARY
Dict
USER_OBJECTS
Obj
USER_CATALOG
accesi-
Cat
USER_TABLES
USER_TAB_COLUMNS
utili-
Tabs
Cols
USER_COL_COMMENTS
vede-
u-
USER_TAB_COMMENTS
USER_SEQUENCES
utili-
Seq
USER_SYNONYM
Syn
USER_VIEWS
USER_INDEXES
utilizatoru-
Ind
ALL_OBJECTS
ALL_TAB_COLUMNS
vederi-
SQL>desc user_objects
O descriere a vederii DICTIONARY urmeaza:
SQL>desc dict
Notati ca sinonimul abreviat DICT poate fi folosit cu referire la
DICTIONARY.
Odata ce stiti structura unei tabele/vederi, puteti selecta informatia
dorita:
SELECT
FROM
WHERE
SQL pentru:
cutiei
CAPITOLUL 13
Date
Atelier
1.
2.
3.
4.
5.
ASSIGNMENTS.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
caracterele "EMP".
25.
CAPITOLUL 13
1.
Solutii
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Ati fi putut alternativ sa adaugati o cheie primara, pana cele doua
coloane
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
CAPITOLUL 14
Limbajul de manipulare a datelor
Acest capitol explica cum se fac schimbari liniilor intr-o tabela, cum se adauga noi linii sau
cum se sterg. Este introdus conceptul de tranzactie. Consistenta la citire este deasemenea
discutata.
Inserarea de noi linii intr-o tabela
Comanda INSERT este folosita pentru a adauga linii unei tabele Sintaxa comenzii INSERT
este:
INSERT
Este posibila inserarea unei noi linii cu valori in fiecare coloana, in care caz lista de coloane
nu este ceruta. Este recomandat ca COLUMN LIST sa fie intotdeauna specificata. Daca lista
nu este specificata, software-ul va cere modificari oriunde definitia tabelei este modificata.
Pentru a insera un nou departament, introduceti:
INSERT
VALUES
INSERT
VALUES
Dupa cum am mentionat anterior, INSERT este o comanda pentru o singura lini- e. Folosind
variabile de substitutie este posibil sa se mareasca viteza de intrare.
INSERT
VALUES
Cand se insereaza o valoare DATE, formatul DD-MON-YY este de obicei folo- sit. Cu acest
format secolul implicit este secolul 20 (19nn). Data deasemenea contine informatii de timp,
care daca nu sunt specificate, implicit devin miezul noptii (00:00:00).
Daca o data trebuie introdusa in alt secol si un timp specific este cerut deasemenea, folositi
functia TO_DATE:
INSERT
VALUES
INTO EMP
(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)
(7658,
'MASON',
'ANALYST',
7566,
TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'),
3000,
NULL,
20);
Aceasta forma a declaratiei INSERT va permite sa inserati cateva linii intr-o tabela unde
valorile sunt derivate din continutul tabelelor existente in baza de date.
Pentru a copia toate informatiile din departamentul 10 in tabela D10HISTORY, introduceti:
INSERT
INTO D10HISTORY
(EMPNO,ENAME,SAL,JOB,HIREDATE
FROM EMP
WHERE DEPTNO=10;
UPDATE
SET
[WHERE
tabela[alias]
coloana [, coloana...] = {expresie, subcerere}
conditie];
De exemplu:
Pentru a actualiza linia lui Scott, introduceti:
UPDATE
SET
WHERE
EMP
JOB='SALESMAN',
HIREDATE = SYSDATE,
SAL = SAL*1.1
ENAME = 'SCOTT';
1 record updated.
Daca clauza WHERE este omisa, toate liniile din tabela vor fi actualizate. Este posibil sa
folositi subcereri inlantuite si subcereri corelate in decla- ratia UPDATE.
Sa presupunem ca ati avut o cifra noua de comisioane pentru angajati siguri. De exemplu,
tabela COMMISSION de mai jos este folosita pentru a actualiza li- nii sigure ale tabelei EMP:
COMMISSION
EMPNO
-----7499
7654
7844
7844
7844
EMP
COMM
---1100
500
3500
2000
1500
EMPNO
----7499
7654
7844
COMM
----300
1400
0
Schimbarile listate in tabela COMMISSION pot fi aplicate tabelei EMP, folosind o subcerere
corelata si o subcerere inlantuita, ca mai jos:
Exemplul 1:
UPDATE EMP
SET COMM = (SELECT COMM FROM COMMISSION C
WHERE C.EMPNO = EMP.EMPNO)
WHERE EMPNO IN (SELECT EMPNO FROM COMMISSION);
3 records updated.
Tabela COMMISSION poate contine mai mult decat o intrare pentru fiecare angajat, ca in
exemplul de mai jos :
EMPNO
----7499
7654
7654
7844
7844
COMISSION
COMM
---1100
500
100
2000
1500
Daca doriti sa inlocuiti (REPLACE) valorile din tabela EMP pentru comision cu comisionul
TOTAL pentru fiecare angajat listat in tabela COMISSION, atunci puteti utiliza urmatorul
SQL :
Exemplul 2:
UPDATE EMP
SET COMM = ( SELECT SUM(COMM) FROM COMISSION C
WHERE C.EMPNO = EMP.EMPNO)
WHERE EMPNO IN (SELECT EMPNO FROM COMISSION);
3 inregistrari modificate.
Tabela EMP reflecta comisioanele modificate :
EMP
EMPNO
----7499
7654
7844
COMM
---1100
600
3500
O alta posibilitate este cea de a adauga (ADD) la valorile comisionului in tabela COMISSION
la comisioanele existente in tabela EMP mai mult decat inlocuirea lor. Exemplul 3 realizeaza
acest lucru :
Exemplul 3:
UPDATE EMP
SET COMM = ( SELECT SUM(COMM) + EMP.COMM
FROM COMISSION C
WHERE C.EMPNO = EMP.EMPNO)
WHERE EMPNO IN (SELECT EMPNO FROM COMISSION);
Tabela EMP reflecta comisioanele schimbate :
EMP
EMPNO
----7844
7499
7654
COMM
---3500
1400
2000
Comanda DELETE permite stergerea unei sau mai multor linii dintr-o tabela.
DELETE
[WHERE
FROM tabela
conditie];
Pentru a sterge toate informatiile despre departamentul 10 din tabela EMP, introduceti :
DELETE
WHERE
FROM EMP
DEPTNO = 10;
Daca clauza WHERE este omisa, atunci toate liniile vor fi sterse.
TRANZACTII
Procesarea unei Tranzactii
Ce este o tranzactie ?
O tranzactie este o operatie asupra unei baze de date care implica una sau mai multe
modificari in una sau mai multe tabele.
Exista doua clase de tranzactii. Tranzactii DML care contin un numar oarecare de blocuri
DML si pe care ORACLE le trateaza ca o singura entitate sau o singura unitate logica de
lucru, si tranzactii DDL care contin un singur bloc DDL.
Nu pot exista situatii "jumatate de drum" in timpul executiei unei tranzactii, asa incat unele
modificari specificate in tranzactie sa fie aplicate bazei de date si altele nu. Pentru fiecare
tranzactie ori toate modificarile sunt aplicate bazei de date, ori nici una din modificari nu este
indeplinita ( sunt toate abandonate - discarded ).
O tranzactie incepe cand prima comanda executabila DML sau DDL este intalnita si se
termina in una din urmatoarele situatii :
Intalneste COMMIT/ROLLBACK
Eroare sistem
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.
Cand o tranzactie este intrerupta de o eroare serioasa, de exemplu o eroare de sistem, intreaga
tranzactie este anulata. Aceasta previne erorile datorate modificarilor nedorite asupra datelor,
si realizeaza intoarcerea tabelelor la starile de dupa ultimul COMMIT. In acest fel SQL*Plus
protejea- za integritatea tabelelor.
Anularea automata este cauzata cel mai des de catre o eroare de sistem, ca de exemplu o
resetare a sistemului sau o cadere de tensiune. Erorile de tastare a comenzilor, ca de exemplu
tastarea gresita a unor nume de coloane sau incercarile de a realiza operatii neautorizate
asupra tabelelor altor utilizatori, nu intrerup tranzactia si nu realizeaza anu- larea automata.
Aceasta se datoreaza faptului ca aceste erori sunt detectate in cursul compilarii (de catre
PARSER) ( cand un bloc SQL este scanat si verificat), si nu in timpul executiei.
O tranzactie noua este lansata urmand unui COMMIT sau ROLLBACK - adica cand primul
bloc executabil DML sau DDL este intalnit.
Semnificatia Tranzactiilor
ORACLE asigura consistenta datelor bazata pe tranzactii. Tranzacti ile dau utilizatorului mai
multa flexibilitate si control la lucrul asupra datelor, si asigura consistenta datelor in cazul
unei erori a procesului utilizator sau a unei erori de sistem.
Tranzactiile ar trebui sa contina doar acele comenzi DML care realizeaza o singura modificare
asupra datelor. De exemplu un transfer de fonduri (sa spunem 1000$) intre 2 conturi ar trebui
sa implice un debit al unui cont de 1000$ si un credit al altui cont de 1000$. Ambele actiuni ar
trebui sa se incheie cu succes sau sa dea eroare impreuna. Creditul nu ar trebui executat fara
debit.
Controlul Tranzactiilor cu Instructiuni SQL
Urmatoarele instructiuni SQL sunt utilizate cand apar executii (commit) sau refaceri
(rollback) :
COMMIT[WORK]
SAVEPOINT nume_savepoint
COMMIT[WORK]
Sintaxa : COMMIT[WORK];
Termina tranzactia
Blocurile DDL cauzeaza mereu executii (commit) in timpul executiei lor. Daca introduceti un
bloc DDL dupa cateva blocuri DML, blocul DDL cauzeaza aparitia unui commit inaintea
propriei executii, incheind tranzactia curenta. Astfel daca blocul DDL este executat pana la
capat, este si inregistrat.
SAVEPOINT
Sintaxa : SAVEPOINT nume_savepoint
Exemplu :
SAVEPOINT terminare_actualizari
se termina tranzactia
O parte a unei tranzactii poate fi anulata. Daca un singur bloc DML da eroare, ORACLE V6
va intoarce inapoi doar acel bloc. Aceasta facilitate este cunoscuta ca STATEMENT LEVEL
ROLLBACK. Intoarcerea la nivel de bloc inseamna daca un singur segment DML da eroare
la executia unei tranzactii, efectul lui este anulat, dar schimbarile realizate de precedentul bloc
DML in tranzactie nu vor fi anulate si pot fi inscrise (COMMIT) sau intoarse (ROLLBACK)
explicit de catre utilizator.
Daca blocul este unul de tip DDL, inscrierea (commit) care precede imediat acest bloc nu este
anulata (schimbarile au fost facute deja permanen- te). ORACLE realizeaza intoarcerea la
nivel de bloc prin crearea unui punct de salvare implicit inainte de executarea fiecarei
comenzi DML. Utilizatorul nu poate referi caest punct de salvare in mod direct.
Astfel, daca va intoarceti la un punct de salvare, atunci:
Intoarceri Implicite
Intoarcerile implicite apar cand se intalnesc terminari anormale ale executiei (de exemplu
cand se intrerupe un proces utilizator). Intoarcerile implicite la nivel de bloc apar la eroarea de
executie a unui bloc.
Este recomandat ca tranzactiile sa se termine explicit utilizand COMMIT[WORK] ori
ROLLBACK[WORK].
Urmatorul exemplu demonstreaza utilizarea unui punct de salvare, si a instructiunilor
ROLLBACK si COMMIT.
INSERT INTO DEPT
VALUES
( 50, 'TESTING', 'LAS VEGAS' );
SAVEPOINT insert_done;
UPDATE DEPT
SET DNAME = 'MARKETING';
ROLLBACK TO insert_done ( modificarile sunt abandonate );
UPDATE DEPT
SET DNAME = 'MARKETING' ( revizuim comanda UPDATE )
WHERE DNAME = 'SALES';
COMMIT;
AUTOCOMMIT
COMMIT sau ROLLBACK pot fi date manual sau automat prin utilizarea optiunii
AUTOCOMMIT a comenzii SET. Optiunea AUTOCOMMIT controleaza cand schimbarile
intr-o baza de date sunt facute permanente.
Exista doua setari :
COMANDA + DESCRIEREA
SET AUTO[COMMIT] ON
COMMIT este utilizat automat la fiecare INSERT, UPDATE sau DELETE
SET AUTO[COMMIT] OFF
COMMIT poate fi utilizata de utilizator explicit. De asemenea, COMMIT se
executa cand apare comanda Z (specifica VAX), cand se executa comenzile
DROP, ALTER sau CREATE, sau la iesirea din SQL*Plus. ROLLBACK poate fi
executat explicit de catre utilizator pentru refacerea bazei de date.
Consistenta la Citire
Utilizatorii bazelor de date fac doua tipuri de accesuri asupra bazelor de date:
Tranzactii de Citire
COMMIT;
NOTES
PROJID
P_DESC
1
WRITE C030 COURSE
2
PROOF READ
P_START_DATE
P_END_DATE
BUDGET_AMOUNT
MAX_NO_STAFF
COMMENTS
02-JAN-88
07-JAN-88
500
1
BE CREATIVE
01-JAN-89
10-JAN-89
600
1
YOUR CHOICE
1
7369
01-JAN-88
03-JAN-88
50.00
WR
15
1
7902
04-JAN-88
07-JAN-88
50.00
WR
20
2
7844
01-JAN-89
10-JAN-89
45.50
PF
30
REZOLVARI:
1.
2.
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.
Ariile acoperite sunt :
Blocarea normala
DEADLOCK
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.
Blocarile sunt utilizate pentru a atinge doua scopuri importante:
CONCURENTA DATELOR
Utilizatorii care vor sa scrie date asteapta doar ulilizatorii care modifica
aceleasi linii.
CONSISTENTA LA CITIRE
Toate exceptand
Cereri
LOCK
cereri,RS,RX,S,
IN
SRX,X
si
blocurilor DDL
Row share
Acces exclusiv,
SELECT...FOR UPDATE,
-RSX
TABLE tabela IN
SHARE MODE
Row exclusive
UPDATE,INSERT,
-RXLOCK TABLE
Modificari,
RS,RX,S,SRX,
LOCK
cereri
ROW
Acces exclusiv
modificari
pentru citire/
RX,RS,
DELETE,
scriere,S,SRX,X
cereri
tabela
IN ROW
EXCLUSIVE MODE
Share row
Citirea tabelei
Blocare linii
LOCK
TABLE tabela
exclusive
in intregime,RX,
RS,cereri
IN
SHARE ROW
-SRXS,SRX,X
EXCLUSIVE MODE
--------------------------------------------------------------------------
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.
Blocarea implicita
Blocarile care apar in timpul unui DML normal, fara o cerere specifica de
blocare.
+
|
+
tabela
+--------------
+----------------------+
| Utilizator A
+--------------
|
|
UPDATE, INSERT
|
DELETE o linie
|
ROW
EXCLUSIVE
|
|
|
|
+
|
|
v
+
+----------------------+
|
|
# EXCLUSIVE
| <-------------+
+----------------------+
sau
|
|
|
|
|
|
|
|
+----------------------+
|
# EXCLUSIVE
| <-------------+
+----------------------+
+------+------|
+----------------------+
| Utilizator B
+--------------
UPDATE, INSERT
sau DELETE
Blocarile Datelor
Blocarile de tabele.
Sintaxa :
SELECT ...
FOT UPDATE [ OF coloana, coloana, ... ] [NOWAIT]
1. ROW LOCK(X)
2. TABLE LOCK(RS)
3. TABLE LOCK(RX)
Deadlock
Este foarte posibil intr-un mediu multi-utilizator, ca utilizatorii isi vor bloca
unii altora resursele. Este de asemenea posibil ca doi utilizatori sa sfarseasca
prin a-si bloca unul altuia resurse diferite. Aceasta situatie se numeste
DEADLOCK deoarece fiecare utilizator asteapta sesursele detinute de celalalt
utilizator.
De exemplu :
Tranzactia A
Tranzactia B
UPDATE EMP
SET SAL=1200
WHERE ENAME = 'SMITH';
UPDATE EMP
SET SAL=1000
WHERE ENAME = 'JONES';
UPDATE EMP
SET SAL=2200
WHERE ENAME = 'JONES';
UPDATE EMP
SET SAL=1350
WHERE ENAME = 'SMITH';
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.
Cand ORACLE detecteaza un deadlock, genereaza o eroare la unul dintre
participantii tranzactiei, si intoarce blocul curent al tranzactiei respective.
Aceasta rezolva deadlock-ul, astfel celalalt utilizator poate inca astepta pana
cand resursa este disponibila. Utilizatorul semnalizat ar trebui sa execute
explicit un ROLLBACK in tranzactie.
Deadlock-ul poate fi evitat daca utilizatorii care acceseaza aceleasi tabele
blocheaza tabelele in aceeasi ordine ca ceilalti. Ar trebui predefinita o ordine
de acces pentru toate tabelele in aplicatii si aplicatiile astfel construite incat sa
urmeze ordinea specificata. Daca aceasta ordine este urmata in toate aplicatiile,
probabilitatea de aparitie a dead-lock va fi minima.
Blocarile de date sunt eliberate de :
COMMIT / ROLLBACK
LOG OFF
Orice bloc explicit DDL.
ROWID (id. de linie) si Blocarea
COL ROWID VALOARE_NOUA IDENTIFICATOR_LINIE NOPRINT
SELECT ENAME, JOB, HIREDATE SAL, ROWID
FROM EMP
WHERE WNAME = 'SCOTT'
FOR UPDATE
ROWID
+--------------------+
| 00004C90.0001.0001 |
+--------------------+
UPDATE EMP
SET JOB = 'SALESMAN,
HIREDATE=SYSDATE,
SAL=1.1*SAL
WHERE ROWID='&ROW_IDENT'
ROWID
00004C90.0001.0001
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.
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 :
CREATE
AS
SELECT
FROM
WHERE
VIEW D10EMP
EMPNO,ENAME,SAL
EMP
DEPTNO = 10;
*
D10EMP
ENAME;
Pentru a crea o imagine complexa numita DEPT_SUMMARY, care contine functii de grup si
date din doua tabele :
CREATE
AS
SELECT
FROM
WHERE
GROUP
VIEW DEPT_SUMMARY
( NAME, MINSAL, MAXSAL, AVSAL )
DNAME, MIN(SAL), MAX(SAL), AVG(SAL)
EMP,DEPT
EMP.DEPTNO = DEPT.DEPTNO
BY DNAME;
De notat faptul ca numele coloanelor alternative au fost specificate pentru imagine. Aceasta
este o cerinta pentru cazul cand elementele SELECTate nu sunt conforme cu conventia
denumirilor din tabele / coloane, sau daca orice coloana din imagine este derivata dintr-o
functie sau expresie.
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 :
CREATE
AS
SELECT
FROM
WHERE
VIEW DEPT20
ENAME, SAL*12 ANNSAL
EMP
DEPTNO = 20;
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.
Utilizarea unei Imagini cu Operatii DML
Imaginile sunt facilitati puternice deoarece ele ne permit sa executam verificari de integritate
referentiale asupra datelor modificate prin utilizarea imaginilor.
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.
CREATE
AS
SELECT
FROM
WHERE
WITH
VIEW D10EMP
EMPNO, ENAME, DEPTNO
EMP
DEPTNO = 10
CHECK OPTION;
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 :
CREATE
AS
SELECT
FROM
WHERE
AND
AND
VIEW EMP_DATA
EMPNO, ENAME, JOB, MGR, SAL, DEPTNO
EMP
SAL BETWEEN 1000 AND 2000
MGR IN ( SELECT DISTINCT EMPNO
FROM EMP )
DEPTNO IN ( SELECT DEPTNO
WITH
FROM DEPT )
CHECK OPTION;
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 :
CREATE
AS
SELECT
FROM
WHERE
AND
AND
WITH
VIEW EMP_DETAILS
EMPNO, ENAME, JOB, DEPTNO
EMP
ENAME = USER
TO_CHAR(SYSDATE,'HH24') BETWEEN 9 AND 17
TO_CHAR(SYSDATE,'D')
BETWEEN 2 AND 6
CHECK OPTION;
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.
Cand accesati date, via o imagine, ORACLE executa urmatoarele operatii :
Odata ca imaginea a fost creata, trebuie sa se execute o cerere la Tabela Dictionarului de Date
numita USER_VIEWS ca sa se vada conanda view.
Acesti parametrii SETabili vor influienta afisarea imaginii text :
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.
Modificarea Datelor prin Imagini
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.
DELETE este interzis cand o imagine contine :
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 !
VIEW nume_imagine;
MAXIMUM
MINIMUM
SUM
NO_SALS
-------
-------
-----
--------
5000
1300
8750
3000
800
10875
2850
950
9400
ENAME
JOB
---------
-------
FORD
ANALYST
SAL
HIREDATE
MINIMUM
MAXIMUM
----
---------
-------
-------
3000
05-DEC-83
800
3000
CREATE
AS
SELECT
VIEW AGGREGATES
( DEPTNO, AVERAGE, MAXIMUM, MINIMUM, SUM,
NO_SALS, NO_COMMS )
DEPTNO,
AVG(SAL),
8.
9.
10.
11.
12.
13.
FROM
GROUP
MAX(SAL),
MIN(SAL),
COUNT(SAL),
COUNT(COMM),
EMP
BY DEPTNO;
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
SELECT
FROM
WHERE
AND
EMP.DEPTNO,
ENAME,
JOB,
SAL,
HIREDATE,
MINIMUM,
MAXIMUM,
AVERAGE
EMP, AGGREGATES AGG
EMP.DEPTNO = AGG.DEPTNO
EMP.EMPNO = & EMPNO;
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
CREATE
AS
SELECT
VIEW ASG_VAL
PROJID,
EMPNO,
A_START_DATE,
A_END_DATE,
BILL_RATE,
ASSIGN_TYPE,
HOURS,
FROM
ASSIGNMENTS
WHERE
A_START_DATE < A_END_DATE
AND
PROJID < 2000
AND
BILL_RATE <=
DECODE( ASSIGN_TYPE,'PF',50,'WT',60,70)
42.
AND
EMPNO IN
43.
( SELECT EMPNO FROM EMP )
44.
WITH
CHECK OPTION;
45.
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.
De exemplu, pentru a activa un rol care are parola "marigold" atasata :
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
fara roluri
Utilizatori
o
o
o
/|\
/|\
/|\
/^\
/^\
/^\
|
|
|
+----+--+-------+-------+
|
|
| |
| |
| +-----|-+--+--|-+-----|-+
| |
| |
| | | | |
| | +---|-|-+---|-|-++--|-|-+
/\+ |
/\+ |
/\+ |
/\+ |
\/--+
\/--+
\/--+
\/--+
DREPTURI
Acordarea de drepturi
utilizand roluri
o
/|\
/^\
\
\
o
o
Utilizatori
/|\
/|\
/^\
/^\
|
/
|
/
\
|
/
\
|
/
++---+---++
|
| <------------ ROL
+--+---+--+
| |
| |
+-------+ |
| +-------+
|
|
|
|
/\
/\ /\
/\
\/
\/ \/
\/
Privilegii
Schimbarea Parolei Utilizatorului
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 :
ALTER USER nume_utilizator IDENTIFIED BY parola
De exemplu :
ALTER USER glenn IDENTIFIED BY swordfish;
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
o un pachet (package)
drepturi
obiect
utilizator;
Tabelul de mai jos arata drepturile care pot fi acordate la tabele si imagini.
Drept
----SELECT
INSERT
UPDATE
DELETE
ALTER
INDEX
REFERENCES
Obiect
-----date in tebele sau imagini
linii in tabele sau imagini
linii sau coloane specificate intr-o tabela sau
imagine
linii dintr-o tabela sau imagine
definitii de coloane in tabele
indexare la o tabela
se refera la o tabela numita in interiorul unei
restrictii de tabela sau coloana.
ALL
GRANT
ON
TO
SELECT
DEPT
ADAMS;
Grant succeeded.
Mesajul :
Grant succeeded.
confirma acordarea dreptului.
Pentru a acorda dreptul UPDATE pentru anumite coloane lui ADAMS, introduceti :
GRANT
ON
TO
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
ON
TO
INSERT, UPDATE
DEPT
ADAMS, JONES;
Grant succeeded.
Pentru a acorda toate privilegiile asupra DEPT lui ADAMS, introdu ceti :
GRANT
ON
TO
ALL
DEPT
ADAMS;
Grant succeeded.
Transmiterea de Privilegii care au fost Acordate.
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
ON
TO
WITH
SELECT
EMP
ADAMS
GRANT OPTION;
Grant succeeded.
Dreptul Public
Permite detinatorului unei tabele sa acorde accesul tuturor utilizatorilor cu o singura comanda,
SELECT
EMP
PUBLIC;
Secventa
Pentru a permite accesul asupra secventei lui Ford -F_SEQ- lui BLAKE, FORD va introduce :
GRANT SELECT ON F_SEQ TO BLAKE;
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 :
GRANT SELECT ON EMP TO ROLE_2;
Optiunea 'WITH GRANT OPTION' nu este permisa in acest caz.
Violarea Drepturilor de Acces
Daca incercati sa executati o operatie neutorizata ( de exemplu stergerea dintr-o tabela fara a
avea dreptul DELETE ), ORACLE nu va permite ca operatia sa aiba loc.
Daca primiti mesajul de eroare ORACLE ' table or view does not exist', aceasta poate insemna
doua lucruri :
ati incercat sa executati o operatie asupra acelei tabele sau imagini pentru care nu aveti
drepturile corespunzatoare.
Comanda REVOKE
Pentru a retrage un drept acordat, utilizati comanda REVOKE. Este similara cu GRANT :
REVOKE
ON
FROM
drepturi
tabela sau imagine
utilizatori;
Cand utlilzati comanda REVOKE, drepturile specificate sunt anulate utilizatorilor enumerati,
si celorlalti utilizatori carora acestia le-au transmis aceste drepturi.
ALL
EMP
ADAMS;
Revoke succeeded.
SELECT
EMP
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.
*
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 :
CREATE SYNONYM
FOR
EMP
SCOTT.EMP;
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.
CREATE PUBLIC SYNONYM
nume_sinonim
for [proprietar.] nume_obiect;
pentru a referi o tabela, secventa sau imagine fara a specifica detinatorul obiectului
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.
Crearea si utilizarea accesului secvential este de asemenea discutata (aceasta permite
atribuirea automata de numere de secventa unice in cadrul unei aplicatii.)
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
------------20
1 record created
SQL> SELECT * FROM DEPT;
DEPTNO DNAME
-----------10
LOC
-------------ACCOUNTING
-----------------NEW YORK
Pentru a accesa un numar de secventa care tocmai a fost generat (numarul de secventa
curent ) se foloseste pseudo-coloana CURRVAL. CURRVAL reprezinta ultima valoare
intoarsa unui program. Cind se adreseaza NEXTVAL pentru o secventa data, numarul
de secventa curent este plasat in CURRVAL. NEXTVAL trebuie folosit pentru a
genera numere de secventa in sesiunea curenta a unui user, inainte de a putea adresa
CURRVAL.
INSERT INTO DEPT_HISTORY
VALUES (dept_seg.CURRVAL, 'ACCOUNTING' , `NEW YORK');
1 record created.
SQL> SELECT * FROM DEPT_HISTORY
DEPTNO
DNAME
-----------------10
LOC
-----------ACCOUNTING
----------------NEW YORK
Pentru a modifica o secventa este necesar sa fii proprietarul eu sau sa ai dreptul DBA
sau sa fi primit dreptul ALTER pentru secventa din partea proprietarului.
Nota:
o Numai secventele viitoare vor fi influientate de catre comanda ALTER
SEQUENCE
o Sunt facute anumite verificari. De exemplu o noua MAXVALUE nu poate
impune care este mai mica decit numarul de secventa curent
o Valoarea START WITH nu poate fi schimbata folosint comanda ALTER
SEQUENCE
o Secventa trebuie abandonata si recreata pentru a reporni secventa la un numar
diferit.
Tiparirea Secventelor
Toate definitiile secventelor sunt memorate intr-o tabela de secvente. Pentru a vedea
secventele la care ai access, interogheaza baza de date urmarind USER_SEQUENCES
sau ALL_SEQUENCES.
Indexarea
Indexarea in sistemul ORACLE are doua principale scopuri:
1. Pentru a accelera afisarea liniilor cu o cheie particulara.
2. Pentru a forta unicitatea valorilor din coloane, de obicei valorile cheii
principale.
Folosirea indexarii este puternic recomandata pentru a obtine performante mai bune.
Retineti ca ORACLE 7 creiaza automat INDEXI pentru coloanele care au setate
PRIMARY KEY sau UNIQUE.
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
4
5
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.
6
7
8
9
SELECT ENAME,JOB,SAL,COMM
FROM
EMP;
*
ENAME = 'JHONES';
EMP
SELECT
FROM
WHERE
*
EMP
UPPER(ENAME)= 'JHONES';
Indexare si Imbinare
Daca nu exista index in cadrul coloanelor IMBINATE atunci se poate obtine o
"sortare-imbinata". Asca inseamna ca fiecare este sortata separat si apoi listele sortate
sunt imbinate . De obicei coloanele folosite pentru imbinari trebuie sa fie indexate.
Daca numai una din tabele are un index utilizabil, atunci cealalta tabela este tabela
conducatoare.
De exemplu:
SELECT
FROM
WHERE
ENAME, DNAME
DEPT, EMP
EMP.DEPTNO = DEPT.DEPTNO
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.
SELECT
ENAME, DNAME
FROM
WHERE
EMP, DEPT
EMP.DEPTNO = DEPT.DEPTNO
Unit 18 Exercitii
1. Creati un indice neunic in coloana Projid a tabelei de atribuire.
2. Interogati tabela DDT (data dictionary table) pentru a obtine informatii despre
indexii folositi (USER_INDEXES).
Solutii:
3.
4.
5.
CREATE
ON
INDEX ASG_PROJID
ASSIGNMENTS
(PROJID);
SELECT
FROM
TABE_NAME, INDEX_NAME
USER_INDEXES;
6.
7.
8.
9.
10.
CAPITOLUL 19
INTRODUCERE IN PL/SQL
CE ESTE PL/SQL ?
Un limbaj procedural
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
Deciziile, buclele si salturile pot fi folosite pentru a controla executia
programelor, decizind daca si cind SQL si alte actiuni sa fie executate. Aceste
facilitati permit aplicatiilor ORACLE cum ar fi SQL*Forms, de a grupa
comenzi si de a controla executia lor prin PL/SQL.
3. Portabilitatea
Deoarece PL/SQL deriva din ORACLE, programele pot fo portate pe toate
masinile ce suporta ORACLE si PL/SQL.
4. Integrarea
PL/SQL joaca un rol din ce in ce mai important in RDBMS si in aplicatiile
ORACLE. Variabilele si tipurile de date din PL/SQL sunt compatibile cu cele
din SQL.PL/SQL acopera golul dintre nevoia de access la tehnologia bazelor
de date si nevoia de facilitati pentru programarea procedurala.
5. Performantele
Utilizarea PL/SQL poate ajuta la imbunatatirea performantelor aplicatiilor.
Avantajele difera , functie de mediul in care PL/SQL este folosit. Aceste
avantaje vor fi discutate mai tirziu in acelasi unit.
--------- Desene pag 19-4 --------
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.
De obicei, un bloc poate fi un bloc anonim sau un sub-program.
o Blocuri anonime
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
Acestea sunt denumite blocuri PL/SQL. Pot fi declarate ca proceduri sau ca
functii. In ultimul caz, ele intorc o valoare daca sunt apelate. SQL*Forms
permite ca procedurile si functiile sa fie declarate ca parte a Form-ului, si
apelate din orice punct.
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;
|
---------------------------------------------------
WHERE
quantity -1
WHERE
ELSE
INSERT INTO purchased_record
VALUES ('OUT of Tennis Rackets',
SYSDATE);
END IF;
COMMIT;
EXCEPTION
WHEN no_data_found THEN
found');
END;
executie in RDBMS.SQL din cadrul blocului nu este spart in instructiuni separate pina
cind ajunge la unitatea PL/SQL, unde comenzile SQL sunt trimise unitatii de executie
SQL. Acest lucru inseamna ca un singur transfer este necesar pentru a trimite blocul de
la aplicatie la ORACLE, imbunatatind performantele in mod special intr-o retea de
tipul client-server. --------- Poza de la pag. 19-7 --------Folosirea PL/SQL in SQL*Plus este discutata in Unitul 2. Folosirea PL/SQL in alte
medii care folosesc unitatea RDBMS este subiect pentru viitoare cursuri.
5
Facilitati PL/SQL
Urmatoarea parte a unit-ului discuta avantajele (facilitatile) ale PL/SQL comune
fiecarui mediu de lucru unde limbajul este instalat.
Acesta este un sumar.
o Variabile si Constante
pentru memorarea si manipularea valorilor. Tipurile de date includ NUMBER,
CHAR si DATE.
o SQL suport
SELECT, INSERT, UPDATE, DELETE, COMMIT, SAVEPOINT si
ROLLBACK sunt instructiuni suportate.
o Controlul Executiei
Instructiunea IF, Bucle, salturi (GOTO) si etichete ofera actiuni conditionale,
teste complexe, bucle iterative.
o Functii Interne
Multe functii SQL sunt disponibile pentru a manipula variabile si valori
PL/SQL.
o Tratarea Exceptiilor
Avertismentele si Erorile sunt definita ca exceptii, care pot fi minuite in fiecare
bloc. Exceptiile definite de user pot fi declarate si folosite la fel de bine ca
erorile standard ORACLE.
REPREZENTAREA DETELOR
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.
COMMIT;
*/
Delimitatori
Delimitatorii sunt simboluri sau simboluri compuse, care au o semnificatie speciala
pentru PL/SQL. Veti recunoaste multe dintre acestia ca operatori pentru SQL.
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
@
'
:
exponential
relational
-||-||-||-||asignare
asociere
rang
concatenare
eticheta
-||comentariu
-||-||-
Retineti ca spatiile nu sunt permise intre cele doua caractere ale simbolurilor
combinate.
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
BEGIN
X NUMBER;
----------------|
|
|
|
...
domeniul
DECLARE
Y NUMBER;
BEGIN
END;
...
...
END;
-----|
|
|
|
-----|
| lui
| x
|
domeniul lui y
|
|
|
|
|
|
---------------|
Retineti ca pe timpul 'Timpului de viata' al lui y, suntem tot in domeniul lui 'x', si
putem defini expresii care sa foloseasca ambele variabile.
Sa presupunem ca variabila din sub-bloc nu se numeste 'y' ci 'x'. Cu alte cuvinte, are
acelasi nume ca si variabila din sub-bloc.
DECLARE
x NUMBER;
BEGIN
...
DECLARE
x NUMBER;
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 subblocului, variabila 'x' din blocul principal exista dar nu este vizibila.
TIPUL NUMERIC
NUMBER
sunt
este data
zecimale.
scala.( ex.
32767
TIPUL BOOLEAN
BOOLEAN
Rezultatul
variabile si
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:
indentificator tipdata [(precizia,scala)] [NOT NULL] [ := expresie ] ;
Unde 'expresie' poate fi o alta variabila, sau o expresie cu functii si operatori. Daca o
valoare initiala nu este asignata, atunci variabila va contine o valoare nula pina cind ii
va fi asignata ulterior o valoare. Constanta NOT NULL nu mai este permisa in aceasta
situatie.
Exemple:
v_count
v_salary
v_annsal
postcode
surname
v_message
CHAR(7);
VARCHAR2(25)
VARCHAR2(80)
:= 'Skywalker' ;
:= 'May the course be woth
married
BOOLEAN
:= FALSE;
today
DATE
:= SYSDATE;
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:
Exemple:
pi CONSTANT NUMBER(9,5) := 3.14159 ;
vat CONSTANT NUMBER(4,2) := 17.5 ;
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:
v_count := v_count +1;
ann_sal := mount_sal * 12 +NVL(comm,0);
lev
:= 6;
mess
:= 'The current level is ' || TO_CHAR(lev) ;
v_ename := 'KING';
Valorile pe care le pot lua variabilele booleene pot fi TRUE si FALSE, ca rezultat a
unei expresii booleene.
Exemple:
overpaid
male
salary_ok
female
:=
:=
:=
:=
switch1
switch2
:= TRUE;
:= FALSE;
:screen_field1
:warp_factor
:global.var1
:= ann_sal ;
:= 9 ;
:= 'YES' ;
Detalii despre modul de minuire al variabilelor NON PL/SQL sunt descrise in cursuri
ORACLE special destinate acestor variabile.
sal_message
VARCHAR2(12)
:= 3500;
:= sal_message;
:= SYSDATE ;
:= '21-JAN-1992' ;
In cadrul expresiilor trebuie sa va asigurati ca tipurile de date sunt aceleasi. Daca apar
tipuri diferite de date in aceiasi expresie, atunci se foloseste cea mai potrivita functie
de conversie:
TO_CHAR
TO_DATE
TO_NUMBER
PL/SQL va incerca sa faca conversia, daca este posibil. De obicei, PL/SQL este mai
pretentios decit SQL daca tipurile de date sunt mixate in cadrul unei expresiilor. Deci
daca nu sunteti sigur, folositi cea mai potrivita functie de conversie.
Exemplu:
v_message VARCHAR2(80) := 'SCOTT earns' || TO_CHAR
(month_sal*12) ;
Precedenta operatorilor
Operatorii logici, aritmetici si de concatenare folositi in PL/SQL sunt aceeasi ca in
SQL. In plus mai exista un operator exponential (**) .
Ordinea in care operatiile sunt realizate poate fi controlata folosind paranteze, ca in
SQL.
Reamintim ordinea naturala a operatiilor in cadrul unei expresii:
Ordinea de evaluare a operatorilor
----------------------------------------------------------------------------|
|
| 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
In plus PL/SQL ofera doua functii pentru minuirea raportatea erorilor denumite
SQLCODE si SQLERRM care vor fi discutate in unitul urmator.
Functii nedisponibile in instructiuni structurale sunt:
GREATEST and LEAST
AGV, MIN, MAX, COUNT, SUM, STDDEV si VARIANCE
|-----------------------------------------------------------------|
|
SQL> DECLARE
|
|
2 x NUMBER(7,2);
|
|
3 BEGIN
|
|
4
SELECT sal INTO x FROM emp WHERE empno= &&n;
|
|
5
IF x<3000 THEN
|
|
6
UPDATE emp SET sal=3000;
|
|
7
WHERE empno = &&n;
|
|
8
END IF;
|
|
9 END;
|
|
10.
|
|
SQL>
|
|-----------------------------------------------------------------|
SQL*Plus este un bun instrument pentru testarea blocurilor PL/SQL,de aceea il vom
folosi si noi pentru partea practica a cursului.
Sunt doua cai pentru a prelucra blocuri PL/SQL in SQL*Plus:
o Se defineste un bloc in buffer-ul SQL, si apoi se ruleaza
o Se defineste un bloc ca parte a unui script SQL*Plus, si apoi se ruleaza scriptul
DECLARE
x NUMBER(7,2);
BEGIN
SELECT sal INTO x FROM emp WHERE empno = 7788;
IF x < 3000 THEN UPDATE emp SET sal = 3000
WHERE empno = 7788;
END IF;
END;
.
Continutul bufferului poate fi editat in maniera obisnuita sau salvat intr-un fisier
folosind comanda SQL*Plus "SAVE".
Pentru a rula buffer-ul PL/SQL, tastati comanda RUN sau '/' la promptul SQL. Daca
executia reuseste fara tratari de eroare atunci singurul mesaj care apare ar trebuie sa
fie:
'PL/SQL procedure seccessfully completed'
No.');
COMMIT;
EXCEPTION
WHEN dup_val on index THEN
INSERT INTO tav VALUES (' Duplicate departament
END;
/
SELECT * FROM error tab;
SET ECHO ON
implicit
END;
Coloana
-----------NUMCOL1
NUMCOL2
CHARCOL1
CHARCOL2
DATECOL1
DATECOL2
Descrierea
------------------------------------NUMBER (9,2)
NUMBER (9,2)
VARCHAR2(60)
VARCHAR2(60)
DATE
DATE
2 Unit 20 SOLUTII
1.
2.
3.
4.
5.
DECLARE
V_BOOL1
V_BOOL2
V_CHAR
16 caractere
6.
V_NUM
7.
BEGIN
8.
V_CHAR :=
9.
V_NUM
:=
la mumar
10.
V_BOOL1
11.
V_BOOL2
12.
END;
BOOLEAN;
BOOLEAN;
VARCHAR2(16);
-- cel putin
NUMBER(2);
'42 este raspunsul';
SUNSTR(V_CHAR,1,2); -- conversie dinamica
:= V_NUM < 100;
:= NOT V_BOOL1;
13.
14.
15.
16.
17.
18.
19.
20.
21.
DECLARE
V_RESULT NUMBER(9,2);
BEGIN
V_RESULT := &main_var ** &exponent ;
-- sau POWER(&main_var,&exponent);
INSERT INTO messages(numcol1) VALUES ( V_RESULT ) ;
END;
22.
Sau o solutie alternativa folosind SQL*Plus :
23.
24.
25.
26.
27.
28.
29.
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.
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.
De asemenea, retineti ca atributele si functiile PL/SQL care sunt unice PL/SQL nu pot
fi adresate direct din comenzi SQL. Acestea includ SQLCODE si SQLERRM, care
vor fi discutate mai tirziu in acest unit.
INSERT
UPDATE
DELETE
[LOCK TABLE]
Exemple:
DECLARE
v_empno NUMBER(4) := 7788 ;
BEGIN
UPDATE emp SET sal = 9000 ;
WHERE empno = v_empno ;
...
END;
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.
Aceste atribute pot fi folosite in aceeasi maniera ca functiile in comenzi PL/SQL, dar
nu in comenzi SQL.
Atributele pot fi folosite in sectiune EXCEPTION a unui bloc pentru a evalua
rezultatul unei instructiuni SELECT esuate (cereia i se permite sa intoarca doar o
linie), dar probabil ca este mult mai folositor sa evaluam rezultatul operatiei DML.
Exemplu:
DECLARE
rows_deleted NUMBER;
BEGIN
DELETE FROM dept WHERE deptno = 50;
rows_deleted := SQL%ROWCOUNT ;
INSERT INTO del_history VALUES ('DEPT',
rows_deleted,SYSDATE);
END;
Controlul Tranzactiilor
La fel ca si ORACLE in general, tranzactiile DML vor incepe la prima comanda ce
urmeaza lui COMMIT sau ROLLBACK, si sfirsitul urmatorului COMMIT sau
ROLLBACK terminat cu succes. Aceste actiuni pot avea loc intr-un bloc PL/SQL sau
ca rezultat al evenimentelor din mediu masinii.
Urmatoarele comenzi de control al Tranzactiilor sunt valide in PL/SQL, dar variabilele
de mediu ale masinii pot impune unele restrictii de utilizare:
COMMIT
[ WORK ]
ROLLBACK
[TO savepoint]
SAVEPOINT
SET TRANSACTION
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.
DELETE FROM emp WHERE job = 'CLERK';
BEGIN
UPDATE emp SET sal = 8000 WHERE job = 'CAPTAIN' ;
IF SQL%NOTFOUND
THEN ROLLBACK;
ELSE COMMIT;
END IF;
END;
altfel
Interogarile
o eroare va fi generata.
De acea, SELECT-ul care nu intoarce nici o linie, sau mai mult de o linie cauzeaza una
din urmatoarele erori:
ORA-01403
ORA-01422
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:
SELECT
INTO
FROM
[WHERE
[GROUP BY
[HAVING
[FOR UPDATE];
Atributele %TYPE
Cind variabile PL/SQL sunt declarate pentru incarcare ulterioara cu valoarea coloanei,
trebuie sa va asigurati ca variabila este compatibila ca tip de data cu coloana si ca este
suficient de mare pentru a stoca valoarea de pe coloana. Daca nu este atunci PL/SQL
va genera eroare.
Decit sa incercati sa ghiciti tipul si precizia pentru o variabila, puteti sa va bazati pe
definitia coloaneo din Data Dictionary. Acest lucru se face folosind atributul %TYPE.
Atributul este prefixat cu numele tabelei si al coloanei, si folosit cind este nevoie de
tipul datei in declaratia variabilei:
identificator
numetabela.coloana%TYPE
Folosind aceasta metoda, tipul de data si dimensiunea sunt determinate atunci cind
blocul este compilat.
Exemplu:
DECLARE
v_deptno
dept.deptno%TYPE;
v_loc
dept,loc%TYPE;
BEGIN
SELECT
INTO
FROM
deptno,
loc
v_deptno, v_loc
dept ...
END;
Predefinite
Definite de USER
o Tratarea exceptiilor
WHEN
In acest unit ne vom concentra asupra exceptiilor interne predefinite. Acestea sunt
urmatoarele:
Numele exceptiei
---------------------------------------------DUP_VA_ON_INDEX
INVALID_CURSOR
INVALID_NUMBER
LOGIN_DENIED
NO_DATA_FOUND
NOT_LOGGED_ON
PROGRAM_ERROR
STORAGE_ERROR
TIMEOUT_IN_RESPONSE
TOO_MANY_ROWS
VALUE_ERROR
ZERO_DEVIDE
CURSOR_ALREADY_OPEN
TRANSACTION_BACKED_OUT
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
INSERT INTO dept (deptno, dname) VALUES (50, `CLEANING`);
INSERT INTO dept (deptno, dname) VALUES (50, `TRAINING`);
-- Exception DUP_VAL_ON_INDEX raised here
...
END;
-- Block terminates which Unhandled Exception - ORA -00001
unde `actions` poate fi una sau mai multe declaratii PL/SQL sau SQL fiecare terminata cu ':'.
Actiunile unui identificator exceptie sint delimitate fie de sfirsitul blocului (END) fie de
inceputul unui alt identificator exceptie (WHEN).
Principalele exceptii care pot apare ca un rezultat al declaratiei SELECT sint
NO_DATA_FOUND (fara linii returnate) si TOO_MANY_ROWS (mai mult decit o linie
returnata).
Exemplu:
DECLARE
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
BEGIN
SELECT ename, job
INTO v_ename, v_job
FROM emp
WHERE hiredate BETWEEN '1-JAN-92' AND '31-DEC-92';
...
EXCEPTION
WHEN no_data_found THEN
INSERT INTO error_tab
VALUES ('Nobody in 92');
WHEN too_many_rows THEN
INSERT INTO error_tab
VALUES ('More then one person in 92');
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.
minuieste toate erorile neminuite inca in bloc. Daca e folosit 'WHWN OTHERS' trebuie sa fie
codat dupa orice alt identificator exceptie din bloc.
Exemplu:
BEGIN
SAVEPOINT
so_far_so_good;
NUMBER;
WHEN OTHERS
THEN
error_message :=SUBSTR(SQLERM,1,100);
error_code :=SQLCODE;
INSERT INTO errors VALUES (error_message, error_code);
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.
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
SELECT empno INTO v1 FROM emp WHERE job = 'PRESIDENT';
EXCEPTION
WHEN too_many_rows THEN
INSERT INTO job_errors VALUES ('More than one
President!');
END;
DECLARE
v1 NUMBER (4);
BEGIN
SELECT empno INTO v1 FROM emp WHERE job = 'MANAGER';
EXCEPTION
WHEN too_many_rows THEN
INSERT INTO job_errors VALUES ('More than one
Manager');
END;
EXCEPTION
WHEN OTHERS THEN
e_mess := SUBSTR(SQLERRM, 1, 80);
INSERT INTO general VALUES (e_mess);
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?
Adaugati un Identificator Exceptie la blocul care inregistreaza un mesaj explicit in Messages
pentru orice tip de exceptie care poate apare. Apoi lansati blocul din nou.
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 jobului 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.
'Jobtype found once'
'Jobtype not found'
'Jobtype found more than once'
Solutii.
O exceptie VALUE_ERROR este lansata daca valoarea este prea mare pt. variabila.
DECLARE
V_RESULT NU MBER(9.2) ;
V_MESSAGE CHAR(60);
BEGIN
V_RESULT := &main_var ** &exponent ;
-- or POWER (&main_var, &exponent);
INSERT INTO messages (numcol1) VALUES (V_RESULT);
EXCEPTION
WHEN OTHERS THEN V_MESSAGE := SUBSTR(SQLERRM,1,60);
INSERT INTO messages (charcol1);
VALUES (V_MESSAGE);
END;
DECLARE
JOBTYPE emp.job%TYPE;
BEGIN
SELECT job INTO JOBTYPE
FROM emp WHERE job = '&1' ;
INSERT INTO messages (charcol1, charcol2)
VALUES ('&1', 'Jobtype found once');
COMMIT;
EXCEPTION
WHEN no_data_found THEN
INSERT INTO messages (charcol1, charcol2)
VALUES ('&1', 'Jobtype not found');
COMMIT;
WHEN too_many_rows THEN
INSERT INTO messages (charcol1, charcol2)
VALUES ('&1', 'Jobtype found more than once');
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
var3 LIKE '%S%'
var4 BETWEEN '01-JUN-92' AND '01-SEP-92'
var2 IS NOT NULL
bool_var
x IN ( 'Y', 'N', 'YES', 'NO' )
( a = b OR c = 5 ) AND p < 400
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.
IF ename = 'SCOTTY' THEN beam_me_up = 'YES' ;
COMMIT;
ELSE beam_me_up = 'NO' ;
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:
IF deptno = 10 THEN accounting := 'YES';
IF job = 'MANAGER' THEN
INSERT INTO status VALUES ( ' Dept10
Manager');
END IF;
COMMIT;
ELSE accounting := 'NO';
IF job = 'MANAGER' THEN
INSERT INTO status VALUES (' Alt Mgr.');
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:
IF f_title = 'doamna' THEN status := 'MARITATA';
ELSIF f_title = 'domnisoara' THEN
status := 'NEM.'
ELSE
status:= 'NECUNOSCUTA';
END IF;
Datorita posibilitatii de a imbrica actiuni, clauza ELSIF poate fi utilizata recursiv, daca doriti:
IF choise = 1 THEN actiune
ELSIF choice
ELSIF choice
ELSIF choice
ELSE actiune
END IF;
:= 'Run Payroll'
= 2 THEN actiune
= 3 THEN actiune
= 4 THEN actiune
:= 'Invalid';
;
:= 'Run Accounts';
:= 'Backups';
:= 'Restore';
Sintaxa:
EXIT [eticheta-ciclu] [WHEN conditie];
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 [loop-label] [WHEN conditie];
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);
...
IF counter = 10 THEN COMMIT;
EXIT;
END IF;
END LOOP;
Exemplul 2:
LOOP
...
EXIT WHEN total_sals = 60000;
...
END LOOP;
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.
Implicit, variabila de control este initializata cu o valoare mica, si este incrementata cu +1 la
fiecare iteratie pina cind valoarea superioara este atinsa.
Exemplu:
FOR i IN 1 .. 2000
LOOP
INSEERT INTO numbered_rows VALUES (i);
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.
Ciclul FOR poate si sa decrementeze variabila de control, incepind de la valoarea superioara
in prima iteratie:
FOR n IN REVERSE 50 .. myvar+50
LOOP
-- n are valoarea myvar+50 la prima iteratie.
-- si valoarea 50 la ultima
END LOOP;
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:
WHILE bill <250 AND food LIKE '%taco%'
LOOP
-- actiuni
END LOOP;
Exemplul 2:
WHILE bool_var
LOOP
-- actiuni
END LOOP;
Normal, daca variabila implicata in conditii nu se schimba in timpul executiei ciclului, atunci
ciclul nu se va termina niciodata. Totusi instructiunea EXIT poate fi inclusa atit in ciclurile
FOR si WHILE.
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
END LOOP outer_limits;
Daca un ciclu subordonat executa un EXIT, atunci el poate specifica care ciclu sa fie incheiat
prin specificarea etichetei.
Exemplu:
<< main >> LOOP
...
LOOP
...
EXIT main WHEN total_done = 'YES';
-- paraseste ambele cicluri
EXIT WHEN inner_done = 'YES';
-- paraseste doar ciclul interior
END LOOP main;
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
END;
.
<> DECLARE
var1 NUMBER := 400;
BEGIN
.
block1.var1 := block1.var + 1;
-- variabila din block 1
-- este incrementata
END block2;
END block1;
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 dintrun 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.
Decembrie
Nici unul din cazurile precedente
** Nimic **
Testatti pentru angajatii cu numerele 7654, 7369, 7900, 7876.
3. Urmatorul cod executa un ciclu, cu diferite valori pentru V la fiecare interatie (in
domeniul 1 la 10).
4.
5.
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.
3.
4.
5.
6.
7.
8.
9.
BEGIN
FOR v_count IN 1..10
LOOP
IF v_count NOT IN (6,8) THEN
INSERT INTO messages (numcol1) VALUES (v_count);
END IF;
END LOOP;
COMMIT;
END;
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
DECLARE
v_ename
v_hiredate
v_sal
v_message
BEGIN
SELECT ename,
INTO v_ename,
FROM emp
WHERE empno =
emp.ename%TYPE;
emp.hiredate%TYPE;
emp.sal%TYPE;
CHAR(30);
hiredate, sal
v_hiredate, v_sal
&EMPLOYEE_NO ;
33.
34.
35.
BEGIN
FOR v IN 1 .. 10
36.
37.
38.
39.
40.
41.
LOOP
UPDATE messages SET numcol2 = 100
WHERE numcol1 = v;
EXIT WHEN SQL%ROWCOUNT <> 1;
END LOOP;
END;
42.
CAPITOLUL 23
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
SELECT * INTO emp_rec FROM emp WHERE empno = 7788;
Cimpurile dintr-o inregistrare pot fi referite individual, atit in PL/SQL cit si in instructiunile
SQL care apar intr-un bloc.
Exemplu:
IF emp_rec.sal < 2000 AND emp_rec.job = 'MANAGER'
THEN underpaid := TRUE ;
END IF;
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;
VALUES(emp_rec.empno,emp_rec.job,emp_rec.sal.,SYSDATE);
CAPITOLUL 24
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 .
Cursoarele explicite va permit sa evitati aceasta a doua extragere , aceasta imbunatatind
eficienta cand o interogare cu un singur rind este ceruta . Cursoarele explicite pot fi utilizate
pentru a rezolva multiple extrageri , si pentru a reexecuta cereri trecute din aria respectiva .
Restul acestui capitol va va explica mult mai pe larg aceste probleme , despre cursorul
explicit.
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:
CURSOR identificator[( parameter details)] IS query-expression;
unde query-expression este o instructiune SELECT care poate include majoritatea clauzelor,
dar nu o clauza INTO. Nu trebuie definit NULL ca un obiect SELECT.
Exemplu
DECLARE
CURSOR c1 IS
SELECT ename, sal, hiredate FROM emp
WHERE deptno= 20 AND job= "ANALYST";
;
;
Instructiunea OPEN
Este utilizata in cadrul actiunilor executabile dintr-un bloc, ai stabileste un set activ de rinduri.
Sintaxa:
OPEN cursor-identif [(lista argumente)] ;
Exemplu:
OPEN c1;
De observat ca exceptiile nu sint lansate daca cererea nu intoarce nici un rind cind este
deschis cursorul. Starea cursorului poate, totusi, sa fie testata dupa un FETCH.
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 punctvirgula ca prefix, pentru a fi deosebite de variabilele PL/SQL.
Sintaxa:
FETCH cursor-id INTO var,var,... ;
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:
FETCH c1 INTO v_ename, v_sat, v_hiredate;
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 ;
ELSE
OPEN c1;
2. 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
FETCH cursor1 INTO a,b,c,d ;
EXIT WHEN cursor1%NOTFOUND ;
.
.
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
SELECT empno, sal, hiredate, rowid
FROM emp WHERE deptno = 20 AND job = 'ANALYST'
FOR UPDATE OF sal;
emp_record c1%ROWTYPE;
BEGIN
OPEN c1;
.
FETCH c1 INTO emp_record;
.
IF emp_record.sal <2000 THEN ...
De observat ca pseudo-coloana 'rowid' este valida ca articol selectabil, si deci va avea un cimp
corespunzator in inregistrarea 'emp_record'.
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.
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
SELECT dname, loc FROM dept
FOR UPDATE OF loc ;
dept_rec
c1%ROWTYPE;
sales_count
NUMBER:=0 ;
non_sales
NUMBER := 0;
BEGIN
OPEN c1;
LOOP
'DALLAS'
THEN
UPDATE dept SET loc = 'DALLAS' WHERE
CURRENT OF c1;
sales_count := sales_count + 1;
ELSIF dept_rec.dname != 'SALES' AND dept_rec.loc !=
'NEW YORK'
CURRENT OF c1;
THEN
UPDATE dept SET loc = 'NEW YORK' WHERE
non_sales := non_sales +1 ;
END IF;
END LOOP;
CLOSE c1;
INSERT INTO counts (sales_set, non_sales_set )
VALUES (sales_count, non_sales);
COMMIT;
END;
Cursoare cu parametrii
Parametrii permit transmiterea unor valori unui cursor cind acesta este
deschis, si utilizarea in cererile care se executa.
Aceasta inseamna ca un cursor explicit poate fi deschis de mai multe ori
intr-un bloc, intorcind seturi de lucru diferite cu fiecare ocazie.
Cind cursorul este ulterior deschis, valorile sint transmise pt. fiecare
din parametrii in mod pozitional.
VAlorile din PL/SQL sau variabile host pot fi utilizate, si de asemenea
literali.
Exemplu:
OPEN c1 (30, 'ANALYST');
OPEN c1 (pl_num, 'CLERK');
OPEN c1 (10, job_type); -- job_type este o variabila PL/SQL
Exemplu:
DECLARE
BEGIN
END;
Daca cursorul pe care il procesati intr-un ciclu FOR cursor a fost definit
cu
parametrii, valorile (parametrii actuali) sint date in paranteza, dupa
numele cursorului in instructiunea FOR.
Exemplu:
FOr rec IN (SELECT ename FROM emp WHERE deptno = 10 )
LOOP
IF rec.ename = 'JONES' THEN
.
END LOOP;
dar trebuie sa tineti cont ca fiecare INSERT si UPDATE provoaca rescanarea tabelei; Daca prelucrati mai multe rinduri dintr-o tabela,
incercati sa o faceti intr-un singur pas.
Exercitii
Solutii
1.
DECLARE
BEGIN
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.
Generarea exceptiilor
Exceptiile in general apar in doua moduri:
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
SELECT 'anything' INTO PLVAR FROM emp
WHERE deptno = dept_number;
IF SQL%FOUND THEN
RAISE TOO_MANY_ROWS;
END_IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
END;
Deasemenea observati cat timp 'NO_DATA_FOUND' este considerat normal pentru aceasta
interogare, declaratia SELECT poate sa primeasca un sub_block in care exceptia are un
identificator nul. Cealalta exceptie TOO_MANY_ROWS va fi transmisa la blocul exterior.
EXEMPLU
DECLARE
credit_exceeded EXCEPTION;
BEGIN
IF stock_ordered>credit_limit THEN
RAISE credit_exceeded;
END IF
EXCEPTION
WHEN credit_exceeded THEN ...
Sintaxa:
PRAGMA EXCEPTION_INIT( exception-identifier, number) ;
aici
atunci exceptia
fetch_failed
este ridicata
automat
*/
EXCEPTION
WHEN fetch_failed THEN ...
Identificatorul WHEN OTHERS prinde toate exceptiile neincluse deja. Citeva instrumente
ORACLE ca SQL*Forms au exceptiile lor predefinite pe care le poti genera pentru a produce
evenimente. WHEN OTHERS le va prinde si pe acestea !
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:
@FILENAME 50 TRAINING BRACKNELL
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
v_deptno NUMBER := &1;
dept_33 EXCEPTION;
BEGIN
IF v_deptno=33 THENRAISE dept_33;
END IF;
INSERT INTO newdept (deptno, dname, loc)
VALUES (&1, `&2`, `&3`);
EXCEPTION
WHWN dept_33 THEN
INSERT INTO messages (charcoll)
VALUES ('Attempt to create Department 33!');
END;
2.
DECLARE
integ_error EXCEPTION;
PRAGMA EXCEPTION_INIT (integ_error, -2292);
BEGIN
APPENDIXA
Pseudo-coloane SQL
Urmatoarea tabela listeaza pseudo-coloanele 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).
APPENDIXB
Cuvinte rezervate SQL
Urmatoarele cuvinte sunt rezervate SQL.Nu puteti sa le utilizati ca nume de obiecte de tip
baza de date daca nu sunt puse intre ghilimle.
Cuvintele urmate de un asterix(*) sunt de asemenea cuvinte ANSI rezervate.
ACCESS
DISTINCT*
IS*
ADD
DROP
ALL*
LEVEL*
ALTER
ELSE*
LIKE*
AND*
EXCLUSIVE
LOCK
ANY*
EXISTS*
LONG
ASC*
FILE
MAXEXTENTS
AUDIT
FLOAT*
MINUS
FOR*
MODE
FROM*
MODIFY*
AS*
BETWEEN*
BY*
NOAUDIT
GRANT*
CHAR*
CHECK*
NOCOMPRESS
GROUP
CLUSTER
COLUMN
NOWAIT
HAVING*
COMMENT
COMPRESS
NOT
NULL*
NUMBER
IDENTIFIED
CONNECT
OF*
CREATE*
IMMEDIATE*
OFFLINE
CURRENT*
IN*
ON*
INCREMENT
ONLINE
DATE
INDEX
OPTION*
DBA
INITIAL
OR*
DECIMAL*
INSERT*
ORDER*
DEFAULT*
INTEGER*
DELETE*
INTERSECT*
PCTFREE
DESC*
INTO*
PRIOR*
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 +.
ARCHIVELOG+
END+
MXVALUE+
AUTHORIZATION*+
ESCAPE
MINEXTENTS
BACKUP+
EVENTS+
MINVALUE
EXEC*+
MOUNT+
BEGIN*+
MODULE+
FETCH*+
CACHE+
FOREIGN*+
NEXT*+
CHARACTER*+
FORTRAN*+
NOARCHIVELOG+
CLOSE*+
FOUND*+
NOCACHE+
COBOL*+
NOCYCLE+
COMMIT*+
GO*+
NOMAXVALUE+
CONSTRAIN*+
GOTO*+
NOMINVALUE+
CONTENTS+
NOORDER+
CONTINUE*+
INCLUDING+
NORMAL+
CONTROLFILE+
INDICATOR*+
NOSORT+
CRASH
INITRANS+
NUMERIC*+
CURSOR*+
INT*+
ONLY*+
CYCLE+
KEY*+
DATABASE
LANGUAGE*+
DATAFILE+
LINK
PASCAL*+
DEC*+
LOGFILE+
PCTINCREASE+
DECLARE*+
OPEN*+
PCTUSED+
DISMOUNT+
MAXDATAFILE+
PL1*+
DOUBLE*+
MAXINSTANCES+
PRECISION*+
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*+
CLUSTERS
COLAUTH
COLUMNS
COMMIT
COMPRESS
CONNECT
CONSTANT
COUNT
CRASH
CREATE
CURRENT
CURSOR
DATA_BASE
DATABASE
DATE
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
PARTITION
PCTFREE
PRAGMA
PRIOR
PRIVATE
PROCEDURE
PUBLIC
RAISE
RANGE
RECORD
RELEASE
REM
RENAME
RESOURCE
RETURN
REVERSE
REVOKE
ROLLBACK
ROWNUM
ROWTYPE
RUN
SAVEPOINT
SCHEMA
SELECT
SEPARATE
SET
SIZE
SPACE
TABAUTH
TABLE
TABLES
TASK
TERMINATE
THEN
TO
TRUE
TIPE
UNION
UNIQUE
UPDATE
USE
VALUES
VARCHAR
VARCHAR2
VARIANCE
VIEW
VIEWS
WHEN
WHERE
WHILE
WHILE
WITH
WITH
WORK
SQL
SQLCODE
SQLERRM
START
STATEMENT
STDDEV
SUBTYPE
SUM
XOR
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
In Oracle versiunea 6 , urmatoarele functii numerice nu sint accepta- te:
SIN,COS,TAN,SINH,COSH,TANH,EXP,LN, si LOG.
Functiile de putere nu admit exponenti neintegrabili.
Capitolul 6
Oracle Versiunea 6 -Formatul datelor
Codul Formatului Relativ de date (RR) nu e admis.
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.
Sinonimul SOME nu e acceptat de operatorul ANY.
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:
CREATE TABLE emp
(empno numar (4) CONSTRAINT nume_constringere cheie primara ...)
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.
Oracle 6 cu TPO foloseste blocarile in acelasi mod ca Oracle 7.
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)
Pentru a redefini o vedere este necesar sa o micsoram si apoi sa o refacem. De asemenea o
vedere nu poate fi creata pina cind tabelele pe care le folo- seste nu exista deja.In Oracle 7 atit
clauza OR REPLACE cit si clauza FORCE furnizeaza aceste inlesniri.
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.
ROLES, multimea de drepturi, nu este suportata.
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
PL/SQL Versiunea 1 este motorul PL/SQL folosit de RDBMS.Astfel procedurile, functiile si
package-urile stocate si trigger-ele nu sint disponibile in Oracle Versiunea 6 RDBMS.Acestea
sint disponibile in PL/SQL Versiunea 2.
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.
Observatie: Oracle foloseste ordinea de comparatie a calculatorului gazda.
Literele mari si mici nu sint echivalente.In ASCII, toate literele mici sint mai mari ca literele
mari.In EBCDIC, opusul este adevarat.
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.
Valoare zecimala
32
33
34
35
36
37
38
Simbol
blank
!
"
#
$
%
&
Valoare zecimala
59
60
61
62
63
64
65-90
Simbol
;
<
=
>
?
@
A-Z
39
40
41
42
43
44
45
46
47
48-57
58
'
(
)
*
+
,
.
/
0-9
:
91
92
93
94
95
96
97-122
123
124
125
126
[
\
]
^
_
'
a-z
{
|
}
~
Simbol
blank
c
.
<
(
+
|
&
!
$
*
)
;
/
,
Valoare zecimala
108
109
110
111
122
123
124
125
126
127
129-137
145-153
162-169
193-201
209-217
226-233
240-249
Simbol
%
_
>
?
:
#
@
'
=
"
a-i
j-r
s-z
A-I
j-r
S-Z
0-9
ANEXA E
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.
Comanda pentru tabela ALTER permite eliminarea unor coloane individuale.
Comanda DROP este utilizata pentu a elimina alte obiecte din baza de date.
De exemplu :
DROP TABLE DEPT;
DROP VIEW SALARY;
INGRES/SQL
INGRES/SQL este un produs al Relational Technology Inc. (RTI). SQL utilizat de INGRES
este acelasi din punct de vedere sintactic ca cel utili zat de alti producatori. Majoritatea
exemplelor de comenzi date pana acum se pot rula si sub INGRES.Oricum, INGRES/SQL nu
are operatorul LIKE.
INGRES suporta caractere speciale pentru utilizarea in comparatii ( in special operatorii de
egalitate ) pentru a indica potrivirile partiale intr-un sir de caractere. Caractere care permit
identificari pestiale sunt :
*
identifica orice sir de 0 sau mai multe caractere
?
identifica orice caracter
[..] identifica oricare din caracterele dintre parantezele patrate
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"
character
vchar
intreg de
intreg pe
intreg pe
real pe 4
800
money
money8(byte)
Destinatiile smallint, float, integer pot fi utilizate in locul notatiei integer2, float8, integer4
respectiv.
Astfel pentru a crea tabela EMP:
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.
Acest apendice furnizeaza o scurta vedere de ansamblu a SQL-ului imple- mentat in RDBMS
de catre trei furnizori proeminenti de RDBMS -DB2 al lui IBM, Rdb al DEC si Ingres al lui
Relational Technology . Informatia prezentata nu intentioneaza sa fie o comparatie
cuprinzatoare a acestor produse . Intentia mea este sa arat ca , de cand toate RDBS-urile
majore suporta SQL va puteti transfera priceperea pe care ati capatat-o in SQL de la un
RDBMS la altul.
DB2
Database 2 ( DB2 ) este RDBMS-ul IBM-ului pentru mediul MVS.
Implementarea DB2 a SQL-ului este identica cu SQL-ul ORACLE-ului . Intr-adevar SQL-ul
folosit pentru DB2 (si SQL/DS-RDBMS-ul IBM-ului pentru DOS/USE si mediul de operare
VM/SP) a format modelul pentru limbajul SQL . Reamintiti-va ca limbajul SQL a fost
dezvoltat de IBM pentru prototipul lor RDBMS-System R , dar ORACLE a intodus prima
implementare comerciala posibila a SQL-ului.
SELECT *
FROM EMP;
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...
Descriere
--------Adunare, scadere, inmultire,
Pot fi folositi cu date, timpi si
timestamp-uri.
||
2
grafiCHAR
timestamp
carac-
ce.
Converteste o data, timp sau
in reprezentarea sirului sau de
tere.
DATE
DAY/MONTH/YEAR
DAYS
DIGITS
HOUR/MINUTE/SECOND
LENGTH
oc-
SUBSTR
VALUE
ne-
COUNT/AVG/
MAX/MIN/SUM
Functii combinate
DB2 nu suporta bogatul set de functii care sunt posibile cu ORACLE. Vezi capitolele 4, 5 si 6.
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.
Zero pentru campuri numarice
Blank-uri pentru campuri cu siruri de lungime fixa
Gol (siruri de lungime zero) pentru campuri cu siruri de lungime variabila.Valoarea lui
CURRENT DATE sau CURRENT TIME sau CURRENT TIMESTAMP ,cat mai potrivit.
Deci, pentru a crea o tabela EMP:
CREATE TABLE EMP
( EMPNO INTEGER NOT NULL,
ENAME CHAR(10),
JOB CHAR(10),
MGR INTEGER,
HIREDATE DATE,
SAL DECIMAL(7,2),
COMM DECIMAL(7,2),
DEPTNO INTEGER NOT NULL);
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
Nu exista tipuri de date ORACLE care sa corespunda pentru GRAPHIC, VARGRAPHIC si
LONG VARGRAPHIC.
VAX Rdb/VMS
Rdb este RDBMS al lui DEC, care lucreaza in mediul VMS.
Urmeaza sintaxa pentru VAX SQL :
SELECT [DISTINCT]/[Tabela.] coloana/expr [alias]
FROM tabela(e) [alias]
[WHERE conditie]
[AND conditie]
[OR conditie]
[GROUP BY coloana(e)]
[HAVING conditie]
[ORDER BY coloana(e)]
Exemple:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
mutare cursor
linie noua
/---+
x |
\---+
<
HELP -----+
|
+-------+-------+-------+-------+
|
|
|
|
|
| PF1 | PF2 | PF3 | PF4 |---> linie (la dreapta cursorului)
|
|
|
|
|
+-------+-------+-------+-------+
|
|
|
|
|
|
7
|
8
|
9
|
.
|---> cuvant (la dreapta cursorului)
|
|
|
|
|
+-------+-------+-------+-------+
|
|
|
|
|
|
4
|
5
|
6
|
,
|---> caracter (sub cursor)
|
|
|
|
|
+-------+-------+-------+-------+
|
|
|
|
|
|
1
|
2
|
3
|
|
|
|
|
|
|
+-------+-------+-------+ ENTER |
|
|
|
|
|
0
|
.
|
|
|
|
|
| (mai sus sunt anulate cand sunt
prefixate
+---------------+-------+-------+
de PF1 )
Pentru a iesi : CTRL + Z impreuna
urmate de EX (pentru a salva) sau QUIT (pentru
abandon)
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
set
set
set
set
feed off
head off
pages 0
lines 75
verify off
spool insert.sql
select 'insert into dept', '
values (' ||
deptno || ',' ||
''''||dname||''''||','||
''''||loc||''''||');'
from dept;
spool off
set
set
set
set
feed on
head on
pages 24
verify on
start insert.sql
Pentru fiecare linie din tabela DEPT, codul de mai sus genereaza blocurile INSERT de mai jos
:
insert into dept
values (10,'ACCOUNTING','NEW YORK');
insert into dept
values (20,'RESEARCH','DALLAS');
insert into dept
values (30,'SALES','CHICAGO');
insert into dept
values (40,'OPERATIONS','BOSTON');
Astfel :
SELECT '''X'''
SELECT ''''
SELECT ''''||DNAME||''''
intoarce 'X'
intoarce '
intoarce 'BOSTON'
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.
SELECT TABLE_NAME, COLUMN_ID, COLUMN_NAME, DATA_TYPE, DATA_LENGHT,
DATA_PRECISION, DATA_SCALE, NULLABLE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME IN ('DEPT','EMP','SALGRADE')
ORDER BY TABLE_NAME, COLUMN_ID;
TABLE_NAME COLUMN_ID COLUMN_NAME DATA_T DATA_LEN DATA_PREC DATA_SCALE
NULLABLE
---------- --------- ----------- ------ -------- --------- ----------------DEPT
1
DEPTNO
NUMBER
22
2
0
DEPT
2
DNAME
CHAR
14
DEPT
3
LOC
CHAR
13
EMP
1
EMPNO
NUMBER
22
4
0
EMP
2
ENAME
CHAR
10
EMP
3
JOB
CHAR
9
EMP
4
MGR
NUMBER
22
4
0
EMP
5
HIREDATE DATE
7
EMP
6
SAL
NUMBER
22
7
2
EMP
7
COMM
NUMBER
22
7
2
EMP
8
DEPTNO
NUMBER
22
2
0
SALGRADE
1
GRADE
NUMBER
22
SALGRADE
2
LOSAL
NUMBER
22
SALGRADE
3
HISAL
NUMBER
22
N
Y
Y
N
Y
Y
Y
Y
Y
Y
N
Y
Y
Y
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.
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:
tax_year SMALLINT DEFAULT 92;
Exemplu:
DECLARE
TYPe time_type IS RECORD (second INTEGER(2) := 0 ,
minute INTEGER(2) := 0 ,
hour INTEGER(2) := 0 ) ;
time_rec time_type;
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)
Ca si inregistrarile definite, o tabela PL/SQL este definita in 2 pasi.Mai intii se defineste un
tip bazat pe un tip de coloana, si apoi se declara o tabela cu acest tip.
Sintaxa:
TYPE type-id IS TABLE OF col-type [NOT NULL]
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;
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
FOR rec1 IN (select ename from emp)
LOOP
i:=i+1;
ename_array := rec1.ename;
END LOOP;
.
.
.
END;
Anexa
18. Acum obtinem definitia completa a fiecarei coloane pentru fiecare tabla.
19. EX.
20.
21. break on sort1 skip 1
22. select table_name sort1,
23.
column_id sort2,
24.
' ' ||
25.
column_name ||
26.
decode(data_type, 'DATE',' DATE',
27.
'LONG',' LONG'
28.
'CHAR',' CHAR('||data_length||')',
29.
'VARCHAR','VARCHAR('||data_length
30.
||')',
31.
'NUMBER',
32.
decode(data_precision,null,' NUMBER',
33.
' NUMBER('||data_precision||','||
34.
data_scale||') '),
35.
'*********** INVALID DATA TYPE
**************')||
36.
decode(nulltable ,'N',' NOT NULL',null)||','
37.
from user_tab_columns
38.
order by table_name,column_id
39. /
40.
41. 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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
EX.
set feedback off echo off head off
set pagesize 9999
col sort1 noprint
col sort2 noprint
break on sort1 skip 1
spool sqlcreates.sql
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
/
/'
from user_tab_columns c
where column_id = (select max(column_id)
from user_tab_columns
where table_name = c.table_name)
order by 1,2
/
spool off
col sort1 clear
col sort2 clear
set head on feedback on echo on
set pagesize 24
Acest exemplu, relativ complicat produce urmatorul fisier :
CREATE TABLE DEPT (
DEPTNO NUMBER (2,0) NOT NULL,
DNAME CHAR (14) ,
LOC CHAR (13) )
/
CREATE TABLE EMP (
EMPNO NUMBER (4,0) NOT NULL,
ENAME CHAR (10) ,
JOB
CHAR (9),
MGR NUMBER (4,0) ,
HIREDATE DAATE,
SAL NUMBER (7,2),
COMM NUMBER (7,2),
DEPTNO NUMBER (2,0) NOT NULL)
/
CREATE TABLE SALGRADE (
GRADE NUMBER (1,0) NOT NULL,
LOSAL NUMBER (5,0),
HISAL NUMBER (5,0) )
start dynamic.sql
Enter deptno; for all
Enter hiredate; for all 4-jun-94
SQL> select ename
2 from emp &where_clause
3
SQL> /
old 2: from emp &where_clause
new 2: from emp where hiredate = '4-jun-94'
ENAME
---------TURNER
ADAMS
start dynamic.sql
Enter deptno; for all
Enter hiredate; for all 4-jun-94
SQL> select ename
2 from emp &where_clause
3
SQL> /
old 2: from emp &where_clause
new 2: from emp where deptno = 20
ENAME
-----------------SMITH
JONES
SCOTT
ADAMS
Autori:
Traducere:
Ristoscu Liviu
Tancu Mihaela
Petre Irina
Vasiliu Bogdan
Ivan Laur
Manolache Costin
Pandelea Daniel
HTML:
Vlas Sergiu
Popescu Florin