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.
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.
- Ennalta määritetyt poikkeukset
- 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.
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.
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
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