Kas ir izņēmumu apstrāde PL / SQL?
Izņēmums rodas, ja PL / SQL dzinējs sastop instrukciju, kuru tā nevar izpildīt izpildes laikā radušās kļūdas dēļ. Šīs kļūdas netiks uztvertas kompilēšanas laikā, un tāpēc tās ir jārisina tikai izpildes laikā.
Piemēram, ja PL / SQL dzinējs saņem norādījumu sadalīt jebkuru skaitli ar “0”, tad PL / SQL dzinējs to izmetīs kā izņēmumu. Izņēmumu izlaišanas laikā izvirza tikai PL / SQL dzinējs.
Izņēmumi apturēs programmas turpmāku izpildi, tāpēc, lai izvairītos no šāda stāvokļa, tie jāaptver un jārīkojas atsevišķi. Šis process tiek saukts par izņēmumu apstrādi, kurā programmētājs apstrādā izņēmumu, kas var notikt izpildes laikā.
Šajā apmācībā jūs uzzināsiet šādas tēmas:
- Izņēmumu apstrādes sintakse
- Izņēmuma veidi
- Iepriekš noteikti izņēmumi
- Lietotāja definēts izņēmums
- PL / SQL paaugstināt izņēmumu
- Svarīgi punkti, kas jāņem vērā sadaļā Izņēmums
Izņēmumu apstrādes sintakse
Izņēmumi tiek apstrādāti blokā, līmenī, ti, ja kādā blokā rodas kāds izņēmums, vadība iznāks no šī bloka izpildes daļas. Pēc tam izņēmums tiks apstrādāts šī bloka izņēmumu apstrādes daļā. Pēc izņēmuma apstrādes nav iespējams nosūtīt vadību atpakaļ uz šī bloka izpildes sadaļu.
Zemāk esošajā sintaksē ir paskaidrots, kā noķert un rīkoties ar izņēmumu.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Sintakses skaidrojums:
- Iepriekš minētajā sintaksē izņēmumu apstrādes bloks satur virkni WHEN nosacījumu, lai apstrādātu izņēmumu.
- Katram KAD nosacījumam seko izņēmuma nosaukums, kuru paredzēts paaugstināt darbības laikā.
- Kad izpildes laikā tiek izvirzīti kādi izņēmumi, PL / SQL dzinējs meklēs izņēmumu apstrādes daļu šim konkrētajam izņēmumam. Tas sāksies no pirmās “WHEN” klauzulas un secīgi meklēs.
- Ja tā ir atradusi izņēmuma apstrādi izvirzītajam izņēmumam, tā izpilda konkrēto apstrādes koda daļu.
- Ja izvirzītajam izņēmumam nav nevienas “WHEN” klauzulas, PL / SQL dzinējs izpildīs daļu “WHEN OTHERS” (ja tāds ir). Tas ir raksturīgi visiem izņēmumiem.
- Pēc izņēmuma izpildes daļas vadība tiks izslēgta no pašreizējā bloka.
- Izpildes laikā blokam var izpildīt tikai vienu izņēmuma daļu. Pēc tā izpildes kontrolieris izlaidīs atlikušo izņēmumu apstrādes daļu un izies no pašreizējā bloka.
Piezīme: KAD CITIEM vienmēr jābūt secības pēdējā pozīcijā. Izņēmuma apstrādes daļa, kas atrodas pēc tam, kad WHEN OTHERS nekad netiks izpildīta, jo vadība izies no bloka pēc WHEN OTHERS izpildīšanas.
Izņēmuma veidi
Pl / SQL ir divu veidu izņēmumi.
- Iepriekš noteikti izņēmumi
- Lietotāja definēts izņēmums
Iepriekš noteikti izņēmumi
Oracle ir iepriekš definējis dažus izplatītus izņēmumus. Šiem izņēmumiem ir unikāls izņēmuma nosaukums un kļūdas numurs. Šie izņēmumi jau ir definēti Oracle paketē “STANDARD”. Kodā mēs varam tieši izmantot šo iepriekš definēto izņēmuma nosaukumu, lai tos apstrādātu.
Zemāk ir daži iepriekš noteikti izņēmumi
Izņēmums | Kļūdas kods | Izņēmuma iemesls |
ACCESS_INTO_NULL | ORA-06530 | Piešķiriet vērtību neinicializētu objektu atribūtiem |
CASE_NOT_FOUND | ORA-06592 | Neviena no “WHEN” klauzulas CASE paziņojumā nav izpildīta, un “ELSE” klauzula nav norādīta |
COLLECTION_IS_NULL | ORA-06531 | Kolekcijas metožu izmantošana (izņemot EXISTS) vai piekļuve kolekcijas atribūtiem neinicializētās kolekcijās |
CURSOR_ALREADY_OPEN | ORA-06511 | Mēģina atvērt kursoru, kas jau ir atvērts |
DUP_VAL_ON_INDEX | ORA-00001 | Vērtības dublikāta saglabāšana datu bāzes kolonnā, kuru ierobežo unikāls indekss |
INVALID_CURSOR | ORA-01001 | Nelikumīgas kursora darbības, piemēram, neatvērta kursora aizvēršana |
INVALID_NUMBER | ORA-01722 | Rakstzīmes pārveidošana par numuru neizdevās nederīgas ciparu rakstzīmes dēļ |
NO_DATA_FOUND | ORA-01403 | Kad 'SELECT' priekšraksts, kas satur klauzulu INTO, neizraisa rindas. |
ROW_MISMATCH | ORA-06504 | Ja kursora mainīgā datu tips nav saderīgs ar faktisko kursora atgriešanas veidu |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Kolekcijas novirzīšana ar indeksa numuru, kas ir lielāks par kolekcijas lielumu |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Kolekcijas novirzīšana ar indeksa numuru, kas atrodas ārpus likumīgā diapazona (piemēram: -1) |
TOO_MANY_ROWS | ORA-01422 | Kad 'SELECT' priekšraksts ar klauzulu INTO atgriež vairāk nekā vienu rindu |
VALUE_ERROR | ORA-06502 | Aritmētiskā vai lieluma ierobežojuma kļūda (piemēram: vērtības piešķiršana mainīgajam, kas ir lielāks par mainīgā lielumu) |
ZERO_DIVIDE | ORA-01476 | Skaitļa dalīšana ar “0” |
Lietotāja definēts izņēmums
Programmā Oracle, izņemot iepriekš definētos izņēmumus, programmētājs var izveidot pats savu izņēmumu un tos apstrādāt. Tos var izveidot apakšprogrammas līmenī deklarācijas daļā. Šie izņēmumi ir redzami tikai šajā apakšprogrammā. Paketes specifikācijā definētais izņēmums ir publisks izņēmums, un tas ir redzams visur, kur pakete ir pieejama. <
Sintakse: apakšprogrammas līmenī
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- Iepriekšminētajā sintaksē mainīgais lielums “izņēmuma_nosaukums” ir definēts kā “IZŅEMŠANAS” tips.
- To var izmantot tāpat kā iepriekš noteiktu izņēmumu.
Sintakse: iepakojuma specifikācijas līmenī
CREATE PACKAGEIS EXCEPTION;… END ;
- Iepriekšminētajā sintaksē mainīgais “izņēmuma_nosaukums” ir noteikts kā “IZŅEMŠANAS” tips
pakotnes specifikācijā. - To var izmantot datu bāzē, kur var izsaukt pakotni 'package_name'.
PL / SQL paaugstināt izņēmumu
Visi iepriekš noteiktie izņēmumi tiek netieši izvirzīti ikreiz, kad rodas kļūda. Bet lietotāja noteikti izņēmumi ir skaidri jāizceļ. To var panākt, izmantojot atslēgvārdu “RAISE”. To var izmantot jebkurā no tālāk minētajiem veidiem.
Ja programmā RAISE tiek izmantots atsevišķi, tad tas jau izvirzīto izņēmumu izplatīs vecāku blokā. Tikai izņēmuma gadījumā bloku var izmantot, kā parādīts zemāk.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Sintakses skaidrojums:
- Iepriekš sintaksē atslēgvārds RAISE tiek izmantots izņēmumu apstrādes blokā.
- Ikreiz, kad programma sastop izņēmumu "izņēmuma_nosaukums", izņēmums tiek apstrādāts un tiks pabeigts normāli
- Bet atslēgvārds “RAISE” izņēmumu apstrādes daļā šo konkrēto izņēmumu izplatīs vecāku programmā.
Piezīme. Lai gan vecāku blokam tiek piešķirts izņēmums, izņēmumam, kas tiek paaugstināts, jābūt redzamam arī vecāku blokā, pretējā gadījumā orākuls radīs kļūdu.
- Mēs varam izmantot atslēgvārdu “RAISE”, kam seko izņēmuma nosaukums, lai izvirzītu konkrēto lietotāja definēto / iepriekš definēto izņēmumu. To var izmantot gan izpildes daļā, gan izņēmumu apstrādes daļā, lai palielinātu izņēmumu.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Sintakses skaidrojums:
- Iepriekš minētajā sintaksē izpildes daļā tiek izmantots atslēgvārds RAISE, kam seko izņēmums "izņēmuma_nosaukums".
- Tas radīs šo konkrēto izņēmumu izpildes laikā, un tas ir jārisina vai jāturpina tālāk.
1. piemērs : Šajā piemērā mēs to redzēsim
- Kā pasludināt izņēmumu
- Kā paaugstināt deklarēto izņēmumu un
- Kā to izplatīt galvenajā 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:/
Koda skaidrojums:
- 2. koda rindiņa : mainīgā “sample_exception” deklarēšana par EXCEPTION tipu.
- 3. koda rindiņa : deklarēšanas procedūra nested_block.
- Kodu rinda 6 : paziņojuma "Inside nested block" izdrukāšana.
- 7. koda rinda: izdruka paziņojuma "Parauga_izņēmuma palielināšana no ligzdotā bloka".
- 8. koda rindiņa: izņēmuma palielināšana, izmantojot “RAISE sample_exception”.
- 10. koda rindiņa: izņēmuma apstrādātājs izņēmuma paraugam_izņēmums ligzdotajā blokā.
- 11. koda rindiņa: izdrukājiet paziņojumu 'Izņēmums, kas iegūts ligzdotajā blokā. Paaugstināšana līdz galvenajam blokam ”.
- Kodu rindiņa 12: Izņēmuma palielināšana galvenajam blokam (pavairošana galvenajā blokā).
- 15. koda rindiņa: paziņojuma "Inside the main block" izdrukāšana.
- 16. koda rindiņa: Izraksta “Zvana ligzdotajam blokam” izdrukāšana.
- 17. koda rindiņa: izsaukšanas procedūra nested_block.
- 19. koda rindiņa: izņēmuma apstrādātājs paraugam_izņēmums galvenajā blokā.
- 20. koda rindiņa: paziņojuma "Izņēmums, kas uzņemts galvenajā blokā" izdrukāšana.
Svarīgi punkti, kas jāņem vērā sadaļā Izņēmums
- Funkcijā izņēmumam vienmēr ir vai nu jāatgriež vērtība, vai arī tas vēl jāpaaugstina. citādi Oracle izpildes laikā izmet kļūdu “Funkcija atgriezta bez vērtības”.
- Darījumu kontroles paziņojumus var sniegt izņēmumu apstrādes blokā.
- SQLERRM un SQLCODE ir iebūvētās funkcijas, kas sniegs izņēmuma ziņojumu un kodu.
- Ja izņēmums netiek apstrādāts, pēc noklusējuma visi aktīvie darījumi šajā sesijā tiks atcelti.
- RAISE_APPLICATION_ERROR (-
, ) var izmantot RAISE vietā, lai radītu kļūdu ar lietotāja kodu un ziņojumu. Kļūdas kodam vajadzētu būt lielākam par 20000 un ar prefiksu “-”.
Kopsavilkums
Pēc šīs nodaļas. jums vajadzētu būt iespējai strādāt ar šādiem Pl SQL izņēmumu aspektiem
- Darbība ar izņēmumiem
- Definējiet izņēmumu
- Paaugstiniet izņēmumu
- Izņēmuma izplatīšanās