Tratarea excepțiilor în Oracle PL/SQL (Exemple)

Ce este gestionarea excepțiilor în PL/SQL?

O excepție apare atunci când motorul PL/SQL întâlnește o instrucțiune pe care nu o poate executa din cauza unei erori care apare în timpul execuției. Aceste erori nu vor fi capturate în momentul compilării și, prin urmare, acestea trebuiau tratate numai în timpul execuției.

De exemplu, dacă motorul PL/SQL primește o instrucțiune de a împărți orice număr la „0”, atunci motorul PL/SQL îl va arunca ca excepție. Excepția este ridicată doar în timpul rulării de către motorul PL/SQL.

Excepțiile vor opri executarea programului în continuare, așa că pentru a evita o astfel de condiție, ele trebuie să fie capturate și gestionate separat. Acest proces este numit Exception-Handling, în care programatorul se ocupă de excepția care poate apărea în timpul rulării.

Sintaxa de gestionare a excepțiilor

Excepțiile sunt gestionate la nivel de bloc, adică, odată, dacă apare vreo excepție în orice bloc, atunci controlul va ieși din partea de execuție a acelui bloc. Excepția va fi apoi gestionată în partea de gestionare a excepțiilor din acel bloc. După gestionarea excepției, nu este posibil să retrimiteți controlul înapoi la secțiunea de execuție a blocului respectiv.

Sintaxa de mai jos explică cum să prindeți și să gestionați excepția.

Gestionarea excepțiilor în PL/SQL

BEGIN
<execution block>
.
.
EXCEPTION
WHEN <exceptionl_name>
THEN
  <Exception handling code for the “exception 1 _name’' >
WHEN OTHERS
THEN
  <Default exception handling code for all exceptions >
END;

Explicația sintaxei:

  • În sintaxa de mai sus, blocul de gestionare a excepțiilor conține o serie de condiții WHEN pentru a gestiona excepția.
  • Fiecare condiție WHEN este urmată de numele excepției care se așteaptă să fie ridicată în timpul execuției.
  • Când orice excepție este ridicată în timpul execuției, atunci motorul PL/SQL va căuta în partea de gestionare a excepțiilor respectiva excepție. Va începe de la prima clauză „WHEN” și, secvențial, va căuta.
  • Dacă a găsit gestionarea excepției pentru excepția care a fost ridicată, atunci va executa acea parte specifică a codului de gestionare.
  • Dacă nicio clauză „WHEN” nu este prezentă pentru excepția care a fost ridicată, atunci motorul PL/SQL va executa partea „WHEN OTHERS” (dacă este prezentă). Acest lucru este comun pentru toate excepțiile.
  • După executarea excepției, controlul părții va ieși din blocul curent.
  • Numai o singură parte excepție poate fi executată pentru un bloc în timpul execuției. După executarea acestuia, controlerul va omite partea rămasă de gestionare a excepțiilor și va ieși din blocul curent.

Notă: WHEN OTHERS ar trebui să fie întotdeauna în ultima poziție a secvenței. Partea de gestionare a excepțiilor prezentă după WHEN OTHERS nu va fi niciodată executată, deoarece controlul va ieși din bloc după executarea WHEN OTHERS.

Tipuri de excepție

Există două tipuri de excepții în Pl/SQL.

  1. Excepții predefinite
  2. Excepție definită de utilizator

Excepții predefinite

Oracle a predefinit o excepție comună. Aceste excepții au un nume unic de excepție și un număr de eroare. Aceste excepții sunt deja definite în pachetul „STANDARD” în Oracle. În cod, putem folosi direct aceste nume de excepție predefinite pentru a le gestiona.

Mai jos sunt câteva excepții predefinite

Excepție Cod de eroare Motivul excepției
ACCESS_INTO_NULL ORA-06530 Atribuiți o valoare atributelor obiectelor neinițializate
CASE_NOT_FOUND ORA-06592 Niciuna dintre clauzele „WHEN” din instrucțiunea CASE nu este satisfăcută și nicio clauză „ELSE” nu este specificată
COLLECTION_IS_NULL ORA-06531 Utilizarea metodelor de colectare (cu excepția EXISTS) sau accesarea atributelor de colecție pe o colecție neinițializată
CURSOR_DEJA_DESCHIS ORA-06511 Încercarea de a deschide a cursor care este deja deschis
DUP_VAL_ON_INDEX ORA-00001 Stocarea unei valori duplicate într-o coloană a bazei de date care este un index limitat de unic
INVALID_CURSOR ORA-01001 Operațiuni ilegale cu cursorul, cum ar fi închiderea unui cursor nedeschis
NUMAR INVALID ORA-01722 Conversia caracterului într-un număr a eșuat din cauza caracterului numeric nevalid
NU S-AU GASIT DATE ORA-01403 Când instrucțiunea „SELECT” care conține clauza INTO nu aduce niciun rând.
ROW_MISMATCH ORA-06504 Când tipul de date variabile de cursor este incompatibil cu tipul real de returnare a cursorului
SUBSCRIPT_BEYOND_COUNT ORA-06533 Trimiterea colecției printr-un număr de index care este mai mare decât dimensiunea colecției
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Trimiterea colectării printr-un număr de index care se află în afara intervalului legal (de exemplu: -1)
TOO_MANY_ROWS ORA-01422 Când o instrucțiune „SELECT” cu clauză INTO returnează mai mult de un rând
VALUE_ERROR ORA-06502 Eroare de constrângere aritmetică sau de dimensiune (de exemplu: atribuirea unei valori unei variabile care este mai mare decât dimensiunea variabilei)
ZERO_DIVIDE ORA-01476 Împărțirea unui număr la „0”

Excepție definită de utilizator

In Oracle, în afară de excepțiile predefinite mai sus, programatorul își poate crea propria excepție și le poate gestiona. Ele pot fi create la nivel de subprogram în partea de declarație. Aceste excepții sunt vizibile numai în acel subprogram. Excepția care este definită în specificația pachetului este o excepție publică și este vizibilă oriunde este accesibil pachetul.

Sintaxă: La nivel de subprogram

DECLARE
<exception_name> EXCEPTION; 
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
<Handler>
END;
  • În sintaxa de mai sus, variabila „exception_name” este definită ca tip „EXCEPTION”.
  • Aceasta poate fi folosită într-un mod similar ca o excepție predefinită.

Sintaxă:La nivel de specificație a pachetului

CREATE PACKAGE <package_name>
 IS
<exception_name> EXCEPTION;
.
.
END <package_name>;
  • În sintaxa de mai sus, variabila „exception_name” este definită ca tip „EXCEPTION” în specificația pachetului de .
  • Acesta poate fi folosit în baza de date oriunde poate fi apelat pachetul „nume_pachet”.

PL/SQL ridică excepție

Toate excepțiile predefinite sunt ridicate implicit ori de câte ori apare eroarea. Dar excepțiile definite de utilizator trebuie ridicate în mod explicit. Acest lucru poate fi realizat folosind cuvântul cheie „RIDIȘTE”. Acesta poate fi folosit în oricare dintre modurile menționate mai jos.

Dacă „RAISE” este folosit separat în program, atunci va propaga excepția deja ridicată către blocul părinte. Numai în blocul de excepție poate fi utilizat așa cum se arată mai jos.

PL/SQL ridică excepție

CREATE [ PROCEDURE | FUNCTION ]
 AS
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
             <Handler>
RAISE;
END;

Explicația sintaxei:

  • În sintaxa de mai sus, cuvântul cheie RAISE este folosit în blocul de gestionare a excepțiilor.
  • Ori de câte ori programul întâlnește excepția „exception_name”, excepția este gestionată și va fi finalizată în mod normal
  • Dar cuvântul cheie „RAISE” din partea de gestionare a excepțiilor va propaga această excepție în programul părinte.

Notă: În timp ce ridicați excepția la blocul părinte, excepția care este ridicată ar trebui să fie vizibilă și la blocul părinte, altfel oracle va arunca o eroare.

  • Putem folosi cuvântul cheie „RAISE” urmat de numele excepției pentru a ridica respectiva excepție definită de utilizator/predefinită. Acesta poate fi folosit atât în ​​partea de execuție, cât și în partea de gestionare a excepțiilor pentru a ridica excepția.

PL/SQL ridică excepție

CREATE [ PROCEDURE | FUNCTION ] 
AS
BEGIN
<Execution block>
RAISE <exception_name>
EXCEPTION
WHEN <exception_name> THEN
<Handler>
END;

Explicația sintaxei:

  • În sintaxa de mai sus, cuvântul cheie RAISE este folosit în partea de execuție, urmat de excepția „exception_name”.
  • Acest lucru va ridica această excepție specială în momentul execuției și aceasta trebuie gestionată sau ridicată în continuare.

Exemplu 1: În acest exemplu, vom vedea

  • Cum se declară excepția
  • Cum se ridică excepția declarată și
  • Cum să-l propagă în blocul principal

PL/SQL ridică excepție

PL/SQL ridică excepție

DECLARE
Sample_exception EXCEPTION;
PROCEDURE nested_block
IS
BEGIN
Dbms_output.put_line(‘Inside nested block’);
Dbms_output.put_line(‘Raising sample_exception from nested block’);
RAISE sample_exception;
EXCEPTION
WHEN sample_exception THEN 
Dbms_output.put_line (‘Exception captured in nested block. Raising to main block’);
RAISE,
END;
BEGIN
Dbms_output.put_line(‘Inside main block’);
Dbms_output.put_line(‘Calling nested block’);
Nested_block;
EXCEPTION
WHEN sample_exception THEN	
Dbms_output.put_line (‘Exception captured in main block');
END:
/

Explicația codului:

  • Linia de cod 2: Declararea variabilei 'sample_exception' ca tip EXCEPTION.
  • Linia de cod 3: Procedura de declarare nested_block.
  • Linia de cod 6: Se imprimă declarația „În interiorul blocului imbricat”.
  • Linia de cod 7: Se imprimă declarația „Raising sample_exception from imbricated block.”
  • Linia de cod 8: Ridicarea excepției folosind „RAISE sample_exception”.
  • Linia de cod 10: Manager de excepții pentru excepția sample_exception în blocul imbricat.
  • Linia de cod 11: Se imprimă declarația „Excepție capturată în bloc imbricat. Ridicarea la blocul principal'.
  • Linia de cod 12: Ridicarea excepției la blocul principal (propagarea la blocul principal).
  • Linia de cod 15: Tipărirea mențiunii „În interiorul blocului principal”.
  • Linia de cod 16: Tipărirea instrucțiunii „Apelarea blocului imbricat”.
  • Linia de cod 17: Apelarea procedurii nested_block.
  • Linia de cod 18: Excepție
  • Linia de cod 19: Managerul de excepții pentru sample_exception în blocul principal.
  • Linia de cod 20: Se imprimă declarația „Excepție capturată în blocul principal”.

Puncte importante de remarcat în Excepție

  • În funcție, o excepție ar trebui să returneze întotdeauna valoarea sau să ridice excepția în continuare. altfel Oracle va arunca eroare „Funcție returnată fără valoare” în timpul execuției.
  • Declarațiile de control al tranzacțiilor pot fi date la blocul de gestionare a excepțiilor.
  • SQLERRM și SQLCODE sunt funcțiile încorporate care vor da mesajul și codul de excepție.
  • Dacă o excepție nu este gestionată, în mod implicit, toate tranzacțiile active din acea sesiune vor fi anulate.
  • RAISE_APPLICATION_ERROR (- , ) poate fi folosit în loc de RAISE pentru a ridica eroarea cu codul utilizatorului și mesajul. Codul de eroare ar trebui să fie mai mare de 20000 și prefixat cu „-”.

Rezumat

După acest capitol. ar trebui să puteți lucra pentru următoarele aspecte ale Pl SQL excepții

  • Gestionarea excepțiilor
  • Definiți o excepție
  • Ridicați excepția
  • Propagarea excepției