Kas yra išimčių tvarkymas PL / SQL?
Išimtis įvyksta, kai PL / SQL variklis aptinka komandą, kurios jis negali įvykdyti dėl vykdymo metu įvykusios klaidos. Šios klaidos nebus užfiksuotos kompiliavimo metu, todėl jas reikia pašalinti tik vykdymo metu.
Pvz., Jei PL / SQL variklis gauna nurodymą padalyti bet kurį skaičių iš „0“, tai PL / SQL variklis išmes jį kaip išimtį. Išimtį PL / SQL variklis pateikia tik vykdymo metu.
Išimtys sustabdys programos vykdymą toliau, todėl norint išvengti tokios sąlygos, jas reikia užfiksuoti ir tvarkyti atskirai. Šis procesas vadinamas Išimčių tvarkymu, kuriame programuotojas tvarko išimtį, kuri gali atsirasti vykdymo metu.
Šioje pamokoje sužinosite šias temas:
- Išimčių tvarkymo sintaksė
- Išimčių rūšys
- Iš anksto nustatytos išimtys
- Vartotojo nustatyta išimtis
- PL / SQL pakelti išimtį
- Svarbūs punktai, kuriuos reikia atkreipti dėmesį į išimtį
Išimčių tvarkymo sintaksė
Išimtys tvarkomos bloke, lygiu, ty, jei bet kuriame bloke atsiranda bet kokia išimtis, valdiklis išeis iš to bloko vykdymo dalies. Tada išimtis bus tvarkoma išimties tvarkymo to bloko dalyje. Po to, kai atlikta išimtis, negalima pakartotinai išsiųsti valdymo atgal į to bloko vykdymo skyrių.
Žemiau esančioje sintaksėje paaiškinta, kaip sugauti ir elgtis su išimtimi.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Sintaksės paaiškinimas:
- Pirmiau pateiktoje sintaksėje išimčių tvarkymo bloke yra WHEN sąlyga, kad būtų galima tvarkyti išimtį.
- Po kiekvienos KADENOS sąlygos nurodomas išimties pavadinimas, kuris, tikimasi, bus padidintas vykdymo metu.
- Kai vykdymo metu bus iškelta bet kokia išimtis, tada PL / SQL variklis ieškos tos konkrečios išimties išimčių tvarkymo dalyje. Tai prasidės nuo pirmosios „KADA“ sąlygos ir nuosekliai ieškos.
- Jei rado iškeltą išimtį tvarkančią išimtį, ji vykdys tą konkrečią tvarkymo kodo dalį.
- Jei išimtyje, kuri buvo iškelta, nėra nė vienos iš „KADA“ sąlygos, PL / SQL variklis vykdys dalį „KAI KITI“ (jei yra). Tai būdinga visoms išimtims.
- Atlikus išimtį, dalies valdymas išeis iš dabartinio bloko.
- Veikimo metu blokui gali būti vykdoma tik viena išimties dalis. Jį įvykdęs, valdiklis praleis likusią išimčių tvarkymo dalį ir išeis iš dabartinio bloko.
Pastaba: KAI KITI visada turėtų būti paskutinėje sekos vietoje. Išimties tvarkymo dalis, esanti po KADA KITI, niekada nebus vykdoma, nes valdiklis išeis iš bloko, kai įvykdys KAD KITI.
Išimčių rūšys
Pl / SQL yra dviejų rūšių išimtys.
- Iš anksto nustatytos išimtys
- Vartotojo nustatyta išimtis
Iš anksto nustatytos išimtys
„Oracle“ iš anksto nustatė kai kurias įprastas išimtis. Šios išimtys turi unikalų išimties pavadinimą ir klaidos numerį. Šios išimtys jau apibrėžtos „Oracle“ pakete „STANDARD“. Kode galime tiesiogiai naudoti šį iš anksto apibrėžtą išimties pavadinimą, kad juos tvarkytume.
Žemiau pateikiamos kelios iš anksto nustatytos išimtys
Išimtis | Klaidos kodas | Išimties priežastis |
ACCESS_INTO_NULL | ORA-06530 | Priskirkite vertę neinicijuotų objektų atributams |
CASE_NOT_FOUND | ORA-06592 | Nei viena CASE teiginio „WHEN“ sąlyga netenkinama, o „ELSE“ sąlyga nenurodyta |
COLLECTION_IS_NULL | ORA-06531 | Naudojant rinkimo metodus (išskyrus EXIST) arba prieigą prie neinicializuotų kolekcijų kolekcijos atributų |
CURSOR_ALREADY_OPEN | ORA-06511 | Bandoma atidaryti jau atidarytą žymeklį |
DUP_VAL_ON_INDEX | ORA-00001 | Dublikato vertės saugojimas duomenų bazės stulpelyje, kurį riboja unikalus indeksas |
INVALID_CURSOR | ORA-01001 | Neteisėtos žymeklio operacijos, tokios kaip neatidaryto žymeklio uždarymas |
INVALID_NUMBER | ORA-01722 | Ženklo pavertimas skaičiumi nepavyko dėl neteisingo skaičiaus simbolio |
NO_DATA_FOUND | ORA-01403 | Kai sakinys „SELECT“, kuriame yra sakinys INTO, negauna jokių eilučių. |
ROW_MISMATCH | ORA-06504 | Kai žymeklio kintamojo duomenų tipas nesuderinamas su faktiniu žymeklio grąžinimo tipu |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Nurodoma kolekcija indekso numeriu, kuris yra didesnis nei kolekcijos dydis |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Nurodoma kolekcija indekso numeriu, kuris nepatenka į leistiną diapazoną (pvz .: -1) |
TOO_MANY_ROWS | ORA-01422 | Kai sakinys „SELECT“ su sąlyga INTO grąžina daugiau nei vieną eilutę |
VALUE_ERROR | ORA-06502 | Aritmetinė arba dydžio suvaržymo klaida (pvz .: vertės priskyrimas kintamajam, kuris yra didesnis už kintamojo dydį) |
ZERO_DIVIDE | ORA-01476 | Skaičio padalijimas iš „0“ |
Vartotojo nustatyta išimtis
Programoje „Oracle“, išskyrus aukščiau nustatytas išimtis, programuotojas gali sukurti savo išimtį ir jas tvarkyti. Jie gali būti sukurti paprogramės lygiu deklaracijos dalyje. Šios išimtys matomos tik toje paprogramėje. Išimtis, apibrėžta paketo specifikacijoje, yra vieša išimtis ir ji matoma visur, kur paketas pasiekiamas. <
Sintaksė: paprogramės lygiu
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- Pirmiau pateiktoje sintaksėje kintamasis „išimties_pavadinimas“ apibrėžiamas kaip „EXCEPTION“ tipas.
- Tai galima naudoti panašiai kaip iš anksto nustatytą išimtį.
Sintaksė: pakuotės specifikacijos lygiu
CREATE PACKAGEIS EXCEPTION;… END ;
- Pirmiau pateiktoje sintaksėje kintamasis „išimties_pavadinimas“ paketo specifikacijoje
apibrėžiamas kaip „IŠIMTIS“ tipas. - Tai galima naudoti duomenų bazėje visur, kur galima pakviesti paketą „package_name“.
PL / SQL pakelti išimtį
Visos iš anksto nustatytos išimtys iškyla netiesiogiai, kai tik įvyksta klaida. Tačiau reikia aiškiai nurodyti vartotojo apibrėžtas išimtis. Tai galima pasiekti naudojant raktinį žodį „RAISE“. Tai galima naudoti bet kuriuo iš toliau nurodytų būdų.
Jei programoje „RAISE“ naudojama atskirai, ji išplės jau iškeltą išimtį į pagrindinį bloką. Tik išimties blokas gali būti naudojamas, kaip parodyta žemiau.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Sintaksės paaiškinimas:
- Pirmiau pateiktoje sintaksėje išimčių tvarkymo bloke naudojamas raktinis žodis RAISE.
- Kai tik programa susiduria su išimtimi „Išimties_pavadinimas“, išimtis yra tvarkoma ir bus baigta paprastai
- Bet raktinių žodžių „RAISE“ išimčių tvarkymo dalyje ši konkreti išimtis bus perkelta į pagrindinę programą.
Pastaba: keliant išimtį pagrindiniam blokui, išimtis, kuri vis didėja, taip pat turėtų būti matoma pagrindiniame bloke, kitaip „Oracle“ sukels klaidą.
- Mes galime naudoti raktinį žodį „RAISE“, po kurio pateikiamas išimties pavadinimas, kad būtų galima iškelti tam tikrą vartotojo apibrėžtą / iš anksto nustatytą išimtį. Tai gali būti naudojama tiek vykdymo dalyje, tiek išimčių tvarkymo dalyje, kad būtų išimtis.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Sintaksės paaiškinimas:
- Pirmiau pateiktoje sintaksėje vykdymo dalyje naudojamas raktinis žodis RAISE, po kurio pateikiama išimtis „Išimties_pavadinimas“.
- Tai sukels šią konkrečią išimtį vykdymo metu, ir tai reikia spręsti ar kelti toliau.
1 pavyzdys : Šiame pavyzdyje mes pamatysime
- Kaip paskelbti išimtį
- Kaip iškelti išimtį ir
- Kaip ją išplisti į pagrindinį bloką
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:/
Kodo paaiškinimas:
- 2 kodo eilutė : kintamojo „sample_exception“ paskelbimas EXCEPTION tipu.
- 3 kodo eilutė : deklaravimo procedūra „nested_block“.
- Kodo 6 eilutė : išspausdinkite teiginį „Inside nested block“.
- 7 kodo eilutė: išspausdinkite teiginį „Sample_exception iš lizdinio bloko iškėlimas“.
- 8 kodo eilutė: Išimties padidinimas naudojant „RAISE sample_exception“.
- 10 kodo eilutė: Išimties tvarkytuvas išimties pavyzdyje_išimtis įdėtame bloke.
- Kodo 11 eilutė: išspausdinti teiginį „Išimtis užfiksuota įdėtame bloke. Pakėlimas į pagrindinį bloką “.
- 12 kodo eilutė: pagrindinio bloko išimties padidinimas (perkeliama į pagrindinį bloką).
- 15 kodo eilutė: išspausdinkite teiginį „Viduje pagrindiniame bloke“.
- Kodo 16 eilutė: išspausdinkite teiginį „Skambinimas įdėtam blokui“.
- 17 kodo eilutė: „ Nested_block“ iškvietimo procedūra.
- 19 kodo eilutė: Išimties tvarkytuvas „sample_exception“ pagrindiniame bloke.
- Kodo 20 eilutė: išspausdinti teiginį „Išimtis užfiksuota pagrindiniame bloke“.
Svarbūs punktai, kuriuos reikia atkreipti dėmesį į išimtį
- Veikiant, išimtis visada turėtų arba grąžinti vertę, arba padidinti išimtį toliau. kitaip „Oracle“ vykdymo metu išmes klaidą „Funkcija grąžinta be vertės“.
- Operacijų kontrolės išrašus galima pateikti išimčių tvarkymo bloke.
- SQLERRM ir SQLCODE yra integruotos funkcijos, kurios suteiks išimties pranešimą ir kodą.
- Jei išimtis nėra tvarkoma, pagal numatytuosius nustatymus visa aktyvi operacija toje sesijoje bus grąžinta atgal.
- RAISE_APPLICATION_ERROR (-
, ) gali būti naudojamas vietoj RAISE, norint ištaisyti klaidą su vartotojo kodu ir pranešimu. Klaidos kodas turi būti didesnis nei 20000 ir prieš jį įrašyti „-“.
Santrauka
Po šio skyriaus. turėtumėte mokėti atsižvelgti į šiuos Pl SQL išimčių aspektus
- Tvarkyti išimtis
- Apibrėžkite išimtį
- Padidinkite išimtį
- Išimties sklidimas