Sunteți pe pagina 1din 10

04.11.

2022

ACADEMIA DE STUDII ECONOMICE BUCUREŞTI


FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

SGBD Oracle
LIMBAJUL PL/SQL
Tratarea excepţiilor

BUCUREŞTI
2022-2023

Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)

Tipuri de erori
 Erori la compilare
 detectate de motorul PL/SQL
 nu pot fi tratate deoarece programul nu a fost încă executat
 utilizatorul trebuie să corecteze erorile și să execute din nou
programul
 Erori la execuție
 denumite excepții
 pot apărea atunci când nu este respectată o regulă a SGBD Oracle
sau dacă este încălcată o limită a sistemului de operare
 pot fi independente de structura bazei de date
 pot să apară ca urmare a nerespectării unor restricţii de integritate
 în program trebuie prevăzută apariția unei astfel de erori și
specificat modul concret de tratare a acesteia
2

1
04.11.2022

Tratarea excepțiilor în PL/SQL


Tipuri de excepții:
1. Excepții implicite, interne serverului Oracle:
 predefinite
au cod de eroare + nume asociat de sistem

 non-predefinite
au cod de eroare (utilizatorul trebuie să le asocieze un nume)
2. Excepții explicite, definite de utilizator

(utilizatorul trebuie să le asocieze nume, eventual cod)

Tratarea excepțiilor în PL/SQL


 O excepție poate fi invocată:
 implicit de către serverul Oracle – excepții implicite
 explicit la nivelul programului PL/SQL – excepții explicite

 O excepție poate fi tratată:


 prin captarea în secțiunea de tratare a excepțiilor
 prin propagarea în blocurile exterioare sau în aplicaţia
gazdă

2
04.11.2022

Tratarea excepțiilor în PL/SQL


EXCEPTION
WHEN nume_exceptie1 [OR nume_exceptie2 . . .] THEN
secventa_de_instructiuni1;

[WHEN nume_exceptie3 [OR nume_exceptie4 . . .] THEN


secventa_de_instructiuni2;]
...
[WHEN OTHERS THEN
secventa_de_instructiuni3;]

Tratarea excepțiilor în PL/SQL


Excepții implicite predefinite

 sunt codificate de forma: ORA-n


 nu trebuie declarate în secțiunea declarativă a blocului PL/SQL
 sunt declanșate implicit de către serverul Oracle
 sunt referite prin numele asociat lor
 sunt declarate în pachetul STANDARD

3
04.11.2022

Tratarea excepțiilor în PL/SQL


Excepții implicite predefinite
Lista completă aici: https://docs.oracle.com/cd/B10501_01/appdev.920/a96624/07_errs.htm

Nume excepţie Cod SQLCODE Descriere


eroare
CURSOR_ALREADY_OPEN ORA-06511 -6511 Se încearcă deschiderea unui cursor deja
deschis
DUP_VAL_ON_INDEX ORA-00001 -1 Se detectează o dublură într-o coloană în
care acestea sunt interzise
INVALID_CURSOR ORA-01001 -1001 Operaţie ilegală asupra unui cursor
INVALID_NUMBER ORA-01722 -1722 Conversie nepermisă de la şir de caractere
la număr (NUMAI în comenzi SQL din bloc)
NO_DATA_FOUND ORA-01403 +100 Comanda SELECT nu returnează niciun rând
TOO_MANY_ROWS ORA-01422 -1422 Comanda SELECT returnează mai multe linii
VALUE_ERROR ORA-06502 -6502 Conversie nepermisă sau eroare aritmetică
(NUMAI în comenzi procedurale din bloc)
ZERO_DIVIDE ORA-01476 -1476 Împărţire la zero
7

Tratarea excepțiilor în PL/SQL


Excepții implicite predefinite

DECLARE
v_nume VARCHAR2(20);
BEGIN
SELECT nume INTO v_nume
FROM angajati
WHERE id_angajat=10;
DBMS_OUTPUT.PUT_LINE(v_nume);

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Nu exista angajatul');
END;
/

4
04.11.2022

Tratarea excepțiilor în PL/SQL


Excepții implicite predefinite

DECLARE
sal angajati.salariul%type;
BEGIN
SELECT salariul INTO sal
FROM angajati
WHERE prenume='John';
DBMS_OUTPUT.PUT_LINE('John are salariul de:'||sal);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Exista mai multi salariati cu
numele John! Utilizati un cursor pentru selectie!');
END;
/

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

 trebuie declarate în secțiunea declarativă a blocului PL/SQL


 sunt declanșate implicit de către serverul Oracle
 sunt referite prin numele asociat lor de către utilizator
 pot fi tratate în clauza WHEN OTHERS

10

5
04.11.2022

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

Paşii pentru tratarea excepţiilor non-predefinite:


1. Declararea excepţiei - se face în zona DECLARE a blocului:
nume_exceptie EXCEPTION;
2. Asocierea codului erorii cu excepţia declarată anterior - se
realizează tot în zona DECLARE prin utilizarea directivei de
compilare EXCEPTION_INIT:
PRAGMA EXCEPTION_INIT (nume_exceptie, COD_EROARE);

3. Tratarea excepţiei în zona EXCEPTION a blocului:

EXCEPTION
WHEN nume_exceptie THEN .........;

11

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

BEGIN
DELETE FROM departamente
WHERE id_departament=&id_dep;
END;
/

 &id_dep7 PL/SQL procedure successfully completed

 &id_dep70 ORA-02292: integrity constraint


(IULI.ANG_DEPT_FK) violated - child
record found

12

6
04.11.2022

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite
DECLARE
are_angajati EXCEPTION;
PRAGMA EXCEPTION_INIT(are_angajati,-2292);
BEGIN
DELETE FROM departamente
WHERE id_departament=&id_dep;
IF SQL%FOUND
THEN DBMS_OUTPUT.PUT_LINE('S-a efectuat stergerea!');
ELSE DBMS_OUTPUT.PUT_LINE('Nu exista departamentul!');
END IF;
EXCEPTION
WHEN are_angajati THEN
DBMS_OUTPUT.PUT_LINE('Sterge mai intai angajatii
din departament!');
END;
/
13

Tratarea excepțiilor în PL/SQL


Excepții implicite non-predefinite

Funcții pentru identificarea excepțiilor


SQLCODE
 Returnează o valoare de tip numeric reprezentând codul
excepției
 Codul excepției este:
• un număr negativ, în cazul unei erori interne
• +100 în cazul excepției NO_DATA_FOUND
• 0 în cazul unei execuții normale, fără excepții
• 1 în cazul unei excepții definite de utilizator

SQLERRM
 Returnează un șir de caractere reprezentând mesajul asociat
excepției
!! Într-o comandă SQL nu se pot apela funcţiile SQLCODE şi SQLERRM
14

7
04.11.2022

Tratarea excepțiilor în PL/SQL


Excepții explicite

 trebuie declarate în secțiunea declarativă a blocului PL/SQL


 sunt invocate explicit de utilizator în secţiunea executabilă
 sunt referite prin numele asociat lor de către utilizator
 în mod implicit au asociate:
 SQLCODE = +1
 SQLERRM = user-defined exception

15

Tratarea excepțiilor în PL/SQL


Excepții explicite

Paşii pentru tratarea excepţiilor explicite:


1. Declararea excepţiei - se face în zona DECLARE a blocului:
nume_exceptie EXCEPTION;
2. Prin instrucţiunea RAISE se declanşează în mod explicit, în cadrul
secţiunii executabile :
RAISE nume_exceptie;

3. Tratarea excepţiei în zona EXCEPTION a blocului:

EXCEPTION
WHEN nume_exceptie THEN .........;

16

8
04.11.2022

Tratarea excepțiilor în PL/SQL


Excepții explicite
DECLARE
invalid_prod EXCEPTION;
BEGIN
UPDATE produse
SET denumire_produs='Laptop ABC'
WHERE id_produs=1726;
IF SQL%NOTFOUND THEN
RAISE invalid_prod;
END IF;
EXCEPTION
WHEN invalid_prod THEN
DBMS_OUTPUT.PUT_LINE('Nu exista produsul cu acest ID');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('A aparut eroarea: '||SQLERRM);
END;
/
17

Temă
Utilizând limbajul PL/SQL, rezolvaţi ecuaţia de gradul 2.

18

9
04.11.2022

CURSUL 7...

Limbajul PL/SQL. Subprograme.

10

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