Oracle PL / SQL-i erandkäsitlus: näited kasutaja määratletud erandi suurendamiseks

Lang L: none (table-of-contents):

Anonim

Mis on erandite käsitlemine PL / SQL-is?

Erand tekib siis, kui PL / SQL-i mootor satub käsku, mida ta ei saa käivitamisel käivitada tõrke tõttu. Neid vigu kompileerimise ajal ei hõivata ja seetõttu on neid vaja ainult käitamise ajal käsitleda.

Näiteks kui PL / SQL-mootor saab käsu mis tahes arv jagada 0-ga, siis loob PL / SQL-mootor selle erandina. Erandi tõstatab käitamise ajal ainult PL / SQL-i mootor.

Erandid peatavad programmi edasise käivitamise, nii et selliste tingimuste vältimiseks tuleb need eraldi hõivata ja käsitseda. Seda protsessi nimetatakse erandkäsitluseks, mille puhul programmeerija käitleb käitamise ajal tekkida võivat erandit.

Selles õpetuses saate teada järgmisi teemasid-

  • Erandite käsitsemise süntaks
  • Erandite tüübid
  • Eelnevalt määratletud erandid
  • Kasutaja määratletud erand
  • PL / SQL tõsta erandit
  • Olulised punktid, mida tuleb märkida jaotises Erand

Erandite käsitsemise süntaks

Erandeid käsitletakse ploki tasandil, st kui ükskõik millises plokis ilmneb mõni erand, siis juhtimine väljub selle ploki täitmisosast. Seejärel käsitletakse erandit selle ploki erandi käitlemise osas. Pärast erandi käsitlemist ei ole võimalik juhtimist uuesti selle ploki täitmisjaoskonda saata.

Allpool olev süntaks selgitab, kuidas erandit tabada ja käsitleda.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Süntaksi selgitus:

  • Ülaltoodud süntaksis sisaldab erandite käitlemise plokk WHEN-tingimuste rida erandi käsitsemiseks.
  • Igale WHEN tingimusele järgneb erandi nimi, mis eeldatavasti tõuseb jooksmise ajal.
  • Kui käitamisel tõstetakse mis tahes erandit, otsib PL / SQL-i mootor erandi käitlemise osa selle konkreetse erandi jaoks. See algab esimesest klauslist "MILLAL" ja järjestikku otsitakse.
  • Kui ta leidis tõstatatud erandi käitlemise erandina, käivitab ta selle konkreetse käitluskoodi osa.
  • Kui tõstatatud erandi kohta pole ühtegi klauslit 'WHEN', täidab PL / SQL mootor osa 'WHEN OTHERS' (kui see on olemas). See on tavaline kõigi erandite puhul.
  • Pärast erandi täitmist läheb osa juhtimine praegusest plokist välja.
  • Käivitusajal saab ploki jaoks käivitada ainult ühe erandi osa. Pärast selle täitmist jätab kontroller ülejäänud erandite käitlemise osa vahele ja läheb praegusest plokist välja.

Märkus. KUI TEISED peaksid alati olema järjestuse viimasel kohal. Pärast seda, kui üksus WHEN OTHERS ei saa kunagi rakendatud erandit, ei täideta kunagi, kuna juhtnupp väljub plokist pärast WHEN OTHERSi käivitamist.

Erandite tüübid

Pl / SQL-is on kahte tüüpi erandeid.

  1. Eelnevalt määratletud erandid
  2. Kasutaja määratletud erand

Eelnevalt määratletud erandid

Oracle on eelnevalt määratlenud mõne levinud erandi. Nendel eranditel on ainulaadne erandi nimi ja vea number. Need erandid on juba määratletud Oracle'i paketis "STANDARD". Koodis saame nende etteantud erandite nime nende käsitsemiseks otse kasutada.

Allpool on mõned etteantud erandid

Erand Veakood Erandi põhjus
ACCESS_INTO_NULL ORA-06530 Määrake initsialiseerimata objektide atribuutidele väärtus
CASE_NOT_FOUND ORA-06592 Ükski CASE-lause WHEN-klausel ei ole täidetud ja ühtegi ELSE-klauslit pole täpsustatud
COLLECTION_IS_NULL ORA-06531 Kogumismeetodite (v.a OLEMAS) kasutamine või initsialiseerimata kogude kollektsiooni atribuutide juurde pääsemine
CURSOR_ALREADY_OPEN ORA-06511 Proovitakse avada juba avatud kursor
DUP_VAL_ON_INDEX ORA-00001 Duplikaatväärtuse salvestamine andmebaasi veergu, mida piirab ainulaadne register
INVALID_CURSOR ORA-01001 Keelatud kursoritoimingud, näiteks avamata kursori sulgemine
INVALID_NUMBER ORA-01722 Märgi teisendamine numbriks ebaõnnestus vale numbrimärgi tõttu
ANDMEID EI LEITUD ORA-01403 Kui lause „SELECT”, mis sisaldab lauset INTO, ei tooda ühtegi rida.
ROW_MISMATCH ORA-06504 Kui kursori muutuja andmetüüp ei ühildu kursori tegeliku tagasituleku tüübiga
SUBSCRIPT_BEYOND_COUNT ORA-06533 Kollektsiooni suunamine indeksi numbri järgi, mis on suurem kui kogu suurus
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Kogumiku suunamine registrinumbriga, mis jääb väljapoole seaduslikku vahemikku (nt: -1)
TOO_MANY_ROWS ORA-01422 Kui lause „SELECT” koos INTO-klausliga tagastab rohkem kui ühe rea
VALUE_ERROR ORA-06502 Aritmeetiline või suuruse piirangu viga (nt: väärtuse määramine muutujale, mis on muutuja suurusest suurem)
ZERO_DIVIDE ORA-01476 Arvu jagamine 0-ga

Kasutaja määratletud erand

Oracle'is saab programmeerija, välja arvatud eelnevalt määratletud erandid, luua oma erandi ja neid käsitseda. Neid saab luua alamprogrammi tasemel deklaratsiooni osas. Need erandid on nähtavad ainult selles alamprogrammis. Paketispetsifikatsioonis määratletud erand on avalik erand ja see on nähtav kõikjal, kuhu paketile juurde pääseb. <

Süntaks: alamprogrammi tasandil

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • Ülaltoodud süntaksis määratletakse muutuja 'erandi_nimi' tüübiks 'VÄLJASTUS.
  • Seda saab kasutada sarnaselt ettemääratud erandina.

Süntaks: pakendi spetsifikatsiooni tasemel

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • Ülaltoodud süntaksis määratletakse muutuja 'erandi_nimi pakendispetsifikatsioonis tüübiks' VÄLJASTUS '.
  • Seda saab andmebaasis kasutada kõikjal, kus paketti 'package_name' saab kutsuda.

PL / SQL tõsta erandit

Kõik etteantud erandid esitatakse kaudselt alati, kui viga ilmneb. Kuid kasutaja määratletud erandeid tuleb selgesõnaliselt tõsta. Seda on võimalik saavutada märksõnaga 'RAISE'. Seda saab kasutada mis tahes allpool nimetatud viisil.

Kui programmis 'RAISE' kasutatakse eraldi, levitab see juba tõstatatud erandi vanemplokki. Ainult erandplokki saab kasutada, nagu allpool näidatud.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Süntaksi selgitus:

  • Ülaltoodud süntaksis kasutatakse erandite käitlemise plokis märksõna RAISE.
  • Alati, kui programm kohtab erandit "erandi_nimi", käsitletakse erandit ja see viiakse lõpule tavapäraselt
  • Kuid erandite käitlemise osa märksõna "RAISE" levitab seda erandit vanemprogrammi.

Märkus. Ehkki erandi tõstmine vanemplokki peaks suurenev erand olema nähtav ka vanemplokis, muidu viskab oraakel vea.

  • Selle konkreetse kasutaja määratletud / eelnevalt määratletud erandi tõstmiseks võime kasutada märksõna RAISE, millele järgneb erandi nimi. Seda saab kasutada nii täitmise osas kui ka erandite käsitlemise osas erandi tekitamiseks.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Süntaksi selgitus:

  • Ülaltoodud süntaksis kasutatakse täitmisosas märksõna RAISE, millele järgneb erand "erandi_nimi".
  • See tõstatab selle konkreetse erandi hukkamise ajal ja sellega tuleb edasi tegeleda või seda tõsta.

Näide 1 : Selles näites vaatame

  • Kuidas kuulutada erand
  • Kuidas tõstatada deklareeritud erand ja
  • Kuidas levitada seda põhiplokki
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:/

Koodi selgitus:

  • Koodirida 2 : muutuja 'sample_exception' deklareerimine tüübiks EXCEPTION.
  • Koodirida 3 : protseduuri pesastatud_blokeerimine deklareerimine.
  • Koodirida 6 : lause "Inside nested block" printimine.
  • Koodirida 7: lause "Proovi_erandi tõstmine pesastatud plokist" printimine.
  • Koodirida 8: erandi suurendamine 'RAISE sample_exception' abil.
  • Koodirida 10: Erandite käsitleja erandile sample_exception pesastatud plokis.
  • Koodirida 11: Väljavõtte „Pesatud plokis hõivatud erand“ printimine. Tõstmine põhiplokiks ”.
  • Koodirida 12: Erandi tõstmine põhiplokile (levitamine põhiplokki).
  • Koodirida 15: lause "Inside the main block" printimine.
  • Koodirida 16: Väljavõtte "Sisestatud plokile helistamine" printimine.
  • Koodirida 17: Nested_block-i kutsumine.
  • Koodirida 19: peaplokis oleva valimi_erand erandite käitleja.
  • Koodirida 20: Väljaande "Põhiplokis hõivatud erand" printimine.

Olulised punktid, mida tuleb märkida jaotises Erand

  • Funktsioonis peaks erand alati kas tagastama väärtuse või tõstma erandit veelgi. muidu viskab Oracle käitusajal vea „Funktsioon tagastatakse ilma väärtuseta”.
  • Tehingute juhtimise avaldused saab anda erandite käsitlemise plokis.
  • SQLERRM ja SQLCODE on sisseehitatud funktsioonid, mis annavad erandi teate ja koodi.
  • Kui erandit ei käsitleta, veeretatakse vaikimisi tagasi kogu selle seansi aktiivne tehing.
  • RAISE_APPLICATION_ERROR (- , ) võib RAISE asemel kasutada tõrke tõstatamiseks kasutajakoodi ja sõnumiga. Veakood peaks olema suurem kui 20000 ja eesliitega „-”.

Kokkuvõte

Pärast seda peatükki. peaksite saama töötada järgmiste Pl SQL-i erandite aspektide osas

  • Erandite käsitlemine
  • Määratlege erand
  • Tõsta erandit
  • Erandite levik