Documente Academic
Documente Profesional
Documente Cultură
Un subprogram PL/SQL reprezintă un bloc PL/SQL cu o denumire specifică, ce poate fi invocat prin
intermediul unui set de parametri. Un subprogram poate fi fie o procedură, fie o funcție. În mod
obișnuit, o procedură este utilizată pentru a efectua o acțiune, în timp ce o funcție este folosită
pentru a calcula și pentru a returna o valoare.
Aceste subprograme pot fi realizate fie la nivel de schemă, fie în interiorul unui pachet sau în
interiorul unui bloc PL/SQL (care poate fi un alt subprogram). Astfel:
În interiorul unui bloc PL/SQL: Un subprogram realizat în interiorul unui bloc PL/SQL este un
subprogram imbricat. Un astfel de subprogram poate să fie declarat și definit în același timp
sau poate să fie declarat inițial (declarație în avans) și definit ulterior în același bloc.
Subprogramele imbricate sunt stocate în baza de date numai dacă sunt imbricate în cadrul
unor subprograme autonome sau “ambalate”.
Un subprogram începe cu un titlu, care specifică numele său și (opțional) lista de parametri. Ca și
blocurile anonime, un subprogram poate fi compus din următoarele părți:
Notă: Partea declarativă a unui subprogram nu începe prin menționarea cuvântului cheie DECLARE,
așa cum face partea declarativă a unui bloc anonim.
12. PROCEDURI
12.1 Realizarea si stergerea unei proceduri
O procedură reprezintă un subprogram care efectuează o acțiune specifică. Aceasta execută un set
de instrucțiuni, dar nu returnează direct o valoare către programul apelant. Rezultatele obținute
prin procesarea datelor pot fi totuşi folosite în programul apelant, în funcție de modul de declarare
a parametrilor.
Variabilele care sunt disponibile atât pentru programul principal (apelant), cât şi pentru procedură
în sine (subprogram) şi care determină funcționalitatea şi rezultatele, sunt denumite parametrii.
Parametrii unei proceduri sunt opționali şi sunt declarați în momentul în care este realizată
procedura.
Procedurile declarate în cadrul unui bloc PL/SQL au ciclu de viață atât cât există blocul (nestocate).
După închiderea blocului, procedura se pierde, deoarece este stocată în memorie (nu şi pe serverul
bazei de date). Pentru a fi recreată, se compilează din nou blocul şi se execută. O procedură stocată
pe serverul bazei de date poate fi folosită oricând, chiar şi după închiderea sesiunii, deoarece rămâne
creată în dicționar, ca orice obiect al bazei de date.
prin nume dintr-un bloc PL/SQL anonim sau din alt subprogram:
nume_procedură (parametrii);
prin apel direct cu instrucțiunile EXECUTE nume_procedură, EXEC nume_procedură sau CALL
nume_procedură. Chiar dacă de cele mai multe ori, CALL și EXECUTE/EXEC sunt folosite
interschimbabil, există anumite diferențe:
o EXEC/EXECUTE reprezintă comenzi SQL*PLUS care includ subprogramul apelat într-un
bloc anonim BEGIN… END. De obicei, un apel folosind EXEC necesită mai puțină
memorie comparativ cu un apel folosind CALL.
Observație: SQL*PLUS este o interfață cu utilizatorul specifică Oracle. A nu se
confunda cu limbajul SQL.
o CALL este o comanda SQL și poate utiliza doar tipuri de date SQL. Are clauza INTO care
poate fi folosită pentru a specifica variabila de mediu (HOST) care va prelua valoarea
returnată de către o funcție. Un apel folosind CALL poate inhiba propagarea unor
excepții către mediu. CALL poate fi folosit în cadrul declanșatorilor, în locul corpului
acestora, pentru a apela o altă procedură.
din alt mediu Oracle (APEX, Oracle Developer Suite).
Aplicatia 2:
Să se realizeze o procedură cu ajutorul căreia să se mărească prețurile produselor cu un anumit
cod introdus de la tastatură. Procedura realizată trebuie să determine afișarea prețului inițial
și a prețului final (actualizat), sub formă de propoziții specifice.
Rezolvare:
CREATE OR REPLACE PROCEDURE marire_pret (p_cod_produs IN produse.cod_produs%TYPE, procent
IN number)
IS p_pret produse.cod_produs%TYPE;
BEGIN
SELECT pret INTO p_pret FROM produse WHERE cod_produs=p_cod_produs;
dbms_output.put_line ('Produsul are pretul initial de: ' ||p_pret);
UPDATE produse
SET pret=pret*(1+procent)
WHERE cod_produs=p_cod_produs;
SELECT pret INTO p_pret FROM produse WHERE cod_produs=p_cod_produs;
dbms_output.put_line ('Produsul are pretul actualizat de: ' ||p_pret);
END;
Rezolvare:
BEGIN micsorare_pret (4,0.1);
END;
Rezolvare:
CREATE OR REPLACE PROCEDURE cautare_angajat
(p_cod_angajat IN angajati.cod_angajat%TYPE, p_nume OUT angajati.nume%TYPE, p_salariu OUT
angajati.salariu%TYPE)
IS
BEGIN
SELECT nume, salariu INTO p_nume, p_salariu FROM angajati
WHERE cod_angajat=p_cod_angajat;
DBMS_OUTPUT.PUT_LINE ('Angajatul ' || p_nume || 'are salariul ' || p_salariu); END;
Rezolvare:
DECLARE v_nume angajati.nume%TYPE; v_salariu angajati.salariu%TYPE;
BEGIN
cautare_angajat(6, v_nume, v_salariu);
END;
Aplicatia 2:
Să se realizeze o procedură prin intermediul căreia să fie calculată valoarea maximă regăsită pe
facturile de aprovizionare. Ca și rezultat al invocării procedurii, pe ecran trebuie afișată
valoarea calculată, sub formă de mesaj specific.
Rezolvare:
CREATE OR REPLACE PROCEDURE valoare_maxima_aprovizionare (p_max OUT number)
IS
BEGIN
SELECT max(suma) INTO p_max FROM facturi_aprovizionare;
DBMS_OUTPUT.PUT_LINE ('Cea mai mare factura de aprovizionare este in valoare de: ' ||p_max);
END;
Rezolvare:
DECLARE v_suma_max NUMBER;
BEGIN valoare_maxima_aprovizionare(v_suma_max);
END;
Se dorește realizarea unei proceduri care să aibă ca efect transpunerea unui șir de caractere în
majuscule (UPPER).
13. FUNCTII
O functie reprezintă un bloc PL/SQL cu o denumire anume, care acceptă parametri, poate fi apelată
și poate returna o valoare. În general, funcțiile sunt utilizate pentru a calcula o valoare.
O funcție este realizată prin intermediul comenzii CREATE FUNCTION care declară o listă de
parametrii și definește acțiunile care trebuie efectuate de blocul PL/SQL standard. Aceasta trebuie să
aibă clauza RETURN în header și cel puțin o clauză RETURN în secțiunea de cod executabil.
Important!
- Funcţiile pot fi folosite în cadrul interogărilor (aşa cum puteți folosi de exemplu funcţia UPPER
din SQL).
- Există câteva tipuri de date care previn utilizarea funcţiilor în comenzi de tip SELECT (de exemplu
boolean).
- În funcţii încercaţi să evitaţi orice operaţie de tip DML (eng. Data Manipulation Language) sau
DDL (eng. Data Definition Language). Adică, încercaţi să nu efectuați operații de
inserare/ştergere/modificare a datelor din tabele, să nu creaţi tabele, să le modificaţi structura
sau să le ştergeţi. De asemenea, este bine să evitați utilizarea comenzilor COMMIT sau ROLLBACK
sau modificarea variabilelor globale ale unui program PL/SQL. În principiu funcţiile au rolul de a
calcula ceva şi de a returna o informaţie.
- De obicei, toate modurile de transmitere a parametrilor vor fi setate de tipul IN. Atunci când se
utilizează tipul OUT, funcţia nu mai poate fi folosită în SELECT-uri. Dacă se omite menționarea
acestor moduri, valoarea lor predefinita este IN.
Lucrări aplicative:
Se consideră un adaos de 15% pentru prețul tuturor produselor aflate în stoc. Să se realizeze o
funcție cu ajutorul căreia să se calculeze adaosul aferent prețului fiecărui produs.
Realizare funcție:
CREATE OR REPLACE FUNCTION adaos (valoare IN NUMBER, procent IN NUMBER) RETURN NUMBER
IS
BEGIN
RETURN (valoare*procent);
END adaos;
Realizare funcție:
CREATE OR REPLACE FUNCTION pret_cu_adaos (valoare IN NUMBER, procent IN NUMBER) RETURN
NUMBER IS
BEGIN
RETURN (valoare*procent);
END pret_cu_adaos;
Să se afișeze, prin apelarea funcțiilor realizate anterior, denumirea, prețul, valoarea adaosului
și prețul cu adaos pentru fiecare produs.
Rezolvare:
SELECT denumire, pret, adaos(pret,0.15) AS Valoare_adaos, pret_cu_adaos(pret,1.15) AS
Pret_cu_ADAOS FROM produse;