Sunteți pe pagina 1din 11

Subrograme PL/SQL – Proceduri stocate

Obiectivele lectiei sunt urmatoarele:

• Sa faceti distinctia intre blocurile PL/SQL anonime si subprogramele


PL/SQL(blocurile cu nume);
• Sa creati o procedura stocata PL/SQL
• Sa rulati o procedura stocata
• Sa stergeti o procedura stocata.

PL/SQL suporta diferite module program. Aceasta lectie isi propune sa


compare blocurile PL/SQL anonime cu blocurile PL/SQL cu nume. Si in plus iti
prezinta diferite medii de dezvoltare.

1
Forma programului PL/SQL :

Diagrama prezint a diferitele module program PL/SQL bazate pe blocurile


PL/SQL de baza. In general un bloc este ori un bloc anonim ori un bloc cu nume.

Structura blocului PL/SQL :

Orice constructie PL/SQL contine unu sau mai multe blocuri. Blocurile pot
fi total separate sau pot fi imbricate. De aceea un bloc poate fi o mica parte dintr-
un alt bloc care la randul lui poate fi o parte dintr-o intreaga unitate de cod.

Structura blocurile PL/SQL anonime :

• DECLARE (optional)
Defineste obiectele PL/SQL care vor fi folosite in interiorul blocului ;
• BEGIN (obligatoriu)
Contine instructiuni executabile
• EXCEPTION(optional)
Ce sa se intample daca in executia instructiunilor apar erori.
• END (obligatoriu)

Blocurile anonime

Sunt blocurile care nu au nume. Sunt declarate intr-un punct al aplicatiei acolo
unde vor rula si sunt pasate motorului PL/SQL pentru executia lor imediata.

• BEGIN si END sunt elemente obligatorii si intre ele sunt incluse instructiunile
ce vor fi executate.Aceasta sectiune esta deseori numita sectiunea executabila a
unui bloc.
• DECLARE este optional. Aici se definesc obiectele PL/SQL cum ar fi
variabilele, constantele, cursoarele si exceptiile definite de utilizator care vor fi
folosite in interiorul blocului.
• EXCEPTION capteaza conditiile de eroare predefinite. Aici se definesc
actiuni care vor fi facute in conditiile specificate. Sectiunea EXCEPTION este
optionala si trebuie sa preceada imediat cuvantul cheie END.

Obs: DECLARE , BEGIN ci EXCEPTION nu se termina cu punct si virgula dar


END si toate celelalte instructiuni PL/SQL trebuie sa se termine cu punct si
virgula;

2
Structura bloc a subprogramelor PL/SQL

Header
IS
Sectiune de declaratii

BEGIN
Instructiuni executabile

EXCEPTION

Sectiune de exceptii

END;

Subprogramele

Subprogramele sunt blocuri PL/SQL cu nume care pot avea parametri si pot fi
apelate. PL/SQL are doua tipuri de subprograme numite proceduri si functii.
• Headerul este relevant doar pentru blocurile cu nume si determina modul in
care o unitate program este apelata sau invocata.Headerul determina tipul
blocului PL/SQL (procedura , functie) , contine numele unitatii program, lista
parametrilor(daca are) si o clauza RETURN (doar pentru functii).
• Elementele BEGIN si END sunt obligatorii, si intre ele sunt incluse
instructiunile ce vor fi executate.Aceasta sectiune este deseori referita ca o
sectiune executabila a unui bloc.
• DECLARE este optional si se aplica doar blocurilor anonime. Aici se definesc
obiectele PL/SQL cum ar fi variabilele, constantele, cursoarele si exceptiile
definite de utilizator care vor fi folosite in interiorul blocului.
• EXCEPTION capteaza conditiile de eroare predefinite.Aici se definesc actiuni
care vor fi facute in conditiile specificate. Sectiunea EXCEPTION este
optionala si trebuie sa preceada imediat cuvantul END.

3
Avantajele Subprogramelor:

• O mai buna gestionare a resurselor


• Imbunatatirea securitatii si integritatii datelor
• Optimizarea performantelor

Mai buna gestionare a resurselor:


• Face posibila modificarea rutinelor fara a interfera cu alti utilizatori
• Face posibila modificarea unei rutine care poate influenta mai multe aplicatii
• Face posibila modificarea unei rutine ce poate fi apelata de mai multi utilizatori

Imbunatatirea securitatii si integritatii datelor:


• Permite controlul accesului indirect din partea utilizatorilor la obiectele bazei
de date.
• Asigura faptul ca actiunile care au legatura untre ele sunt executate impreuna
sau deloc.

Imbunatatirea performantelor :
• Evita parcurgerea de mai multe ori a unei zone SQL partajata de catre
utilizatori multipli
• Evita parsarii programului PL/SQL in executie prin parsarea in timpul
compilarii.
• Reduce numarul de apeluri la baza de date si permite reducerea traficului prin
retea

Dezvoltarea de proceduri si functii folosind SQL *Plus

4
Exemplul de mai sus creeaza o procedura stocata, fara nici un argument,
folosita pentru a înregistra numele de utilizator si data curenta într-o tabela.

Apelarea de proceduri si functii stocate

Puteti apela o functie sau o procedura creata pe o mare varietate de medii


de dezvoltare cum ar fi : SQL*Plus, Developer/2000, alta procedura stocata
precum si multe alte utilitare Oracle si aplicatii precompilate.

1. SQL *Plus
SQL>EXECUTE log_execution

2. Alta procedura :
CREATE OR REPLACE PROCEDURE fire_emp (v_id IN
emp.empno%TYPE) IS
BEGIN
log_execution;
DELETE FROM emp
WHERE empno=v_id;
END fire_emp;

4. Alte medii.

5
Proceduri stocate

O procedura este un bloc PL/SQL cu nume care executa o actiune. Exista doua
tipuri de proceduri:
- proceduri stocate pe serverul de date
- proceduri pe partea de client (dezvoltate cu instrumente Oracle)

O procedura poate fi stocata in baza de date, ca un obiect al bazei de date


pentru executii repetate. O procedura poate fi creata si pe partea de client folosind
un instrument specific (ex: Procedure Builder).

Dezvoltarea procedurilor stocate.

Sintaxa de creare a unei proceduri stocate este:

CREATE [OR REPLACE] PROCEDURE nume_procedura


(argument1 [mod1] tipdate1,
argument2 [mod2] tipdate2, …)
IS [AS]
-- declaratii
BEGIN
-- instructiuni
[EXCEPTION]
-- tratarea exceptiilor
END;
/

6
O procedura este creata folosind instructiunea CREATE [OR REPLACE]
PROCEDURE :

Procedure_name – numele procedurei

Argument –lista de parametri formali

Mode –modul de pasare a parametrilor: IN (predefinit), OUT, IN OUT

Datatype – tipul de date al fiecarui parametru formal

Bloc PL/SQL – corpul procedurii in care se defineste actiunea ce va fi lansata la


apelarea procedurii

Optiunea REPLACE permite suprascrierea unei proceduri cu acelasi nume deja


existent. Din cadrul corpului unei proceduri nu se pot referi variabile de legatura
sau ale mediului gazda.

Pentru a crea o procedura stocata din mediul SQL*Plus trebuie urmati urmatorii
pasi:
• se scrie codulu procedurii intr-un editor de texte asociat si se salveaza
intr-un fisier script;
• se ruleaza fisierul script din mediul SQL*Plus pentru a compila codul
sursa si pentru a stoca procedura in baza de date.
• se apeleaza procedura dintr-un mediu ce interactioneaza cu serverul de
date pentru a vedea daca aceasta se executa corect :

Ex. SQL*Plus: EXECUTE nume_proc(arg1,…)

7
Exista mai multe moduri de a transmite parametri unei proceduri ca in figura
urmatoare:

Transmiterea parametrilor intr-o procedura.

Modurile de transmitere a parametrilor sunt descrise in tabelul urmator:

Moduri de transmitere a parametrilor intr-o procedura.

Exemplu de procedura cu parametru de tip IN:

SQL> CREATE OR REPLACE PROCEDURE raise_salary


2 (v_id in emp.empno%TYPE)
3 IS
4 BEGIN
5 UPDATE emp
6 SET sal = sal * 1.10
7 WHERE empno = v_id;
8 END raise_salary;
9 /
Procedu re cr eated .SQL> EXECUTE raise_salary (7369)
PL/SQL proce dure succ essfu lly c omple ted.
Exemplu de procedura cu parametri de tip IN si de tip OUT:

8
SQL> CREATE OR REPLACE PROCEDURE query_emp
1 (v_id IN emp.empno%TYPE,
2 v_name OUT emp.ename%TYPE,
3 v_salary OUT emp.sal%TYPE,
4 v_comm OUT emp.comm%TYPE)
5 IS
6 BEGIN
7 SELECT ename, sal, comm
8 INTO v_name, v_salary, v_comm
9 FROM emp
10 WHERE empno = v_id;
11 END query_emp;
12 /
SQL> START emp_query.sql
Procedure created.
SQL> VARIABLE g_name varchar2(15)
SQL> VARIABLE g_salary number
SQL> VARIABLE g_comm number
SQL> EXECUTE query_emp (7654, :g_name, :g_salary,
2 :g_comm)PL/SQL procedure successfully completed.
SQL> PRINT g_name
G_NAME
---------------
MARTIN
Exemplu de procedura cu parametru de tip IN OUT:

SQL> CREATE OR REPLACE PROCEDURE format_phone


2 (v_phone_no IN OUT VARCHAR2)
3 IS
4 BEGIN
5 v_phone_no := '(' || SUBSTR(v_phone_no,1,3) ||
6 ')' || SUBSTR(v_phone_no,4,3) ||
7 '-' || SUBSTR(v_phone_no,7);
8 END format_phone;
9 /
SQL>VARIABLE g_phone_no varchar2(15)
SQL> BEGIN :g_phone_no := '8006330575'; END;
2 /
PL/SQL procedure successfully completed.SQL> EXECUTE format_phone
(:g_phone_no)
PL/SQL procedure successfully completed.SQL> PRINT g_phone_no
Parametrii procedurilor stocate PL/SQL pot fi pasati in trei moduri:
SQL> CREATE OR REPLACE PROCEDURE add_dept
1 (v_name IN dept.dname%TYPE DEFAULT 'unknown',
2 v_loc IN dept.loc%TYPE DEFAULT 'unknown')
3 IS
4 BEGIN
5 INSERT INTO dept
6 VALUES (dept_deptno.NEXTVAL, v_name, v_loc);
7 END add_dept;
8 /
SQL> begin
2 add_dept;
3 add_dept ( 'TRAINING', 'NEW YORK');

9
4 add_dept ( v_loc => 'DALLAS', v_name =>
'EDUCATION') ;
5 add_dept ( v_loc => 'BOSTON') ;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> SELECT * FROM dept;
DEPTNO DNAME LOC
------ -------------- -------------
... ... ...
41 unknown unknown
42 TRAINING NEW YORK
43 EDUCATION DALLAS
44 unknown BOSTON
DECLARE
v_id NUMBER := 7900;
BEGIN
raise_salary(v_id); --invoke procedure
COMMIT;
...
END;
SQL> CREATE OR REPLACE PROCEDURE process_emps
2 IS
3 CURSOR emp_cursor IS
4 SELECT empno
5 FROM emp;
6 BEGIN
7 FOR emp_rec IN emp_cursor LOOP
8 raise_salary(emp_rec.empno); --invoke procedure
9 END LOOP;
10 COMMIT;
11 END process_emps;
12 /

Stergerea unei proceduri stocate se face cu instructiunea DROP PROCEDURE.

DROP PROCEDURE proc_nume;

Exemplu:
SQL> DROP PROCEDURE raise_salary;
Procedure dropped.

Concluzii

• Procedura este un bloc PL/SQL cu nume care executa o actiune.


• Se folosesc parametrii pentru a pasa date din mediul apelant procedurii.
• Procedurile pot fi apelate din orice instrument sau limbaj care suporta
PL/SQL.
• Procedurile pot servi ca module intr-o aplicatie mai mare.

10
Exercitii

1. Creati si apelati procedura ADD_PROD astfel:

a. ADD_PROD va insera un produs nou in tabela PRODUCT.


b. Apelati procedura si apoi interogati tabela pentru a vedea rezultatele.
c. Apelati procedura cu ProductId avand valorea 100860.

1. Creati procedura UPD_PROD astfel:

a. UPD_PROD va actualiza descrierea unui produs dat ca parametru.


Includeti si cod pentru tratarea exceptiilor.
b. Apelati procedura cu diversi parametri si apoi interogati tabela pentru a
vedea rezultatele. Testati si cazurile corespunzatoare lansarii exceptiilor.

1. Creati procedura DEL_PROD astfel:

a. Procedura DEL_PROD va sterge un produs dat. Includeti partea de


tratare a exceptiilor.
b. Testati procedura pentru diferite cazuri.

1. Creati procedura QUERY_EMP astfel:

a. QUERY_EMP va extrage salariul si meseria pentru un angajat dat.


Includeti partea de tratare a exceptiilor.
b. Testati procedura pentru angajatul cu numarul 7839.
c. Testati procedura pentru angajatul cu numarul 98989.

11

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