Documente Academic
Documente Profesional
Documente Cultură
Elemente de PL SQL
Subprograme
Un subprogram este un bloc PL/SQL cu nume (spre deosebire de blocurile anonime) care
poate primi parametri și poate fi invocat dintr-un anumit mediu (e.g., SQL*Plus, Oracle Forms,
Oracle Reports etc.).
Subprogramele sunt bazate pe structura de bloc PL/SQL. Similar unui bloc PL/SQL ele conțin
o parte declarativă facultativă, o parte executabilă obligatorie și o parte de tratare excepțiilor
facultativă.
Proceduri
Funcții (trebuie să conțină cel puțin o comandă RETURN);
Subprogramele pot fi:
Proceduri PL/SQL
O procedură este un subprogram care execută un set de instrucțiuni și nu returnează direct
o valoare către programul apelant. Rezultatele obținute prin procesarea datelor pot fi folosite
în programul apelant, în funcție de modul de declarare a parametrilor.
Proceduri declarate în cadrul unui bloc
O procedură stocată poate fi declarată în cadrul unui bloc PL/SQL. Durata de viață al unei
astfel de proceduri este numai pe perioada existenței blocului. După terminarea execuției
blocului procedura se pierde, deoarece este stocată doar în memorie, nu este stocată
permanent în SGBD.
Sintaxa
DECLARE
[block_variables;]
PROCEDURE procedure_name [(parameter_name [IN|OUT|IN OUT]
parameter_type,...)]
{IS|AS}
[procedure_declaration_section]
BEGIN
procedure_executable_section;
[EXCEPTION
procedure_exception_section]
END [procedure_name];
...
BEGIN
lock_executable_section;
procedure_name [(parameters)];
block_executable_section;
[EXCEPTION
block_exception_section]
END;
Unde:
Ex. 2. Să se scrie o procedură declarată în cadrul unui bloc care întoarce salariu maxim pentru
un ID de departament și o funcție introduse de la tastatură. Salariu maxim să fie returnat
folosindu-se o variabilă scalară. Să se traducă joburile în limba română, în cadrul procedurii.
Aveți grijă la cum sunt repartizate job-urile în departamente.
Proceduri stocate
O procedură stocată este creată ca un obiect în dicționarul de date de la nivelul SGBD-ului și
poate fi folosită oricând.
Sintaxa:
Cursoare în proceduri
Cursoarele declarate într-o procedură urmează aceleași reguli ca într-un bloc obișnuit. O
procedură poate conține mai multe cursoare înlănțuite sau imbricate.
Varray
Nested table
Ex. 4. Să se creeze un vector fie la nivelul dicționarului de date, fie local. Într-un bloc, să se
definească și inițializeze o variabilă de tipul nou creat și să se apeleze o procedură care
afișează valorile elementelor. Să se șteargă tipul din dicționarul de date.
O procedură stocată poate să primească ca parametru un cursor. Acesta trebuie să fie de tipul
SYS_REFCURSOR.
Sintaxa:
DECLARE
block_variables;
var return_data_type; -- variabilă de tipul întors de funcție
block_variables;
Sintaxa:
Observații:
Funcția se va crea prima și dacă nu are erori de compilare se va afișa
mesajul: Function created
În caz contrar se va afișa mesajul: Warning: Function created with
compilation errors
Pentru a vedea erorile de compilare se va folosi comanda show errors
Dacă în dicționarul de date există o funcție cu un nume, atunci nu se
mai poate crea alta cu același nume
Pentru a suprascrie o funcție existentă se folosește comanda C|EATE
O| |EPLACE, folosiți comanda aceasta cu atenție deoarece puteți să
înlocuiți din greșeală o funcție deja existentă, scrisă de un alt
dezvoltator, care are același nume dar are altă funcționalitate
Pentru a șterge o funcție stocată se folosește comanda DDL
drop: D|OP FUNCTION function_name
Odată create și stocate în baza de date, funcțiile pot fi apelate în
comenzi SQL, dar cu anumite restricții.
Funcția f_puncte creată anterior, care returnează numărul de puncte obținute de un angajat
în vederea întocmirii unui clasament pe departamente, poate fi folosită astfel:
SELECT d.dname, e.ename, f_puncte(e.empno) punctaj
FROM emp e
INNER JOIN DEPT d ON d.deptno = e.deptno
WHERE d.deptno = 10;
SELECT
d.dname Departament,
(SELECT MAX(sal) FROM emp WHERE deptno = e.deptno) Salariu_Maxim,
e.ename NumeAngajat,
trunc(months_between(sysdate, e.hiredate)/12) Ani_Vechime,
nvl(e.comm, 0) Comision,
f_puncte(e.empno) Punctaj
FROM emp e INNER JOIN dept d ON d.deptno = e.deptno
WHERE f_puncte(e.empno) = (SELECT MAX(f_puncte(empno)) FROM emp WHERE deptno =
e.deptno)
ORDER BY d.dname;
Informațiile obținute din ultimul select sunt echivalente cu cele obținute prin programul
PL/SQL prezentat în exercițiul 3. Se observă că dacă utilizatorul are cunoștințe de SQL, acesta
poate să creeze fără dificultăți liste simple. Comanda se bazează pe un cursor implicit creat
de SGBD. Faptul că o comandă SQL poate să facă același lucru ca un bloc PL/SQL nu înseamnă
că este mai ușor să scrii comenzi SQL decât blocuri PL/SQL. Totuși, în dezvoltarea aplicațiilor,
un dezvoltator va încerca întotdeauna, în momentul construirii unui bloc PL/SQL, să
minimizeze numărul de cereri SQL, încercând să obțină toate informațiile necesare folosind
cât mai puține cereri SQL.