Sunteți pe pagina 1din 8

SISTEME INFORMATICE DE GESTIUNE | CIG, ANUL III

ORACLE Application Express


11. SUBPROGRAME PL/SQL
11.1 Aspecte introductive

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:

 La nivel de schemă: Un subprogram realizat la nivel de schemă reprezintă un subprogram


stocat independent. Acesta se realizează prin instrucțiuni specifice (CREATE PROCEDURE sau
CREATE FUNCTION). Subprogramul este stocat în baza de date până în momentul în care este
“abandonat” prin utilizarea instrucțiunilor DROP PROCEDURE sau DROP FUNCTION.

 În interiorul unui pachet: Un subprogram realizat în interiorul unui pachet este un


subprogram “ambalat”. Acesta este stocat în baza de date până în momentul în care pachetul
este “abandonat” prin utilizarea instrucțiunii DROP PACKAGE.

 Î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”.

11.2 Avantaje ale utilizării subprogramelor

Subprogramele sprijină dezvoltarea și menținerea unui cod fiabil, reutilizabil, cu următoarele


caracteristici:

 MODULARITATE – Subprogramele vă permit să împărțiți un program în module gestionabile


și bine definite.
 MENTENANȚĂ – Puteți modifica detaliile de implementare ale unui subprogram fără a
schimba invocatorii.
 GRUPARE ÎN PACHETE – Subprogramele pot fi grupate în pachete, ale căror avantaje vor fi
explicate într-o secțiune ulterioară.
 REUTILIZABILITATE – Mai multe aplicații, din medii diferite, pot utiliza același pachet de
subprograme sau un subprogram autonom.

Asist.Univ.Drd. Bogoslov Ioana Andreea 1


SISTEME INFORMATICE DE GESTIUNE | CIG, ANUL III

 PERFORMANȚĂ MAI BUNĂ – Fiecare subprogram este compilat și stocat în formă


executabilă, care poate fi invocată în mod repetat.

11.3 Realizarea subprogramelor

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:

 PARTEA DECLARATIVĂ (OPȚIONALĂ)


În cadrul acestei secțiuni are loc declarea și definirea unor tipuri locale, cursoare, constante, variabile,
excepții și subprograme imbricate. Aceste elemente nu mai există atunci când subprogramul
finalizează execuția.

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.

 PARTEA EXECUTABILĂ (OBLIGATORIE)


Această parte conține una sau mai multe instrucțiuni care atribuie valori, execută controlul și
manipulează datele.

 PARTEA DE TRATARE A EXCEPȚIILOR (OPȚIONALĂ)


Această parte conține cod care gestionează erorile de execuție.

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.

Asist.Univ.Drd. Bogoslov Ioana Andreea 2


SISTEME INFORMATICE DE GESTIUNE | CIG, ANUL III

Sintaxa generală a unei proceduri:


CREATE [OR REPLACE] PROCEDURE nume_procedură (parametru1 [IN | OUT | IN OUT]
tip, parametru2 [IN | OUT | IN OUT] tip...)
[AUTHID {DEFINER | CURRENT_USER}]
IS | AS -- NU se utilizează DECLARE
[PRAGMA AUTONOMOUS_TRANSACTION;]
[declaratii locale]
BEGIN
instrucțiuni executabile sau NULL;
[EXCEPTION tratare erori]
END nume_procedură;
Unde:
 CREATE [OR REPLACE] – îndică faptul că procedura este definită ca obiect al bazei de date și va fi
stocată în aceasta. Altfel, ea este parte a unui alt bloc PL/SQL.
 [AUTHID {DEFINER | CURRENT_USER}] - specifică dacă o procedură stocată se execută cu
drepturile celui care a realizat-o (valoare implicită) sau ale utilizatorului curent.
 [PRAGMA AUTONOMOUS_TRANSACTION;] - dacă se specifică această caracteristică, execuția
procedurii suspendă tranzacția curentă, care se reia dupa terminarea execuției procedurii. Este
ca și cand, într-o tranzacție imbricăm altă tranzacție, cu propriile sale COMMIT sau ROLLBACK.
Sintaxa generală utilizată pentru stergerea unei proceduri:
DROP PROCEDURE nume_procedură;

12.2 Apelul/invocarea unei proceduri

Apelul unei proceduri poate fi realizat în următoarele moduri:

 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).

Asist.Univ.Drd. Bogoslov Ioana Andreea 3


SISTEME INFORMATICE DE GESTIUNE | CIG, ANUL III

12.3 Parametrii unei proceduri

Parametrii utilizați în proceduri (parametrii formali), pot fi de tipul:


 IN (default) - pentru parametri de intrare (este implicit) și are următoarele caracteristici:
- este utilizat pentru a trimite valori la procedurile stocate;
- este un parametru read-only;
- putem atribui valoarea un parametru de tip IN unei variabile sau îl putem folosi într-o
interogare, dar nu putem să-i schimbăm valoarea în cadrul procedurii.

 OUT - pentru parametri de ieșire (trebuie specificat) și are următoarele caracteristici:


- este folosit pentru a obține/prelua valori din procedurile stocate;
- este un parametru write-only, adică nu putem transmite valori la parametrii OUT în
timp ce executăm procedura stocată, dar putem atribui valori parametrului OUT în
interiorul procedurii stocate și programul de apel poate primi această valoare de
ieșire.

 IN OUT - pentru parametri de intrare-ieșire (trebuie specificat);


- acest tip de parametru este folosit pentru a trimite valori și a obține valori din
procedurile stocate.
- este utilizat dacă valoarea parametrului IN poate fi modificată în programul de apel;
- prin utilizarea parametrului IN OUT putem transmite valori într-un parametru și putem
returna o valoare programului de apel, utilizând același parametru. Acest lucru este
posibil numai dacă valoarea transmisă procedurii și valoarea de ieșire au același tip de
date.

Lucrări aplicative (parametrii de tip IN):


Aplicatia 1:
 Să se realizeze o procedură cu ajutorul căreia să se mărească salariile tuturor angajaților cu un
anumit procent care urmează să fie introdus de la tastatură.

Rezolvare (realizare procedură):


CREATE OR REPLACE PROCEDURE marire_salariu (procent IN number)
IS
BEGIN
UPDATE angajati
SET salariu=salariu*(1+procent);
END;

 Să se marească salariile tuturor angajaților cu 10% ca urmare a apelarii procedurii realizate


anterior.

Rezolvare (apelare procedură):


BEGIN marire_salariu(0.1); END;

Asist.Univ.Drd. Bogoslov Ioana Andreea 4


SISTEME INFORMATICE DE GESTIUNE | CIG, ANUL III

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;

 Să se marească prețul produsului cu codul 4 cu 10%, ca urmare a apelării procedurii realizate


anterior.

Rezolvare:
BEGIN micsorare_pret (4,0.1);
END;

Lucrări aplicative (parametrii de tip OUT):


Aplicatia 1:
 Să se realizere o procedură care să permită căutarea unui angajat prin introducerea de la
tastatură a codului acestuia. Totodată, o dată apelată, procedura trebuie să determine afișarea,
sub formă de mesaj specific, numelui și salariului angajatului căutat.

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;

Asist.Univ.Drd. Bogoslov Ioana Andreea 5


SISTEME INFORMATICE DE GESTIUNE | CIG, ANUL III

 Să se afișeze numele și salariul angajatului cu codul 6, prin apelarea procedurii realizate


anterior.

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;

 Să se apeleze procedura realizată anterior.

Rezolvare:
DECLARE v_suma_max NUMBER;
BEGIN valoare_maxima_aprovizionare(v_suma_max);
END;

Lucrare aplicativă (parametrii de tip IN OUT):

 Se dorește realizarea unei proceduri care să aibă ca efect transpunerea unui șir de caractere în
majuscule (UPPER).

CREATE PROCEDURE nume_maj (nume_majuscule IN OUT VARCHAR2) AS


BEGIN
nume_majuscule := UPPER(nume_majuscule);
END;

 Să se extragă și să se afișeze numele angajatului cu codul 1. Afișarea numelui se va face sub


formă de mesaje specifice, prima dată așa cum este scris în tabela Angajați și, ulterior, sub
formă de majuscule prin apelarea procedurii realizate anterior.

Asist.Univ.Drd. Bogoslov Ioana Andreea 6


SISTEME INFORMATICE DE GESTIUNE | CIG, ANUL III

DECLARE -- declarații de variabile și subprograme


v_nume angajati.nume%TYPE;
v_cod_ang angajati.cod_angajat%TYPE;
BEGIN
SELECT nume, cod_angajat INTO v_nume, v_cod_ang FROM angajati WHERE cod_angajat=1;
DBMS_OUTPUT.PUT_LINE('Numele angajatului este: ' || v_nume ); -- afișare valori inițiale
nume_maj (v_nume); -- apelare procedură cu parameteri
DBMS_OUTPUT.PUT_LINE('Numele angajatului este: ' || v_nume ); -- afișare valori noi
END;

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.

Sintaxa generală a unei functii:


CREATE [OR REPLACE] FUNCTION denumire_funcție (parametru1 tip, parametru2 tip, ...)
RETURN tipul_datei_de_returnat
IS|AS [variabile_locale]
BEGIN
-- instrucțiuni;
RETURN expresie;
END [denumire_funcție];
Sintaxa generală utilizată pentru stergerea unei functii:
DROP FUNCTION nume_funcție;

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.

Asist.Univ.Drd. Bogoslov Ioana Andreea 7


SISTEME INFORMATICE DE GESTIUNE | CIG, ANUL III

- 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;

Apelul funcției realizate anterior:


SELECT cod_produs, denumire, pret, adaos(pret,0.15) as ADAOS FROM produse;

 Să se realizeze o funcție care calculează prețul cu adaos pentru fiecare produs.

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;

Asist.Univ.Drd. Bogoslov Ioana Andreea 8

S-ar putea să vă placă și