Documente Academic
Documente Profesional
Documente Cultură
2021
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
Limbajul SQL-Oracle
Actualizarea structurii bazei de date
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
3
07.10.2021
Limbajul SQL-Oracle.
Crearea tabelelor
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
Limbajul SQL-Oracle.
Crearea tabelelor
2) cu indicarea restricţiilor de integritate la nivel de coloană
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ă
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);
14
7
07.10.2021
Limbajul SQL-Oracle.
Modificarea structurii tabelelor
ALTER TABLE nume_tabela
ADD CONSTRAINT nume_restrictie tip_restrictie ….;
15
Limbajul SQL-Oracle.
Ştergerea tabelelor
16
8
07.10.2021
Limbajul SQL-Oracle.
Ştergerea tabelelor
17
Limbajul SQL-Oracle
Actualizarea datelor
18
9
07.10.2021
Limbajul SQL-Oracle
Interogarea datelor
Comandă SQL Descriere
SELECT regăseşte date din una sau mai multe tabele
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
21
Limbajul SQL-Oracle
Funcţii SQL
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
SUM(e)
MIN(e)
MAX(e)
AVG(e)
24
12
07.10.2021
Limbajul SQL-Oracle
Agregarea datelor
Clauze în SELECT Descriere
25
Limbajul SQL-Oracle
Joncţiuni
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;
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';
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
31
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
SELECT id_angajat, salariul
FROM angajati
WHERE salariul > ALL (10000, 15000, 20000);
32
16
07.10.2021
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
SELECT id_angajat, salariul
FROM angajati
WHERE salariul > ANY (10000, 15000, 20000);
33
Atenție!
34
17
07.10.2021
CURSUL 2...
Definiții SGBD
Funcțiile SGBD
Clasificarea SGBD
18
10.10.2021
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.
Definirea SGBD
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ă:
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
BD
13
Obiectivele SGBD
1. Asigurarea independenței datelor faţă de programe
14
7
10.10.2021
Obiectivele SGBD
2. Redundanţă minimă şi controlată a datelor
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
Clasificarea SGBD
10
18.10.2021
SGBD Oracle
CURSUL 3
BUCUREŞTI
2021-2022
Agenda
1. Funcțiile SGBD
2. Arhitectura SGBD
3. Clasificarea SGBD
1
18.10.2021
Funcțiile SGBD
UTILIZARE
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ț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
4
18.10.2021
Funcțiile SGBD.
Funcţia de administrare
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
INSTRUMENTE
11
INSTRUMENTE
6
18.10.2021
INSTRUMENTE
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
15
16
8
18.10.2021
SGBD Oracle
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
19
10
18.10.2021
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;
11
18.10.2021
v_functie VARCHAR2(9);
v_totalsal NUMBER(9,2):=0;
v_datainceput DATE:=sysdate+7;
c_taxa CONSTANT NUMBER(3,2):=8.25;
Exemple
24
12
18.10.2021
25
26
13
18.10.2021
27
Blocuri PL/SQL
Bloc fără secțiunile declarativă şi de tratare a excepțiilor:
BEGIN
DBMS_OUTPUT.PUT_LINE('SGBD Oracle');
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
16
18.10.2021
INSERT
UPDATE MERGE
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ă;
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');
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
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
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
3
25.10.2021
4
25.10.2021
BAZA DE DATE
INSTRUMENTE RELAŢIONALĂ
DE ÎNTREŢINERE
9 10
5
25.10.2021
11 12
6
25.10.2021
13 14
7
25.10.2021
15 16
8
25.10.2021
17 18
9
25.10.2021
10
25.10.2021
21 22
11
25.10.2021
23 24
12
25.10.2021
25 26
13
25.10.2021
❑ 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;
29
15
25.10.2021
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
35 36
18
25.10.2021
37 38
19
25.10.2021
39 40
20
25.10.2021
test := a AND b;
a b test
TRUE TRUE ?
TRUE FALSE ?
NULL TRUE ?
NULL FALSE ?
41 42
21
25.10.2021
43
22
30.10.2021
SGBD Oracle
CURSUL 5
BUCUREŞTI
2021-2022
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
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
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
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
12
6
30.10.2021
Mecanismul de cursor
Cursorul explicit
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...
11
14.10.2021
SGBD Oracle
LIMBAJUL PL/SQL. NOȚIUNI FUNDAMENTALE
BUCUREŞTI
2021-2022
◦ Proceduri
◦ Funcţii
◦ Pachete de subprograme
◦ Declanşatori
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
Operatori utilizați
Operator
* , / , - , +, **
= , >= , > , <= , < , <> , != , IS , LIKE , IN
BETWEEN
NOT
AND
|| , OR
:= (operatorul de atribuire)
2
14.10.2021
3
14.10.2021
Variabile PL/SQL
➢ Declarare:
nume_variabila [CONSTANT] TIP_DATA [NOT NULL]
[:= | DEFAULT expresie]
4
14.10.2021
Variabile PL/SQL
➢ Exemple:
v_salariu NUMBER;
v_data_nastere DATE;
v_nume VARCHAR2(20);
Variabile PL/SQL
Atributul %TYPE
➢ Preia definirea unei coloane dintr-o tabelă:
v_nume_ang angajati.nume%TYPE;
5
14.10.2021
11
TEMĂ
1. Să se creeze tabelele bazei de date pentru proiect.
2. Să se adauge înregistrări în tabelele create (prin comenzi SQL)
12
6
25.10.2021
SGBD Oracle
LIMBAJUL PL/SQL
BUCUREŞTI
2021-2022
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
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
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;
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
15
TEMĂ
1. Să se creeze minim 4 exemple de blocuri PL/SQL conținând structuri
de control variate, folosind BD proprie
19
7
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 2
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.
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
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).
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
Î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).
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.
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:
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:
-4 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 2
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.
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.
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);
EXERCIŢII
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
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;
/
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;
/
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;
/
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;
/
-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
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.
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.
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;
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;
Î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
-2 -
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 3
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;
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;
/
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;
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);
CASE [Selector]
WHEN expression1 THEN action1;
WHEN expression2 THEN action2;
-----------------------------------------
WHEN expressionN THEN actionN;
[ELSE action N+1];
END CASE;
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
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;
/
-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;
/
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
SGBD Oracle
LIMBAJUL PL/SQL
Tratarea excepţiilor
BUCUREŞTI
2021-2022
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
✓ non-predefinite
au cod de eroare (utilizatorul trebuie să le asocieze un nume)
2. Excepții explicite, definite de utilizator
2
07.11.2021
3
07.11.2021
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
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?
5
07.11.2021
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
13
EXCEPTION
WHEN nume_exceptie THEN .........;
14
7
07.11.2021
BEGIN
DELETE FROM departamente
WHERE id_departament=&id_dep;
END;
/
15
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
❑SQLERRM
➢ Returnează un șir de caractere reprezentând mesajul asociat
excepției
18
9
07.11.2021
19
BEGIN
INSERT INTO produse(id_produs,
denumire_produs) VALUES (20, NULL );
END;
/
20
10
07.11.2021
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
BEGIN
INSERT INTO produse(id_produs,
denumire_produs) VALUES ( 2400,'usb stick');
END;
/
22
11
07.11.2021
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
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
25
EXCEPTION
WHEN nume_exceptie THEN .........;
26
13
07.11.2021
28
14
07.11.2021
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
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...
18
15.11.2021
SGBD Oracle
LIMBAJUL PL/SQL
Gestiunea subprogramelor.
Proceduri
BUCUREŞTI
2021-2022
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
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
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
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
id_ang:= 100;
mareste_salariu(id_ang, 2000);
5
15.11.2021
Subprograme în PL/SQL
Proceduri
EXECUTE mareste_salariu(176,10);
11
Subprograme în PL/SQL
Proceduri
6
15.11.2021
Subprograme în PL/SQL
Proceduri
❑ Transmiterea parametrilor
13
Subprograme în PL/SQL
Proceduri
14
7
15.11.2021
Subprograme în PL/SQL
Proceduri
EXECUTE prelucreaza_angajati;
15
Subprograme în PL/SQL
Proceduri
8
15.11.2021
Subprograme în PL/SQL
Proceduri
Subprograme în PL/SQL
Proceduri
18
9
15.11.2021
Exemplificare PL/SQL
--apel
EXECUTE afiseaza_produse;
19
Exemplificare PL/SQL
--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...
12