Documente Academic
Documente Profesional
Documente Cultură
Obiective :
Scopul prezentarii :
În aceasta prezentare veti învata ce sunt exceptiile PL/SQL si cum se poate lucra cu ele
folosind tratari predefinite, non-predefinite, si definite de utilizator .
Ce este o exceptie ?
- Un identificator în PL/SQL care apare în timpul unei executii.
Cum apare ?
- La aparitia unei erori.
- Este apelata explicit.
Cum se trateaza ?
- Este capturata într-o rutina de tratare a exceptiei.
- Este propagata spre mediul apelant.
O exceptie este un identificator în PL/SQL , care apare în timpul executiei unui bloc care îsi
încheie partea principala de instructiuni. Un bloc se termina întodeauna când PL/SQL genereaza o
exceptie, dar pot fi specificate rutine utilizator de tratare a acestora în care se pot executa actiuni
finale.
DECLARE DECLARE
BEGIN BEGIN
Este generata Este generata
exceptia exceptia
EXCEPTION EXCEPTION
Exceptia este Exceptia nu este
capturata capturata
END; END;
Daca exceptia este generata în partea executabila a blocului, programul sare în rutina de
tratare corespunzatoare din sectiunea de bloc alocata exceptiilor. Daca PL/SQL trateaza cu succes
atunci aceasta nu se propaga în blocul superior. Blocul PL/SQL se termina cu succes.
Se poate trata o exceptie prin propagarea ei spre mediul apelant. Daca exceptia este generata
în portiunea executabila a blocului si nu exista nici o rutina de tratare corespondenta atunci blocul
PL/SQL se termina cu eroare.
Tipuri de exceptii
Exceptiile se pot programa pentru a evita întreruperile din program. Exista trei tipuri :
Capturarea exceptiilor
Sintaxa
EXCEPTION
WHEN exception1 [ OR exception2 . . .] THEN
statement1;
statement2;
. . .
[ WHEN exception3 [ OR exception4 . . .] THEN
statement1;
statement2;
. . .]
[ WHEN OTHERS THEN
statement1;
statement2;
. . .]
Se poate captura orice eroare prin includerea unei rutine corespunzatoare în cadrul sectiunii
de tratare a exceptiilor dintr-un bloc PL/SQL . Fiecare tratare consta într-o clauza WHERE , care
specifica exceptia, urmata de o secventa de instructiuni care vor fi executate când exceptia este
generata.
În cadrul sintaxei,
exception este numele standard a unei exceptii predefinite sau numele unei exceptii definite de
utilizator si declarata în cadrul sectiunii declarative
statement reprezinta una sau mai multe instructiuni ale PL/SQL sau SQL
OTHERS este o tratare de exceptii optionala si trateaza clauze care captureaza exceptiile
nespecificate
Sectiunea de tratare a exceptiilor captureza numai acele exceptii care au fost specificate ;
orice alte exceptii nu sunt capturate decat daca se foloseste tratarea cu OTHERS. Aceasta
captureaza orice expresie care nu a fost înca tratata. Din acest motiv OTHERS este ultima tratare
definita.
Tratarea OTHERS captureaza toate expresiile care nu au fost tratate. Câteva instrumente
ORACLE au propriile exceptii predefinite care pot fi generate de utilizator pentru provocarea
anumitor evenimente în aplicatii. Aceste exceptii sunt de asemenea capturate de OTHERS.
Exceptii predefinite :
Exceptii Predefinite
Sintaxa :
BEGIN
SELECT . . . COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;
WHEN TOO_MANY_ROWS THEN
statement1;
WHEN OTHERS THEN
statement1;
statement2;
statement3;
END;
Se poate captura o eroare non-predefinita fie prin a o declara sau prin folosirea handlerului
OTHERS. Exceptia declarata este generata implicit. În PL/SQL, constrângerea (PRAGMA)
EXCEPTION_INIT comanda compilatorului sa asocieze numele unei exceptii cu un numar de
exceptie ORACLE. Acest lucru permite ca sa putem referi orice exceptie interna cu numele ei si sa
o putem trata într-un handler specific.
Erori Non-Predefinite
Captarea erorii -2292 a serverului Oracle - încălcarea unei constrângeri
DECLARE
e_products_invalid EXCEPTION; 1
PRAGMA EXCEPTION_INIT ( e_products_invalid, -2292); 2
v_message VARCHAR2(50);
BEGIN
. . .
EXCEPTION
WHEN e_products_invalid THEN
:g_message := ‘Product code specified is not valid.’; 3
. . .
END;
Sintaxa :
exception EXCEPTION;
Exemplu :
[DECLARE]
e_amount_remaining EXCEPTION;
1
. . .
BEGIN
. . .
RAISE e_amount_remaining;
2
. . .
ECXEPTION
WHEN e_amount_remaining THEN
:g_message := ‘There is still an amount in stock.’;
3
. . .
END;
Sintaxa :
exception EXCEPTION;
Sintaxa :
RAISE exception;
În exemplul de mai sus : Acest client are o ‘regula’ de afaceri care spune ca un produs nu poate fi
sters din baza de date daca mai exista inventar din acest produs în stoc. Cum nu exista nici o
constrângere care sa reglementeze acest lucru, se trateaza evenimentul explicit în cadrul aplicatiei.
Înainte de executarea unui DELETE în tabela PRODUCT, blocul interogheaza tabela
INVENTORY sa verifice daca exista stoc pentru produsul respectiv. Daca da, se apeleaza exceptia.
Când apare o exceptie , se poate identifica codul de eroare asociat sau mesajul de eroare
folosind doua functii. În functie apoi de valoarea codului sau de mesaj se pot decide masurile
aferente care vor trebui luate.
SQLCODE întoarce numarul de eroare Oracle pentru exceptiile interne. Se poate transmite
numarul erorii functiei SQLERRM, care returneaza apoi mesajul asociat cu numarul erorii.
Functia Descriere
SQLCODE Returneaza valoarea numerica pentru codul erorii ( se poate asigna unei
variabile d etip NUMBER ).
SQLERRM Returneaza data de tip sir de caractere continând mesajul asociat cu
numarul erorii.
Exemple de valori ale SQLCODE :
Exemple :
DECLARE
v_error_code NUMBER;
v_error_message VARCHAR2(255);
BEGIN
. . .
EXCEPTION
. . .
WHEN OTHERS THEN
ROLLBACK;
v_error_code := SQLCODE;
v_error_message := SQLERRM;
INSERT INTO errors VALUES (v_error_code, v_error_message);
END;
Functii de captare a exceptiilor :
Când o exceptie este captata în sectiunea WHEN OTHERS, se poate folosi un set de functii
generice pentru identificarea acestor erori.
În exemplu se prezinta asignarea valorilor SQLCODE si SQLERRRM unor variabile care ai
apoi sunt folosite în instructiuni SQL.
Mediile apelante
Transmiterea exceptiilor
DECLARE
. . .
e_no rows exception;
e_integrity exception;
PRAGMA EXCEPTION INIT ( e_integrity ,
-2992 );
BEGIN
FOR c_record IN emp_cursor LOOP
BEGIN
SELECT . . .
Subblocurile pot trata o exceptie UPDATE . . .
sau o pot transmite blocului IF SQL %NOTFOUND THEN
final(imbricat) RAISE e_no_rows;
END IF;
EXCEPTION
WHEN e_integrity THEN . . .
WHEN e_no_rows THEN . . .
END;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN . . .
WHEN TOO_MANY_ROWS THEN . . .
RAISE_APPLICATION_ERROR
Sintaxa :
raise_application_error ( error_number,
message [ , { TRUE | FALSE } ] ) ;
Exemplu :
. . .
DELETE FROM emp
WHERE mgr = v_mgr ;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR ( -20202 , ‘ Acesta nu este un manager
valid ’ ) ;
END IF ;
. . .
Sumar :
* Tipuri de exceptii :
- erori predefinite de Server-ul Oracle
- erori nepredefinite de Server-ul Oracle
- erori definite de utilizator
* Capturarea exceptiilor
* Tratarea exceptiilor :
- capturarea exceptiilor în interiorul unui bloc PL/SQL
- propagarea exceptiei
Exercitii :
RESULTS
--------------------------------------------------------
SMITH – 800
More than one employee with a salary of 3000
No employee with a salary of 6000
G_MESSAGE
-------------------------------------------------
Departament 50 is an invalid department
3. Scrieti un bloc PL/SQL care tipareste numele angajatilor care au cu 100$ mai mult sau
mai putin la salar fata de valoarea salariului introdus :
a. Daca nu este nici un angajat al carui salar sa se încadreze în acesta valoare, tipariti
un mesaj utilizatorului indicându-i acest lucru. Folositi o exceptie pentru acest caz.
b. Daca sunt unul sau mai multi angajati ale caror salarii se încadreaza în acesta
valoare, mesajul va trebui sa indice câti angajati au un salar ce se încadreaza în valoarea respectiva.
c. Tratati orice alta exceptie cu o exceptie asemanatoare, mesajul va trebui sa indice
daca au mai aparut si alte erori.
Please enter the salary : 800
PL/SQL procedure successfully completed.
G_MESSAGE
----------------------------------------------------------------------
There is 1 employee (s) with a salary between 700 and 900
G_MESSAGE
---------------------------------------------------------------------------
There are 3 employee (s) with a salary between 2900 and 3900
G_MESSAGE
-----------------------------------------------------------------
There are no employee salary between 5900 and 6100