Mitä on poikkeusten käsittely PL / SQL: ssä?
Poikkeus tapahtuu, kun PL / SQL-moottori kohtaa käskyn, jota se ei voi suorittaa suorituksen aikana tapahtuneen virheen vuoksi. Näitä virheitä ei siepata kokoamishetkellä, joten niitä tarvitaan vain ajon aikana.
Esimerkiksi, jos PL / SQL-moottori saa käskyn jakaa mikä tahansa luku 0: lla, PL / SQL-moottori heittää sen poikkeuksena. Poikkeuksen tuo esiin vain ajon aikana PL / SQL-moottori.
Poikkeukset estävät ohjelman suorittamisen edelleen, joten tällaisten olosuhteiden välttämiseksi ne on kaapattava ja käsiteltävä erikseen. Tätä prosessia kutsutaan nimellä Exception-Handling, jossa ohjelmoija hoitaa ajon aikana mahdollisesti esiintyvän poikkeuksen.
Tässä opetusohjelmassa opit seuraavat aiheet-
- Poikkeuksia käsittelevä syntakse
- Poikkeustyypit
- Ennalta määritetyt poikkeukset
- Käyttäjän määrittelemä poikkeus
- PL / SQL-korotuspoikkeus
- Tärkeä huomautus kohdasta Poikkeus
Poikkeuksia käsittelevä syntakse
Poikkeuksia käsitellään lohkotasolla, ts. Jos jossakin lohkossa tapahtuu poikkeus, ohjaus tulee ulos 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.
Seuraavassa syntaksissa selitetään, miten poikkeus saadaan kiinni ja miten sitä käsitellään.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Syntaksi Selitys:
- Edellä olevassa syntaksissa poikkeusten käsittelylohko sisältää sarjan WHEN-ehtoja poikkeuksen käsittelemiseksi.
- Jokaista WHEN-ehtoa seuraa poikkeuksen nimi, jonka odotetaan nousevan ajon aikana.
- Kun jokin poikkeus nousee suorituksen aikana, PL / SQL-moottori etsii poikkeuksen käsittelystä kyseistä poikkeusta. Se alkaa ensimmäisestä 'WHEN' -lausekkeesta ja etsii peräkkäin.
- Jos se löysi poikkeuksen käsittelyn esille otetulle poikkeukselle, se suorittaa kyseisen käsittelykoodin osan.
- Jos mikään 'WHEN' -lausekkeesta ei ole esillä olevassa poikkeuksessa, PL / SQL-moottori suorittaa osan WHEN OTHERS (jos sellainen on). Tämä on yleistä kaikille poikkeuksille.
- Poikkeuksen suorittamisen jälkeen osan ohjaus menee ulos nykyisestä lohkosta.
- Vain yksi poikkeusosa voidaan suorittaa lohkolle ajon aikana. Sen suorittamisen jälkeen ohjain ohittaa jäljellä olevan poikkeuksen käsittelyosan ja menee ulos nykyisestä lohkosta.
Huomaa: KUN MUIDEN tulisi aina olla jakson viimeisessä paikassa. Poikkeuksen käsittelyosaa, joka on läsnä WHEN OTHERS jälkeen, ei koskaan suoriteta, koska ohjaus poistuu lohkosta suoritettuaan WHEN OTHERS.
Poikkeustyypit
Pl / SQL: ssä on kahdenlaisia poikkeuksia.
- Ennalta määritetyt poikkeukset
- Käyttäjän määrittelemä poikkeus
Ennalta määritetyt poikkeukset
Oracle on määrittänyt ennalta jonkin yleisen poikkeuksen. Näillä poikkeuksilla on ainutlaatuinen poikkeuksen nimi ja virhenumero. Nämä poikkeukset on jo määritelty Oraclen STANDARD-paketissa. Koodissa voimme käyttää näitä ennalta määriteltyjä poikkeusten nimiä suoraan niiden käsittelemiseen.
Alla on muutamia ennalta määriteltyjä poikkeuksia
Poikkeus | Virhekoodi | Poikkeuksen syy |
ACCESS_INTO_NULL | ORA-06530 | Määritä arvo alustamattomien objektien määritteille |
CASE_NOT_FOUND | ORA-06592 | Mikään CASE-lausekkeen WHEN-lauseke ei täyty eikä ELSE-lauseketta ole määritetty |
COLLECTION_IS_NULL | ORA-06531 | Keräysmenetelmien (paitsi OLEMASSA) käyttäminen tai alustamattomien kokoelmien kokoelmamääritteiden käyttö |
CURSOR_ALREADY_OPEN | ORA-06511 | Yritetään avata kohdistin, joka on jo avattu |
DUP_VAL_ON_INDEX | ORA-00001 | Kopion arvon tallentaminen tietokannan sarakkeeseen, jota rajoittaa ainutlaatuinen indeksi |
INVALID_CURSOR | ORA-01001 | Laittomat kohdistintoiminnot, kuten avaamattoman kohdistimen sulkeminen |
VÄÄRÄ NUMERO | ORA-01722 | Merkin muuntaminen numeroksi epäonnistui virheellisen numeromerkin takia |
DATAA EI LÖYTYNYT | ORA-01403 | Kun 'SELECT' -lauseke, joka sisältää INTO-lauseen, ei hae rivejä. |
ROW_MISMATCH | ORA-06504 | Kun kohdistimen muuttujan tietotyyppi ei ole yhteensopiva todellisen kohdistimen palautustyypin kanssa |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Viitataan kokoelmaan indeksinumerolla, joka on kokoelman kokoista suurempi |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Viittaus kokoelmaan indeksinumerolla, joka on laillisen alueen ulkopuolella (esim .: -1) |
TOO_MANY_ROWS | ORA-01422 | Kun SELECT-käsky INTO-lauseella 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 | Numeron jakaminen 0: lla |
Käyttäjän määrittelemä poikkeus
Oraclessa, lukuun ottamatta edellä määriteltyjä poikkeuksia, ohjelmoija voi luoda oman poikkeuksen ja käsitellä niitä. Ne voidaan luoda alaohjelmatasolla ilmoitusosassa. Nämä poikkeukset näkyvät vain kyseisessä alaohjelmassa. Pakettimäärityksissä määritelty poikkeus on julkinen poikkeus, ja se on näkyvissä missä paketti on käytettävissä. <
Syntaksi: Aliohjelmatasolla
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- Edellä olevassa syntaksissa muuttuja 'poikkeuksen_nimi' määritellään tyypiksi 'POISTE'.
- Tätä voidaan käyttää samalla tavalla kuin ennalta määritettyä poikkeusta.
Syntaksi: Pakettimäärittelytasolla
CREATE PACKAGEIS EXCEPTION;… END ;
- Yllä olevassa syntaksissa muuttuja 'poikkeuksen_nimi' määritellään nimellä 'EXCEPTION'
-pakettimäärityksessä. - Tätä voidaan käyttää tietokannassa missä pakettia 'package_name' voidaan kutsua.
PL / SQL-korotuspoikkeus
Kaikki ennalta määritetyt poikkeukset tuodaan esiin implisiittisesti aina, kun virhe tapahtuu. Mutta käyttäjän määrittelemiä poikkeuksia on tuotava esiin nimenomaisesti. Tämä voidaan saavuttaa käyttämällä avainsanaa "RAISE". Tätä voidaan käyttää millä tahansa alla mainituista tavoista.
Jos ohjelmaa käytetään erikseen 'RAISE', se levittää jo korotettua poikkeusta vanhempalohkoon. Vain poikkeuslohkoa voidaan käyttää alla olevan kuvan mukaisesti.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Syntaksi Selitys:
- Edellä olevassa syntaksissa poikkeuksen käsittelylohkossa käytetään avainsanaa RAISE.
- Aina kun ohjelma kohtaa poikkeuksen "poikkeuksen_nimi", poikkeusta käsitellään ja se suoritetaan normaalisti
- Mutta poikkeuksen käsittelyosan avainsana "RAISE" levittää tätä tiettyä poikkeusta pääohjelmaan.
Huomaa: Vaikka nostetaan poikkeus vanhempainlohkoon, myös nousevan poikkeuksen pitäisi olla näkyvissä myös vanhemmassa lohkossa, muuten oraakkeli heittää virheen.
- Voimme käyttää avainsanaa "RAISE", jota seuraa poikkeuksen nimi, kyseisen käyttäjän määrittelemän / ennalta määritetyn poikkeuksen nostamiseksi. Tätä voidaan käyttää sekä suoritusosassa että poikkeuksen käsittelyosassa poikkeuksen nostamiseksi.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Syntaksi Selitys:
- Edellä olevassa syntaksissa suoritusosassa käytetään avainsanaa RAISE, jota seuraa poikkeus "poikkeuksen_nimi".
- Tämä herättää tämän erityisen poikkeuksen teloituksen yhteydessä, ja sitä on käsiteltävä tai nostettava edelleen.
Esimerkki 1 : Tässä esimerkissä aiomme nähdä
- Kuinka julistaa poikkeus
- Kuinka saada ilmoitettu poikkeus ja
- Kuinka levittää se päälohkoon
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:/
Koodin selitys:
- Koodirivi 2 : Muuttujan 'sample_exception' julistaminen EXCEPTION-tyypiksi.
- Koodirivi 3 : Menettely nested_block -ilmoitus.
- Koodirivi 6 : Laskun "Sisäkkäinen lohko" tulostaminen.
- Koodirivi 7: Lausekkeen "Raising sample_exception from sisäkkäinen lohko" tulostaminen.
- Koodirivi 8: Poikkeuksen nostaminen käyttämällä RAISE sample_exception -ohjelmaa.
- Koodirivi 10: Poikkeuksen käsittelijä sisäkkäisen lohkon poikkeukselle sample_exception.
- Koodirivi 11: Tulos sisätetyssä lohkossa kaapattu poikkeus. Korotus päälohkoon ''.
- Koodirivi 12: Poikkeuksen nostaminen päälohkoon (eteneminen päälohkoon).
- Koodirivi 15: Lausekkeen "Päälohkon sisällä" tulostaminen.
- Koodirivi 16: Tulostetaan käsky "Sisäkkäisen lohkon kutsuminen".
- Koodirivi 17: Nested_block-prosessin kutsuminen.
- Koodirivi 19: Päälohkon esimerkki_poikkeus käsittelijä.
- Koodirivi 20: Lausekkeen "Päälohkoon kaapattu poikkeus" tulostaminen.
Tärkeä huomautus kohdasta Poikkeus
- Toiminnossa poikkeuksen tulisi aina joko palauttaa arvo tai nostaa poikkeusta edelleen. muuten Oracle heittää 'Toiminto palautettu ilman arvoa' -virheen ajon aikana.
- Tapahtumanhallintalauseet voidaan antaa poikkeusten käsittelylohkossa.
- SQLERRM ja SQLCODE ovat sisäänrakennettuja toimintoja, jotka antavat poikkeussanoman ja -koodin.
- Jos poikkeusta ei käsitellä, kaikki kyseisen istunnon aktiiviset tapahtumat palautetaan oletusarvoisesti.
- RAISE_APPLICATION_ERROR (-
, ) voidaan käyttää RAISE: n sijasta korottamaan virhe käyttäjän koodilla ja viestillä. Virhekoodin tulee olla suurempi kuin 20000 ja sen etuliitteenä on - -.
Yhteenveto
Tämän luvun jälkeen. sinun pitäisi pystyä työskentelemään seuraavien Pl SQL -poikkeuksien näkökohtien suhteen
- Poikkeusten käsittely
- Määritä poikkeus
- Nosta poikkeusta
- Poikkeuksen eteneminen