Oracle PL / SQL Exception Handling: Exemple pentru creșterea excepției definite de utilizator

Cuprins:

Anonim

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 la rulare. Aceste erori nu vor fi capturate în momentul compilării și, prin urmare, acestea trebuie să fie tratate numai în timpul rulării.

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 o excepție. Excepția este ridicată numai în timpul rulării de către motorul PL / SQL.

Excepțiile vor împiedica executarea suplimentară a programului, astfel încât pentru a evita o astfel de condiție, trebuie să fie capturate și tratate separat. Acest proces este numit Exception-Handling, în care programatorul gestionează excepția care poate apărea în timpul rulării.

În acest tutorial, veți învăța următoarele subiecte-

  • Sintaxa de gestionare a excepțiilor
  • Tipuri de excepție
  • Excepții predefinite
  • Excepție definită de utilizator
  • Excepție de creștere PL / SQL
  • Puncte importante de remarcat în Excepție

Sintaxa de gestionare a excepțiilor

Excepțiile sunt tratate la nivel de bloc, adică odată ce apare o excepție în orice bloc, atunci controlul va ieși din partea de execuție a acelui bloc. Excepția va fi apoi tratată la excepția care tratează o parte din blocul respectiv. După gestionarea excepției, nu este posibil să retrimiteți controlul înapoi la secțiunea de execuție a acelui bloc.

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

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Sintaxă Explicație:

  • Î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 rulării.
  • Atunci când orice excepție este ridicată în timpul rulării, atunci motorul PL / SQL va căuta în partea de gestionare a excepțiilor pentru acea excepție specială. 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 a codului de manipulare.
  • Dacă niciuna dintre clauzele „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 piesei va ieși din blocul curent.
  • O singură parte de excepție poate fi executată pentru un bloc în timpul rulării. După executarea acestuia, controlerul va sări peste partea rămasă de manipulare a excepțiilor și va ieși din blocul curent.

Notă: CÂND ALȚII ar trebui să fie întotdeauna la ultima poziție a secvenței. Excepția care tratează partea prezentă după WHEN OTHERS nu va fi executată niciodată, 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 unele excepții comune. 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” din 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 Excepție Motiv
ACCESS_INTO_NULL ORA-06530 Atribuiți o valoare atributelor obiectelor neinițializate
CASE_NOT_FOUND ORA-06592 Niciuna dintre clauzele „WHEN” din declarația CASE nu este satisfăcută și nu este specificată nicio clauză „ELSE”
COLLECTION_IS_NULL ORA-06531 Folosirea metodelor de colectare (cu excepția EXISTS) sau accesarea atributelor de colecție pe colecții neinitializate
CURSOR_ALREADY_OPEN ORA-06511 Încercarea de a deschide un cursor care este deja deschis
DUP_VAL_ON_INDEX ORA-00001 Stocarea unei valori duplicat într-o coloană a bazei de date care este constrânsă de un index unic
INVALID_CURSOR ORA-01001 Operații de cursor ilegale, cum ar fi închiderea unui cursor nedeschis
NUMAR INVALID ORA-01722 Conversia caracterului într-un număr a eșuat din cauza caracterului de număr nevalid
NU S-AU GASIT DATE ORA-01403 Când instrucțiunea „SELECT” care conține clauză INTO nu preia niciun rând.
ROW_MISMATCH ORA-06504 Când tipul de date variabil al cursorului este incompatibil cu tipul real de returnare a cursorului
SUBSCRIPT_BEYOND_COUNT ORA-06533 Referirea colecției cu un număr de index mai mare decât dimensiunea colecției
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Colectarea referitoare la 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 multe rânduri
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

În Oracle, altele decât excepțiile predefinite mai sus, programatorul își poate crea propria excepție și le poate gestiona. Ele pot fi create la un 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 excepție publică și este vizibilă oriunde este accesibil pachetul. <

Sintaxă: la nivel de subprogram

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • În sintaxa de mai sus, variabila „exception_name” este definită ca tip „EXCEPTION”.
  • Aceasta poate fi utilizată într-un mod similar ca o excepție predefinită.

Sintaxă: la nivelul Specificațiilor pachetului

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • În sintaxa de mai sus, variabila „excepție_nume” este definită ca tip „EXCEPȚIE” în ​​specificația pachetului .
  • Aceasta poate fi utilizată în baza de date oriunde poate fi apelat pachetul „nume_pachet”.

Excepție de creștere PL / SQL

Toate excepțiile predefinite sunt ridicate implicit ori de câte ori apare eroarea. Dar excepțiile definite de utilizator trebuie să fie ridicate în mod explicit. Acest lucru poate fi realizat folosind cuvântul cheie „RIDICAȚI”. Aceasta poate fi utilizată în oricare dintre modurile menționate mai jos.

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

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Sintaxă Explicație:

  • În sintaxa de mai sus, cuvântul cheie RAISE este utilizat î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 „RIDICAȚI” din partea de gestionare a excepțiilor va răspândi această excepție specială în programul părinte.

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

  • Putem utiliza cuvântul cheie „RAISE” urmat de numele excepției pentru a ridica acea excepție definită de utilizator / predefinită. Acest lucru poate fi utilizat atât în ​​partea de execuție, cât și în partea de gestionare a excepțiilor pentru a ridica excepția.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Sintaxă Explicație:

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

Exemplul 1 : În acest exemplu, vom vedea

  • Cum să declarați excepția
  • Cum se ridică excepția declarată și
  • Cum se propagă la blocul principal
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/

Explicatie cod:

  • Linia de cod 2 : Declararea variabilei „sample_exception” ca tip EXCEPTION.
  • Linia de cod 3 : Declararea procedurii nested_block.
  • Linia de cod 6 : Tipărirea declarației „În interiorul blocului imbricat”.
  • Linia de cod 7: Tipărirea declarației „Creșterea sample_exception din blocul imbricat”.
  • Linia de cod 8: Creșterea excepției utilizând „RAISE sample_exception”.
  • Linia de cod 10: Handler de excepții pentru excepția sample_exception în blocul imbricat.
  • Linia de cod 11: Tipărirea declarației „Excepție capturată în blocul imbricat. Creșterea la blocul principal '.
  • Linia de cod 12: Creșterea excepției la blocul principal (propagarea la blocul principal).
  • Linia de cod 15: Tipărirea declarației „În interiorul blocului principal”.
  • Linia de cod 16: Tipărirea declarației „Apelarea blocului imbricat”.
  • Linia de cod 17: Apelarea procedurii nested_block.
  • Linia de cod 19: Handler de excepții pentru sample_exception în blocul principal.
  • Linia de cod 20: Tipărirea declarației „Excepție capturată în blocul principal”.

Puncte importante de remarcat în Excepție

  • În funcție, o excepție ar trebui întotdeauna să returneze valoarea sau să ridice excepția în continuare. altfel, Oracle va arunca o eroare „Funcția returnată fără valoare” în timpul rulării.
  • 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 codul și mesajul de excepție.
  • Dacă o excepție nu este gestionată, atunci în mod implicit, toată tranzacția activă din acea sesiune va fi derulată înapoi.
  • RAISE_APPLICATION_ERROR (- , ) poate fi utilizat în loc de RAISE pentru a ridica eroarea cu codul de utilizator și mesajul. Codul de eroare trebuie să fie mai mare de 20000 și prefixat cu „-”.

rezumat

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

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