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 apărea numai în partea dreapta a (:=)
un parametru OUT poate apărea numai în partea stânga a (:=)
un parametru IN OUT poate apărea în ambele părţi ale (:=)
prin nume dintr-un bloc PL/SQL anonim sau din alt subprogram;
prin apel direct cu EXECUTE nume_proc sau EXEC nume_proc sau CALL nume_proc.
din alt mediu Oracle (APEX, Oracle Developer Suite)
Parametri 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;
/
In această situație vom folosi un bloc apelator anonim:
2
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 5
SET SERVEROUTPUT ON
DECLARE
v_nume angajati.nume%type;
v_salariul angajati.salariul%type;
BEGIN
Cauta_angajat(150, v_nume, v_salariul);
END;
/
3
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 5
2. FUNCŢII:
Observație: Funcțiile pot avea parametrii OUT și IN/OUT, acestea însă nu vor putea fi folosite în
expresii SQL. Vor putea fi însă apelate din alte blocuri PL/SQL.
Exemplu: Funcția verifica_salariul returnează TRUE/FALSE daca salariatul are salariul mai
mare/mai mic sau egal cu salariul mediu si NULL daca salariatul nu exista
4
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 5
describe verifica_salariul;
SET SERVEROUTPUT ON
DECLARE
v_sal_mediu number;
BEGIN
--apelul procedurii pentru calculul salariului mediu:
SAL_MEDIU (v_sal_mediu);
Exemplu:
CREATE OR REPLACE FUNCTION TAXA (value IN NUMBER, proc IN
NUMBER)
RETURN NUMBER IS
BEGIN
RETURN (value*proc/100);
END taxa;
5
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle, opțional – seminarul 5
--apelul funcţiei
SELECT id_produs, cantitate, pret, taxa (pret, 20) as tva
FROM rand_comenzi;
Exemplu:
SELECT id_produs, cantitate, pret, taxa (pret, 20)
FROM rand_comenzi
WHERE taxa(pret, 20)>(select avg(taxa(pret, 20)) from rand_comenzi)
ORDER BY taxa(pret, 20) 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. Acestea 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.
Functiile apelate in cadrul expresiilor SQL pot fi continute in pachete.