Poikkeuskäsittely sisään Oracle PL/SQL (esimerkkejä)

Mitä on poikkeuskäsittely PL/SQL:ssä?

Poikkeus tapahtuu, kun PL/SQL-moottori kohtaa komennon, jota se ei voi suorittaa suorituksen aikana tapahtuvan virheen vuoksi. Näitä virheitä ei kaapata käännöshetkellä, ja siksi ne on käsiteltävä vain ajon aikana.

Jos esimerkiksi PL/SQL-moottori saa käskyn jakaa mikä tahansa luku nollalla, PL/SQL-moottori jättää sen poikkeuksena. Poikkeuksen nostaa esiin vain ajon aikana PL/SQL-moottori.

Poikkeukset estävät ohjelman suorittamisen edelleen, joten tällaisen tilanteen välttämiseksi ne on kaapattava ja käsiteltävä erikseen. Tätä prosessia kutsutaan poikkeuskäsittelyksi, jossa ohjelmoija käsittelee poikkeuksen, joka voi tapahtua ajon aikana.

Poikkeuskäsittelyn syntaksi

Poikkeukset käsitellään lohkon tasolla, eli kerran, jos jokin poikkeus tapahtuu jossakin lohkossa, ohjaus poistuu kyseisen lohkon suoritusosasta. Poikkeus käsitellään sitten kyseisen lohkon poikkeuksia käsittelevässä osassa. Poikkeuksen käsittelyn jälkeen ei ole mahdollista lähettää ohjausta takaisin kyseisen lohkon suoritusosaan.

Alla oleva syntaksi selittää, kuinka poikkeus saadaan kiinni ja käsitellään.

Poikkeuskäsittely PL/SQL:ssä

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;

Syntaksiselitys:

  • Yllä olevassa syntaksissa poikkeuksenkäsittelylohko sisältää sarjan WHEN-ehtoja poikkeuksen käsittelemiseksi.
  • Jokaista WHEN-ehtoa seuraa poikkeuksen nimi, jonka odotetaan nousevan ajon aikana.
  • Kun jokin poikkeus nostetaan esiin ajon aikana, PL/SQL-moottori etsii poikkeuksen käsittelyosasta kyseistä poikkeusta. Se alkaa ensimmäisestä WHEN-lauseesta ja hakee peräkkäin.
  • Jos se löysi poikkeuksen käsittelyn esitetylle poikkeukselle, se suorittaa kyseisen käsittelykoodin osan.
  • Jos mitään WHEN-lausetta ei ole esille nostetussa poikkeuksessa, PL/SQL-moottori suorittaa WHEN OTHERS-osan (jos sellainen on). Tämä on yleistä kaikille poikkeuksille.
  • Poikkeuksen suorittamisen jälkeen osan ohjaus poistuu nykyisestä lohkosta.
  • Vain yksi poikkeusosa voidaan suorittaa lohkolle ajon aikana. Sen suorittamisen jälkeen ohjain ohittaa jäljellä olevan poikkeuskäsittelyn osan ja poistuu nykyisestä lohkosta.

Huomautus: KUN OTHERS:n tulisi aina olla sekvenssin viimeisessä kohdassa. WHEN OTHERS:n jälkeen olevaa poikkeuskäsittelyosaa ei koskaan suoriteta, koska ohjaus poistuu lohkosta WHEN OTHERS -toiminnon suorittamisen jälkeen.

Poikkeustyypit

Siinä on kahdenlaisia ​​poikkeuksia Pl/SQL.

  1. Ennalta määritetyt poikkeukset
  2. Käyttäjän määrittämä poikkeus

Ennalta määritetyt poikkeukset

Oracle on ennalta määrittänyt yleisen poikkeuksen. Näillä poikkeuksilla on yksilöllinen poikkeuksen nimi ja virhenumero. Nämä poikkeukset on jo määritelty STANDARD-paketissa Oracle. Koodissa voimme suoraan käyttää näitä ennalta määritettyjä poikkeusnimiä käsittelemään niitä.

Alla on muutamia ennalta määritettyjä poikkeuksia

Poikkeus Virhekoodi Poikkeuksen syy
ACCESS_INTO_NULL ORA-06530 Määritä arvo alustamattomien objektien attribuuteille
CASE_NOT_FOUND ORA-06592 Mikään CASE-lauseen WHEN-lauseista ei täyty, eikä ELSE-lausetta ole määritetty
COLLECTION_IS_NULL ORA-06531 Keräysmenetelmien käyttäminen (paitsi EXISTS) tai kokoelmamääritteiden käyttäminen alustamattomissa kokoelmissa
CURSOR_ALREADY_OPEN ORA-06511 Yritetään avata a kohdistin joka on jo avattu
DUP_VAL_ON_INDEX ORA-00001 Kaksinkertaisen arvon tallentaminen tietokannan sarakkeeseen, joka on yksilöllisen indeksin rajoittama
INVALID_CURSOR ORA-01001 Laittomat kohdistimen toiminnot, kuten avaamattoman kohdistimen sulkeminen
VÄÄRÄ NUMERO ORA-01722 Merkin muuntaminen numeroksi epäonnistui virheellisen numeromerkin vuoksi
DATAA EI LÖYTYNYT ORA-01403 Kun INTO-lauseen sisältävä SELECT-lause ei nouta rivejä.
ROW_MISMATCH ORA-06504 Kun kohdistinmuuttujan tietotyyppi ei ole yhteensopiva todellisen kursorin palautustyypin kanssa
SUBSCRIPT_BEYOND_COUNT ORA-06533 Kokoelmaan viitataan indeksinumerolla, joka on suurempi kuin kokoelman koko
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Kerään viittaaminen indeksinumerolla, joka on laillisen alueen ulkopuolella (esim.: -1)
TOO_MANY_ROWS ORA-01422 Kun SELECT-lause, jossa on INTO-lause, palauttaa useamman kuin yhden rivin
VALUE_ERROR ORA-06502 Aritmeettinen tai kokorajoitusvirhe (esim. arvon määrittäminen muuttujalle, joka on suurempi kuin muuttujan koko)
ZERO_DIVIDE ORA-01476 luvun jakaminen 0:lla

Käyttäjän määrittämä poikkeus

In Oracle, ohjelmoija voi luoda oman poikkeuksensa ja käsitellä niitä edellä mainittuja poikkeuksia lukuun ottamatta. Ne voidaan luoda aliohjelmatasolla ilmoitusosassa. Nämä poikkeukset näkyvät vain kyseisessä aliohjelmassa. Paketin määrittelyssä määritetty poikkeus on julkinen poikkeus, ja se näkyy kaikkialla, missä paketti on käytettävissä.

Syntaksi: Aliohjelman tasolla

DECLARE
<exception_name> EXCEPTION; 
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
<Handler>
END;
  • Yllä olevassa syntaksissa muuttuja 'poikkeuksen_nimi' on määritelty tyypiksi 'EXCEPTION'.
  • Tätä voidaan käyttää samalla tavalla kuin ennalta määritettyä poikkeusta.

Syntaksi:Pakettimäärittelyn tasolla

CREATE PACKAGE <package_name>
 IS
<exception_name> EXCEPTION;
.
.
END <package_name>;
  • Yllä olevassa syntaksissa muuttuja 'poikkeuksen_nimi' on määritelty 'EXCEPTION'-tyypiksi paketin spesifikaatioissa. .
  • Tätä voidaan käyttää tietokannassa, missä pakettia paketin_nimi voidaan kutsua.

PL/SQL-korotuspoikkeus

Kaikki ennalta määritetyt poikkeukset tulevat esiin epäsuorasti aina, kun virhe ilmenee. Mutta käyttäjän määrittämät poikkeukset on tuotava esiin. Tämä voidaan saavuttaa käyttämällä avainsanaa 'RAISE'. Tätä voidaan käyttää millä tahansa alla mainituista tavoista.

Jos 'RAISE' käytetään erikseen ohjelmassa, se välittää jo nostetun poikkeuksen emolohkoon. Vain poikkeuslohkoa voidaan käyttää alla olevan kuvan mukaisesti.

PL/SQL-korotuspoikkeus

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

Syntaksiselitys:

  • Yllä olevassa syntaksissa avainsanaa RAISE käytetään poikkeuskäsittelylohkossa.
  • Aina kun ohjelma kohtaa poikkeuksen "poikkeuksen_nimi", poikkeus käsitellään ja suoritetaan normaalisti
  • Mutta avainsana 'RAISE' poikkeuskäsittelyosassa välittää tämän poikkeuksen pääohjelmaan.

Huomautus: Poikkeusta korotettaessa ylälohkoon nostettavan poikkeuksen tulee näkyä myös ylälohkossa, muuten Oracle antaa virheen.

  • Voimme käyttää avainsanaa 'RAISE' ja poikkeuksen nimeä herättääksemme kyseisen käyttäjän määrittämän/ennalta määritetyn poikkeuksen. Tätä voidaan käyttää sekä suoritusosassa että poikkeusten käsittelyosassa poikkeuksen nostamiseksi.

PL/SQL-korotuspoikkeus

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

Syntaksiselitys:

  • Yllä olevassa syntaksissa avainsanaa RAISE käytetään suoritusosassa, jota seuraa poikkeus "poikkeuksen_nimi".
  • Tämä nostaa tämän erityisen poikkeuksen esiin toteutushetkellä, ja sitä on käsiteltävä tai nostettava edelleen.

Esimerkki 1: Tässä esimerkissä aiomme nähdä

  • Kuinka julistaa poikkeus
  • Kuinka nostaa julistettu poikkeus ja
  • Kuinka levittää se päälohkoon

PL/SQL-korotuspoikkeus

PL/SQL-korotuspoikkeus

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:
/

Koodin selitys:

  • Koodirivi 2: Ilmoitetaan muuttuja 'sample_exception' tyypiksi EXCEPTION.
  • Koodirivi 3: Proseduurin ilmoittaminen nested_block.
  • Koodirivi 6: Tulostetaan lause "Sisäkkäisen lohkon sisällä".
  • Koodirivi 7: Tulostetaan lause "Raising_exception from sisäkkäisestä lohkosta".
  • Koodirivi 8: Poikkeuksen korottaminen käyttämällä parametria 'RAISE sample_exception'.
  • Koodirivi 10: Poikkeuskäsittelijä poikkeukselle sample_exception sisäkkäisessä lohkossa.
  • Koodirivi 11: Tulostetaan lause 'Poikkeus kaapattu sisäkkäiseen lohkoon. Nosto päälohkoon'.
  • Koodirivi 12: Poikkeuksen nostaminen päälohkoon (eteneminen päälohkoon).
  • Koodirivi 15: Lausunnon "Päälohkon sisällä" tulostaminen.
  • Koodirivi 16: Lausunnon "Sisäkkäistä lohkoa kutsuminen" tulostaminen.
  • Koodirivi 17: Kutsutaan nested_block-menettelyä.
  • Koodirivi 18: Poikkeus
  • Koodirivi 19: Päälohkon sample_exceptionin poikkeuskäsittelijä.
  • Koodirivi 20: Tulosta lause "Poikkeus tallennettu päälohkossa".

Tärkeitä huomioita kohdassa Poikkeus

  • Toiminnassa poikkeuksen tulee aina joko palauttaa arvo tai nostaa poikkeusta edelleen. muu Oracle antaa ajon aikana virheen "Funktion palauttaa ilman arvoa".
  • Tapahtumanohjauslausekkeet voidaan antaa poikkeuskäsittelylohkossa.
  • SQLERRM ja SQLCODE ovat sisäänrakennettuja toimintoja, jotka antavat poikkeusviestin ja koodin.
  • Jos poikkeusta ei käsitellä, oletusarvoisesti kaikki kyseisen istunnon aktiiviset tapahtumat palautetaan.
  • RAISE_APPLICATION_ERROR (- , ) voidaan käyttää RAISE:n sijaan virheen nostamiseen käyttäjäkoodilla ja viestillä. Virhekoodin tulee olla suurempi kuin 20000 XNUMX ja sen eteen tulee olla '-'.

Yhteenveto

Tämän luvun jälkeen. sinun pitäisi pystyä työskentelemään seuraavien Pl SQL poikkeukset

  • Poikkeusten käsittely
  • Määrittele poikkeus
  • Korosta poikkeusta
  • Poikkeuslisäys