Sunteți pe pagina 1din 145

07.10.

2021

ACADEMIA DE STUDII ECONOMICE BUCUREŞTI


FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

SGBD Oracle

Recapitulare SQL

BUCUREŞTI
2021-2022
Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)
iuliana.botha@ie.ase.ro

Baze de date
Conform CODASYL, o bază de date este definită ca
una sau mai multe colecţii de date aflate în
interdependenţă, împreună cu un fişier de
descriere globală a datelor şi a legăturilor dintre
acestea (dicţionarul de date).

1
07.10.2021

Limbajul SQL

SQL (Structured Query Language) - limbaj de descriere şi


manipulare acceptat de toate sistemele de gestiune a
bazelor de date relaţionale standard pentru limbajele de
interogare a bazelor de date relaţionale

Limbajul SQL-Oracle
Actualizarea structurii bazei de date

Comandă SQL Descriere


CREATE creează structura unui obiect al BD

ALTER modifică structura unui obiect existent al BD

DROP şterge un obiect al BD

2
07.10.2021

Limbajul SQL-Oracle.
Crearea tabelelor
Tabela reprezintă o structură de date care conţine datele unei BDR.
În general, crearea unei tabele constă din:
❑ definirea coloanelor
❑ definirea restricţiilor de integritate
❑ specificarea parametrilor de stocare
❑ definirea cluster-ului în care este inclusă tabela etc.

Limbajul SQL-Oracle.
Crearea tabelelor

CREATE TABLE [nume_schema.] nume_tabelă


(
nume_coloana_1 tip_date [DEFAULT expresie],

nume_coloana_2 tip_date [DEFAULT expresie]
);

3
07.10.2021

Limbajul SQL-Oracle.
Crearea tabelelor

Structura unei tabele poate fi creată în următoarele moduri:


1) fără indicarea restricţiilor de integritate
2) cu indicarea restricţiilor la nivel de coloană
3) cu indicarea restricţiilor la nivel de tabelă
4) prin copiere din altă tabelă

Notă: variantele 2 şi 3 pot fi utilizate împreună pentru crearea unei tabele

Limbajul SQL-Oracle.
Crearea tabelelor
Restricţiile de integritate în Oracle:
❑ PRIMARY KEY
❑ FOREIGN KEY
❑ UNIQUE
❑ NOT NULL
❑ CHECK

4
07.10.2021

Limbajul SQL-Oracle.
Crearea tabelelor
1) fără indicarea restricţiilor de integritate

CREATE TABLE angajati


(
marca NUMBER(4),
nume VARCHAR2(20),
prenume VARCHAR2(20),
email VARCHAR2(20),
data_angajare DATE DEFAULT SYSDATE,
salariu NUMBER(8,2),
id_departament NUMBER(3)
);
9

Limbajul SQL-Oracle.
Crearea tabelelor
2) cu indicarea restricţiilor de integritate la nivel de coloană

CREATE TABLE angajati


(
marca NUMBER(4) CONSTRAINT pkAng PRIMARY KEY,
nume VARCHAR2(20) NOT NULL,
prenume VARCHAR2(20) NOT NULL,
email VARCHAR2(20) CONSTRAINT uqMail UNIQUE
CONSTRAINT ckMail CHECK (email LIKE '%@%.%'),
data_angajare DATE DEFAULT SYSDATE,
salariu NUMBER(8,2),
id_departament NUMBER(3) CONSTRAINT fkDep REFERENCES
departamente (id_departament) ON DELETE CASCADE
);

10

5
07.10.2021

Limbajul SQL-Oracle.
Crearea tabelelor
3) cu indicarea restricţiilor de integritate la nivel de tabelă
CREATE TABLE angajati (
marca NUMBER(4),
nume VARCHAR2(20),
prenume VARCHAR2(20),
email VARCHAR2(20),
data_angajare DATE DEFAULT SYSDATE,
salariu NUMBER(8,2),
id_departament NUMBER(3),
CONSTRAINT pkAng PRIMARY KEY (marca),
CONSTRAINT uqMail UNIQUE (email),
CONSTRAINT ckMail CHECK (email LIKE '%@%.%'),
CONSTRAINT nnNume CHECK (nume IS NOT NULL),
CONSTRAINT nnPrenume CHECK (prenume IS NOT NULL),
CONSTRAINT fkDep FOREIGN KEY(id_departament) REFERENCES
departamente (id_departament) ON DELETE CASCADE );

11

Limbajul SQL-Oracle.
Crearea tabelelor
4) prin copiere din altă tabelă

CREATE TABLE angajati_noi


AS
SELECT * FROM angajati
WHERE data_angajare>TO_DATE ('01.01.2010',
'DD.MM.YYYY');

Notă: restricţiile de integritate existente în tabela angajaţi nu se păstrează şi


în noua tabelă

12

6
07.10.2021

Limbajul SQL-Oracle.
Modificarea structurii tabelelor
Modificarea structurii unei tabele constă din:
❑ adăugarea unor coloane noi într-o tabelă existentă (eventual
cu indicarea de restricţii sau de valori implicite)
❑ modificarea coloanelor unei tabele
❑ specificarea unor restricţii pentru coloane existente
❑ activarea, dezactivarea sau suprimarea unor restricţii de
integritate
❑ redenumiri ale coloanelor sau redenumirea tabelei

13

Limbajul SQL-Oracle.
Modificarea structurii tabelelor
ALTER TABLE nume_tabela
ADD (nume_coloana_1 tip_data restrictie,
... nume_coloana_2 tip_data restrictie);

ALTER TABLE nume_tabela


MODIFY (nume_coloana_1 tip_data restrictie,
... nume_coloana_2 tip_data restrictie);

ALTER TABLE nume_tabela


RENAME COLUMN nume_coloana TO nume_nou_coloana;

ALTER TABLE nume_tabela


DROP COLUMN nume_coloana;

ALTER TABLE nume_tabela


DROP (nume_coloana_1, nume_coloana_2);

14

7
07.10.2021

Limbajul SQL-Oracle.
Modificarea structurii tabelelor
ALTER TABLE nume_tabela
ADD CONSTRAINT nume_restrictie tip_restrictie ….;

ALTER TABLE nume_tabela


DROP CONSTRAINT nume_restrictie;

ALTER TABLE nume_tabela


DISABLE CONSTRAINT nume_restricţie;

ALTER TABLE nume_tabela


ENABLE CONSTRAINT nume_restricţie;

ALTER TABLE nume_tabela


RENAME TO nume_nou_tabelă;

15

Limbajul SQL-Oracle.
Ştergerea tabelelor

Ştergerea unei tabele presupune:


❑ ştergerea definiţiei sale din dicţionarul BD
❑ ştergerea indecşilor asociaţi tabelei
❑ ştergerea privilegiilor conferite în legătură cu tabela
❑ eliberarea spaţiului de memorie ocupat
❑ invalidarea funcţiilor, procedurilor, tabelelor virtuale,
sinonimelor referitoare la tabelă

16

8
07.10.2021

Limbajul SQL-Oracle.
Ştergerea tabelelor

DROP TABLE nume_tabela;

Pentru a se permite ştergerea unei tabele referite într-o altă tabelă


se utilizează comanda DROP cu opţiunea CASCADE CONSTRAINTS,
în scopul suprimării restricţiilor de referenţialitate:
DROP TABLE nume_tabela CASCADE CONSTRAINTS;

17

Limbajul SQL-Oracle
Actualizarea datelor

Comandă SQL Descriere


INSERT adaugă o înregistrare nouă într-o tabelă

UPDATE modifică valori asociate coloanelor unei tabele

DELETE şterge înregistrări dintr-o tabelă

18

9
07.10.2021

Limbajul SQL-Oracle
Interogarea datelor
Comandă SQL Descriere
SELECT regăseşte date din una sau mai multe tabele

Clauze în SELECT Descriere


restricţionează liniile care se returnează pe baza unui criteriu
WHERE condiţie specificat în condiţia de selecţie
structurează rezultatul într-o manieră ierarhică (asemănător
clauze de ordonare ierarhică cu o organigramă)
grupează liniile în scopul identificării valorilor comune
GROUP BY coloane_grupare grupurilor (valori agregate calculate prin funcţii de grup)
restricţionează grupurile create prin clauza GROUP BY pe baza
HAVING condiţie unei condiţii asupra funcţiilor de grup
ORDER BY coloane_ordonare sortează liniile (implicit ascendent)

19

Limbajul SQL-Oracle
Precedenţa operatorilor

Operator
*, /, -,+
= , >= , > , <= , < , <> , != , IS , LIKE , IN
BETWEEN
NOT
AND
|| , OR

20

10
07.10.2021

Limbajul SQL-Oracle
Funcţii SQL

Ex. de funcţii SQL care manipulează şiruri de caractere


Sintaxă Rezultat
UPPER (s) / LOWER (s) şir de caractere

SUBSTR (s,poz,n) şir de caractere

CONCAT (s1,s2) şir de caractere

Ex. de funcţii SQL care manipulează valori numerice


Sintaxă Rezultat
ROUND (n,i) număr

TRUNC (n,i) număr

MOD (n1,n2) număr

21

Limbajul SQL-Oracle
Funcţii SQL

Ex. de funcţii SQL care manipulează date calendaristice


Sintaxă Rezultat
SYSDATE dată calendaristică

ROUND (d,i) dată calendaristică

TRUNC (d,i) dată calendaristică

MONTHS_BETWEEN (d1,d2) număr


EXTRACT (DAY FROM d)
EXTRACT (MONTH FROM d) număr
EXTRACT (YEAR FROM d)

22

11
07.10.2021

Limbajul SQL-Oracle
Funcţii SQL
Ex. de funcţii SQL speciale Ex. de funcţii SQL de conversie între
tipuri de date

Sintaxă Sintaxă
NVL (e1,e2) TO_NUMBER(s,format)
NULLIF (e1,e2) TO_CHAR (n,format)
DECODE (e,expresii_de_căutare,d) TO_CHAR (d,format)
CASE expr WHEN cond THEN rez ... TO_DATE (s,format)
ELSE rez END
TO_TIMESTAMP (s,format)

23

Limbajul SQL-Oracle
Funcţii SQL

Funcţii SQL de grup


Sintaxă
COUNT(e)

SUM(e)

MIN(e)

MAX(e)

AVG(e)

24

12
07.10.2021

Limbajul SQL-Oracle
Agregarea datelor
Clauze în SELECT Descriere

grupează liniile în scopul identificării valorilor comune


GROUP BY coloane_grupare grupurilor (valori agregate calculate prin funcţii de grup)

restricţionează grupurile create prin clauza GROUP BY


HAVING condiţie pe baza unei condiţii asupra funcţiilor de grup

25

Limbajul SQL-Oracle
Joncţiuni

Oracle Standard SQL


Joncţiune de egalitate
SELECT t1.a, t2.c SELECT t1.a, t2.c
FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 JOIN tabela2 t2
WHERE t1.b=t2.b; ON t1.b=t2.b;

26

13
07.10.2021

Limbajul SQL-Oracle
Joncţiuni
Oracle Standard SQL
Joncţiune externă stânga
SELECT t1.a, t2.c SELECT t1.a, t2.c
FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 LEFT JOIN tabela2 t2
WHERE t1.b=t2.b (+); ON t1.b=t2.b;

Joncţiune externă dreapta


SELECT t1.a, t2.c SELECT t1.a, t2.c
FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 RIGHT JOIN tabela2 t2
WHERE t1.b (+)=t2.b; ON t1.b=t2.b;

27

Limbajul SQL-Oracle
Joncţiuni
Oracle Standard SQL
Joncţiune externă completă
SELECT t1.a, t2.c SELECT t1.a, t2.c
FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 FULL JOIN tabela2 t2
WHERE t1.b=t2.b (+) ON t1.b=t2.b;
UNION
SELECT t1.a, t2.c
FROM tabela1 t1, tabela2 t2
WHERE t1.b (+)=t2.b;

28

14
07.10.2021

Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
SELECT id_angajat, nume
FROM angajati
WHERE id_functie = (SELECT id_functie FROM angajati
WHERE UPPER(nume)='KING')
AND UPPER(nume)!='KING';

ORA-01427: single-row subquery returns more than one row

SELECT id_angajat, nume


FROM angajati
WHERE id_functie IN (SELECT id_functie FROM angajati
WHERE UPPER(nume)='KING')
AND UPPER(nume)!='KING';
29

Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
Operatori de comparaţie utilizaţi în cadrul subcererilor multiple-row:

Operatori Descriere
• compară cu o listă de valori
IN
• verifică dacă valoarea căutată se regăseşte în listă
NOT • utilizat cu operatorul IN
• utilizat în combinaţie cu operatorii de comparaţie (=, <)
ANY • verifică dacă valoarea căutată îndeplineşte condiţia de comparaţie cu
oricare dintre liniile returnate de subcerere
SOME • la fel ca operatorul ANY
• utilizat în combinaţie cu operatorii de comparaţie (=, <)
ALL • verifică dacă valoarea căutată îndeplineşte condiţia de comparaţie cu
toate liniile returnate de subcerere

30

15
07.10.2021

Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
• ANY compară valoarea cu oricare valoare returnată de interogare
• ALL compară valoarea cu toate valorile returnate de interogare

Semnificaţia operatorilor ANY şi ALL în combinaţie cu operatorii de comparație:


<ANY() – mai mic decât maximul
>ANY() – mai mare decât minimul
=ANY() – echivalent cu operatorul IN
>ALL() – mai mare decât maximul
<ALL() – mai mic decât minimul

31

Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
SELECT id_angajat, salariul
FROM angajati
WHERE salariul > ALL (10000, 15000, 20000);

SELECT id_angajat, salariul


FROM angajati
WHERE salariul > 10000
AND salariul > 15000
AND salariul > 20000;

32

16
07.10.2021

Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
SELECT id_angajat, salariul
FROM angajati
WHERE salariul > ANY (10000, 15000, 20000);

SELECT id_angajat, salariul


FROM angajati
WHERE salariul > 10000
OR salariul > 15000
OR salariul > 20000;

33

Atenție!

De recapitulat noțiunile de SQL


învățate în anul II, semestrul 1 !

34

17
07.10.2021

CURSUL 2...
Definiții SGBD

Funcțiile SGBD

Tipuri de arhitecturi de SGBD

Clasificarea SGBD

18
10.10.2021

ACADEMIA DE STUDII ECONOMICE BUCUREŞTI


FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

SGBD Oracle
CURSUL 2

BUCUREŞTI
2021-2022
Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)
iuliana.botha@ie.ase.ro

Agenda
1. Recapitulare
2. Definirea SGBD
3. Rolul SGBD
4. Evoluția SGBD
5. Obiectivele SGBD
6. Exemple de SGBD

1
10.10.2021

Recapitulare.
Baze de date
O bază de date poate fi definită ca una sau mai
multe colecţii de date aflate în interdependenţă,
împreună cu un fişier de descriere globală a
datelor şi a legăturilor dintre acestea (dicţionarul
de date).

Recapitulare.
Sistemul de baze de date (SBD)
Un sistem de baze de date reprezintă un ansamblu
de elemente intercondiţionate care contribuie la
realizarea şi exploatarea unei aplicaţii cu baze de
date.
Componentele unui SBD:
◦ Date
◦ Software
◦ Elemente auxiliare

2
10.10.2021

Definirea SGBD
Un sistem de gestiune a bazelor de date (SGBD)
reprezintă un pachet de programe cu rolul principal
de a gestiona o bază de date şi de a oferi interfaţa
între aceasta şi utilizatori.

Reprezintă partea principală a componentei


software a unui SBD, care interacţionează cu toate
celelalte componente, precum şi cu exteriorul
sistemului.

Definirea SGBD

Cercetătorul C.J. Date descrie SGBD ca fiind o


componentă software cu rolul de a administra
bazele de date şi de a ascunde utilizatorilor detalii
precum modul de stocare şi de accesare a datelor
într-o bază de date.

3
10.10.2021

Definirea SGBD
Un produs software este SGBD dacă, în acelaşi timp:
➢este un sistem: ansamblu de programe intercorelate, care
colaborează pentru realizarea unei aplicaţii cu baze de date;
➢gestionează date stocate în memoria externă, conform unui
model logic de date;
➢îndeplineşte toate funcţiile şi cea mai mare parte a
obiectivelor unui SGBD.

Definirea SGBD
Un SGBD, în mod minimal (obligatoriu), trebuie să:

➢ implementeze un model de date pentru baze de date;

➢ conţină cel puţin un limbaj de programare;

➢ conţină instrumente pentru gestiunea optimă a datelor.

4
10.10.2021

Rolul SGBD
❑ definirea și descrierea structurii bazei de date;
❑ încărcarea și validarea datelor;
❑ realizarea accesului la date (interogare, actualizare);
❑ întreţinerea/administrarea bazei de date (gestiunea
spaţiului, optimizarea BD);
❑ asigurarea protecției datelor (integritatea şi securitatea
datelor).

10

5
10.10.2021

Evoluţia SGBD
A fost determinată în principal de evoluţia modelului de date
implementat:
1.Până în anii ’60 datele erau organizate doar în fişiere, gestionate
de programe scrise în diferite limbaje de programare universale
(exemple: Cobol, Fortran etc.);
2.La sfârşitul anilor ’60 a apărut modelul arborescent de
organizare a datelor în BD şi primele SGBD care erau ierarhice şi
implementau acest model (exemplu: IMS);
3.La începutul anilor ’70 a apărut modelul reţea de organizare a
datelor şi SGBD reţea care implementau acest model (exemple:
IDMS, SOCRATE).
SGBD arborescente şi reţea fac parte din prima generaţie de SGBD
şi constituie pionieratul în domeniu.

Evoluţia SGBD
4. La sfârşitul anilor ’70 şi începutul anilor ’80 a apărut modelul
relaţional de organizare a datelor şi ulterior s-au realizat SGBD
relaţionale care implementau acest model (exemple: Oracle,
Informix, DB2, SQLServer, Visual FoxPro, MySQL, Access etc.).
Este generaţia a doua de SGBD, care prin simplitate,
interactivitate şi neproceduralitate domină piaţa actuală.
5. La sfârşitul anilor ’80, începutul anilor ’90 a apărut modelul
orientat-obiect de organizare a datelor şi SGBD orientate-
obiect care implementau acest model (exemple: Gemstone,
O2, Jasmine etc.). Aceasta este generaţia a treia de SGBD, care
nu s-a impus pe scară largă până acum, ci doar pe anumite
nişe.

6
10.10.2021

Obiectivele SGBD
Obiectivul general al SGBD

Suport software complet pentru dezvoltarea aplicaţiilor cu baze de date

Obiectivele particulare ale SGBD


4.
1. 2. 3. 7.
Protecţia 5. 6.
Independenţa Redundanţă Facilităţi de Performanţe
datelor datelor Partajabilitatea Legăturile
minimă şi utilizare a globale ale
(securitate, datelor între date
(logică, fizică) controlată datelor aplicaţiei
integritate)

BD

13

Obiectivele SGBD
1. Asigurarea independenței datelor faţă de programe

❑fizică - modul de memorare a datelor şi tehnicile fizice de stocare


(strategia de acces) pot fi schimbate fără a rescrie programele;

❑logică - structura de date din dicționarul BD poate fi schimbată


fără a rescrie programele.

14

7
10.10.2021

Obiectivele SGBD
2. Redundanţă minimă şi controlată a datelor

❑ pentru a realiza performanţe sporite în ceea ce priveşte timpul


de răspuns se acceptă o anumită redundanţă a datelor. Aceasta
va fi însă controlată pentru a se asigura coerenţa și
corectitudinea datelor stocate în baza de date.

15

Obiectivele SGBD
3. Facilităţi de utilizare a datelor
❑ utilizarea datelor de către mai mulţi utilizatori în diferite scopuri
sau aplicaţii;
❑ accesul cât mai simplu al utilizatorilor la date, fără ca ei să fie
nevoiţi să cunoască structura întregii baze de date, acest lucru
rămânând în sarcina administratorului bazei de date;
❑ existenţa unor limbaje performante de regăsire a datelor care
permit exprimarea interactivă a unor cereri de regăsire a datelor
şi indicarea unor reguli pentru editarea informaţiilor solicitate;
❑ acces multicriterial la date.

16

8
10.10.2021

Obiectivele SGBD
4. Protecția bazei de date
❑ securitatea datelor:
➢ autorizarea şi controlul accesului;
➢ utilizarea tabelelor virtuale;
➢ realizarea unor proceduri speciale de acces;
➢ criptarea;
❑ integritatea datelor:
➢ integritatea semantică;
➢ accesul concurent;
➢ salvarea și restaurarea datelor.
17

Obiectivele SGBD
5. Partajabilitatea datelor
❑ asigurarea accesului mai multor utilizatori la aceleaşi date şi
posibilitatea dezvoltării unor aplicaţii fără a se modifica structura bazei
de date.
6. Legăturile între date
❑ descrierea datelor se face împreună cu dependențele dintre acestea
conform unui model de date implementat.
7. Performanţele globale
❑ gestiunea unui volum mare de date, de o complexitate ridicată, într-un
anumit timp de acces rezonabil pentru diferiţi utilizatori, prin utilizarea
metodelor de acces, a tehnicilor de optimizare, a diverselor tipuri de
date.
18

9
10.10.2021

Exemple de SGBD

19

CURSUL 3...
Funcțiile SGBD

Tipuri de arhitecturi de SGBD

Clasificarea SGBD

10
18.10.2021

ACADEMIA DE STUDII ECONOMICE BUCUREŞTI


FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

SGBD Oracle
CURSUL 3

BUCUREŞTI
2021-2022

Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)

Agenda

1. Funcțiile SGBD

2. Arhitectura SGBD

3. Clasificarea SGBD

4. Introducere în limbajul PL/SQL

1
18.10.2021

Funcțiile SGBD

UTILIZARE

MANIPULARE DESCRIERE ADMINISTRARE

BAZA DE DATE

Funcțiile SGBD.
Funcţia de descriere
❑permite definirea structurii bazei de date cu ajutorul
limbajului de definire a datelor (LDD). Definirea datelor
poate fi realizată la nivel conceptual, logic şi fizic.
❑se descriu atributele, legăturile dintre entităţile bazei de
date sau dintre atributele aceleiaşi entităţi, se definesc
eventualele criterii de validare a datelor, metodele de
acces la date, aspectele referitoare la asigurarea
integrităţii datelor.
❑concretizarea acestei funcţii este schema bazei de date,
memorată în cod intern.

2
18.10.2021

Funcțiile SGBD.
Funcţia de manipulare

❑ funcţia de manipulare este cea mai complexă şi realizează


actualizarea şi regăsirea datelor din baza de date, cu
ajutorul limbajului de manipulare a datelor (LMD).

Funcțiile SGBD.
Funcţia de manipulare (cont.)
a. încărcarea datelor în baza de date se realizează prin
operaţii automatizate sau programate ce asigură şi
criteriile de validare necesare.
b. actualizarea bazei de date constă în operaţii de adăugare,
modificare şi ştergere de înregistrări. La operaţiile de
adăugare şi de modificare se păstrează aceleaşi criterii de
validare care s-au folosit şi la activitatea de încărcare a
datelor. Actualizarea se realizează numai autorizat, prin
asigurarea unei protecţii corespunzătoare a datelor,
pentru a se păstra coerenţa bazei de date.

3
18.10.2021

Funcțiile SGBD.
Funcţia de manipulare (cont.)
c. prelucrarea datelor se realizează prin operaţii de
selecţie, ordonare, interclasare (compunere) şi ventilare
(descompunere) efectuate asupra entităţilor bazei de
date. Acestea sunt, de obicei, operaţii pregătitoare
activităţii de regăsire a datelor. Multe din operaţiile de
prelucrare sunt realizate cu ajutorul operatorilor din
modelul de date pe care îl implementează SGBD.
d. regăsirea (interogarea) datelor constă în operaţii de
vizualizare și raportare.

Funcțiile SGBD.
Funcţia de utilizare

❑ funcţia de utilizare asigură mulţimea interfeţelor necesare


pentru comunicarea tuturor utilizatorilor cu baza de date.
❑ pentru a realiza această funcţie, SGBD trebuie să asigure
facilităţi pentru mai multe categorii de utilizatori ai bazei
de date: neinformaicieni, specialişti (informaticieni),
administratori.

4
18.10.2021

Funcțiile SGBD.
Funcţia de administrare

❑ funcţia de administrare este complexă şi ține și de


competenţa administratorului bazei de date:
✓ organizarea bazei de date conform modelului de
date;
✓ managementul drepturilor de acces;
✓ organizarea spațiului bazei de date;
✓ protecția bazei de date.

Arhitectura SGBD
Arhitectura pe componente (niveluri) a unui SGBD
SGBD
INTERFEȚE
DE DEZVOLTARE

NUCLEU
BAZA DE DATE

INSTRUMENTE
DE ÎNTREŢINERE

10

5
18.10.2021

Arhitectura SGBD (cont.)


INTERFEȚE

NUCLEU BAZA DE DATE

INSTRUMENTE

➢ nucleul (motorul) conţine limbajul de descriere a datelor


(LDD), limbajul de manipulare a datelor (LMD), componente
obligatorii în kit-ul minim de SGBD;

➢ componenta este destinată analiştilor, programatorilor şi


administratorilor BD.

11

Arhitectura SGBD (cont.)


INTERFEȚE

NUCLEU BAZA DE DATE

INSTRUMENTE

➢ interfeţele sunt formate din: generatoarele de diferite tipuri (de


meniuri, de videoformate, de rapoarte etc.), elementele de
CASE (Computer Aided Software Engineering), interfeţe cu
limbaje de programare universale, interfeţe cu alte sisteme etc.
➢ componenta este destinată tuturor categoriilor de utilizatori:
finali, intensivi, specialişti.
12

6
18.10.2021

Arhitectura SGBD (cont.)


INTERFEȚE

NUCLEU BAZA DE DATE

INSTRUMENTE

➢ instrumentele sunt formate din: editoarele, navigatoarele


(browsers), utilitarele (shells) de diferite tipuri.

➢ componenta este destinată, în principal, administratorului


bazei de date, dar şi altor categorii de utilizatori.

13

Clasificarea SGBD
1. După limbajul de programare utilizat:
➢ SGBD cu limbaj gazdă: este cel care are un limbaj de
manipulare a datelor bazat pe unul de nivel înalt
(universal);
➢ SGBD cu limbaj propriu (autonom): este cel care are
un limbaj de manipulare a datelor specific.

14

7
18.10.2021

Clasificarea SGBD (cont.)


2. După modelul logic de date implementat:
➢ SGBD ierarhice - exemplu: IMS;
➢ SGBD reţea - exemplu: IDMS;
➢ SGBD relaţionale - exemple: Oracle, MS SQL Server,
MySQL, FoxPro, Paradox, Access, Informix, DB2;
➢ SGBD orientate obiect - exemple: O2, Orion,
Jasmine.

15

Clasificarea SGBD (cont.)


3. După localizarea bazei de date:
➢ SGBD centralizate sunt cele care gestionează datele
amplasate într-o singură bază de date centrală;
➢ SGBD distribuite sunt cele care gestionează datele
amplasate pe mai multe calculatoare dintr-o reţea
tratându-le ca un tot unitar.

16

8
18.10.2021

SGBD Oracle

LIMBAJUL PL/SQL. CARACTERIZARE

Introducere în limbajul PL/SQL


PL/SQL este un limbaj de programare procedural care extinde
limbajul descriptiv SQL şi care conţine următoarele elemente:
◦ Blocuri anonime
◦ Proceduri
◦ Funcţii
◦ Pachete de subprograme
◦ Declanşatori Structura generală a unui bloc PL/SQL

DECLARE --opţional
--secţiunea declarativă a blocului;
--cuprinde declaraţii de variabile, cursori, excepţii...;
BEGIN --obligatoriu
--secţiunea executabilă a blocului;
--cuprinde comenzi descriptive SQL, comenzi procedurale şi
structuri de programare PL/SQL;
EXCEPTION --opţional
--secţiunea de tratare a excepţiilor;
optimizarea cererii de regăsire
--cuprinde a datelor
acţiuni care se execută în momentul apariţiei unei
excepţii sau erori;
END; --obligatoriu
18

9
18.10.2021

Introducere în limbajul PL/SQL


Variabile PL/SQL

➢ declararea variabilelor se realizează în zona declarativă


(delimitată prin DECLARE) a blocului;
➢ iniţializarea se poate face la declarare sau în zona de
execuţie (între BEGIN şi END);
➢ variabilele vor fi vizibile în restul blocului, respectiv şi în
blocurile incluse în el, mai puţin în sub-blocurile în care
numele lor este redefinit;

19

Introducere în limbajul PL/SQL


Variabile PL/SQL
➢ variabile scalare
➢ variabile compuse
➢ variabile referinţă
➢ variabile de tip obiect
➢ variabile de tip LOB (Large Objects):
• BLOB (Binary LOB)
• CLOB (Character LOB)
• BFILE (Binary File)
• NCLOB (National CLOB)
optimizarea cererii de regăsire a datelor
20

10
18.10.2021

Introducere în limbajul PL/SQL


Variabile PL/SQL
➢ toate variabilele PL/SQL au un tip de dată, restricţii şi un şir
valid de valori;
➢ declararea şi iniţializarea se realizează astfel:
nume_variabila [CONSTANT] TIP_DATA [NOT NULL]
[:= | DEFAULT expresie]
➢ constantele trebuie obligatoriu iniţializate, iar ulterior nu
îşi vor putea schimba valoarea;
➢ variabilele NOT NULL trebuie obligatoriu iniţializate, iar
ulterior nu vor putea primi valoarea NULL.

optimizarea cererii de regăsire a datelor


21

Introducere în limbajul PL/SQL


Variabile PL/SQL

Atributul %TYPE
➢ utilizat pentru a declara o variabilă:
▪ conform definiţiei unei coloane dintr-o tabelă:
v_nume_ang angajati.nume%TYPE;
▪ conform definiţiei unei alte variabile:
v_sal NUMBER(5,2);
v_sal_mediu v_sal%TYPE;

optimizarea cererii de regăsire a datelor


22

11
18.10.2021

Introducere în limbajul PL/SQL


Variabile PL/SQL

v_functie VARCHAR2(9);
v_totalsal NUMBER(9,2):=0;
v_datainceput DATE:=sysdate+7;
c_taxa CONSTANT NUMBER(3,2):=8.25;
Exemple

v_valid BOOLEAN NOT NULL:=TRUE;


v_pret produse.pret%TYPE:=100;
v_text CONSTANT VARCHAR2(30):='ABC';
v_stoc NUMBER DEFAULT 100;
v_compusa produse%ROWTYPE;

optimizarea cererii de regăsire a datelor


23

Introducere în limbajul PL/SQL


Variabile non-PL/SQL
Variabile de mediu sau variabile de legătură ale aplicaţiilor
gazdă (BIND VARIABLES)
◦ sunt variabile de legătură cu aplicaţia în care rulează
motorul PL/SQL;
◦ trebuie declarate în aplicaţie (în mediul gazdă) şi pot fi
accesate şi modificate în cadrul blocurilor PL/SQL;
◦ după terminarea execuţiei blocului PL/SQL, variabila
rămâne în mediul gazdă cu valoarea primită în urma
rulării blocului;
◦ nu pot fi utilizate în cadrul procedurilor, funcţiilor sau
pachetelor;

24

12
18.10.2021

Introducere în limbajul PL/SQL


Variabile non-PL/SQL

Variabile de mediu sau variabile de legătură ale aplicaţiilor


gazdă (BIND VARIABLES)
◦ se declară în afara blocului PL/SQL prin cuvântul cheie
VARIABLE (pentru declararea unei variabile numerice,
nu se specifică precizia şi scala):
VAR[IABLE] g_numevariabilă TIP
◦ pentru utilizarea lor în cadrul unui bloc PL/SQL sau
într-o frază SQL din afara blocului se prefixează cu “:”
:host_variabila:=v_variabila;
◦ se afişează în afara blocului cu ajutorul comenzii PRINT
PRINT g_numevariabilă

25

Introducere în limbajul PL/SQL


Variabile non-PL/SQL
Variabile de substituţie
◦ de regulă, variabilele de substituţie sunt folosite pentru
a transmite valori spre comenzile SQL sau blocurile
PL/SQL, în timp ce variabilele de legătură (bind
variables) sunt folosite pentru a transmite valori în sens
invers sau pentru a transfera valori între blocuri PL/SQL
lansate succesiv (primul bloc setează variabila,
următorul o consultă);
◦ prin variabile de substituţie se pot transmite valori
comenzilor SQL sau blocurilor PL/SQL lansate (folosind
"&" sau "&&");

26

13
18.10.2021

Introducere în limbajul PL/SQL


Variabile non-PL/SQL
Variabile de substituţie
◦ se pot invoca din comenzile SQL sau din blocurile
PL/SQL prin
&nume_variabila sau &&nume_variabila;
◦ sunt locale sesiunii SQL în care au fost declarate;
◦ variabilele de substituţie pot fi citite prin introducerea
de valori de la tastatură (utilizând ACCEPT
nume_variabila) sau se pot defini (prin DEFINE
nume_variabila = valoare).

27

Blocuri PL/SQL
Bloc fără secțiunile declarativă şi de tratare a excepțiilor:
BEGIN
DBMS_OUTPUT.PUT_LINE('SGBD Oracle');
END;

Bloc cu secțiune declarativă, dar fără secțiune de tratare a excepțiilor:


DECLARE
v_data DATE := SYSDATE;
BEGIN
DBMS_OUTPUT.PUT_LINE('Data curentă: '|| v_data);
END;

28

14
18.10.2021

Blocuri PL/SQL
Bloc cu toate cele trei secţiuni:
DECLARE
x NUMBER := &p_x;
y NUMBER := &p_y;
BEGIN
DBMS_OUTPUT.PUT_LINE(x/y);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Impartire la 0!');
END;
/

29

Blocuri PL/SQL
DECLARE
nume_tata VARCHAR2(20):='Ion';
data_nastere DATE:=TO_DATE('20-Apr-1972','DD-MON-YYYY');
BEGIN
DECLARE
nume_copil VARCHAR2(20):='Mihai';
data_nastere DATE:= TO_DATE('28-Feb-2000','DD-MON-YYYY');
BEGIN
DBMS_OUTPUT.PUT_LINE('Numele tatalui: '||nume_tata);
DBMS_OUTPUT.PUT_LINE('Data nasterii: '||data_nastere);
DBMS_OUTPUT.PUT_LINE('Numele copilului: '||nume_copil);
END;
DBMS_OUTPUT.PUT_LINE('Data nasterii: '||data_nastere);
END;
/

30

15
18.10.2021

Blocuri PL/SQL
<<bloc_extern>>
DECLARE
nume_tata VARCHAR2(20):='Ion';
data_nastere DATE:=TO_DATE('20-Apr-1972','DD-MON-YYYY');
BEGIN
DECLARE
nume_copil VARCHAR2(20):='Mihai';
data_nastere DATE:= TO_DATE('28-Feb-2000','DD-MON-YYYY');
BEGIN
DBMS_OUTPUT.PUT_LINE('Numele tatalui: '||nume_tata);
DBMS_OUTPUT.PUT_LINE('Data nasterii: '
||bloc_extern.data_nastere);
DBMS_OUTPUT.PUT_LINE('Numele copilului: '||nume_copil);
DBMS_OUTPUT.PUT_LINE('Data nasterii: '||data_nastere);
END;
END;
/

31

Funcţii SQL suportate


În cadrul instrucţiunilor descriptive sunt suportate toate
tipurile de funcţii SQL (inclusiv funcţiile de grup în cadrul
instrucţiunii SELECT);
Instrucţiunile PL/SQL:
◦ suportă funcţii la nivel de înregistrare (single-row):
numerice, caracter, data, de conversie etc.;
◦ NU suportă funcţii de grup (SUM, MIN, MAX, AVG,
COUNT, STDDEV) sau funcţia DECODE.

16
18.10.2021

Comenzi SQL în PL/SQL


Comenzi SQL care pot fi utilizate direct în PL/SQL
❑ LMD
✓SELECT
✓INSERT, UPDATE, DELETE, MERGE
DELETE
❑ LCD
✓COMMIT, SAVEPOINT, ROLLBACK

INSERT

UPDATE MERGE

Comenzi SQL în PL/SQL


Comenzi SQL care NU pot fi utilizate direct în PL/SQL

❑ LDD (CREATE, ALTER, DROP)

❑ LCD (GRANT, REVOKE)

Se execută prin utilizarea


SQL dinamic – curs 11

17
18.10.2021

Blocuri PL/SQL
BEGIN
DELETE FROM clienti WHERE id_client=110;
INSERT INTO
clienti(id_client,prenume_client,nume_client)
VALUES (100,'&prenume','&nume');
UPDATE clienti
SET limita_credit = 25000
WHERE id_client = 222;
COMMIT;
END;
/

35

Observații
❑ un bloc PL/SQL nu este o unitate tranzacţională;

❑ într-un bloc pot fi mai multe tranzacţii sau blocul poate


face parte dintr-o tranzacţie;

❑ acţiunile COMMIT, SAVEPOINT şi ROLLBACK sunt


independente de blocuri, dar instrucţiunile asociate
acestor acţiuni pot fi folosite într-un bloc.

36

18
18.10.2021

Blocuri PL/SQL
DECLARE
v_functia VARCHAR2(20);
v_salariul NUMBER;
BEGIN
SELECT id_functie, salariul
INTO v_functia, v_salariul
FROM angajati
WHERE id_angajat = 100;
DBMS_OUTPUT.PUT_LINE (v_functia||' '||v_salariul);
END;
/

37

Rezolvaţi
CARE ESTE EFECTUL BLOCULUI PL/SQL DE MAI JOS?
SET SERVEROUTPUT ON
DECLARE
a NUMBER(10,2);
b NUMBER(2) DEFAULT 7;
c NUMBER(2) DEFAULT 5;
BEGIN
a:=MAX(B,C);
DBMS_OUTPUT.PUT_LINE('a=
'||a);
END;
/
38

19
18.10.2021

Rezolvaţi
CARE ESTE EFECTUL BLOCURILOR PL/SQL DE MAI JOS?
SET SERVEROUTPUT ON SET SERVEROUTPUT ON
DECLARE DECLARE
x NUMBER(2) NOT NULL; x NUMBER(2) NOT NULL :=2;
BEGIN BEGIN
x:=2; DBMS_OUTPUT.PUT_LINE(x);
DBMS_OUTPUT.PUT_LINE(x); END;
END; /
/

39

Rezolvaţi
CARE ESTE EFECTUL BLOCURILOR PL/SQL DE MAI JOS?
SET SERVEROUTPUT ON SET SERVEROUTPUT ON
DECLARE DECLARE
v_nume VARCHAR2(20); v_nume VARCHAR2(20) := 'Ion';
BEGIN BEGIN
DBMS_OUTPUT.PUT_LINE v_nume:= 'Gheorghe';
('Numele este: '||v_nume); DBMS_OUTPUT.PUT_LINE
v_nume:= 'Ion'; ('Numele este: '||v_nume);
DBMS_OUTPUT.PUT_LINE END;
('Numele este: '||v_nume); /
END;
/

40

20
18.10.2021

Rezolvaţi
CARE ESTE EFECTUL BLOCURILOR PL/SQL DE MAI JOS?
SET SERVEROUTPUT ON SET SERVEROUTPUT ON
DECLARE DECLARE
a NUMBER(7); a NUMBER(7);
b NUMBER(7); b NUMBER(7);
BEGIN
BEGIN
SELECT
SUM(salariul),MAX(salariul) SELECT
INTO a,b FROM angajati; SUM(salariul),MAX(salariul)
DBMS_OUTPUT.PUT_LINE('a=' FROM angajati;
||a); END;
DBMS_OUTPUT.PUT_LINE('b=' /
||b);
END;
/

41

Rezolvaţi
CARE ESTE EFECTUL BLOCURILOR PL/SQL DE MAI JOS?
SET SERVEROUTPUT ON SET SERVEROUTPUT ON
BEGIN DECLARE
v_nume VARCHAR2(20);
SELECT * FROM angajati;
v_prenume VARCHAR2(20);
END; BEGIN
/ SELECT nume, prenume INTO
v_nume, v_prenume FROM
angajati WHERE
id_angajat=101;
DBMS_OUTPUT.PUT_LINE(v_nume
||' '|| v_prenume);
END;
/
42

21
18.10.2021

Rezolvaţi
Care dintre următoarele declaraţii sunt corecte:
a. DECLARE
v_nume, v_prenume VARCHAR2(14);

b. DECLARE
v_test NUMBER(5) NOT NULL;

c. DECLARE
v_sal_max NUMBER(5,2) = 550000;

d. DECLARE
v_data_comanda BOOLEAN := SYSDATE;

43

Rezolvaţi
Indicaţi ce tipuri de date vor avea asociate variabilele de mai jos, ca
urmare a atribuirilor efectuate:
a. v_email := v_nume || TO_CHAR(v_id_angajat);

b. v_data := TO_DATE('20-JAN-1999','DD-MON-YYYY');

c. v_sal := (1000*12) + 500;

d. v_test := FALSE;

e. v_data_comanda:= SYSDATE;

44

22
18.10.2021

Rezolvaţi
DECLARE
v_id_client NUMBER(4) := 1600;
v_nume_client VARCHAR2(300) := 'SC Alfa SRL';
v_id_nou NUMBER(3) := 500;
BEGIN
DECLARE
v_id_client NUMBER(4) := 0;
v_nume_client VARCHAR2(300) := 'SC Beta SRL';
v_id_nou NUMBER(3) := 300;
v_nume_nou VARCHAR2(300) := 'SC Gama SRL';
BEGIN
v_id_client:= v_id_nou;
v_nume_client:= v_nume_nou;
A
END;
v_id_client:= v_id_client / 10;
B
END;
/

45

Rezolvaţi
Indicaţi ce tipuri de date şi ce valori vor avea următoarele variabile:
a. v_id_client la poziţia A

b. v_nume_client la poziţia A

c. v_id_nou la poziţia A

d. v_nume_nou la poziţia A

e. v_id_client la poziţia B

f. v_nume_client la poziţia B

46

23
18.10.2021

CURSUL 4...

SGBD relaţionale

24
25.10.2021

ACADEMIA DE STUDII ECONOMICE BUCUREŞTI


FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

Agenda
1. SGBD relaționale - definire
SGBD Oracle 2. SGBD relaționale - facilități
3. SGBD relaționale - arhitectură
CURSUL 4 4. SGBD relaționale - regulile lui Codd
5. SGBD relaționale - avantaje și limitări
6. Limbajul PL/SQL - exerciții recapitulative
7. Limbajul PL/SQL - structuri de control
BUCUREŞTI
2021-2022

Conf.univ.dr. IULIANA BOTHA (ȘIMONCA) 2

1
25.10.2021

Noţiuni fundamentale
❑ Un SGBD relaţional este un sistem software complet care
SGBD Oracle implementeză modelul de date relaţional şi cel puţin un
limbaj relaţional.
SGBD relaţionale

2
25.10.2021

Noţiuni fundamentale Facilităţi ale SGBDR


1. Facilităţi globale:
Paralelă între conceptele utilizate în organizarea datelor a) limbaje relaţionale:
▪ LDD
FIŞIERE TEORIA BD TEORIA SGBDR
▪ LMD
RELAŢIONALĂ
Fişier Colecţie de date Relaţie Tabelă b) mecanisme de protecţie a datelor:
▪ controlul integrităţii
Înregistrare Familie de caracteristici Tuplu Rând ▪ controlul securităţii
c) mecanisme de optimizare a datelor:
Câmp Caracteristică Atribut Coloană ▪ transformări relaţionale
Valoare Domeniu de valori Domeniu Domeniu ▪ optimizarea alocării
▪ optimizarea accesului
d) interfeţe şi instrumente specializate:
▪ interfeţe de dezvoltare
▪ instrumente de întreţinere
5 6

3
25.10.2021

Facilităţi ale SGBDR Facilităţi ale SGBDR


1. Facilităţi globale: 1) Facilităţi de descriere a 1. Facilităţi globale:
datelor la nivel conceptual
a) limbaje relaţionale: – baza de date, tabele de a) limbaje relaţionale: 1) Restricții de integritate;
▪ LDD bază, restricții de ▪ LDD 2) Tranzacţii;
integritate; 3) Blocare;
▪ LMD ▪ LMD 4) Fişiere de jurnalizare.
2) Facilităţi de descriere a
b) mecanisme de protecţie a datelor: datelor la nivel logic – b) mecanisme de protecţie a datelor:
▪ controlul integrităţii tabele virtuale, gestiunea ▪ controlul integrităţii
utilizatorilor;
▪ controlul securităţii 3) Facilităţi de descriere a ▪ controlul securităţii
1) Profile de utilizatori;
c) mecanisme de optimizare a datelor: datelor la nivel fizic – c) mecanisme de optimizare a datelor: 2) Tabele virtuale;
indecși, structuri de 3) Biblioteci de sistem;
▪ transformări relaţionale stocare, gruparea fizică a ▪ transformări relaţionale
4) Criptare.
▪ optimizarea alocării datelor (clusterizare). ▪ optimizarea alocării
▪ optimizarea accesului ▪ optimizarea accesului
d) interfeţe şi instrumente specializate: d) interfeţe şi instrumente specializate:
▪ interfeţe de dezvoltare ▪ interfeţe de dezvoltare
▪ instrumente de întreţinere ▪ instrumente de întreţinere
7 8

4
25.10.2021

Facilităţi ale SGBDR


Arhitectura SGBDR
2. Facilităţi particulare:
a) Facilități de descriere SGBDR
INTERFEȚE
b) Facilități de manipulare DE DEZVOLTARE
c) Facilități de utilizare
d) Facilități de administrare
NUCLEU

BAZA DE DATE
INSTRUMENTE RELAŢIONALĂ
DE ÎNTREŢINERE

9 10

5
25.10.2021

Regulile lui Codd Regulile lui Codd – R0


❑ În anul 1985, E.F. Codd a publicat un set de 13 reguli în raport R0 – regula fundamentală
cu care un SGBD poate fi apreciat ca fiind relaţional
Un sistem se califică drept sistem de gestiune a bazelor de date
❑ Niciun SGBD pus în vânzare pe piaţa comercială nu respectă relaţionale dacă foloseşte exclusiv facilităţile relaţionale pentru
absolut toate regulile definite de Codd, dar acest lucru nu gestiunea bazelor de date.
împiedică etichetarea acestor sisteme drept relaţionale
❑ Regulile lui Codd exprimă cerinţele maximale pentru ca un
SGBD să fie total relaţional
❑ Sunt greu de îndeplinit toate şi fiecare în totalitate
❑ Sunt utile pentru evaluarea unui SGBD
❑ Oracle respectă toate cele 13 reguli, însă R3 şi R6 doar parţial

11 12

6
25.10.2021

Regulile lui Codd – R1 Regulile lui Codd – R2


R1 – reprezentarea logică a datelor R2 – garantarea accesului la date
La nivel logic, toate informaţiile dintr-o bază de date relaţională Orice element dintr-o bază de date relaţională este accesibil din
trebuie stocate ca valori în tabele (inclusiv metadatele stocate în punct de vedere logic prin apelarea la o combinaţie: nume de
dicționarul bazei de date). tabelă, nume de coloană, valoare a cheii primare.

13 14

7
25.10.2021

Regulile lui Codd – R3 Regulile lui Codd – R4


R 3 – tratarea sistematică a valorii NULL R 4 – stocarea metadatelor
Într-o bază de date relaţională trebuie să se permită declararea şi Descrierea BD se stochează în dicţionarul de date şi se tratează la
prelucrarea valorilor NULL ca date lipsă sau inaplicabile / nivel logic în acelaşi mod ca şi datele obişnuite, astfel încât
neprecizate, în mod sistematic, indiferent de tipul de date. utilizatorii autorizaţi pot folosi pentru interogare acelaşi limbaj
relaţional aplicat datelor curente.

SELECT * FROM USER_TABLESPACES;

SELECT * FROM DBA_DATA_FILES;

15 16

8
25.10.2021

Regulile lui Codd – R5 Regulile lui Codd – R6


R 5 – limbajele utilizate R 6 – actualizarea tabelelor virtuale
SGBD trebuie să permită utilizarea mai multor limbaje, dintre care Trebuie să se permită ca tabelele virtuale să fie şi efectiv
cel puţin unul să permită definirea tabelelor (de bază şi virtuale), actualizabile, nu numai teoretic actualizabile.
definirea restricţiilor de integritate, manipularea datelor,
autorizarea accesului, tratarea tranzacţiilor.

17 18

9
25.10.2021

Regulile lui Codd – R6 (cont) Regulile lui Codd –R7


O tabelă virtuală este teoretic actualizabilă dacă îndeplineşte R 7 – actualizările în baza de date
următoarele criterii:
Manipularea unei tabele trebuie să se realizeze prin operaţii de
❑ Nu este construită pe baza operatorilor JOIN *, UNION sau regăsire, dar şi de actulizare.
INTERSECT
❑ Comanda SELECT din cadrul acesteia nu conţine DISTINCT
❑ Comanda SELECT din cadrul acesteia nu conţine funcţii de grup sau
clauzele GROUP BY sau HAVING
❑ Nu conţine coloane derivate (calculate pe baza unor coloane din
tabelele de bază)
❑ Nu include opţiunea READ ONLY

* există excepţii (key-preserved tables)


19 20

10
25.10.2021

Regulile lui Codd – R8 Regulile lui Codd – R9


R 8 – independenţa fizică a datelor R 9 – independenţa logică a datelor
Schimbarea structurii fizice a datelor (modul de organizare şi/sau Schimbarea structurii de date (logice) a tabelelor nu trebuie să
modul de acces) nu trebuie să afecteze programele de aplicaţii. afecteze programele de aplicaţii.

21 22

11
25.10.2021

Regulile lui Codd – R10 Regulile lui Codd – R11


R 10 – restricţiile de integritate R 11 – distribuirea geografică a datelor
Restricţiile de integritate trebuie să fie definite printr-un limbaj Limbajul de manipulare a datelor (LMD) trebuie să permită ca
de definire a datelor (LDD) şi stocate în dicţionarul bazei de date. programele de aplicaţie să fie aceleaşi atât pentru date
distribuite, cât şi pentru date centralizate.

23 24

12
25.10.2021

Regulile lui Codd – R12 Regulile lui Codd


R 12 – prelucrarea datelor la nivel de bază Regulile lui Codd pot fi grupate în cinci categorii
Dacă SGBD posedă un limbaj de nivel scăzut (prelucrarea datelor
se face la nivel de înregistrare), atunci acesta nu trebuie utilizat R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12
pentru a evita restricţiile de integritate. 1. Reguli de bază
x x
(fundamentale)
2. Reguli structurale x x
3. Reguli privind
x x
integritatea datelor
4. Reguli privind
x x x x
manipularea datelor
5. Reguli privind
x x x
independenţa datelor

25 26

13
25.10.2021

Regulile lui Codd – tipuri de SGBDR Avantajele SGBDR


❑ cu interfaţă relaţională - toate datele se reprezintă în tabele, ❑ Simplitatea conceptelor şi a schemei;
există operatorii de selecţie, proiecţie şi joncţiune doar pentru
interogare; ❑ Un grad mare de independenţă a datelor faţă de programe;
❑ pseudorelaţional - toate datele se reprezintă în tabele, există
operatorii de selecţie, proiecţie şi joncţiune fără limitări; ❑ Limbajele relaţionale declarative au o mare putere de regăsire;
❑ minimal relaţional - este pseudorelaţional şi în plus, operaţiile
cu tabele nu fac apel la pointeri observabili de utilizatori; ❑ Optimizarea accesului la date, precum şi a alocării datelor;

❑ complet relaţional - este minimal relaţional şi în plus, există ❑ Manipularea de ansambluri de date prin operatorii din calculul
operatorii de reuniune, intersecţie şi diferenţă, precum şi sau algebra relaţională, cu implicaţii importante pentru
restricţiile de integritate privind unicitatea cheii şi restricţia
referenţială.
regăsirea datelor.

27 28

14
25.10.2021

Limitele SGBDR
❑ Pierderea unor informaţii semantice utile prin normalizare;

❑ Operaţiile relaţionale, chiar optimizate, sunt costisitoare din


punct de vedere al resurselor de calcul;
LIMBAJUL PL/SQL
❑ LMD relaţionale sunt prea limitate, ceea ce generează RECAPITULARE – NOȚIUNI GENERALE
disfuncţionalităţi;

❑ Mecanismele de optimizare implicite privesc doar LMD


relaţional, deci ceea ce este scris în limbaj procedural trebuie
optimizat de către programator.

29

15
25.10.2021

EXERCIȚII PL/SQL EXERCIȚII PL/SQL

1. Creaţi un bloc PL/SQL ce selectează prețul de listă maxim pentru 2. Creaţi un bloc PL/SQL care şterge un produs pe baza codului acestuia
produsele existente în tabela PRODUSE. Afișați rezultatul pe ecran. primit ca parametru (variabilă de substituţie). Anulaţi ştergerea.

31 32

16
25.10.2021

EXERCIȚII PL/SQL
3. Creaţi un bloc PL/SQL ce adaugă un produs nou în tabela PRODUSE.
a)Folosiți maximul dintre codurile produselor și adăugaţi 10 la această
valoare, folosind-o drept valoare pentru codul produsului nou introdus.
b)Folosiţi un parametru (variabilă de substituţie) pentru denumire,
LIMBAJUL PL/SQL
categoria şi prețul de listă al produsului.
c)Lăsaţi restul coloanelor NULL. STRUCTURI FUNDAMENTALE DE CONTROL
d)Executaţi blocul.

33

17
25.10.2021

Elemente de programare procedurală


Structuri fundamentale de control
Elemente de programare procedurală
Structuri fundamentale de control IF conditie_1 THEN
secventa_comenzi_1;
ELSE
secventa_comenzi_2;
IF conditie_1 THEN END IF;
CASE [selector]
secventa_comenzi_1;
WHEN expresie_1 THEN
ELSIF conditie_2 THEN
actiune_1;
secventa_comenzi_2;
WHEN expresie_2 THEN
ELSIF conditie_3 THEN
secventa_comenzi_3; Structura actiune_2;
alternativă --------
---------
WHEN expresie_n THEN
ELSIF conditie_n THEN
actiune_n;
secventa_comenzi_n;
[ELSE actiune_n+1];
ELSE
END CASE;
secventa_comenzi_n+1;
END IF;
variabila:=
CASE [selector]
WHEN expresie_1 THEN rezultat_1
WHEN expresie_2 THEN rezultat_2
--------
WHEN expresie_n THEN rezultat_n
[ELSE rezultat_n+1]
END;

35 36

18
25.10.2021

Elemente de programare procedurală Elemente de programare procedurală


Structuri fundamentale de control Structuri fundamentale de control
DECLARE
nota number;
BEGIN
IF nota<5 THEN
DBMS_OUTPUT.PUT_LINE('Nepromovat!');
ELSE
DBMS_OUTPUT.PUT_LINE('Promovat!');
END IF;
DECLARE END;
LOOP
DECLARE
v_stoc produse.stoc%TYPE; / secventa_comenzi;
v_stoc produse.stoc%TYPE;
BEGIN
SELECT stoc INTO v_stoc FROM
BEGIN EXIT [WHEN conditie];
SELECT stoc INTO v_stoc FROM
produse WHERE id_produs=10;
produse WHERE id_produs=10;
END LOOP;
IF v_stoc < 500 THEN
v_stoc:=2* v_stoc; Structura CASE
WHEN v_stoc < 500
ELSIF v_stoc BETWEEN 500 AND
1000 THEN
alternativă THEN v_stoc:= v_stoc *2;
WHEN v_stoc BETWEEN 500 AND
v_stoc:=1.5 * v_stoc;
1000 THEN v_stoc:= v_stoc *1.5;
ELSE
ELSE v_stoc:= v_stoc *1.25;
v_stoc:=1.25* v_stoc;
END CASE;
END IF; DECLARE
END; v_stoc produse.stoc%TYPE;
END; WHILE conditie LOOP FOR n IN [REVERSE]
/
/ v_proc NUMBER(4,2); secventa_comenzi_1; min..max LOOP
BEGIN
SELECT stoc INTO v_stoc FROM produse
secventa_comenzi_2; Structura repetitivă secventa_comenzi;
WHERE id_produs=10; EXIT [WHEN conditie]; EXIT [WHEN conditie];
v_proc:= END LOOP; END LOOP;
CASE
WHEN v_stoc < 500 THEN 2
WHEN v_stoc BETWEEN 500 AND 1000 THEN 1.5
ELSE 1.25
END;
v_stoc:= v_stoc *v_proc;
END;
/

37 38

19
25.10.2021

Elemente de programare procedurală


Structuri fundamentale de control
DECLARE
v_nr NUMBER(2):=1;
Tratarea valorilor NULL
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE ❑ Comparaţiile simple care implică NULL sunt evaluate la NULL
(v_nr);
v_nr:=v_nr+1; ❑ Aplicarea operatorului logic NOT unei valori NULL va conduce la NULL
EXIT WHEN v_nr > 10;
END LOOP; ❑ În cadrul structurilor de control, în cazul în care condiţiile sunt evaluate
END;
/ la NULL, atunci secvenţa de comenzi asociată nu se execută
x := 5;
DECLARE y := NULL;
v_nr NUMBER(2):=1; BEGIN ...
BEGIN FOR v_nr IN 1..10 IF x != y THEN -- returnează NULL
WHILE v_nr <= 10 Structura repetitivă LOOP -- secvenţă de comenzi care nu se execută
LOOP DBMS_OUTPUT.PUT_LINE END IF;
DBMS_OUTPUT.PUT_LINE (v_nr);
(v_nr); END LOOP;
a := NULL;
v_nr:=v_nr+1; END; b := NULL;
END LOOP; / ...
END; IF a = b THEN -- returnează NULL
/ -- secvenţă de comenzi care nu se execută
END IF;

39 40

20
25.10.2021

Tratarea valorilor NULL Rezolvaţi


Ce valoare primeşte variabila test în fiecare caz dintre următoarele:

test := a AND b;

a b test
TRUE TRUE ?
TRUE FALSE ?
NULL TRUE ?
NULL FALSE ?

41 42

21
25.10.2021

TEMĂ CURSUL 5...


Construiți un bloc PL/SQL prin care să verificați dacă un an citit
de la tastatură este sau nu bisect. Limbajul PL/SQL – gestiunea cursorilor...

Testați soluția cu următoarele valori:


1990 Nu este an bisect
2000 An bisect
1996 An bisect
1886 Nu este an bisect
1992 An bisect
1824 An bisect

43

22
30.10.2021

ACADEMIA DE STUDII ECONOMICE BUCUREŞTI


FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

SGBD Oracle
CURSUL 5

BUCUREŞTI
2021-2022

Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)

Agenda
1. Limbajul PL/SQL - cursorul implicit
2. Limbajul PL/SQL - cursorul explicit
3. Limbajul PL/SQL - exerciții recapitulative

1
30.10.2021

LIMBAJUL PL/SQL
MECANISMUL DE CURSOR

Mecanismul de cursor
❑ Atunci când se execută o comandă SQL, Oracle Server deschide
o zonă de memorie (context area) în care comanda este
executată. Cursorul este un pointer către această zonă
❑ În PL/SQL se utilizează două tipuri de cursoare:
1) implicit: declarat pentru toate instrucţiunile PL/SQL de
tip LMD (INSERT / UPDATE / DELETE /SELECT care
returnează un singur rând);
2) explicit: declarat şi gestionat de programator pentru a
procesa individual fiecare rând returnat de o instrucţiune
SELECT care generează mai multe rânduri.

2
30.10.2021

Mecanismul de cursor
Cursorul implicit

Atributele cursorului implicit, prin care se testează modul de


execuţie a comenzilor LMD:
Atribut Tip Descriere
SQL%FOUND Boolean Evaluat la TRUE dacă ultima comandă LMD a afectat /
returnat cel puţin un rând
Evaluat la NULL înainte de execuţia unei comenzi LMD
SQL%NOTFOUND Boolean Evaluat la TRUE dacă ultima comandă LMD nu a
afectat / returnat niciun rând
Complementar atributului %FOUND
Evaluat la NULL înainte de execuţia unei comenzi LMD
SQL%ROWCOUNT Number Returnează numărul de rânduri afectate de ultima
comandă LMD
Evaluat la NULL înainte de execuţia unei comenzi LMD
SQL%ISOPEN Boolean Evaluat la FALSE după execuţia unei comenzi LMD

Mecanismul de cursor
Cursorul implicit

BEGIN
UPDATE angajati
SET comision=0.2
WHERE salariul < 2000;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('Nu exista angajati cu salariul
mai mic decat limita');
ELSE
DBMS_OUTPUT.PUT_LINE('S-a modificat comisionul pentru
'|| SQL%ROWCOUNT || ' angajati');
END IF;
COMMIT;
END;
/

3
30.10.2021

Mecanismul de cursor
Cursorul explicit

Prelucrarea cursorului explicit presupune parcurgerea


următoarelor etape:
1. Declararea variabilelor
2. Declararea cursorului, specificând fraza SELECT
CURSOR nume_cursor IS SELECT .....;

3. Deschiderea cursorului
OPEN nume_cursor;
4. Încărcarea liniilor din cursor în variabile
FETCH nume_cursor INTO var1, var2, ...;

5. Închiderea cursorului
CLOSE nume_cursor;

Mecanismul de cursor
Cursorul explicit

Atributele cursorului explicit:

Atribut Tip Descriere


%ISOPEN Boolean Evaluat la TRUE atunci când cursorul a fost deschis
%FOUND Boolean Evaluat la TRUE atunci când cel mai recent FETCH
a returnat un rând
Evaluat la NULL înainte de primul FETCH
%NOTFOUND Boolean Evaluat la TRUE atunci când cel mai recent FETCH
nu a returnat niciun rând
Complementar atributului %FOUND
Evaluat la NULL înainte de primul FETCH
%ROWCOUNT Number Returnează numărul total de rânduri parcurse
până în acel moment
Evaluat la NULL înainte de prima parcurgere

4
30.10.2021

Mecanismul de cursor
Cursorul explicit

DECLARE
CURSOR c IS SELECT id_angajat, nume, salariul FROM
angajati WHERE id_departament=60;
v_id angajati.id_angajat%TYPE;
v_nume angajati.nume%TYPE;
v_sal angajati.salariul%TYPE;
BEGIN
OPEN c;
LOOP
FETCH c INTO v_id, v_nume, v_sal;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Salariatul '||v_nume||' are
salariul: '||v_sal);
END LOOP;
CLOSE c;
END;
/
9

Mecanismul de cursor
Cursorul explicit

DECLARE
CURSOR c IS SELECT id_angajat, nume, salariul FROM
angajati WHERE id_departament=60;
rec_c c%ROWTYPE;
BEGIN
OPEN c;
LOOP
FETCH c INTO rec_c;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Salariatul '||rec_c.nume||' are
salariul: '||rec_c.salariul);
END LOOP;
CLOSE c;
END;
/

10

5
30.10.2021

Atributul %ROWTYPE
DECLARE
CURSOR c IS SELECT id_angajat, nume, salariul FROM
angajati WHERE id_departament=60;
rec_c c%ROWTYPE;
Elemente ale rec_c
............
id_angajat, nume, salariul
DECLARE
CURSOR c IS SELECT nr_comanda, COUNT(id_produs)
numar_produse FROM .....;
rec_c c%ROWTYPE; Elemente ale rec_c
............ nr_comanda, numar_produse
DECLARE
CURSOR c IS SELECT * FROM tari;
rec_c c%ROWTYPE; Elemente ale rec_c
Id_tara, denumire_tara, id_regiune
11

Mecanismul de cursor
Cursorul explicit

Gestiunea cursorului prin utilizarea unui ciclu FOR

FOR variabila_compusa IN nume_cursor LOOP


-----
END LOOP;

✓ în acest caz, variabila compusă nu trebuie declarată;


✓ se realizează în mod implicit deschiderea, încărcarea şi
închiderea cursorului.

12

6
30.10.2021

Mecanismul de cursor
Cursorul explicit

Utilizarea unui cursor direct în cadrul instrucţiunii FOR

FOR NUME_RECORD IN (SELECT ...) LOOP


-----
END LOOP;

✓ în acest caz cursorul nu este declarat, nu are nume, este


reprezentat doar de interogarea SELECT din cadrul
instrucţiunii FOR;
✓ dezavantajul este ca nu se pot utiliza atributele cursorului
din cauza faptului că acesta nu are nume.

13

Mecanismul de cursor
Cursorul explicit
DECLARE BEGIN
CURSOR c IS SELECT FOR rec_ang IN (SELECT
id_angajat, nume, salariul id_angajat, nume, salariul
FROM angajati WHERE FROM angajati WHERE
id_departament=60; id_departament=60)
BEGIN LOOP
FOR rec_ang IN c LOOP DBMS_OUTPUT.PUT_LINE
('Salariatul '||
DBMS_OUTPUT.PUT_LINE
rec_ang.nume || ' are
('Salariatul '|| salariul: ' ||
rec_ang.nume || ' are rec_ang.salariul);
salariul: ' ||
rec_ang.salariul); END LOOP;
END LOOP; END;
END; /
/ 14

7
30.10.2021

Mecanismul de cursor
Cursorul explicit parametrizat

CURSOR c_cursor
[(nume_param TIP_DATA, ...)]
IS
SELECT...;
-----
OPEN c_cursor (valoare_param,...);

15

Mecanismul de cursor
Cursorul explicit parametrizat
DECLARE
CURSOR c_ang (p_id NUMBER) IS
SELECT id_angajat, nume
FROM angajati
WHERE id_departament=p_id;
rec_ang c_ang%ROWTYPE;
BEGIN
SELECT id_angajat, nume
OPEN c_ang (80); FROM angajati
LOOP WHERE id_departament=80;
FETCH c_ang INTO rec_ang;
EXIT WHEN c_ang%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Angajatul '||rec_ang.nume);
END LOOP;
CLOSE c_ang;
FOR rec_ang IN c_ang (90) LOOP
DBMS_OUTPUT.PUT_LINE('***Angajatul '||rec_ang.nume);
END LOOP;
END; SELECT id_angajat, nume
FROM angajati
/ WHERE id_departament=90;
16

8
30.10.2021

Rezolvaţi
Ce va afişa blocul PL/SQL?
begin
update angajati
set salariul=salariul+10
where id_departament=30;
if SQL%ISOPEN then
dbms_output.put_line('deschis’);
else
dbms_output.put_line('inchis’);
end if;
end;
/
a) deschis
b) inchis
c) va genera o eroare la compilare
d) va returna o excepţie
e) NULL

Rezolvaţi
Ce va afişa blocul PL/SQL?

DECLARE
CURSOR c1 IS SELECT * FROM angajati WHERE comision IS NULL;
CURSOR c2 IS SELECT * FROM angajati WHERE 1=2;
BEGIN
OPEN c1;
IF c1%FOUND THEN
DBMS_OUTPUT.PUT_LINE('AAA');
ELSE
DBMS_OUTPUT.PUT_LINE('BBB');
END IF;
OPEN c2;
IF c2%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('ZZZ');
ELSE
DBMS_OUTPUT.PUT_LINE('YYY');
END IF;
CLOSE c1; CLOSE c2;
END;

9
30.10.2021

Rezolvaţi
Ce va afişa blocul PL/SQL?

DECLARE
CURSOR c1 IS SELECT * FROM angajati ORDER BY salariul DESC;
r1 c1%ROWTYPE;

BEGIN
OPEN c1;
WHILE c1%FOUND
LOOP
DBMS_OUTPUT.PUT_LINE(r1.nume);
FETCH c1 INTO r1;
END LOOP;
CLOSE c1;
END;
/

Rezolvaţi
Ce va afişa blocul PL/SQL?

DECLARE
CURSOR c1 IS SELECT * FROM angajati ORDER BY salariul DESC;

BEGIN
OPEN c1;
FOR r1 IN c1 LOOP
DBMS_OUTPUT.PUT_LINE(r1.nume);
END LOOP;
CLOSE c1;
END;
/

10
30.10.2021

Rezolvaţi
Ce va afişa blocul PL/SQL?

DECLARE
CURSOR c IS SELECT nume FROM angajati WHERE id_angajat=3;
r c%ROWTYPE;

BEGIN
OPEN c;
FETCH c INTO r;
IF c%ROWCOUNT = 0 THEN
DBMS_OUTPUT.PUT_LINE('nu s-au preluat date in setul
curent');
ELSE DBMS_OUTPUT.PUT_LINE(r.nume);
END IF;
CLOSE c;
END;
/

CURSUL 6...

Limbajul PL/SQL. Tratarea excepţiilor.

11
14.10.2021

ACADEMIA DE STUDII ECONOMICE BUCUREŞTI


FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

SGBD Oracle
LIMBAJUL PL/SQL. NOȚIUNI FUNDAMENTALE

Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)


iuliana.botha@ie.ase.ro

BUCUREŞTI
2021-2022

Introducere în limbajul PL/SQL


PL/SQL este un limbaj de programare procedural care extinde
limbajul descriptiv SQL şi care conţine următoarele elemente:
◦ Blocuri anonime

◦ Proceduri

◦ Funcţii

◦ Pachete de subprograme

◦ Declanşatori

optimizarea cererii de regăsire a datelor


2

1
14.10.2021

Blocul PL/SQL

DECLARE --opţional
--secţiunea declarativă a blocului;
--cuprinde declaraţii de variabile, cursori, excepţii...;
BEGIN --obligatoriu
--secţiunea executabilă a blocului;
--cuprinde comenzi descriptive SQL, comenzi procedurale şi
structuri de programare PL/SQL;
EXCEPTION --opţional
--secţiunea de tratare a excepţiilor;
--cuprinde acţiuni care se execută în momentul apariţiei unei
excepţii sau erori;
END; --obligatoriu

optimizarea cererii de regăsire a datelor


3

Operatori utilizați
Operator
* , / , - , +, **
= , >= , > , <= , < , <> , != , IS , LIKE , IN
BETWEEN
NOT
AND
|| , OR
:= (operatorul de atribuire)

2
14.10.2021

Funcţii SQL suportate


Instrucţiunile SQL acceptă toate tipurile de funcţii SQL
(inclusiv funcţiile de grup în cadrul instrucţiunii SELECT);
Instrucţiunile PL/SQL:
◦ suportă funcţii la nivel de înregistrare (single-row):
numerice, caracter, data, de conversie etc.;
◦ NU suportă funcţii de grup (SUM, MIN, MAX, AVG,
COUNT, STDDEV) sau funcţia DECODE.

Comenzi SQL în PL/SQL


Comenzi SQL care pot fi utilizate direct în PL/SQL
❑ LMD (comenzile limbajului de manipulare a datelor)
✓SELECT
✓INSERT, UPDATE, DELETE
❑ LPT (comenzile limbajului de procesare a tranzacțiilor)
✓COMMIT, SAVEPOINT, ROLLBACK

3
14.10.2021

Comenzi SQL în PL/SQL


Comenzi SQL care NU pot fi utilizate direct în PL/SQL

❑ LDD (CREATE, ALTER, DROP)

❑ LCD (GRANT, REVOKE)

Se execută prin utilizarea


comenzii PL/SQL:
EXECUTE IMMEDIATE

Variabile PL/SQL

➢ Declarare:
nume_variabila [CONSTANT] TIP_DATA [NOT NULL]
[:= | DEFAULT expresie]

➢ constantele trebuie obligatoriu iniţializate, iar ulterior nu


îşi vor putea schimba valoarea;
➢ variabilele NOT NULL trebuie obligatoriu iniţializate

optimizarea cererii de regăsire a datelor


8

4
14.10.2021

Variabile PL/SQL
➢ Exemple:
v_salariu NUMBER;

v_data_nastere DATE;

v_nume VARCHAR2(20);

v_pret NUMBER NOT NULL:=2000;

optimizarea cererii de regăsire a datelor


9

Variabile PL/SQL
Atributul %TYPE
➢ Preia definirea unei coloane dintr-o tabelă:
v_nume_ang angajati.nume%TYPE;

▪ Preia definirea unei alte variabile:


v_sal NUMBER(5,2);
v_sal_mediu v_sal%TYPE;

optimizarea cererii de regăsire a datelor


10

5
14.10.2021

Variabile PL/SQL - exemplu


DECLARE
v_nume VARCHAR2(20);
v_sal NUMBER NOT NULL:=100;
v_bonus v_sal%TYPE:=&a; --citire de la tastatură
BEGIN
v_nume:='Anonim';
v_sal:=v_sal+20;
DBMS_OUTPUT.PUT_LINE (v_nume||' are salariul '||v_sal||'
si bonusul '||v_bonus);
END;
/

11

TEMĂ
1. Să se creeze tabelele bazei de date pentru proiect.
2. Să se adauge înregistrări în tabelele create (prin comenzi SQL)

* Comenzile se vor testa în SQL Developer

12

6
25.10.2021

ACADEMIA DE STUDII ECONOMICE BUCUREŞTI


FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

SGBD Oracle
LIMBAJUL PL/SQL

Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)


iuliana.botha@ie.ase.ro

BUCUREŞTI
2021-2022

Structura blocului PL/SQL

DECLARE --opţional
--secţiunea declarativă a blocului;
--cuprinde declaraţii de variabile, cursori, excepţii...;
BEGIN --obligatoriu
--secţiunea executabilă a blocului;
--cuprinde comenzi descriptive SQL, comenzi procedurale şi
structuri de programare PL/SQL;
EXCEPTION --opţional
--secţiunea de tratare a excepţiilor;
--cuprinde acţiuni care se execută în momentul apariţiei unei
excepţii sau erori;
END; --obligatoriu

optimizarea cererii de regăsire a datelor


2

1
25.10.2021

Comenzi SQL
SELECT
DECLARE
v_nume VARCHAR2(20);
v_sal NUMBER NOT NULL:=0;
v_data DATE;
v_id NUMBER NOT NULL:=&id;
BEGIN
SELECT nume, salariul, data_angajare
INTO v_nume, v_sal, v_data
FROM angajati WHERE id_angajat=v_id;
DBMS_OUTPUT.PUT_LINE ('Angajatul '||v_id|| ' este '||
v_nume||' '||v_sal||' '||v_data);
END;
/
3

Comenzi SQL
UPDATE
DECLARE
v_id NUMBER:=&id;
BEGIN
UPDATE angajati
SET salariul=salariul*2
WHERE id_angajat = v_id;
END;
/

2
25.10.2021

Comenzi SQL
INSERT

DECLARE
v_den produse.denumire_produs%TYPE := 'coca cola';
v_desc produse.descriere%TYPE := 'sticla 2 litri';
BEGIN
INSERT INTO produse (id_produs,denumire_produs,descriere)
VALUES (10, v_den, v_desc);
END;
/

Comenzi SQL
DELETE
DECLARE
v_id NUMBER:=&id;
BEGIN
DELETE FROM angajati
WHERE id_angajat = v_id;
END;
/

3
25.10.2021

EXERCIȚII
-- sa se afiseze numele si vechimea angajatului citit de la tastatura

-- sa se calculeze salariul mediu al angajatilor din departamentul citit de


la tastatura

SGBD Oracle
STRUCTURI DE CONTROL

4
25.10.2021

Structuri de control

11

Structuri de control
IF conditie_1 THEN
secventa_comenzi_1;
ELSE
secventa_comenzi_2;
IF conditie_1 THEN END IF;
CASE [selector]
secventa_comenzi_1;
WHEN expresie_1 THEN
ELSIF conditie_2 THEN
actiune_1;
secventa_comenzi_2;
WHEN expresie_2 THEN
ELSIF conditie_3 THEN
secventa_comenzi_3; Structura actiune_2;
alternativă --------
---------
WHEN expresie_n THEN
ELSIF conditie_n THEN
actiune_n;
secventa_comenzi_n;
[ELSE actiune_n+1];
ELSE
END CASE;
secventa_comenzi_n+1;
END IF;
variabila:=
CASE [selector]
WHEN expresie_1 THEN rezultat_1
WHEN expresie_2 THEN rezultat_2
--------
WHEN expresie_n THEN rezultat_n
[ELSE rezultat_n+1]
END;

12

5
25.10.2021

Structuri de control

LOOP
secventa_comenzi;
EXIT [WHEN conditie];
END LOOP;

WHILE conditie LOOP FOR n IN [REVERSE]


secventa_comenzi_1; min..max LOOP
secventa_comenzi_2; Structura repetitivă secventa_comenzi;
EXIT [WHEN conditie]; EXIT [WHEN conditie];
END LOOP; END LOOP;

13

Exemplu
- - sa se parcurga angajatii care au id-uri de la 100 la 120

DECLARE
v_nume VARCHAR2(20);
v_sal NUMBER NOT NULL:=0;
BEGIN
FOR i IN 100..120 LOOP
SELECT nume, salariul
INTO v_nume, v_sal
FROM angajati
WHERE id_angajat=i;
DBMS_OUTPUT.PUT_LINE ('Angajatul '||i|| ' este '||
v_nume||' - '||v_sal);
END LOOP;
END;
/
14

6
25.10.2021

EXERCIȚII
-- sa se parcurga TOTI angajatii, folosind pe rand structurile: FOR-LOOP,
WHILE-LOOP, LOOP-EXIT WHEN

-- sa se stearga angajatul cu id_angajat 150

-- sa se parcurga toti angajatii, folosind pe rand structurile: FOR-LOOP,


WHILE-LOOP, LOOP-EXIT WHEN

15

TEMĂ
1. Să se creeze minim 4 exemple de blocuri PL/SQL conținând structuri
de control variate, folosind BD proprie

* Comenzile se vor testa în SQL Developer

19

7
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 2

Introducere în PL/SQL – Procedural Language extension to SQL

1. Caracteristici generale:
 Construcţiile PL/SQL conţin structuri de control procedurale şi comenzi descriptive SQL;
 PL/SQL este un limbaj procedural structurat pe bloc, programele putând fi împărţite în
blocuri logice;
 Blocurile PL/SQL sunt procesate de motorul PL/SQL care poate fi rezident pe ORACLE
SERVER sau pe un instrument de dezvoltare (ex.: APEX, Oracle Forms, Reports,
JDeveloper etc.);
 Multe instrumente ORACLE au propriul motor PL/SQL (ex.: APEX, Oracle Forms, Reports,
JDeveloper etc.);
 Tipurile de date din SQL pot fi folosite în PL/SQL;
 Programarea în PL/SQL este modularizată – se utilizează blocurile care grupează
instrucţiunile.

2. Blocuri PL/SQL:
Orice unitate PL/SQL conţine unul sau mai multe blocuri, complet separate sau imbricate.

Componentele unui bloc PL/SQL:

Un bloc PL/SQL este compus din până la 3 secţiuni: declarativă (opţională), executabilă
(obligatorie) şi de tratare a excepţiilor (opţională).

DECLARE (Opţional)
variabile, cursori, excepţii
BEGIN (Obligatoriu)
comenzi SQL (asigură accesul la baza de date)
structuri de programare procedurală PL/SQL
EXCEPTION (Opţional)
acţiuni ce se execută când apare o eroare
END; (Obligatoriu)

Observaţii:
 comenzile SQL asigură accesul la baza de date;
 operaţiile efectuate cu variabilele PL/SQL în cadrul instrucţiunilor procedurale nu presupun
accesarea bazei de date;
 se foloseşte (;) după fiecare instrucţiune SQL sau instrucţiune de control PL/SQL;
 blocul PL/SQL se termină cu (;);
 se foloseşte (/) pentru a lansa un bloc anonim în bufferul SQL;
 o eroare în PL/SQL este tratată ca o excepţie.

-1 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 2

Tipuri de blocuri PL/SQL:


1. Blocuri anonime;
2. Funcţii stocate şi funcţii de aplicaţii;
3. Proceduri stocate şi proceduri de aplicaţii;
4. Pachete;
5. Declanşatoare (triggeri) pe baza de date / de aplicaţii.

1. Blocurile anonime:
 nu au nume;
 nu sunt stocate în baza de date;
 se declară inline, în locul în care se doreşte execuţia lor;
 se execută în momentul rulării.

2 / 3. Proceduri, funcţii:
 blocuri PL/SQL cu un nume;
 se pot stoca la nivel de ORACLE SERVER(proceduri/funcţii stocate) sau la nivel de aplicaţie
(APEX sau Forms & Reports).

4. Pachete de programe - grupează proceduri, funcţii.

5. Declanşatori pe baza de date - blocuri PL/SQL asociate tabelelor (de bază sau virtuale) şi
lansate automat în execuţie când are loc o comanda de manipulare. Declanşatorii de aplicaţie
desemnează blocuri PL/SQL asociate unor evenimente din cadrul aplicaţiei (de exemplu:
deplasarea mouse-ului, apăsarea unui buton) şi lansate în execuţie automat.

3. Operatori în PL/SQL

Operator Caracteristici
+, -, *, /, ** (op. exponenţial) Operatori aritmetici
AND, OR, NOT Operatori logici
<, >, =, >=, <=, <>, != Operatori de comparaţie
BETWEEN ... AND ... Operator de verificare a apartenenţei la un interval
IN(listă) Operator de verificare a apartenenţei la o listă de valori
LIKE Operator de comparare cu un şablon
% - oricâte caractere; _ - un caracter;
IS NULL Operator care verifică dacă o variabilă are valoarea NULL
|| Operator de concatenare
@ Operator de conectare la distanţă
& Operatori pentru adresarea variabilelor de substituţie
sau &&
:= Operator de atribuire

-2 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 2

4. Funcţii SQL suportate în PL/SQL

 În cadrul instrucţiunilor descriptive sunt suportate toate tipurile de funcţii SQL (inclusiv
funcţiile de grup în cadrul instrucţiunii SELECT);
 Instrucţiunile PL/SQL:
 Suportă funcţii la nivel de înregistrare (single-row): numerice, caracter, data, de
conversie etc.;
 NU suportă funcţii de grup (SUM, MIN, MAX, AVG, COUNT, STDDEV) sau
funcţia DECODE. De exemplu nu se pot utiliza construcţii de forma: IF
DECODE(...) THEN ... sau IF AVG(...) THEN ... sau a:=max(b,c). Pentru a afla
maximul dintre 2 sau mai multe valori se poate folosi funcția la nivel de
înregistrare GREATEST (LEAST pentru minim).

5. Comenzi SQL suportate în PL/SQL

 PL/SQL permite folosirea comenzilor de manipulare a datelor (LMD):


 SELECT
 INSERT
 UPDATE
 DELETE
 PL/SQL permite folosirea comenzilor de control al tranzacţiilor:
 COMMIT
 ROLLBACK
 SAVEPOINT

Notă: Un bloc PL/SQL nu este o tranzacţie. Comenzile Commit/ Rollback/ Savepoint sunt
independente de bloc, dar pot să apară în cadrul acestuia.

 PL/SQL NU suportă comenzile de definire a datelor (LDD)


 CREATE
 ALTER
 DROP
 RENAME
 TRUNCATE
 PL/SQL NU suportă comenzile din cadrul limbajului pentru controlul datelor (LCD)
 GRANT
 REVOKE

Notă: Comenzile LDD și LCD pot fi folosite prin intermediul comenzii EXECUTE
IMMEDIATE.

-3 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 2

VARIABILE
1. Declarare şi iniţializare
 declararea variabilelor se realizează în zona declarativă (delimitată prin DECLARE) a
blocului (sau sub-blocului);
 iniţializarea se poate face la declarare sau în zona de execuţie (între BEGIN şi END);
 variabilele vor fi vizibile în restul blocului, respectiv şi în blocurile incluse în el, mai puţin în
sub-blocurile în care numele lor este redefinit (ca în majoritatea limbajelor de programare
structurate, semnificaţia unui nume definit de utilizator într-un bloc/sub-bloc este dată de cea
mai apropiată declaraţie anterioară locului folosirii);
 toate variabilele PL/SQL au un tip de dată, restricţii şi un şir valid de valori;
 declararea şi iniţializarea se realizează astfel:

nume_variabila [CONSTANT] TIP_DATA [NOT NULL] [:= | DEFAULT expresie]

 constantele trebuie obligatoriu iniţializate, iar ulterior nu îşi vor putea schimba valoarea;
 variabilele NOT NULL trebuie obligatoriu iniţializate, iar ulterior nu vor putea primi
valoarea NULL;
 se foloseşte următoarea convenţie de notare:
c_nume Constanta
v_nume Variabila
g_nume VarGlobala (variabilă globală definită în zona de specificaţii a pachetului de
programe şi valabilă pentru toate subprogramele pachetului).

2. Tipuri de variabile

Variabile PL/SQL
 Scalare
 Compozite
 Referinţă
 LOB (Large Objects): NCLOB, CLOB, BLOB, BFILE
 Obiect
Variabile non-PL/SQL
 variabile de mediu (BIND VARIABLES)
 variabile de substituție

a) Variabile Scalare:
Tipurile scalare conţin valori simple (o variabila scalară poate conţine la un moment dat o
singură valoare simplă). Cele mai folosite tipuri sunt:

 CHAR (lung_max) - lungime fixă de max 32.767 bytes


 VARCHAR2 (lung_max) – lungime variabilă de max 32.767 bytes
 NUMBER (precizie,scală) – virgulă fixă, precizie maximă 38 cifre
zecimale
 BOOLEAN (poate lua valorile TRUE, FALSE sau NULL) – nu are un
tip SQL echivalent
 DATE

-4 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 2

Exemple de definire variabile și constante:


v_functie varchar2(9);
v_numar binary_integer:=0;
v_totalsal number(9,2):=0;
v_datainceput date:=sysdate+7;
c_taxa constant number(3,2):=8.25;
v_valid boolean not null:=true;

Afişarea variabilelor PL/SQL se realizează prin intermediul funcţiei PUT_LINE din pachetului
DBMS_OUTPUT.
Se poate utiliza operatorul de concatenare ( || ) pentru a afişa mai multe mesaje sau variabile pe
aceeaşi linie.

DBMS_OUTPUT.PUT_LINE ('VALOAREA VARIABILEI ESTE:' ||variabila);

Popularea variabilelor cu valori din tabelele bazei de date


 Se utilizează comanda SELECT cu clauza INTO pentru popularea variabilelor PL/SQL cu
valori ale atributelor din tabele;
 cererile SELECT din cadrul blocurilor PL/SQL trebuie să furnizeze o singură linie rezultat
(în caz contrar se semnalează eroare).

Rulează următorul bloc PL/SQL!


--se afiseaza numele angajatului cu codul 100
SET SERVEROUTPUT ON
DECLARE
v_nume VARCHAR2(20);
BEGIN
SELECT nume
INTO v_nume
FROM angajati
WHERE id_angajat = 100;
DBMS_OUTPUT.PUT_LINE('NUMELE ANGAJATULUI ESTE:' || v_nume);
END;
/

3. Atributul %TYPE

Atribuie unei variabile tipul altei variabile sau tipul de date specific unei coloane din tabelă.
Contribuie la asigurarea independenței programelor față de baza de date.

Declararea unei variabile cu %TYPE:

variabila tabelă.nume_coloană%TYPE;
sau
variabila1 tip_dată;
variabila2 variabila1%TYPE;

-5 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 2

Observaţie: Restricţia NOT NULL a unei coloane nu se aplică şi variabilei declarate prin
folosirea atributului %TYPE.

4. Variabile de substituţie

 în mediul SQL variabilele de substituţie pot fi uşor citite prin introducerea de valori de la
tastatură (utilizând ACCEPT), se pot defini (cu DEFINE) sau afişa pe ecran (cu PROMPT);

Rulează următorul bloc PL/SQL!


--se afiseaza numarul de comenzi ale angajatului al carui cod este introdus de
utilizator prin intermediul variabilei de substitutie &id_angajat
DECLARE
v_nr_comenzi number(2);
BEGIN
select count(nr_comanda) into v_nr_comenzi from comenzi
where id_angajat=&id_angajat;
dbms_output.put_line('Angajatul are: '|| v_nr_comenzi||' comenzi');
END;
/

Rulează următorul bloc PL/SQL!


-- se afiseaza salariul si prenumele angajatului cu numele Abel
SET SERVEROUTPUT ON
DECLARE
v_prenume angajati.nume%type;
v_salariul angajati.salariul%type;
BEGIN
select prenume,salariul into v_prenume, v_salariul
from angajati where nume='&s_nume';
DBMS_OUTPUT.PUT_LINE ('Prenumele angajatului este: '||v_prenume||
' si are salariul: '||v_salariul);
END;
/

EXERCIŢII

Specificaţi ce se va afişa la rularea următorului bloc PL/SQL:

DECLARE
v_var1 NUMBER :=100;
v_var2 NUMBER;
v_var3 NUMBER := v_var2;
v_var4 VARCHAR(20) := 'variabila PL/SQL';
v_var5 NUMBER NOT NULL := v_var1;
c_const1 CONSTANT DATE := TO_DATE('12/02/2007','dd/mm/yyyy');
c_const2 CONSTANT NUMBER NOT NULL := 2;
c_const3 CONSTANT NUMBER := NULL;

-6 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 2

v_var6 NUMBER DEFAULT NULL;

BEGIN
DBMS_OUTPUT.PUT_LINE('variabila 1 = '||v_var1);
DBMS_OUTPUT.PUT_LINE('variabila 2 = '||v_var2);
DBMS_OUTPUT.PUT_LINE('variabila 3 = '||v_var3);
DBMS_OUTPUT.PUT_LINE('variabila 4 = '||v_var4);
DBMS_OUTPUT.PUT_LINE('variabila 5 = '||v_var5);
DBMS_OUTPUT.PUT_LINE('constanta 1 = '||c_const1);
DBMS_OUTPUT.PUT_LINE('constanta 2 = '||c_const2);
DBMS_OUTPUT.PUT_LINE('constanta 3 = '||c_const3);
DBMS_OUTPUT.PUT_LINE('variabila 6 = '||v_var6);
END;
/

Specificaţi ce se va afişa la rularea următorului bloc PL/SQL


(care conţine blocuri imbricate, ilustrând domeniul de vizibilitate al unor variabile care au acelaşi
nume):

DECLARE
var NUMBER;
BEGIN
var := 1;
DBMS_OUTPUT.PUT_LINE(var);

<<bloc1>>
DECLARE
var NUMBER;
BEGIN
var :=2;
DBMS_OUTPUT.PUT_LINE(var);
END bloc1;

DBMS_OUTPUT.PUT_LINE(var);

<<bloc2>>
DECLARE
var NUMBER;
BEGIN
var :=3;
DBMS_OUTPUT.PUT_LINE(var);

<<bloc3>>
DECLARE
var NUMBER;
BEGIN
var :=4;
DBMS_OUTPUT.PUT_LINE(var);
DBMS_OUTPUT.PUT_LINE(bloc2.var);

-7 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 2

END bloc3;
DBMS_OUTPUT.PUT_LINE(var);
END bloc2;
DBMS_OUTPUT.PUT_LINE(var);
END;
/

Specificați de ce apare o eroare la execuția următorului bloc PL/SQL:

DECLARE
stoc NUMBER(3):=600;
mesaj VARCHAR2(50):='Produsul 101';
BEGIN
DECLARE
stoc NUMBER(3):=10;
mesaj VARCHAR2(50):='Produsul 102';
um VARCHAR2(10):= ' bucati ';
BEGIN
stoc:= stoc+1;
mesaj:='Stocul pentru '||mesaj||' este de: '||stoc||um;
DBMS_OUTPUT.PUT_LINE(mesaj);
END;
stoc:= stoc+100;
mesaj:='Stocul pentru '||mesaj||' este de: '||stoc||um;
DBMS_OUTPUT.PUT_LINE(mesaj);
END;
/

Să se calculeze suma a două numere, iar rezultatul să se dividă cu 3. Numerele se vor


introduce de la tastatură.

DECLARE
v_num1 number:=&p_num1;
v_num2 number:=&p_num2;
g_rezultat number;
BEGIN
g_rezultat:=(v_num1+v_num2)/3;
DBMS_OUTPUT.PUT_LINE(mesaj);
END;
/

Să se afişeze salariul mărit cu un x procente. Salariul şi procentul se citesc de la tastatură.

ACCEPT p_sal PROMPT 'Introduceţi salariul:'


ACCEPT p_procent PROMPT 'Introduceţi procentul:'

-8 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 2

DECLARE
v_sal number:=&p_sal;
v_procent number:=&p_procent;
BEGIN
dbms_output.put_line(to_char(nvl(v_sal,0)*(1+nvl(v_procent,0)/100)));
END;
/

TEMĂ
Comenzile se vor testa în SQL Developer:
1. Să se creeze tabelele bazei de date pentru proiect.
2. Să se adauge înregistrări în tabelele create (prin comenzi SQL)

-9 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 3

INTERACŢIUNEA CU SERVERUL ORACLE PRIN COMENZI SQL

Interacţiunea se realizează prin intermediul comenzilor LDD (Limbajul de Descriere a Datelor),


LCD (Limbajul de Control al Datelor), LMD (Limbajul de Manipulare a Datelor), LPT
(Limbajul pentru Procesarea Tranzacțiilor) astfel:

 PL/SQL nu suportă comenzi LDD sau LCD în cadrul unui bloc. Pentru executarea acestor
comenzi se utilizează comanda EXECUTE IMMEDIATE:
Comenzi DDL/DCL Executie
CREATE, ALTER, DROP EXECUTE IMMEDIATE 'CREATE
GRANT, REVOKE TABLE.... '

 PL/SQL suportă toate comenzile din limbajul de manipulare a datelor (LMD) şi din cel de
control al tranzacţiilor (LPT). Un bloc PL/SQL nu e o tranzacţie. Comenzile Commit/
Rollback/ Savepoint sunt independente de bloc dar pot să apară în interiorul său.

Comenzi DML/TPL Executie


SELECT, INSERT, UPDATE, Se executa normal in cadrul blocului
DELETE, MERGE

COMMIT, ROLLBACK, SAVEPOINT Pot apare în bloc dar au efect asupra


tuturor tranzacţiilor din interiorul şi din
afara acestuia.

Manipularea datelor in PL/SQL se face prin instrucţiunile LMD (INSERT, UPDATE, DELETE)
care pot fi lansate fără restricţii în PL/SQL.

Rulează următoarele blocuri PL/SQL!

 Comanda INSERT
Se adaugă o nouă înregistrare în tabela EMP_SAL:

BEGIN
INSERT INTO emp_sal (id_angajat, nume, prenume, salariul)
VALUES (200, 'Pop', 'Marian', 7500);
END;
/
select * from emp_sal;

Se adaugă o nouă înregistrare în tabela produse prin introducerea valorilor cu ajutorul


variabilelor de substituţie:

BEGIN
INSERT INTO produse (id_produs, denumire_produs, categorie, stoc)
VALUES (&id, '&denumire', '&categorie', &stoc);
END;
/
select * from produse;

-1 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 3

 Comanda UPDATE

Se mărește cu x procente salariul angajaților din tabela EMP_SAL care au în prezent salariul
mai mic decât o anumită valoare:
DECLARE
v_procent number:=0.1;
v_prag angajati.salariul%type:=10000;
BEGIN
UPDATE emp_sal
SET salariul=salariul*(1+v_procent)
WHERE salariul<v_prag;
END;
/
select * from emp_sal;

Se realizează o aprovizionare în cadrul depozitului prin care se măresc stocurile tuturor


produselor cu 100 bucăți (coloana STOC a fost anterior adăugată):
BEGIN
UPDATE produse
SET stoc=nvl(stoc,0)+100;
END;
/
select * from produse;

În urma comenzilor realizate de clienţi, monitoarele de tipul LCD sunt vândute, se deci scade
din stocul existent un număr de monitoare introdus de la tastatură:

BEGIN
UPDATE produse
SET stoc=stoc-&nr_buc_vandute
WHERE lower(denumire_produs) like 'monitor lcd%';
COMMIT;
END;
/
select * from produse;

Atenţie! În acest caz utilizarea comenzii COMMIT va finaliza atât tranzacţia curentă cât şi
tranzacţiile executate anterior.

 Comanda DELETE

Se şterge angajatul cu numele Pop din tabela emp_sal:


DECLARE
BEGIN
DELETE FROM emp_sal WHERE initcap(nume) like 'Pop%';
ROLLBACK;
END;
/
select * from emp_sal;

-2 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 3

STRUCTURI FUNDAMENTALE DE PROGRAMARE

STRUCTURI ALTERNATIVE

Structura IF..THEN..END IF

IF cond1 THEN
secvcom1
ELSE
secvcom2
END IF;

IF cond1 THEN
secvcom1
ELSE
IF cond2 THEN
secvcom2
END IF;
END IF;

 se poate folosi clauza ELSIF în loc de IF imbricate


IF cond1 THEN
secvcom1
ELSIF cond2 THEN secvcom2;
ELSIF cond3 THEN secvcom3;
---------------------------------------
ELSIF condN THEN secvcomN;
ELSE secvcomN+1;
END IF;

Exemplu:
În funcție de prețul de listă a produsului având codul citit de la tastatură, se va afişa modificat pe
ecran noua valoare.

SET SERVEROUTPUT ON
DECLARE
v_lista produse.pret_lista%type;
BEGIN
SELECT pret_lista into v_lista from produse where id_produs=&p;
dbms_output.put_line ('Pretul de lista initial este: '||v_lista);
IF v_lista < 500 THEN
v_lista:=2* v_lista;
ELSIF v_lista between 500 and 1000 THEN
v_lista:=1.5 * v_lista;
ELSE
v_lista:=1.25* v_lista;
END IF;
dbms_output.put_line('Pretul final este: '||v_lista);
-3 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 3

end;
/
Atentie la variabilele de tip NULL si evaluarea in IF!
De exemplu, în următoarea situaţie se va afişa “Felicitări, sunteţi admis!” din cauza faptului că
variabila nota este declarată, dar nu este iniţializată, fiind deci NULL:
DECLARE
nota number;
Begin
IF nota<5 THEN
dbms_output.put_line('Ne pare rau, candidatul este respins!');
ELSE
dbms_output.put_line('Felicitari, sunteti admis!');
END IF;
END;
/

Observaţi cazurile de mai jos:

X:=10;
Y:=NULL;
IF x!=y then
--intoarce NULL si nu TRUE
END IF;
sau
a:=NULL;
b:=NULL;
IF a=b then
--intoarce NULL si nu TRUE
END IF;

Structura CASE ... WHEN... THEN...

Sunt 2 variante:
 expresii CASE (CASE Expressions) care intorc un rezultat intr-o variabila. Se termina cu
END
 sintaxa CASE (CASE Statement) care executa o anumita instructiune. Se termina cu
END CASE, iar fiecare rand se termina cu ;

CASE Expressions:

Variabila:=
CASE [Selector]
WHEN expression1 THEN result1
WHEN expression2 THEN result2
-----------------------------------------
WHEN expressionN THEN resultN
[ELSE result N+1]
END;

-4 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 3

Exemplu:
SET SERVEROUTPUT ON
DECLARE
v_lista produse.pret_lista%type;
BEGIN
SELECT pret_lista into v_lista from produse where id_produs=&p;
dbms_output.put_line ('Pretul de lista initial este: '||v_lista);

v_lista:= CASE WHEN v_lista < 500 THEN 2* v_lista


WHEN v_lista between 500 and 1000 THEN 1.5 * v_lista
ELSE 1.25* v_lista END;

dbms_output.put_line('Pretul final este: '||v_lista);


end;
/
CASE Statement:

CASE [Selector]
WHEN expression1 THEN action1;
WHEN expression2 THEN action2;
-----------------------------------------
WHEN expressionN THEN actionN;
[ELSE action N+1];
END CASE;

Exemplu de instrucțiune condițională CASE fără selector:


SET SERVEROUTPUT ON
DECLARE
v_lista produse.pret_lista%type;
BEGIN
SELECT pret_lista into v_lista from produse where id_produs=&p;
dbms_output.put_line ('Pretul de lista initial este: '||v_lista);
CASE
WHEN v_lista < 500 THEN
v_lista:=2* v_lista;
WHEN v_lista between 500 and 1000 THEN
v_lista:=1.5 * v_lista;
ELSE
v_lista:=1.25* v_lista;
END CASE;
dbms_output.put_line('Pretul final este: '||v_lista);
end;
/

Atenție: Lipsa clauzei ELSE în cazul CASE STATEMENT poate duce la apariția unei excepții
dacă niciuna dintre expresiile din WHEN nu este TRUE. Acest lucru nu se întâmplă în cazul lui
IF sau CASE EXPRESSION.

-5 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 3

STRUCTURI REPETITIVE

Structura LOOP……END LOOP

LOOP
Secventa comenzi;
EXIT [WHEN cond];
END LOOP;

Exemplu:
Se afişează pe ecran utilizând structura loop…end loop numerele 9,7, 4, 0.
set serveroutput on
DECLARE
v_nr number(2):=10;
i number(2):=1;
BEGIN
loop
v_nr:=v_nr-i;
i:=i+1;
exit when v_nr < 0;
dbms_output.put_line(v_nr);
end loop;
END;
/

Se afişează în ordine angajaţii cu codurile în intervalul 100-110 atât timp cât salariul acestora
este mai mic decât media:
DECLARE
v_sal angajati.salariul%type;
v_salMediu v_sal%type;
i number(4):=100;
BEGIN
SELECT avg(salariul) into v_salmediu from angajati;
dbms_output.put_line('Salariul mediu este: '||v_salmediu);
loop
select salariul into v_sal from angajati where id_angajat=i;
dbms_output.put_line('Salariatul cu codul '||i||' are salariul: '||v_sal);
i:=i+1;
exit when v_sal<v_salmediu or i>110;
end loop;
end;
/

Structura WHILE…..LOOP….END LOOP

WHILE cond LOOP


Secventa comenzi 1;
Secventa comenzi 2;
EXIT [WHEN cond];

-6 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 3

END LOOP;

Exemplu:
Se afişează pe ecran utilizând structura while loop…end loop numerele 9,7, 4, 0.

set serveroutput on
DECLARE
v_nr number(2):=10;
i number(2):=1;
BEGIN
while v_nr > 0
loop
v_nr:=v_nr-i;
i:=i+1;
dbms_output.put_line(v_nr);
end loop;
END;
/

Se afişează în ordine angajaţii cu codurile în intervalul 100-110 atât timp cât salariul acestora
este mai mic decât media:

DECLARE
v_sal angajati.salariul%type;
v_salMediu v_sal%type;
i number(4):=100;
BEGIN
SELECT avg(salariul) into v_salmediu from angajati;
dbms_output.put_line('Salariul mediu este: '||v_salmediu);
while i<=110 loop
select salariul into v_sal from angajati where id_angajat=i;
dbms_output.put_line('Salariatul cu codul '||i||' are salariul: '||v_sal);
i:=i+1;
exit when v_sal<v_salmediu;
end loop;
end;
/

Structura FOR…..LOOP….END LOOP

FOR var IN [REVERSE] valmin..valmax LOOP


Secventa comenzi;
EXIT [WHEN cond];
END LOOP;

Observatii:
Valorile intervalului pot fi de orice tip, dar sa aiba valori care pot fi convertite la un intreg (de
exemplu 20/13 sau 11/5). Daca aceste 2 valori vor fi egale ca intregi atunci instructiunile din
interiorul ciclului se executa o singura data. De exemplu secventa:
FOR i IN 3..3 LOOP

-7 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 3

Secventa comenzi;
END LOOP;

Exemple:
Se afişează pe ecran utilizând structura for…end loop numerele 9,7, 4, 0.

set serveroutput on
DECLARE
v_nr number(2):=10;
i number(2);
BEGIN
for i in 1..10
loop
v_nr:=v_nr-i;
exit when v_nr < 0;
dbms_output.put_line(v_nr);
end loop;
END;
/
Se afişează în ordine angajaţii cu codurile în intervalul 100-110 atât timp cât salariul acestora
este mai mic decât media:
DECLARE
v_sal angajati.salariul%type;
v_salMediu v_sal%type;
-- i nu mai trebuie declarat
BEGIN
SELECT avg(salariul) into v_salmediu from angajati;
dbms_output.put_line('Salariul mediu este: '||v_salmediu);
for i in 100..110 loop
select salariul into v_sal from angajati where id_angajat=i;
dbms_output.put_line('Salariatul cu codul '||i||' are salariul: '||v_sal);
exit when v_sal<v_salmediu;
end loop;
end;
/

TEMĂ
Comenzile se vor testa în SQL Developer:
1. Să se creeze minim 4 blocuri PL/SQL conținând structuri de control variate, folosind BD
proprie

-8 -
07.11.2021

ACADEMIA DE STUDII ECONOMICE BUCUREŞTI


FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

SGBD Oracle
LIMBAJUL PL/SQL
Tratarea excepţiilor

BUCUREŞTI
2021-2022

Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)

Tipuri de erori
❑ Erori la compilare
➢ detectate de motorul PL/SQL
➢ nu pot fi tratate deoarece programul nu a fost încă executat
➢ utilizatorul trebuie să corecteze erorile și să execute din nou
programul
❑ Erori la execuție
➢ denumite excepții
➢ pot apărea atunci când nu este respectată o regulă a SGBD Oracle
sau dacă este încălcată o limită a sistemului de operare
➢ pot fi independente de structura bazei de date
➢ pot să apară ca urmare a nerespectării unor restricţii de integritate
➢ în program trebuie prevăzută apariția unei astfel de erori și
specificat modul concret de tratare a acesteia
2

1
07.11.2021

Tratarea excepțiilor în PL/SQL


Tipuri de excepții:
1. Excepții implicite, interne serverului Oracle:
✓ predefinite
au cod de eroare + nume asociat de sistem

✓ non-predefinite
au cod de eroare (utilizatorul trebuie să le asocieze un nume)
2. Excepții explicite, definite de utilizator

(utilizatorul trebuie să le asocieze nume, eventual cod)

Tratarea excepțiilor în PL/SQL


❑ O excepție poate fi invocată:
➢ implicit de către serverul Oracle – excepții implicite
➢ explicit la nivelul programului PL/SQL – excepții explicite

❑ O excepție poate fi tratată:


➢ prin captarea în secțiunea de tratare a excepțiilor
➢ prin propagarea în blocurile exterioare sau în aplicaţia
gazdă

2
07.11.2021

Tratarea excepțiilor în PL/SQL


EXCEPTION
WHEN nume_exceptie1 [OR nume_exceptie2 . . .] THEN
secventa_de_instructiuni1;

[WHEN nume_exceptie3 [OR nume_exceptie4 . . .] THEN


secventa_de_instructiuni2;]
...
[WHEN OTHERS THEN
secventa_de_instructiuni3;]

Tratarea excepțiilor în PL/SQL


Excepții implicite predefinite

❑ sunt codificate de forma: ORA-n


❑ nu trebuie declarate în secțiunea declarativă a blocului PL/SQL
❑ sunt declanșate implicit de către serverul Oracle
❑ sunt referite prin numele asociat lor
❑ sunt declarate în pachetul STANDARD

3
07.11.2021

Tratarea excepțiilor în PL/SQL


Excepții implicite predefinite
Lista completă aici: https://docs.oracle.com/cd/B10501_01/appdev.920/a96624/07_errs.htm

Nume excepţie Cod SQLCODE Descriere


eroare
CURSOR_ALREADY_OPEN ORA-06511 -6511 Se încearcă deschiderea unui cursor deja
deschis
DUP_VAL_ON_INDEX ORA-00001 -1 Se detectează o dublură într-o coloană în
care acestea sunt interzise
INVALID_CURSOR ORA-01001 -1001 Operaţie ilegală asupra unui cursor
INVALID_NUMBER ORA-01722 -1722 Conversie nepermisă de la şir de caractere
la număr (NUMAI în comenzi SQL din bloc)
NO_DATA_FOUND ORA-01403 +100 Comanda SELECT nu returnează niciun rând
TOO_MANY_ROWS ORA-01422 -1422 Comanda SELECT returnează mai multe linii
VALUE_ERROR ORA-06502 -6502 Conversie nepermisă sau eroare aritmetică
(NUMAI în comenzi procedurale din bloc)
ZERO_DIVIDE ORA-01476 -1476 Împărţire la zero
7

Tratarea excepțiilor în PL/SQL


Excepții implicite predefinite

DECLARE
v_nume VARCHAR2(20);
BEGIN
SELECT nume INTO v_nume
FROM angajati
WHERE id_angajat=10;
DBMS_OUTPUT.PUT_LINE(v_nume);

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Nu exista angajatul');
END;
/

4
07.11.2021

Tratarea excepțiilor în PL/SQL


Excepții implicite predefinite

DECLARE
v_nume angajati.nume%TYPE;
BEGIN
A SELECT nume INTO v_nume
FROM angajati WHERE id_angajat=200;
SELECT nume INTO v_nume
B
FROM angajati WHERE id_angajat=300;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Angajatul nu exista!');
END;
/ Care comandă SQL generează excepţia?
A sau B?

Tratarea excepțiilor în PL/SQL


Excepții implicite predefinite Soluţia 1
DECLARE
v_nume angajati.nume%TYPE;
i NUMBER(2);
BEGIN
i:=1;
SELECT nume INTO v_nume
FROM angajati WHERE id_angajat=200;
i:=2;
SELECT nume INTO v_nume
FROM angajati WHERE id_angajat=300;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Angajatul cautat in
interogarea '|| i ||' nu exista!');
END;
/
10

5
07.11.2021

Tratarea excepțiilor în PL/SQL


Excepții implicite predefinite Soluţia 2
DECLARE
v_nume angajati.nume%TYPE;
BEGIN
BEGIN
SELECT nume INTO v_nume
FROM angajati WHERE id_angajat=200;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Angajatul nu exista!');
END;
BEGIN
SELECT nume INTO v_nume
FROM angajati WHERE id_angajat=300;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Nici acesta nu exista!');
END;
END;
/ 11

Tratarea excepțiilor în PL/SQL


Excepții implicite predefinite

DECLARE
sal angajati.salariul%type;
BEGIN
SELECT salariul INTO sal
FROM angajati
WHERE prenume='John';
DBMS_OUTPUT.PUT_LINE('John are salariul de:'||sal);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Exista mai multi salariati cu
numele John! Utilizati un cursor pentru selectie!');
END;
/

12

6
07.11.2021

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

❑ trebuie declarate în secțiunea declarativă a blocului PL/SQL


❑ sunt declanșate implicit de către serverul Oracle
❑ sunt referite prin numele asociat lor de către utilizator
❑ pot fi tratate în clauza WHEN OTHERS

13

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

Paşii pentru tratarea excepţiilor non-predefinite:


1. Declararea excepţiei - se face în zona DECLARE a blocului:
nume_exceptie EXCEPTION;
2. Asocierea codului erorii cu excepţia declarată anterior - se
realizează tot în zona DECLARE prin utilizarea directivei de
compilare EXCEPTION_INIT:
PRAGMA EXCEPTION_INIT (nume_exceptie, COD_EROARE);

3. Tratarea excepţiei în zona EXCEPTION a blocului:

EXCEPTION
WHEN nume_exceptie THEN .........;

14

7
07.11.2021

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

BEGIN
DELETE FROM departamente
WHERE id_departament=&id_dep;
END;
/

➢ &id_dep→7 PL/SQL procedure successfully completed

➢ &id_dep→70 ORA-02292: integrity constraint


(IULI.ANG_DEPT_FK) violated - child
record found

15

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

DECLARE
are_angajati EXCEPTION;
PRAGMA EXCEPTION_INIT(are_angajati,-2292);
BEGIN
DELETE FROM departamente
WHERE id_departament=&id_dep;
EXCEPTION
WHEN are_angajati THEN
DBMS_OUTPUT.PUT_LINE('Sterge mai intai angajatii
din departament!');
END;
/

16

8
07.11.2021

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite
DECLARE
are_angajati EXCEPTION;
PRAGMA EXCEPTION_INIT(are_angajati,-2292);
BEGIN
DELETE FROM departamente
WHERE id_departament=&id_dep;
IF SQL%FOUND
THEN DBMS_OUTPUT.PUT_LINE('S-a efectuat stergerea!');
ELSE DBMS_OUTPUT.PUT_LINE('Nu exista departamentul!');
END IF;
EXCEPTION
WHEN are_angajati THEN
DBMS_OUTPUT.PUT_LINE('Sterge mai intai angajatii
din departament!');
END;
/
17

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

Funcții pentru identificarea excepțiilor


❑SQLCODE
➢ Returnează o valoare de tip numeric reprezentând codul
excepției
➢ Codul excepției este:
• un număr negativ, în cazul unei erori interne
• +100 în cazul excepției NO_DATA_FOUND
• 0 în cazul unei execuții normale, fără excepții
• 1 în cazul unei excepții definite de utilizator

❑SQLERRM
➢ Returnează un șir de caractere reprezentând mesajul asociat
excepției

18

9
07.11.2021

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

Funcții pentru identificarea excepțiilor (cont.)


➢ În afara secţiunii de tratare a excepţiilor, precum şi în cazul
execuţiei blocului fără erori:
▪ SQLCODE = 0
▪ SQLERRM = ORA-0000: normal, successful completion

➢ Într-o comandă SQL nu se pot apela funcţiile SQLCODE şi


SQLERRM

19

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

BEGIN
INSERT INTO produse(id_produs,
denumire_produs) VALUES (20, NULL );
END;
/

ORA-01400: cannot insert NULL into


("IULI"."PRODUSE"."DENUMIRE_PRODUS")

20

10
07.11.2021

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

DECLARE
valori_insuficiente EXCEPTION;
PRAGMA EXCEPTION_INIT(valori_insuficiente,-01400);
BEGIN
INSERT INTO produse(id_produs,
denumire_produs) VALUES (20, NULL);
EXCEPTION
WHEN valori_insuficiente THEN
DBMS_OUTPUT.PUT_LINE('Nu ati precizat informatii
suficiente pentru produs');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/

21

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

BEGIN
INSERT INTO produse(id_produs,
denumire_produs) VALUES ( 2400,'usb stick');
END;
/

ORA-00001: unique constraint


(IULI.PRODUSE_ID_PRODUS_PK) violated

22

11
07.11.2021

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

DECLARE
exceptie_unicitate EXCEPTION;
PRAGMA EXCEPTION_INIT(exceptie_unicitate, -00001);
BEGIN
INSERT INTO produse(id_produs,
denumire_produs) VALUES (2400, 'usb stick');
EXCEPTION
WHEN exceptie_unicitate THEN
DBMS_OUTPUT.PUT_LINE('Exista deja un produs cu
acest cod de identificare');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/

23

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

SAU
BEGIN
INSERT INTO produse(id_produs,
denumire_produs) VALUES (2400, 'usb stick');
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('Exista deja un produs cu
acest cod de identificare');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/

24

12
07.11.2021

Tratarea excepțiilor în PL/SQL


Excepții explicite

❑ trebuie declarate în secțiunea declarativă a blocului PL/SQL


❑ sunt invocate explicit de utilizator în secţiunea executabilă
❑ sunt referite prin numele asociat lor de către utilizator
❑ în mod implicit au asociate:
✓ SQLCODE = +1
✓ SQLERRM = user-defined exception

25

Tratarea excepțiilor în PL/SQL


Excepții explicite

Paşii pentru tratarea excepţiilor explicite:


1. Declararea excepţiei - se face în zona DECLARE a blocului:
nume_exceptie EXCEPTION;
2. Prin instrucţiunea RAISE se declanşează în mod explicit, în cadrul
secţiunii executabile :
RAISE nume_exceptie;

3. Tratarea excepţiei în zona EXCEPTION a blocului:

EXCEPTION
WHEN nume_exceptie THEN .........;

26

13
07.11.2021

Tratarea excepțiilor în PL/SQL


Excepții explicite
DECLARE
invalid_prod EXCEPTION;
BEGIN
UPDATE produse
SET denumire_produs='Laptop ABC'
WHERE id_produs=1726;
IF SQL%NOTFOUND THEN
RAISE invalid_prod;
END IF;
EXCEPTION
WHEN invalid_prod THEN
DBMS_OUTPUT.PUT_LINE('Nu exista produsul cu acest ID');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('A aparut eroarea: '||SQLERRM);
END;
/
27

Tratarea excepțiilor în PL/SQL


Excepții explicite

❑ erorile definite de utilizator pot fi tratate la nivelul aplicaţiilor


întocmai ca erorile serverului Oracle prin atribuirea de coduri
cu ajutorul procedurii:
RAISE_APPLICATION_ERROR (nr_eroare, mesaj);

❑ nr_eroare - poate fi un număr negativ cuprins între -20000 şi


-20999
❑ mesaj - textul explicativ al erorii.
❑ tratarea excepţiei se realizează asemănător cu a celor non-
predefinite Oracle Server.

28

14
07.11.2021

Tratarea excepțiilor în PL/SQL


Excepții explicite

DECLARE
v_nume clienti.nume_client%TYPE;
v_id_client clienti.id_client%TYPE:=& id_client;
BEGIN
SELECT nume_client INTO v_nume
FROM clienti
WHERE id_client = v_id_client;
DBMS_OUTPUT.PUT_LINE('Clientul: '||v_nume);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000, 'Clientul cu ID '
|| v_id_client || ' nu exista!');
END;
/

29

Tratarea excepțiilor în PL/SQL


Propagarea excepţiilor

❑ dacă este declanşată o eroare în secţiunea executabilă a unui


sub-bloc, iar aceasta este tratată în zona EXCEPTION ➔ succes,
iar controlul se transmite blocului exterior
❑ dacă este declanşată o eroare în secţiunea executabilă a unui
sub-bloc, iar aceasta NU este tratată în zona EXCEPTION ➔ eşec,
iar excepţia este propagată blocului exterior
❑ dacă este declanşată o eroare în secţiunile declarativă sau de
tratare a excepţiilor ale unui sub-bloc ➔ se propagă întotdeauna
către blocul exterior (chiar dacă în sub-bloc exista o rutină de
tratare a acesteia)

30

15
07.11.2021

Rezolvaţi
Ce va afişa blocul PL/SQL?

1. DECLARE
2. v_cod NUMBER;
3. v_nume VARCHAR2(128);
4. BEGIN
5. FOR i IN 1..500 LOOP
6. SELECT id_angajat, nume||' '||prenume
INTO v_cod, v_nume
FROM angajati WHERE id_angajat=i;
7. DBMS_OUTPUT.PUT_LINE(v_cod|| ' '||v_nume);
8. END LOOP;
9. EXCEPTION
10. WHEN NO_DATA_FOUND THEN NULL;
11. END;
12. /

31

Rezolvaţi
Ce va afişa blocul PL/SQL?
1. DECLARE
2. v_cod NUMBER;
3. v_nume VARCHAR2(128);
4. BEGIN
5. FOR i IN 1..500 LOOP
6. BEGIN
7. SELECT id_angajat, nume||' '||prenume
INTO v_cod, v_nume
FROM angajati WHERE id_angajat=i;
8. DBMS_OUTPUT.PUT_LINE(v_cod|| ' '||v_nume);
9. EXCEPTION
10. WHEN NO_DATA_FOUND THEN NULL;
11. END;
12. END LOOP;
13. END;
14. /
32

16
07.11.2021

Rezolvaţi
Ce va afişa blocul PL/SQL?
1. DECLARE
2. v_cod NUMBER;
3. v_nume VARCHAR2(128);
4. BEGIN
5. FOR i IN 1..500 LOOP
6. BEGIN
7. SELECT id_angajat, nume||' '||prenume
INTO v_cod, v_nume
FROM angajati WHERE id_angajat=i;
8. EXCEPTION
9. WHEN NO_DATA_FOUND THEN NULL;
10. END;
11. DBMS_OUTPUT.PUT_LINE(v_cod|| ' '||v_nume);
12. END LOOP;
13. END;
14. /

33

Rezolvaţi
Ce va afişa blocul PL/SQL?
DECLARE
CURSOR c IS SELECT nume FROM angajati;
r c%ROWTYPE;
BEGIN
FETCH c INTO r;
DBMS_OUTPUT.PUT_LINE('Numele este '||r.nume);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('A');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('B');
END;
/

34

17
07.11.2021

Temă
Utilizând limbajul PL/SQL, rezolvaţi ecuaţia de gradul 2.

35

CURSUL 7...

Limbajul PL/SQL. Subprograme.

18
15.11.2021

ACADEMIA DE STUDII ECONOMICE BUCUREŞTI


FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

SGBD Oracle
LIMBAJUL PL/SQL
Gestiunea subprogramelor.
Proceduri

BUCUREŞTI
2021-2022

Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)

Subprograme în PL/SQL
❑ Sunt module de program care îndeplinesc o serie de acţiuni
❑ Pot fi îmbinate pentru a se obţine subprograme complexe
❑ Pot fi create:
➢ La nivel de schemă – subprograme de sine stătătoare
➢ În interiorul pachetelor de subprograme
➢ În interiorul unui bloc PL/SQL

1
15.11.2021

Blocuri anonime vs. subprograme


Blocuri anonime Subprograme
Blocuri PL/SQL fără nume Blocuri PL/SQL denumite

Compilate la fiecare rulare Compilate doar o dată (eventual recompilate


dacă se efectuează modificări în corpul
acestora)
Nu sunt stocate în baza de date Stocate în baza de date

Nu pot fi invocate de alte aplicaţii Pot fi invocate de alte aplicaţii prin numele
asociat
Nu returnează valori Funcţiile returnează întotdeauna o valoare.
Şi unele proceduri pot returna valori prin
parametrii de ieşire
Nu pot avea parametri Pot avea parametri

Subprograme în PL/SQL
Secţiuni:
➢ Declarativă
➢ Executabilă
➢ Pentru tratarea excepţiilor
Tipuri de subprograme:
➢ Proceduri – efectuează acţiuni; pot returna valori prin parametri
de tip IN OUT sau OUT
➢ Funcţii – de obicei returnează o singură valoare. Dacă sunt
îndeplinite o serie de condiţii, pot fi utilizate în comenzile SQL ca
funcţii de sine stătătoare
Parametri
➢ IN
➢ OUT
➢ IN OUT

2
15.11.2021

Subprograme în PL/SQL
Avantaje:
➢ codul sursă este mai uşor de întreţinut

➢ odată ce subprogramul a fost compilat, codul este reutilizabil


➢ sporesc performanţa

➢ contribuie la securitatea aplicaţiilor

➢ modificările necesare se realizează într-un singur loc


➢ pot fi utilizate de mai mulţi utilizatori simultan

Subprograme în PL/SQL
Proceduri

Creare procedură:
CREATE [OR REPLACE] PROCEDURE nume_proc
[(param1 [IN | OUT | IN OUT] TIP_DATA1, ....) ]
-- tipul variabilelor este precizat fără dimensiune
(ex: NUMBER sau VARCHAR2)
IS | AS
-- zona de declarare a variabilelor utilizate
-- NU se utilizează DECLARE
BEGIN
----
[EXCEPTION]
------
END [nume_proc];

3
15.11.2021

Subprograme în PL/SQL
Proceduri

Apel procedură:

1.prin nume dintr-un bloc PL/SQL anonim sau din alt subprogram
2.prin apel direct utilizând:
EXECUTE nume_proc;
✓ comandă SQL Plus care include apelul într-un bloc PL/SQL anonim
(BEGIN...END;)
✓ utilizează mai puţină memorie decât CALL
3.prin apel direct utilizând:
CALL nume_proc;
✓ comandă SQL
✓ poate inhiba propagarea excepţiilor
4.dintr-o altă aplicaţie (ex. Oracle Forms, Oracle APEX, Oracle JDeveloper,
JAVA)
7

Subprograme în PL/SQL
Proceduri

❑ Parametrii unei proceduri

IN transmite procedurii o valoare constantă


OUT transmite o valoare către mediul apelant
IN OUT transmite o valoare procedurii şi o altă valoare
mediului apelant prin acelaşi parametru

4
15.11.2021

Subprograme în PL/SQL
Proceduri

IN OUT IN OUT
Implicit Trebuie indicat Trebuie indicat
Valoare transmisă Valoare returnată în mediul Valoare transmisă
subprogramului apelant subprogramului; altă valoare
(eventual) returnată în mediul
apelant
Parametrii formali: Parametrii formali: variabile Parametrii formali: variabile
constante neiniţializate iniţializate
Parametrii actuali: Parametrii actuali: variabile Parametrii actuali: variabile
literali,expresii, constante,
variabile iniţializate
Pot primi valori implicite Nu pot primi valori implicite Nu pot primi valori implicite

Subprograme în PL/SQL
Proceduri

Parametri formali: variabile locale declarate în lista parametrilor indicată în


definiţia subprogramului

CREATE PROCEDURE mareste_salariu(p_id IN NUMBER, p_sal IN NUMBER)


IS
BEGIN ...
END mareste_salariu;

Parametri actuali: literali, variabile sau expresii utilizate în lista parametrilor


indicată la apelul subprogramului

id_ang:= 100;
mareste_salariu(id_ang, 2000);

➢parametrii formali şi cei actuali trebuie să aibă tipuri de date compatibile


➢parametrii actuali sunt asociaţi celor formali pe parcursul execuţiei
subprogramului
10

5
15.11.2021

Subprograme în PL/SQL
Proceduri

CREATE OR REPLACE PROCEDURE mareste_salariu


(p_id_ang IN angajati.id_angajat%TYPE,
p_proc IN NUMBER)
IS
BEGIN
UPDATE angajati
SET salariul = salariul * (1 + p_proc/100)
WHERE id_angajat = p_id_ang;
END mareste_salariu;
/

EXECUTE mareste_salariu(176,10);

11

Subprograme în PL/SQL
Proceduri

CREATE OR REPLACE PROCEDURE info_angajat


(p_id_ang IN angajati.id_angajat%TYPE,
p_nume OUT angajati.nume%TYPE,
p_sal OUT angajati.salariul%TYPE) IS
BEGIN
SELECT nume, salariul INTO p_nume, p_sal
FROM angajati
WHERE id_angajat = p_id_ang;
END info_angajat;
/
DECLARE
v_nume angajati.nume%TYPE;
v_sal angajati.salariul%TYPE;
BEGIN
info_angajat(171, v_nume, v_sal);
END;
12

6
15.11.2021

Subprograme în PL/SQL
Proceduri

❑ Transmiterea parametrilor

Prin poziţie Se indică parametrii actuali în aceeaşi ordine în care


sunt declaraţi cei formali
Prin nume Se indică valorile parametrilor actuali în ordine
arbitrară, folosindu-se operatorul de asociere => pentru
a asocia fiecare parametru actual cu parametrul formal
corespunzător
Mixt Se transmite primul parametru prin poziţie şi ceilalţi
prin nume

13

Subprograme în PL/SQL
Proceduri

CREATE OR REPLACE PROCEDURE adauga_dep(


p_den IN departamente.denumire_departament%TYPE,
p_loc IN departamente.id_locatie%TYPE)
IS
BEGIN
INSERT INTO departamente(id_departament,
denumire_departament, id_locatie)
VALUES (seq_dep.NEXTVAL, p_den, p_loc);
END adauga_dep;
/
Considerăm creată
secvența SEQ_DEP
-- transmiterea parametrilor prin pozitie
EXECUTE adauga_dep ('IT', 2500);

-- transmiterea parametrilor prin nume


EXECUTE adauga_dep (p_loc=>2400, p_den=>'EDUCATION');

14

7
15.11.2021

Subprograme în PL/SQL
Proceduri

CREATE OR REPLACE PROCEDURE prelucreaza_angajati


IS
CURSOR c_ang IS
SELECT id_angajat
FROM angajati;
BEGIN
FOR rec_ang IN c_ang
LOOP
mareste_salariu(rec_ang.id_angajat, 10);
END LOOP;
COMMIT;
END prelucreaza_angajati;
/

EXECUTE prelucreaza_angajati;

15

Subprograme în PL/SQL
Proceduri

CREATE OR REPLACE PROCEDURE valoare_comenzi


(p_id_client IN comenzi.id_client%TYPE)
IS
v_val NUMBER;
BEGIN
SELECT SUM(r.pret*r.cantitate) INTO v_val
FROM rand_comenzi r,comenzi c
WHERE r.nr_comanda=c.nr_comanda
AND c.id_client=p_id_client;
DBMS_OUTPUT.PUT_LINE('Valoare totala = '||v_val);
END;
/

CALL valoare_comenzi(109); -- apel folosind CALL


EXECUTE valoare_comenzi(109); -- apel folosind EXECUTE
BEGIN -- apel în bloc anonim
valoare_comenzi(109);
END;
/

8
15.11.2021

Subprograme în PL/SQL
Proceduri

CREATE OR REPLACE PROCEDURE valoare_comenzi_o


(p_id_client IN comenzi.id_client%TYPE, p_val OUT NUMBER)
IS
BEGIN
SELECT SUM(r.pret*r.cantitate) INTO p_val
FROM rand_comenzi r,comenzi c
WHERE r.nr_comanda=c.nr_comanda
AND c.id_client=p_id_client;
END;
/
DECLARE
n NUMBER;
BEGIN
valoare_comenzi_o(109,n);
DBMS_OUTPUT.PUT_LINE('Valoare: '||n);
END;
/

Subprograme în PL/SQL
Proceduri

❑ Ştergerea unei proceduri:


DROP PROCEDURE nume_proc;

❑ Vizualizarea procedurilor în dicţionarul de date:


SELECT object_name FROM user_objects
WHERE object_type='PROCEDURE';

❑ vizualizarea corpului unei proceduri:


SELECT text FROM user_source
WHERE name='ADAUGA_DEP';

18

9
15.11.2021

Exemplificare PL/SQL

CREATE OR REPLACE PROCEDURE afiseaza_produse


IS
CURSOR c IS SELECT * FROM produse;
v c%rowtype;
BEGIN
OPEN c;
LOOP
FETCH c INTO v;
EXIT WHEN c%notfound;
DBMS_OUTPUT.PUT_LINE('Produsul '||v.denumire_produs||' -
categoria: '||v.categorie);
END LOOP;
CLOSE c;
END;
/

--apel
EXECUTE afiseaza_produse;

19

Exemplificare PL/SQL

CREATE OR REPLACE PROCEDURE produse_in_categorie


IS
CURSOR c IS
SELECT categorie, COUNT(id_produs) nr_produse
FROM produse
GROUP BY categorie;
BEGIN
FOR v IN c LOOP
DBMS_OUTPUT.PUT_LINE('Categoria: '||v.categorie||' contine:
'||v.nr_produse||' produse.');
END LOOP;
END;
/

--apel
EXECUTE produse_in_categorie;

20

10
15.11.2021

Exemplificare PL/SQL
CREATE OR REPLACE PROCEDURE sal_mediu(p_sal_mediu OUT NUMBER)
IS
BEGIN
SELECT AVG(salariul) INTO p_sal_mediu FROM angajati;
END;
/

--apel:
SET serveroutput ON
DECLARE
v_sal NUMBER;
BEGIN
sal_mediu(v_sal);
dbms_output.put_line(ROUND(v_sal));
END;
/

21

Exemplificare PL/SQL
CREATE OR REPLACE PROCEDURE cauta_angajat(
p_id_angajat IN angajati.id_angajat%type,
p_nume OUT angajati.nume%type,
p_salariul OUT angajati.salariul%type)
IS
BEGIN
SELECT nume, salariul INTO p_nume, p_salariul
FROM angajati WHERE id_angajat=p_id_angajat;
DBMS_OUTPUT.PUT_LINE('Angajatul '||p_nume||' are salariul de:
'||p_salariul);
END;
/
--apel
DECLARE
v_nume angajati.nume%type;
v_salariul angajati.salariul%type;
BEGIN
cauta_angajat(150, v_nume, v_salariul);
END;
/
22

11
15.11.2021

Exemplificare PL/SQL
CREATE OR REPLACE PROCEDURE ang_in_departamente
IS
CURSOR d IS SELECT id_departament, denumire_departament
FROM departamente WHERE id_departament IN
(SELECT id_departament FROM angajati);
CURSOR a (dep NUMBER) IS SELECT nume, salariul
FROM angajati WHERE id_departament=dep;
BEGIN
FOR v IN d LOOP
DBMS_OUTPUT.PUT_LINE('Departamentul:
'||v.denumire_departament);
FOR w IN a(v.id_departament) LOOP
DBMS_OUTPUT.PUT_LINE(' *** Angajat: '||w.nume||
' cu salariul '||w.salariul);
END LOOP;
END LOOP;
END;
/
--apel
EXECUTE ang_in_departamente;
23

CURSUL 8...

Limbajul PL/SQL. Gestiunea subprogramelor: funcții

12

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