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 THEN WHEN OTHERSTHEN END;
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.
- Eelnevalt määratletud erandid
- 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
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- Ü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 PACKAGEIS 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 THEN RAISE;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 THEN END;
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