Sunteți pe pagina 1din 18

Sisteme de Gestiune a Bazelor de Date 9-1

CUPRINS

9. PL/SQL Gestiunea excepiilor ............................................................................................. 2


9.1. Seciunea de tratare a excepiilor .................................................................................... 4
9.2. Funcii pentru identificarea excepiilor........................................................................... 5
9.3. Excepii interne predefinite ............................................................................................ 5
9.4. Excepii interne nepredefinite ......................................................................................... 7
9.5. Excepii externe .............................................................................................................. 8
9.6. Cazuri speciale n tratarea excepiilor .......................................................................... 11
9.7. Activarea excepiilor..................................................................................................... 13
9.8. Propagarea excepiilor .................................................................................................. 14
9.8.1 Excepie declanat n seciunea executabil .......................................................... 15
9.8.2 Excepie declanat n seciunea declarativ .......................................................... 15
9.8.3 Excepie declanat n seciunea EXCEPTION ...................................................... 16
9.9. Informaii despre erori .................................................................................................. 17
Bibliografie............................................................................................................................... 18

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-2

9. PL/SQL Gestiunea excepiilor

Mecanismul de gestiune a excepiilor permite utilizatorului s defineasc i s


controleze comportamentul programului atunci cnd acesta genereaz o eroare.

Erori la compilare
Tipuri de erori
Erori la execuie

Fig. 9.1. Tipuri de erori

ntr-un program PL/SQL pot s apar:


o erori la compilare
sunt detectate de motorul PL/SQL;
programul nu poate trata aceste erori deoarece nu a fost nc executat;
programatorul trebuie s corecteze erorile i s execute din nou programul;
o erori la execuie
sunt denumite excepii;
pot aprea datorit deficienelor de proiectare, defeciunilor la nivel hardware,
greelilor de cod etc.;
n program trebuie prevzut apariia unei astfel de erori i specificat modul
concret de tratare a acesteia;
- atunci cnd apare eroarea este declanat o excepie, iar controlul trece la
seciunea de tratare a excepiilor, unde va avea loc tratarea erorii;
- dac excepia nu este tratat, atunci aceasta se va propaga n mediul din care a
fost lansat programul;
- nu pot fi anticipate toate excepiile posibile, dar prin mecanismul de tratare a
excepiilor se poate permite programului s i continue execuia i n
prezena anumitor erori.
Excepiile pot fi definite i tratate la nivelul fiecrui bloc din program (bloc principal,
funcii i proceduri, blocuri interioare acestora).
o Execuia unui bloc se termin ntotdeauna atunci cnd apare o excepie, dar se pot
executa aciuni ulterioare apariiei acesteia, ntr-o seciune special de tratare a
excepiilor.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-3

Posibilitatea de a da nume fiecrei excepii, de a izola tratarea erorilor ntr-o seciune


particular, de a declana automat erori (n cazul excepiilor interne) mbuntete
lizibilitatea i fiabilitatea programului. Prin utilizarea excepiilor i a rutinelor de
tratare a excepiilor, un program PL/SQL devine robust i capabil s trateze att erorile
ateptate, ct i cele neateptate ce pot aprea n timpul execuiei.

Excepii interne nepredefinite

Tipuri de excepii Excepii interne predefinite

Excepii externe

Fig. 9.2. Tipuri de excepii

Exist urmtoarele tipuri de excepii:


o excepii interne nepredefinite
au un cod de eroare, dar nu au nume asociat dect dac acesta este precizat de
ctre utilizator;
o excepii interne predefinite
sunt excepii interne care au nume asociat de ctre sistem;
o excepii externe
sunt excepii definite de utilizator n blocuri PL/SQL anonime, subprograme sau
pachete.

Excepiile interne:
o se produc atunci cnd un bloc PL/SQL nu respect o regul Oracle sau depete o
limit a sistemului de operare;
o pot fi independente de structura bazei de date sau pot s apar datorit nerespectrii
constrngerilor statice implementate n structur (PRIMARY KEY, FOREIGN KEY,
NOT NULL, UNIQUE, CHECK);
Atunci cnd apare o eroare Oracle, excepia asociat acesteia se declaneaz implicit.
o De exemplu, dac apare eroarea ORA-01403 (deoarece o comand SELECT nu
ntoarce nicio linie) atunci implicit PL/SQL activeaz excepia NO_DATA_FOUND
(al crui cod este 100).
o Cu toate c fiecare astfel de excepie are asociat un cod specific, ele trebuie referite
prin nume.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-4

Excepii interne Excepii interne Excepii externe


nepredefinite predefinite
Proprietar Sistemul Sistemul Utilizatorul

Doar dac utilizatorul


Cod asociat Da Da
l atribuie

Doar dac utilizatorul


Nume asociat Da Da
l atribuie

Declanare
Da Da Nu
automat

Declanare
Opional Opional Da
explicit

Fig. 9.3. Caracteristicile excepiilor

9.1. Seciunea de tratare a excepiilor

Tratarea excepiilor se realizeaz n seciunea EXCEPTION a unui bloc PL/SQL.

Sintaxa:

EXCEPTION
WHEN nume_excepie1 [OR nume_excepie2 ] THEN
secvena_de_instruciuni_1;
[WHEN nume_excepie3 [OR nume_excepie4 ] THEN
secvena_de_instruciuni_2;]

[WHEN OTHERS THEN
secvena_de_instruciuni_n;]
END;

o Clauza WHEN OTHERS trebuie s fie ultima clauz specificat i trebuie s fie
unic.
Toate excepiile care nu au fost specificate explicit vor fi captate prin aceast
clauz.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-5

9.2. Funcii pentru identificarea excepiilor

Funcia SQLCODE:
o obine codul excepiei;
o ntoarce o valoare de tip numeric;
o codul excepiei este:
- un numr negativ, n cazul unei erori interne;
- numrul +100, n cazul excepiei NO_DATA_FOUND;
- numrul 0, n cazul unei execuii normale (fr excepii);
- numrul 1, n cazul unei excepii definite de utilizator.
Funcia SQLERRM:
o obine mesajul asociat excepiei;
o ntoarce un ir de caractere;
o lungimea maxim a mesajului este de 512 caractere;
o mesajul asociat excepiei declanate poate fi furnizat i de funcia
DBMS_UTILITY.FORMAT_ERROR_STACK.

Exemplul 9.1 vezi curs -

9.3. Excepii interne predefinite

Excepiile interne predefinite (erori de tip ORA-n):


o nu trebuie declarate n seciunea declarativ a blocului PL/SQL;
o sunt declanate implicit de ctre server-ul Oracle;
o sunt referite prin numele asociat lor;
PL/SQL declar aceste excepii n pachetul STANDARD.

Nume excepie Cod Descriere

ACCESS_INTO_NULL -6530 Asignare de valori atributelor unui obiect


neiniializat.

CASE_NOT_FOUND -6592 Nu este selectat nici una din clauzele WHEN


ale lui CASE i nu exist nici clauza ELSE .

COLLECTION_IS_NULL -6531 Aplicarea unei metode (diferite de EXISTS) unui


tabel imbricat sau unui vector neiniializat.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-6

CURSOR_ALREADY_ -6511 Deschiderea unui cursor care este deja deschis.


OPEN
DUP_VAL_ON_INDEX -1 Detectarea unei dubluri ntr-o coloan unde
acestea sunt interzise.

INVALID_CURSOR -1001 Operaie ilegal asupra unui cursor.

INVALID_NUMBER -1722 Conversie nepermis de la tipul ir de caractere


la numr.

LOGIN_DENIED -1017 Nume sau parol incorecte.

NO_DATA_FOUND +100 Comanda SELECT nu ntoarce nicio linie.

NOT_LOGGED_ON -1012 Programul PL/SQL apeleaz baza de date fr s


fie conectat la Oracle.

PROGRAM_ERROR -6501 PL/SQL are o problem intern.

ROWTYPE_MISMATCH -6504 Incompatibilitate ntre parametrii actuali i


formali, la deschiderea unui cursor parametrizat.

SELF_IS_NULL -30625 Apelul unei metode cnd instana este NULL.

STORAGE_ERROR -6500 PL/SQL are probleme cu spaiul de memorie.

SUBSCRIPT_BEYOND_ -6533 Referire la o component a unui tablou imbricat


COUNT
sau vector, folosind un index mai mare dect
numrul elementelor coleciei respective.

SUBSCRIPT_OUTSIDE_ -6532 Referire la o component a unui tabel imbricat


LIMIT
sau vector, folosind un index care este n afara
domeniului (de exemplu, -1).

SYS_INVALID_ROWID -1410 Conversia unui ir de caractere ntr-un ROWID


nu se poate face deoarece irul nu reprezint un
ROWID valid.

TIMEOUT_ON_ -51 Expirarea timpului de ateptare pentru eliberarea


RESOURCE
unei resurse.

TRANSACTION_BACKED -61 Tranzacia este anulat datorit unei interblocri.


_OUT
TOO_MANY_ROWS -1422 Comanda SELECT ntoarce mai multe linii.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-7

VALUE_ERROR -6502 Apariia unor erori n conversii, constrngeri sau


erori aritmetice.

ZERO_DIVIDE -1476 Sesizarea unei mpriri la zero.

Aceeai excepie poate s apar n diferite circumstane.


De exemplu, excepia NO_DATA_FOUND poate fi generat fie pentru c o
interogare nu ntoarce un rezultat, fie pentru c se refer un element al unui
tablou PL/SQL care nu a fost definit (nu are atribuit o valoare).
Dac ntr-un bloc PL/SQL apar ambele situaii, este greu de stabilit care dintre
ele a generat eroarea i este necesar restructurarea blocului, astfel nct acesta
s poat diferenia cele dou situaii.

Exemplul 9.2 vezi curs

Dei excepiile interne sunt lansate implicit (automat) de ctre sistem, sunt
cazuri n care utilizatorul le poate invoca explicit.

Exemplul 9.3 vezi curs

9.4. Excepii interne nepredefinite

Excepiile interne nepredefinite se declar n seciunea declarativ a blocului PL/SQL


i sunt declanate implicit de ctre server-ul Oracle.
Diferenierea acestor erori este posibil doar cu ajutorul codului asociat lor.
Exist dou metode de tratare a excepiilor interne nepredefinite, folosind:
o clauza WHEN OTHERS din seciunea EXCEPTION a blocului;
o directiva de compilare (pseudo-instruciune) PRAGMA EXCEPTION_INIT.
Directiva PRAGMA EXCEPTION_INIT
o permite asocierea unui nume pentru o excepie al crui cod de eroare intern este
specificat;
o avnd un nume specificat pentru excepie, permite referirea acesteia n seciunea
EXCEPTION a blocului;
o este procesat n momentul compilrii (nu la execuie);

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-8

o trebuie s apar n partea declarativ a unui bloc, pachet sau subprogram, dup
definirea numelui excepiei;
o poate s apar de mai multe ori ntr-un program; de asemenea, pot fi asignate mai
multe nume pentru acelai cod de eroare.

Pentru a trata o eroare folosind directiva PRAGMA EXCEPTION_INIT trebuie urmai


paii de mai jos:
1) se declar numele excepiei n partea declarativ a blocului:
nume_excepie EXCEPTION;
2) se asociaz numele excepiei cu un cod de eroare standard Oracle:
PRAGMA EXCEPTION_INIT (nume_excepie, cod_eroare);
3) se refer excepia n seciunea EXCEPTION a blocului (excepia este tratat
automat, fr a fi necesar comanda RAISE):
WHEN nume_excepie THEN set_de_instruciuni

Exemplul 9.4 vezi curs -

9.5. Excepii externe

Excepiile externe:
o sunt excepii definite de utilizator;
o sunt declarate n seciunea declarativ a unui bloc, subprogram sau pachet;
o sunt activate explicit n partea executabil a blocului (folosind comanda RAISE
nsoit de numele excepiei);
o pot s apar n toate seciunile unui bloc, subprogram sau pachet;
o nu pot s apar n instruciuni de atribuire sau n comenzi SQL;
o n mod implicit, au asociat acelai cod (+1) i acelai mesaj (User-Defined
Exception).

Sintaxa de declarare i prelucrare a excepiilor externe :

DECLARE
nume_excepie EXCEPTION; -- declarare excepie
BEGIN

RAISE nume_excepie; -- activare excepie
-- execuia este ntrerupt i se transfer
-- controlul n seciunea EXCEPTION

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-9


EXCEPTION
WHEN nume_excepie THEN
-- definire mod de tratare a erorii

END;

Exemplul 9.5 vezi curs

Activarea unei excepii externe poate fi fcut i cu ajutorul procedurii


RAISE_APPLICATION_ERROR, furnizat de pachetul DBMS_STANDARD.
o Aceast procedur poate fi utilizat pentru a ntoarce un mesaj de eroare unitii
care o apeleaz, mesaj mai descriptiv (non standard) dect identificatorul erorii.
o Are urmtoarea specificaie:
RAISE_APPLICATION_ERROR (num NUMBER,
msg VARCHAR2, keeperrorstack BOOLEAN);
parametrul num reprezint codul asociat erorii, un numr cuprins ntre 20000 i
20999;
parametrul msg reprezint mesajul asociat erorii, un ir de caractere de maxim
2048 bytes;
parametrul keeperrorstack este opional; dac are valoarea TRUE, atunci noua
eroare se va aduga listei erorilor existente, iar dac este FALSE (valoare
implicit) atunci noua eroare va nlocui lista curent a erorilor (se reine ultimul
mesaj de eroare).

O aplicaie poate apela procedura RAISE_APPLICATION_ERROR numai


dintr-un subprogram stocat (sau metod).
Dac procedura RAISE_APPLICATION_ERROR este apelat, atunci
subprogramul se termin i sunt ntoarce codul i mesajul asociate erorii
respective.

Procedura RAISE_APPLICATION_ERROR poate fi apelat n seciunea executabil,


n seciunea de tratare a excepiilor sau simultan n ambele seciuni.
o n seciunea executabil:

DELETE FROM produse WHERE denumire = 'produs';


IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20001,'Date incorecte');
END IF;

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-10

o n seciunea de tratare a excepiilor:

EXCEPTION
WHEN exceptie THEN
RAISE_APPLICATION_ERROR(-20002,'info invalida');
END;

o n ambele seciuni:

DECLARE
exceptie EXCEPTION;
PRAGMA EXCEPTION_INIT (exceptie, -20000);
BEGIN
DELETE produse WHERE denumire = 'produs cautat';
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20000,'Date incorecte');
END IF;
EXCEPTION
WHEN exceptie THEN
DBMS_OUTPUT.PUT_LINE('Mesajul exceptiei: '||SQLERRM);
DBMS_OUTPUT.PUT_LINE('Codul exceptiei: '||SQLCODE);
END;

Procedura RAISE_APPLICATION_ERROR faciliteaz comunicaia dintre client


i server, transmind aplicaiei client erori specifice aplicaiei de pe server (de
obicei, un trigger).
Procedura RAISE_APPLICATION_ERROR este doar un mecanism folosit pentru
comunicaia dintre server i client a unei erori definite de utilizator, care permite
ca procesul client s trateze excepia.

Exemplul 9.6 -
CREATE OR REPLACE TRIGGER trig
BEFORE UPDATE OF serie ON case
FOR EACH ROW
WHEN (NEW.serie <> OLD.serie)
BEGIN
RAISE_APPLICATION_ERROR (-20145,
'Nu puteti modifica seria casei fiscale!');
END;
/

--blocul urmator detecteaza si trateaza eroarea


DECLARE
-- declarare exceptie
exceptie EXCEPTION;
-- asociere un nume codului de eroare folosit in trigger
PRAGMA EXCEPTION_INIT(exceptie,-20145);

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-11

BEGIN
-- lansare comanda declasatoare
UPDATE case
SET serie = serie||'_';
EXCEPTION
-- tratare exceptie
WHEN exceptie THEN
-- se afiseaza mesajul erorii specificat in trigger
-- in procedura RAISE_APPLICATION_ERROR
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/

9.6. Cazuri speciale n tratarea excepiilor

Dac se declaneaz o excepie ntr-un bloc simplu atunci:


o execuia blocului este ntrerupt (setul de comenzi care urmeaz dup comanda care
a declanat excepia nu se mai execut);
o controlul este transferat n seciunea de tratare a excepiilor;
o se trateaz excepia (se execut comenzile specificate n handler-ul excepiei
respective);
o se iese din bloc.

Dac dup o eroare se dorete totui continuarea prelucrrii datelor, este


suficient ca instruciunea care a declanat excepia s fie inclus ntr-un
subbloc.
n acest caz, dup tratarea excepiei i ieirea din subbloc, se continu secvena
de instruciuni din blocul principal.

BEGIN
comanda_1; -- declanseaza exceptia E
comanda_2; -- nu se mai executa
EXCEPTION
WHEN E THEN
set_comenzi; -- se executa
END;

Dac se dorete execuia comenzii comanda_2 chiar i atunci cnd comanda_1


declaneaz o excepie, atunci comanda_1 se include ntr-un subbloc, iar excepia
declanat de aceasta este tratat n acel subbloc.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-12

BEGIN
BEGIN
comanda_1; -- declanseaza exceptia E
EXCEPTION
WHEN E THEN
set_comenzi; -- se executa
END;
comanda_2; -- se executa
EXCEPTION
...
END;

Uneori este dificil de aflat care comand SQL a determinat o anumit eroare, deoarece
exist o singur seciune pentru tratarea erorilor unui bloc.
Variante de rezolvare a acestor situaii:

o utilizarea unui contor care s identifice instruciunea SQL care a declanat excepia.

DECLARE
contor NUMBER(1);
BEGIN
contor :=1;
comanda_SELECT_1;
contor :=2;
comanda_SELECT_2;
contor :=3;
comanda_SELECT_3;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('comanda SELECT '|| contor);
END;

o Introducerea fiecrei instruciuni SQL ntr-un subbloc.

BEGIN
BEGIN
comanda_SELECT_1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('comanda SELECT 1');
END;
BEGIN
comanda_SELECT_2;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('comanda SELECT 2');
END;

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-13

BEGIN
comanda_SELECT_3;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('comanda SELECT 3');
END;
END;

9.7. Activarea excepiilor

Exist dou metode de activare a unei excepii:


o activarea explicit a excepiei (definit de utilizator sau predefinit) n interiorul
blocului, cu ajutorul comenzii RAISE;
o activarea automat a excepiei asociate unei erori Oracle.
Excepiile pot fi generate n oricare dintre seciunile unui bloc PL/SQL (n seciunea
declarativ, n seciunea executabil sau n seciunea de tratare a excepiilor).
o La aceste niveluri ale programului, o excepie poate fi gestionat n moduri diferite.

Pentru a reinvoca o excepie, dup ce a fost tratat n blocul curent, se folosete


instruciunea RAISE, dar fr a fi nsoit de numele excepiei.
o n acest fel, dup executarea instruciunilor corespunztoare tratrii excepiei,
aceasta se transmite i blocului printe.
o Pentru a fi recunoscut ca atare de ctre blocul printe, excepia trebuie s nu fie
definit n blocul curent, ci n blocul printe (sau chiar mai sus n ierarhie), n caz
contrar ea putnd fi captat de ctre blocul printe doar la categoria OTHERS.
Pentru a executa acelai set de aciuni n cazul mai multor excepii nominalizate
explicit, n seciunea de tratare a excepiilor se poate utiliza operatorul OR (WHEN
excepie_1 OR excepie_2 THEN ...).
Pentru a evita tratarea fiecrei erori n parte, se folosete seciunea WHEN OTHERS
care va cuprinde aciuni pentru fiecare excepie care nu a fost tratat, adic pentru
captarea excepiilor neprevzute sau necunoscute.
o Aceast seciune trebuie utilizat cu atenie deoarece poate masca erori critice sau
poate mpiedica aplicaia s rspund n mod corespunztor.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-14

9.8. Propagarea excepiilor

Dac este declanat o eroare n seciunea executabil, iar


o blocul curent are un handler pentru tratarea acesteia, atunci blocul curent se termin
cu succes i controlul este transmis blocului imediat exterior;
o blocul curent nu are un handler pentru tratarea acesteia, atunci excepia se propag
spre blocul printe, iar blocul curent se termin fr succes;
procesul se repet pn cnd fie se gsete ntr-un bloc modalitatea de tratare a
erorii, fie se oprete execuia i se semnaleaz situaia aprut (unhandled
exception error).
Dac este declanat o eroare n seciunea declarativ a blocului sau n seciunea de
tratare a erorilor, atunci aceasta este propagat ctre blocul imediat exterior, chiar dac
exist un handler al acesteia n blocul curent.
La un moment dat, ntr-o seciune EXCEPTION, poate fi activ numai o singur
excepie.

Instruciunea GOTO nu permite:


- saltul la seciunea de tratare a unei excepii;
- saltul de la seciunea de tratare a unei excepii, n blocul curent.
Comanda GOTO permite totui saltul de la seciunea de tratare a unei excepii la
un bloc care include blocul curent.

Exemplul 9.7
DECLARE
v_den produse.denumire%TYPE;
v_id produse.id_produs%TYPE := &p_id;
BEGIN
SELECT denumire
INTO v_den
FROM produse
WHERE id_produs = v_id;
<<eticheta>>
DBMS_OUTPUT.PUT_LINE('Denumirea produsului este '||v_den);
EXCEPTION
WHEN NO_DATA_FOUND THEN v_den := ' ';
GOTO eticheta; --salt ilegal in blocul curent
END;
/

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-15

9.8.1 Excepie declanat n seciunea executabil

Excepia este produs i tratat n subbloc. Dup tratarea excepiei controlul este
transmis blocului exterior.

DECLARE
A EXCEPTION;
BEGIN

BEGIN
RAISE A; -- in subbloc se produse exceptia A
EXCEPTION
WHEN A THEN -- exceptia A este tratata in subbloc

END;
-- aici este reluat controlul
END;

Excepia este produs n subbloc, dar nu este tratat n acesta. Excepia se propag
spre blocul exterior. Regula poate fi aplicat de mai multe ori.
DECLARE
A EXCEPTION;
B EXCEPTION;
BEGIN
BEGIN
RAISE B; -- in subbloc se produse exceptia B
EXCEPTION
WHEN A THEN
--exceptia B nu este tratata in subbloc
END;
EXCEPTION
WHEN B THEN
/*exceptia B s-a propagat spre blocul exterior unde este
tratata, apoi controlul este dat in exteriorul blocului */
END;

9.8.2 Excepie declanat n seciunea declarativ

Dac n seciunea declarativ este generat o excepie, atunci aceasta se propag ctre
blocul exterior, unde are loc tratarea acesteia. Chiar dac exist un handler pentru
excepie n blocul curent, acesta nu este executat.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-16

Exemplul 9.8

BEGIN
DECLARE
nr_produse NUMBER(10) := ' ';
-- este generata eroarea VALUE_ERROR
BEGIN
SELECT COUNT (DISTINCT id_produs)
INTO nr_produse
FROM facturi_produse;
EXCEPTION
WHEN VALUE_ERROR THEN
-- eroarea nu este captata si tratata in blocul intern
DBMS_OUTPUT.PUT_LINE('Eroare bloc intern: ' || SQLERRM);
END;
EXCEPTION
WHEN VALUE_ERROR THEN
-- eroarea este captata si tratata in blocul extern
DBMS_OUTPUT.PUT_LINE('Eroare bloc extern: ' || SQLERRM );
END;
/

9.8.3 Excepie declanat n seciunea EXCEPTION

Dac excepia este declanat n seciunea EXCEPTION, atunci aceasta se propag


imediat spre blocul exterior.
BEGIN
DECLARE
A EXCEPTION;
B EXCEPTION;
BEGIN
RAISE A; -- este generata exceptia A
EXCEPTION
WHEN A THEN
RAISE B; -- este generata exceptia B
WHEN B THEN
/* exceptia este propagata spre blocul exterior
cu toate ca exista aici un handler pentru ea */
END;
EXCEPTION
WHEN B THEN
--exceptia B este tratata in blocul exterior
END;

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-17

9.9. Informaii despre erori

Pentru a obine textul corespunztor erorilor aprute la compilare, poate fi utilizat


vizualizarea USER_ERRORS din dicionarul datelor.
Pentru informaii adiionale referitoare la erori pot fi consultate vizualizrile
ALL_ERRORS sau DBA_ERRORS.

Vizualizarea USER_ERRORS ofer informaii despre obiectele care au generat erori la


compilare; de exemplu:
o numele obiectului (NAME);
o tipul obiectului (TYPE);
o numrul liniei din codul surs la care a aprut eroarea (LINE);
o poziia din linie (POSITION);
o mesajul asociat erorii (TEXT).

LINE specific numrul liniei n care apare eroarea, dar acesta nu corespunde
liniei efective din fiierul text (se refer la codul surs depus n
USER_SOURCE).

Exemplul 9.9 -
CREATE OR REPLACE FUNCTION f_test
RETURN NUMBER;
IS
BEGIN
RETURN 1;
END;
/
FUNCTION F_TEST compiled
Errors: check compiler log

SELECT LINE, POSITION, TEXT


FROM USER_ERRORS
WHERE NAME = UPPER('f_test');

LINE POSITION TEXT


---- -------- --------------------------------------
3 1 PLS-00103: Encountered the symbol "IS"

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.


Sisteme de Gestiune a Bazelor de Date 9-18

Bibliografie

1. Programare avansat n Oracle9i, I. Popescu, A. Alecu, L. Velcescu, G. Florea


(Mihai), Ed. Tehnic (2004)
2. Oracle Database PL/SQL Language Reference 11g Release 2, Oracle Online
Documentation (2012)
3. Oracle Database SQL Language Reference11g Release 2, Oracle Online
Documentation (2012)
4. Oracle Database 11g: PL/SQL Fundamentals, Student Guide, Oracle University
(2009)

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

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