Documente Academic
Documente Profesional
Documente Cultură
Subprograme PL/SQL
1. PROCEDURI
Parametrii utilizati in procedura (parametri formali) pot fi de tip:
IN (valoarea parametrului actual este transferata in variabila definita in procedura.
Aceasta variabila este considerata read-only). Când procedura se încheie, controlul
revine mediului apelant. Parametrul actual nu se modifica. Este modul implicit.
OUT (valoarea parametrului formal este transferata in parametrul actual când procedura
se incheie)
IN OUT (valorile sunt transferate de la un tip de variabilă la celălalt (la lansarea în
execuţie/terminarea procedurii))
un parametru IN poate apare numai în partea dreapta a (:=)
un parametru OUT poate apare numai în partea stânga a (:=)
un parametru IN OUT poate apare în ambele părţi ale (:=)
-1-
Facultatea de Științe Economice - SIG - Oracle – Laboratorul 8
Parametrii de tip IN
Exemplu: Procedura primeşte ca parametru de tip IN id_ul unui angajat şi returnează prin
parametrii de tip OUT numele şi salariul acestuia:
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;
/
--apelul procedurii intr-un bloc anonim
SET SERVEROUTPUT ON
DECLARE
v_nume angajati.nume%type;
v_salariul angajati.salariul%type;
BEGIN
Cauta_angajat(150, v_nume, v_salariul);
-2-
Facultatea de Științe Economice - SIG - Oracle – Laboratorul 8
END;
/
Exemplu: Procedura calculează salariul mediu şi îl returnează printr-un parametru de tip OUT:
Exemplu: Procedura modifică salariul unui angajat doar în cazul în care este mai mic decât media
prin apelarea procedurii create mai sus, MODIFICA_SALARIUL_PROCENT. Procedura primeşte
id-ul angajatului ca parametru de intrare şi salariul mediu actual şi prin returnează prin parametrul
de tip IN OUT salariul mediu modificat prin apelul procedurii SAL_MEDIU.
--apelul cu id invalid
v_id_angajat:=1230;
CAUTA_ANGAJAT(v_id_angajat, v_nume, v_salariul);
modifica_salariul_med (v_id_angajat, v_sal_mediu);
Exception
When NO_DATA_FOUND then
DBMS_OUTPUT.PUT_LINE('Angajat inexistent! ID invalid');
END;
/
rollback;
2. FUNCŢII:
-4-
Facultatea de Științe Economice - SIG - Oracle – Laboratorul 8
----
RETURN VALOARE;
[EXCEPTION]
------
END [NUME_FUNCTIE];
Exemplu: Returnează true/false daca salariatul are salariul mai mare/mai mic sau egal cu salariul
mediu si null daca salariatul nu exista
--apelul functiei:
SET SERVEROUTPUT ON
DECLARE
v_sal_mediu number;
BEGIN
--apelul procedurii pentru calculul salariului mediu:
SAL_MEDIU (v_sal_mediu);
else
dbms_output.put_line(' Salariatul are salariul mai mic decat media!');
end if;
Exemplu:
CREATE OR REPLACE FUNCTION taxa (value IN NUMBER, proc IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURN (value*proc);
END taxa;
/
--apelul funcţiei
SELECT id_produs, cantitate, pret, taxa (pret, 0.19) as tva
FROM rand_comenzi;
Exemplu:
SELECT id_produs, cantitate, pret, taxa (pret, 0.19)
FROM rand_comenzi
WHERE taxa(pret, 0.19)>(select avg(taxa(pret, 0.19)) from rand_comenzi)
ORDER BY taxa(pret, 0.19) DESC;
Observatii!
Functiile utilizate in expresii SQL trebuie sa accepte doar parametrii de tip IN si sa returneze numai
tipuri de date specifice PL/SQL.
Functiile nu trebuie sa contina comenzi DML (update, delete, insert) sau comenzi DDL si nici
comenzi pentru controlul tranzactiilor (commit, rollback) si nici nu trebuie sa apeleze alte
subprograme care sa incalce aceste restrictii.
-6-
Facultatea de Științe Economice - SIG - Oracle – Laboratorul 8
Exemplu: Apelul urmatoarei functii dintr-o instructiune SQL va returna o eroare: ORA-
04091: table [nume_tabela] is mutating, trigger/function may not see it
CREATE OR REPLACE FUNCTION produs_nou (pret_min NUMBER)
RETURN NUMBER
IS
BEGIN
INSERT INTO produse values (1, 'cafea', 'kg', pret_min);
RETURN (pret_min+100);
END;
/
--apelul din instructiuni SQL:
UPDATE produse
SET pret_min= produs_nou(2000)
WHERE id_produs=111;
Exemplu:
Select text
From user_source
Where name='TAXA' and type='FUNCTION'
ORDER BY line;
-7-