Documente Academic
Documente Profesional
Documente Cultură
2022
SGBD Oracle
LIMBAJUL PL/SQL
Gestiunea subprogramelor
BUCUREŞTI
2022-2023
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
17.11.2022
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
17.11.2022
Subprograme în PL/SQL
Avantaje:
codul sursă este mai uşor de întreţinut
PROCEDURI
3
17.11.2022
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];
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)
8
4
17.11.2022
Subprograme în PL/SQL
Proceduri
Subprograme în PL/SQL
Proceduri
id_ang:= 100;
mareste_salariu(id_ang, 2000);
5
17.11.2022
Subprograme în PL/SQL
Proceduri
EXECUTE mareste_salariu(176,10);
11
Subprograme în PL/SQL
Proceduri
6
17.11.2022
Subprograme în PL/SQL
Proceduri
EXECUTE prelucreaza_angajati;
13
Subprograme în PL/SQL
Proceduri
7
17.11.2022
Subprograme în PL/SQL
Proceduri
Subprograme în PL/SQL
Proceduri
16
8
17.11.2022
Exercițiul 1
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;
17
Exercițiul 2
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;
18
9
17.11.2022
FUNCȚII
19
Gestiunea subprogramelor
Funcţii
Creare funcţie:
20
10
17.11.2022
Gestiunea subprogramelor
Funcţii
Apel funcţie:
21
Gestiunea subprogramelor
Funcţii
22
11
17.11.2022
Gestiunea subprogramelor
Funcţii
23
Exercițiul 1
/*functie care verifica daca salariul angajatului indicat este mai
mare decat salariul mediu al angajatilor din departamentul in care
acesta lucreaza*/
CREATE OR REPLACE FUNCTION verifica_sal_p
(p_id_ang angajati.id_angajat%TYPE)
RETURN Boolean IS
v_id_dep angajati.id_departament%TYPE;
v_sal angajati.salariul%TYPE;
v_sal_mediu angajati.salariul%TYPE;
BEGIN
SELECT salariul, id_departament INTO v_sal, v_id_dep
FROM angajati WHERE id_angajat=p_id_ang;
SELECT avg(salariul) INTO v_sal_mediu FROM angajati
WHERE id_departament=v_id_dep;
IF v_sal > v_sal_mediu THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL; 24
END;
/
12
17.11.2022
Exercițiul 1
--apel in bloc anonim
DECLARE
v_id angajati.id_angajat%TYPE:=&v;
BEGIN
DBMS_OUTPUT.PUT_LINE('Verificare angajat '||v_id);
IF (verifica_sal_p(v_id) IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('Exceptie!');
ELSIF (verifica_sal_p(v_id)) THEN
DBMS_OUTPUT.PUT_LINE('salariul > salariul mediu');
ELSE
DBMS_OUTPUT.PUT_LINE('salariul < salariul mediu');
END IF;
END;
/
25
Gestiunea subprogramelor
Funcţii
13
17.11.2022
Exercițiul 2
/* functii care returneaza contributiile si salariul
net, pe baza salariului brut*/
CREATE OR REPLACE FUNCTION cas(p_brut IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURN (p_brut * 0.25);
END cas;
/
Exercițiul 2
CREATE OR REPLACE FUNCTION imp(p_brut IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURN ((p_brut-cass(p_brut)-cas(p_brut)) * 0.10);
END imp;
/
28
14
17.11.2022
Exercițiul 2
--apelul intr-o comanda SQL
SELECT id_angajat, nume, salariul, net(salariul)
FROM angajati
ORDER BY id_angajat;
29
Gestiunea subprogramelor
Funcţii
15
17.11.2022
Gestiunea subprogramelor
Funcţii
Gestiunea subprogramelor
Funcţii
/*functie care genereaza eroare la apelul intr-o comanda LMD
din cauza faptului ca include deja o astfel de comanda*/
CREATE OR REPLACE FUNCTION test_call_sql(p_sal NUMBER)
RETURN NUMBER IS
BEGIN
INSERT INTO angajati(id_angajat, nume,
email, data_angajare, id_functie, salariul)
VALUES(1, 'Frost', 'jfrost@company.com',SYSDATE,
'SA_MAN', p_sal);
RETURN (p_sal + 100);
END test_call_sql;
/
UPDATE angajati
SET salariul = test_call_sql(2000)
WHERE id_angajat = 170;
Error report -
SQL Error: ORA-04091: table IULI.ANGAJATI is mutating, trigger/function
may not see it
ORA-06512: at "IULI.TEST_CALL_SQL", line 4 32
16
17.11.2022
Subprograme în PL/SQL
Funcţii
33
Gestiunea subprogramelor
PROCEDURI FUNCŢII
Apelate direct prin nume Apelate ca parte a unei expresii
34
17
17.11.2022
Să se rezolve!
Construiți procedura AfisareAngajati prin care să se afișeze informații
despre angajații din departamentul al cărui id este specificat drept
parametru de intrare.
Apelați procedura.
35
Să se rezolve!
Construiți funcția Vechime care să returneze vechimea angajatului al
cărui id este specificat drept parametru de intrare.
Apelați funcția în cadrul unui bloc anonim.
36
18
17.11.2022
Să se rezolve!
Construiți funcția Calcul_cantitate_totala care să returneze cantitatea
totală comandată dintr-un produs al cărui id este specificat drept
parametru de intrare.
Apelați funcția în cadrul unui bloc anonim.
37
CURSUL 9...
Recapitulare
19