„Oracle PL / SQL“ išimčių tvarkymas: pavyzdžiai, kaip padidinti vartotojo apibrėžtą išimtį

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

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.

  1. Iš anksto nustatytos išimtys
  2. 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

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

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

Įdomios straipsniai...