Oracle PL / SQL Exception Handling: Esimerkkejä käyttäjän määrittelemän poikkeuksen lisäämisestä

Sisällysluettelo:

Anonim

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 THENWHEN OTHERSTHENEND;

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.

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

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • 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 PACKAGE 
IS 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  THENRAISE;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  THENEND;

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