Aflați cum să gestionați excepțiile din PL / SQL



Acest articol este un ghid cuprinzător despre cum să efectuați gestionarea excepțiilor în PL / SQL prin discutarea diferitelor tipuri de excepții oferite în PL / SQL.

Dacă sunteți programator, s-ar putea să vă familiarizați cu conceptul de gestionare a excepțiilor care face parte integrantă din orice . Întrucât erorile sunt inevitabile și chiar și cei mai inteligenți dintre noi pot face greșeli în timp ce scriu codul, trebuie să fim familiarizați cu modul de gestionare a acestora. În acest articol, vom învăța în special despre gestionarea excepțiilor în PL / SQL.

SQL-Exception Handling în PL / SQL-EdurekaMai jos sunt subiectele tratate în acest articol:





Ce este o excepție?

Orice afecțiune sau eveniment anormal care întrerupe fluxul normal al instrucțiunilor programului nostru în timpul rulării sau, în cuvinte simple, o excepție este o eroare.

Sintaxa gestionării excepțiilor în PL / SQL

DECLARA BEGIN EXCEPTION WHEN exception1 THEN exception1-handling-statement WHEN exception2 THEN exception2-handling-statement WHEN exception3 THEN exception3-handling-statement ........ WHEN alții THEN exception3-handling-statement END

Aici, putem enumera câte excepții dorim. Excepția implicită va fi gestionată folosind „WHEN others THEN”.



Exemplu de gestionare a excepțiilor în PL / SQL

Programul de mai jos afișează numele și adresa unui student al cărui act de identitate este dat. Deoarece nu există un student cu valoarea de identificare 8 în baza noastră de date, programul ridică excepția de execuție NO_DATA_FOUND, care este capturată în blocul EXCEPTION.

DECLARA s_id studentS.id% type: = 8 s_name studentS.Name% type s_loc studentS.loc% type BEGIN SELECT nume, loation INTO s_name, s_loc FROM students WHERE id = s_id DBMS_OUTPUT.PUT_LINE ('Name:' || s_name) DBMS_OUTPUT .PUT_LINE ('Locație:' || s_loc) EXCEPȚIE CÂND nu_data_found THEN dbms_output.put_line ('No such student!') CÂND alții THEN dbms_output.put_line ('Hopa, Eroare!') END

Ieșire

Niciun astfel de student! Procedura PL / SQL a fost finalizată cu succes.

Aici, putem enumera câte excepții dorim. Excepția implicită va fi gestionată folosind „ CÂND ALȚI ATUNCI '

Tipuri de excepții în PL / SQL

  • Sistem definit
  • Utilizatorul a sfidat

Următorul în acest articol despre gestionarea excepțiilor în PL / SQL , să discutăm în detaliu despre aceste două tipuri.



Sistem definit

Definite și întreținute implicit de serverul Oracle, aceste excepții sunt definite în principal în pachetul Oracle Standard. Ori de câte ori apare o excepție în interiorul programului, serverul Oracle se potrivește și identifică excepția corespunzătoare din setul disponibil de excepții disponibile în pachetul standard Oracle. Practic, aceste excepții sunt predefinite în PL / SQL care se ridică CÂND este încălcată o anumită regulă a bazei de date .

Excepții definite de sistem sunt împărțite în două categorii:

  • Excepții de sistem denumite
  • Excepții de sistem fără nume

Excepții de sistem denumit

Excepțiile denumite PL / SQL sunt denumit în pachetul standard PL / SQL , prin urmare, dezvoltatorul nu trebuie să definească excepțiile PL / SQL în codul lor. PL / SQL oferă multe excepții denumite predefinite, care sunt executate atunci când orice regulă a bazei de date este încălcată de un program. Tabelul următor enumeră câteva dintre excepțiile și minusurile predefinite importante

Excepție Eroare Oracle SQLCODE Descriere
ACCESS_INTO_NULL06530-6530Se ridică atunci când unui obiect nul i se atribuie automat o valoare.
CASE_NOT_FOUND06592-6592Se ridică atunci când niciuna dintre alegerile din clauza WHEN a Declarație CASE este selectat și nu există nicio clauză ELSE.
COLLECTION_IS_NULL06531-6531Se ridică atunci când un program încearcă să aplice metode de colectare, altele decât EXISTS, la o tabelă sau un varray imbricat neinițializat, sau programul încearcă să atribuie valori elementelor unui tabel sau varray imbricat neinicializat.
DUP_VAL_ON_INDEX00001-unuSe crește atunci când se încearcă stocarea valorilor duplicate într-o coloană cu un index unic.
INVALID_CURSOR01001-1001Se ridică atunci când se încearcă efectuarea unei operații de cursor care nu este permisă, cum ar fi închiderea unui cursor nedeschis.
NUMAR INVALID01722-1722Se ridică atunci când conversia unui șir de caractere într-un număr eșuează deoarece șirul nu reprezintă un număr valid.
LOGIN_DENIED01017-1017Se ridică atunci când un program încearcă să se conecteze la baza de date cu un nume de utilizator sau o parolă nevalide.
NU S-AU GASIT DATE01403+100Se ridică atunci când o instrucțiune SELECT INTO nu returnează niciun rând.
NOT_LOGGED_ON01012-1012Se ridică atunci când este emis un apel la baza de date fără a fi conectat la baza de date.
PROGRAM_ERROR06501-6501Se ridică atunci când PL / SQL are o problemă internă.
ROWTYPE_MISMATCH06504-6504Se ridică atunci când un cursor preia valoare într-o variabilă având un tip de date incompatibil.
SELF_IS_NULL30625-30625Este ridicat atunci când este invocată o metodă membru, dar instanța tipului de obiect nu a fost inițializată.
STORAGE_ERROR06500-6500Se ridică atunci când PL / SQL a rămas fără memorie sau memoria a fost deteriorată.
TOO_MANY_ROWS01422-1422Se ridică atunci când o instrucțiune SELECT INTO returnează mai mult de un rând.
VALUE_ERROR06502-6502Se ridică atunci când apare o eroare de aritmetică, conversie, trunchiere sau constrângere de dimensiune.
ZERO_DIVIDE014761476Se ridică atunci când se încearcă împărțirea unui număr la zero.

Exemplu

CREAȚI SAU ÎNLOCUIȚI PROCEDURA add_new_student (student _id_in IN NUMBER, student _name_in IN VARCHAR2) ESTE ÎNCEPUT INSERAT ÎN student (student _id, student _name) VALORI (student _id_in, student _name_in) EXCEPȚIE CÂND DUP_VAL_ON_INDEX THER ridicați ) CÂND ALȚI APOI raise_application_error (-20002, „A apărut o eroare.”) END

Trecând mai departe în acest articol despre tratarea excepțiilor în PL / SQL, să înțelegem ce sunt excepțiile de sistem fără nume.

cuplaj strâns vs cuplaj slăbit

Excepții de sistem fără nume

Excepțiile de sistem pentru care Oracle nu are un nume sunt cunoscute ca excepții de sistem fără nume. Aceste excepții nu apar frecvent și sunt scrise cu un cod și un mesaj asociat.

În principiu, există două modalități de a gestiona excepțiile de sistem fără nume:

1. Folosind handlerul de excepții WHEN OTHERS

2. Asocierea codului de excepție la un nume și utilizarea acestuia ca excepție numită.

Unii pași urmați pentru excepțiile de sistem fără nume sunt:

  • Ridicați-le implicit.
  • În cazul în care nu sunt tratate în „CÂND Alții” atunci, acestea trebuie tratate în mod explicit.
  • Pentru a gestiona în mod explicit excepția, acestea pot fi declarate folosind Pragma EXCEPTION_INIT și gestionate făcând referire la numele de excepție definit de utilizator în secțiunea de excepție.

Un exemplu de gestionare a excepțiilor nenumite folosind Pragma EXCEPTION_INIT este furnizat mai târziu în articol. Trecând mai departe în acest articol despre gestionarea excepțiilor în PL / SQL, să înțelegem excrețiile definite de utilizator.

Definit de utilizator

La fel ca toate celelalte limbaje de programare, Oracle vă permite, de asemenea, să declarați că implementați anunțurile propriile excepții. Spre deosebire de excepțiile definite de sistem, aceste excepții sunt ridicate în mod explicit în blocul PL / SQL.

care sunt filtrele de context în tablou

Pași pentru declararea excepțiilor definite de utilizator în baza de date Oracle

Putem defini excepții definite de utilizator în baza de date Oracle în următoarele 3 moduri:

  • Folosind Variabila de tip EXCEPTION

Aici, putem declara o excepție definită de utilizator declarând o variabilă EXCEPTION tip de date în codul nostru și ridicați-l explicit în programul nostru folosind instrucțiunea RAISE.

  • Folosind funcția PRAGMA EXCEPTION_INIT

Putem defini un număr de eroare nedefinit cu variabila tip de date EXCEPTION

  • Folosind metoda RAISE_APPLICATION_ERROR

Folosind această metodă, putem declara o excepție definită de utilizator cu propriul număr de eroare și mesaj personalizat.

Până acum este posibil să aveți o idee aproximativă cu privire la modalitățile prin care putem ridica excepțiile definite de utilizator în PL / SQL. Vom afla despre fiecare dintre metodele menționate mai sus, cu exemple în continuare în acest articol despre gestionarea excepțiilor în PL / SQL.

În continuare, în acest articol, să continuăm cu demonstrațiile de gestionare a excepțiilor definite de utilizator.

Demonstrarea excepțiilor definite de utilizator

Trecând mai departe în acest articol despre gestionarea excepțiilor în PL / SQL, să înțelegem cum să folosim variabila de tip EXCEPTION.

Folosind Variabila de tip EXCEPTION

Procesul de declarare a excepției definite de utilizator este împărțit în trei părți și aceste 3 părți sunt:

  • Declarați un tip de date de excepție variabilă
  • Ridicați excepția
  • Manipulați excepția

Să scriem un cod pentru a demonstra în detaliu pașii de mai sus.

DECLARAȚI var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION

În blocul de declarație de mai sus, avem patru variabile, dintre care primele trei sunt variabile tip de date cu număr normal, iar a patra, care este ex_DivZero, este variabila de tip de date de excepție specială. A patra este excepția noastră definită de utilizator.

DECLARAȚI var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION

Partea de execuție de mai sus a acestui bloc anonim, va intra în acțiune numai atunci când divizorul este 0. Dacă divizorul este zero așa cum este în cazul nostru, eroarea va fi ridicată și controlul programului va sări peste toți pașii următori și va căuta gestionarea excepțiilor potrivite. În cazul în care găsește oricare altul, va efectua acțiunea în consecință, altfel fie va încheia programul, fie ne va solicita o eroare definită de sistem.

EXCEPȚIE CÂND ex_DivZero THEN DBMS_OUTPUT.PUT_LINE („EROARE, divizorul nu poate fi zero”)

Acesta este tratatorul de excepții. De îndată ce utilizatorul introduce divizorul ca 0, șirul de mesaje de mai sus va fi solicitat.

Cod final:

DECLARA var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION BEGIN IF var_divisor = 0 THEN RAISE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('Rezultat =' VAR_res = 0 THEN RAISE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('Result =' || var_result) END

Trecând mai departe în acest articol despre tratarea excepțiilor în PL / SQL, să înțelegem cum să folosim metoda PRAGMA_EXCEPTION_INIT.

Folosind funcția PRAGMA EXCEPTION_INIT

În Funcția PRAGMA EXCEPTION_INIT, un nume de excepție este asociat cu un număr de eroare Oracle. Acest nume poate fi utilizat la proiectarea gestionării excepțiilor pentru eroare.Pentru proiecte uriașe cu multe erori definite de utilizator, PRAGMA EXCEPTION_INIT este cea mai utilă și adecvată metodă.

Sintaxă:

PRAGMA EXCEPTION_INIT (excepție_nume, -Oracle_eror_number)

Exemplu

DECLARA deadlock_detected EXCEPTION PRAGMA EXCEPTION_INIT (deadlock_detected, -60) BEGIN NULL - Unele operațiuni care provoacă o eroare ORA-00060 EXCEPTION WHEN deadlock_detected THEN NULL - gestionează eroarea END

PRAGMA EXCEPTION_INIT îi spune compilatorului să asocieze un nume de excepție cu un număr de eroare Oracle așa cum am menționat anterior. Vă permite să faceți referire la orice excepție internă pe nume și să scrieți un anumit handler pentru aceasta. Când vedeți o stivă de erori sau o secvență de mesaje de eroare, cea de deasupra este cea care poate fi blocată și tratată.

tutorial microsoft sql pentru începători

Trecând mai departe în acest articol despre gestionarea excepțiilor în PL / SQL, să înțelegem cum să folosim metoda RAISE_APPLICATION_ERROR.

Folosind metoda RAISE_APPLICATION_ERROR

Este o procedură integrată cu software-ul Oracle. Folosind această procedură putem asocia un număr de eroare cu un mesaj de eroare personalizat. Combinând atât numărul de eroare cât și mesajul de eroare personalizat, poate fi compus un șir de eroare care arată similar cu acele șiruri de eroare implicite care sunt afișate de oracle atunci când se întâlnește o eroare. Procedura RAISE_APPLICATION_ERROR se găsește în pachetul DBMS_STANDARD

Sintaxă

raise_application_error (error_number, message [, TRUE])

Exemplu

/ * Se creează un declanșator trg_emp_detail_chk. * / CREAȚI SAU ÎNLOCUIȚI TRIGGER-ul trg_emp_detail_chk / * Timpul declanșatorului este declarat ÎNAINTE ACTUALIZARE pe tabela ANGAJATI. ziua orei sistemului este fie sâmbătă, fie duminică sau nu. * / IF trim (TO_CHAR (sysdate, 'Day')) IN ('sâmbătă', 'duminică') THEN raise_application_error (-20000, 'Nu sunteți autorizat să faceți orice modificare în weekend !! ') / * Procedura raise_application_error este apelată cu prima valoare a parametrului ca -20000 și al doilea parametru cu un text implicit care afirmă că utilizatorul nu este autorizat să facă nicio modificare în weekend. * / END IF END

Cu aceasta ajungem la sfârșitul acestui articol despre „Tratarea excepțiilor în PL / SQL”. Sper că acest subiect este înțeles bine și te-a ajutat. Încercați să scrieți propriile coduri și să încorporați metodele explicate în acest articol.

Dacă doriți să vă instruiți de la profesioniști cu privire la această tehnologie, puteți opta pentru formare structurată de la edureka! Verifica asta de Edureka, o companie de învățare online de încredere, cu o rețea de peste 250.000 de elevi mulțumiți răspândiți pe tot globul. Acest curs vă instruiește asupra conceptelor de bază și a instrumentelor și tehnicilor avansate pentru gestionarea datelor și administrarea bazei de date MySQL. Include învățare practică pe concepte precum MySQL Workbench, MySQL Server, Modelarea datelor, MySQL Connector, Proiectarea bazei de date, Linia de comandă MySQL, Funcțiile MySQL etc. Sfârșitul instruirii veți putea crea și administra propria bază de date MySQL și gestionați date.

Ai o întrebare pentru noi? Vă rugăm să îl menționați în secțiunea de comentarii a acestui articol „Except Handling in PL / SQL” și vă vom contacta cât mai curând posibil.