Kivételek kezelése Oracle PL/SQL (példák)
Mi az a kivételkezelés a PL/SQL-ben?
Kivétel akkor történik, amikor a PL/SQL motor olyan utasítással találkozik, amelyet nem tud végrehajtani egy futás közben fellépő hiba miatt. Ezeket a hibákat a rendszer nem rögzíti a fordításkor, ezért ezeket csak a futási időben kell kezelni.
Például, ha a PL/SQL motor utasítást kap bármely szám 0-val való elosztására, akkor a PL/SQL motor kivételként dobja ki. A kivételt a PL/SQL motor csak futási időben veti fel.
A kivételek leállítják a program további végrehajtását, ezért az ilyen állapot elkerülése érdekében ezeket külön kell rögzíteni és kezelni. Ezt a folyamatot kivételkezelésnek nevezik, amelyben a programozó kezeli a futási időben előforduló kivételeket.
Kivételkezelési szintaxis
A kivételek kezelése a blokk szintjén történik, azaz ha bármely blokkban kivétel történik, akkor a vezérlés kikerül a blokk végrehajtási részéből. A kivételt ezután az adott blokk kivételkezelő részében kezeli a rendszer. A kivétel kezelése után nem lehet visszaküldeni a vezérlést az adott blokk végrehajtási szakaszába.
Az alábbi szintaxis elmagyarázza, hogyan lehet elkapni és kezelni a kivételt.
BEGIN <execution block> . . EXCEPTION WHEN <exceptionl_name> THEN <Exception handling code for the “exception 1 _name’' > WHEN OTHERS THEN <Default exception handling code for all exceptions > END;
Szintaxis magyarázata:
- A fenti szintaxisban a kivételkezelő blokk WHEN feltétel sorozatot tartalmaz a kivétel kezelésére.
- Minden WHEN feltételt a kivétel neve követ, amely várhatóan fel fog emelkedni a futási időben.
- Ha futás közben bármilyen kivétel felmerül, akkor a PL/SQL motor a kivételkezelő részben keresi az adott kivételt. Az első „WHEN” záradéktól indul, és szekvenciálisan keresni fog.
- Ha megtalálta a kivétel kezelését a felhozott kivételhez, akkor végrehajtja az adott kezelési kódrészt.
- Ha a „WHEN” záradék egyike sem szerepel a felhozott kivételnél, akkor a PL/SQL motor végrehajtja a „WHEN OTHERS” részt (ha van). Ez minden kivételre jellemző.
- A kivétel végrehajtása után az alkatrészvezérlés kikerül az aktuális blokkból.
- Egy blokkhoz csak egy kivételrész hajtható végre futásidőben. A végrehajtás után a vezérlő kihagyja a fennmaradó kivételkezelési részt, és kilép az aktuális blokkból.
Jegyzet: A WHEN OTHERS-nek mindig a sorozat utolsó helyén kell lennie. A WHEN OTHERS után található kivételkezelő rész soha nem kerül végrehajtásra, mivel a vezérlő kilép a blokkból a WHEN OTHERS végrehajtása után.
A kivételek típusai
Kétféle kivétel létezik Pl/SQL.
- Előre meghatározott kivételek
- Felhasználó által meghatározott kivétel
Előre meghatározott kivételek
Oracle előre meghatározott néhány gyakori kivételt. Ezek a kivételek egyedi kivételnévvel és hibaszámmal rendelkeznek. Ezek a kivételek már meghatározva vannak a „STANDARD” csomagban Oracle. A kódban közvetlenül használhatjuk ezeket az előre meghatározott kivételneveket a kezelésükhöz.
Az alábbiakban felsoroljuk a néhány előre meghatározott kivételt
kivétel | Hibakód | Kivétel oka |
---|---|---|
ACCESS_INTO_NULL | ORA-06530 | Rendeljen értéket az inicializálatlan objektumok attribútumaihoz |
CASE_NOT_FOUND | ORA-06592 | A CASE utasításban a WHEN záradék egyike sem teljesül, és nincs megadva az ELSE záradék sem |
COLLECTION_IS_NULL | ORA-06531 | Gyűjteményi módszerek használata (kivéve EXISTS) vagy gyűjteményattribútumok elérése inicializálatlan gyűjteményekben |
CURSOR_ALREADY_OPEN | ORA-06511 | Megpróbálja megnyitni a kurzor amely már nyitva van |
DUP_VAL_ON_INDEX | ORA-00001 | Ismétlődő érték tárolása egy egyedi index által korlátozott adatbázisoszlopban |
INVALID_CURSOR | ORA-01001 | Illegális kurzorműveletek, mint például a megnyitatlan kurzor bezárása |
ÉRVÉNYTELEN SZÁM | ORA-01722 | A karakter számmá átalakítása érvénytelen számkarakter miatt nem sikerült |
NEM TALÁLHATÓ ADAT | ORA-01403 | Amikor az INTO záradékot tartalmazó "SELECT" utasítás nem kér le sorokat. |
ROW_MISMATCH | ORA-06504 | Ha a kurzorváltozó adattípusa nem kompatibilis a kurzor tényleges visszatérési típusával |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Gyűjtemény hivatkozása a gyűjtemény méreténél nagyobb indexszámmal |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Gyűjtemény olyan indexszámmal történő hivatkozása, amely kívül esik a törvényes tartományon (pl.: -1) |
TOO_MANY_ROWS | ORA-01422 | Amikor egy INTO záradékkal rendelkező 'SELECT' utasítás egynél több sort ad vissza |
VALUE_ERROR | ORA-06502 | Aritmetikai vagy méretkorlátozási hiba (pl.: érték hozzárendelése egy olyan változóhoz, amely nagyobb, mint a változó mérete) |
ZERO_DIVIDE | ORA-01476 | egy szám elosztása "0"-val |
Felhasználó által meghatározott kivétel
In Oracle, a fent előre meghatározott kivételektől eltekintve a programozó létrehozhat saját kivételt és kezelheti azokat. Alprogram szinten hozhatók létre a deklarációs részben. Ezek a kivételek csak abban az alprogramban láthatók. A csomagspecifikációban meghatározott kivétel nyilvános kivétel, és mindenhol látható, ahol a csomag elérhető.
Syntax: Alprogram szinten
DECLARE <exception_name> EXCEPTION; BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> END;
- A fenti szintaxisban a „kivétel_neve” változó „EXCEPTION” típusúként van definiálva.
- Ez hasonló módon használható előre meghatározott kivételként.
Syntax:Csomag specifikáció szinten
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- A fenti szintaxisban az 'exception_name' változó 'EXCEPTION' típusként van definiálva a csomag specifikációjában. .
- Ez mindenhol használható az adatbázisban, ahol a 'package_name' csomag meghívható.
PL/SQL emelés kivétel
Az összes előre meghatározott kivétel implicit módon megjelenik a hiba előfordulásakor. De a felhasználó által meghatározott kivételeket kifejezetten fel kell vetni. Ez a „RAISE” kulcsszó használatával érhető el. Ez az alábbiakban felsorolt módok bármelyikével használható.
Ha a 'RAISE'-t külön használjuk a programban, akkor a már felvetett kivételt továbbítja a szülőblokknak. Csak kivételblokkban használható az alábbiak szerint.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
Szintaxis magyarázata:
- A fenti szintaxisban a RAISE kulcsszót használjuk a kivételkezelő blokkban.
- Amikor a program „kivétel_neve” kivétellel találkozik, a kivétel kezelve lesz, és a szokásos módon befejeződik
- De a kivételkezelő részben a „RAISE” kulcsszó ezt a kivételt továbbítja a szülőprogramnak.
Jegyzet: Miközben a kivételt a szülőblokkra emeli, a felvett kivételnek a szülőblokknál is láthatónak kell lennie, különben az oracle hibát dob.
- A 'RAISE' kulcsszót és a kivétel nevét használhatjuk az adott felhasználó által meghatározott/előre definiált kivétel felemelésére. Ez mind a végrehajtási részben, mind a kivételkezelési részben használható a kivétel előidézésére.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Szintaxis magyarázata:
- A fenti szintaxisban a RAISE kulcsszó kerül felhasználásra a végrehajtási részben, amelyet a „kivétel_neve” kivétel követ.
- Ez a végrehajtás során felveti ezt a kivételt, és ezt kezelni vagy tovább kell emelni.
Példa 1: Ebben a példában látni fogjuk
- Hogyan jelentsük ki a kivételt
- Hogyan emeljük fel a bejelentett kivételt és
- Hogyan terjesztjük a főblokkba
DECLARE Sample_exception EXCEPTION; PROCEDURE nested_block IS BEGIN Dbms_output.put_line(‘Inside nested block’); Dbms_output.put_line(‘Raising sample_exception from nested block’); RAISE sample_exception; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in nested block. Raising to main block’); RAISE, END; BEGIN Dbms_output.put_line(‘Inside main block’); Dbms_output.put_line(‘Calling nested block’); Nested_block; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block'); END: /
Kód magyarázata:
- 2. kódsor: A 'sample_exception' változó KIVÉTEL típusú deklarálása.
- 3. kódsor: Nesd_block eljárás deklarálása.
- 6. kódsor: A „Beágyazott blokkon belül” utasítás kinyomtatása.
- 7. kódsor: A „Minta_kivétel kiemelése beágyazott blokkból” utasítás kinyomtatása.
- 8. kódsor: A kivétel emelése a 'RAISE sample_exception' használatával.
- 10. kódsor: Kivételkezelő a minta_exception kivételhez a beágyazott blokkban.
- 11. kódsor: A „Kivétel rögzítve a beágyazott blokkban” utasítás kinyomtatása. Felemelés a főblokkba'.
- 12. kódsor: A kivétel felemelése főblokkra (a főblokkra terjedése).
- 15. kódsor: A „Főblokk belsejében” utasítás kinyomtatása.
- 16. kódsor: A „Beágyazott blokk hívása” utasítás kinyomtatása.
- 17. kódsor: Nesd_block eljárás meghívása.
- 18. kódsor: kivétel
- 19. kódsor: A minta_exception kivételkezelője a fő blokkban.
- 20. kódsor: A „Kivétel rögzítve a fő blokkban” utasítás kinyomtatása.
Fontos tudnivalók a Kivételnél
- A függvényben a kivételnek mindig vagy értéket kell visszaadnia, vagy tovább kell emelnie a kivételt. más Oracle "A függvény érték nélkül visszaadott" hibát fog dobni futás közben.
- Tranzakcióvezérlő utasítások adhatók meg a kivételkezelő blokkban.
- Az SQLERRM és az SQLCODE azok a beépített függvények, amelyek kivételüzenetet és kódot adnak.
- Ha egy kivételt nem kezelnek, akkor alapértelmezés szerint az adott munkamenetben lévő összes aktív tranzakció visszaállításra kerül.
- RAISE_APPLICATION_ERROR (- , ) használható a RAISE helyett a hiba előidézésére felhasználói kóddal és üzenettel. A hibakódnak nagyobbnak kell lennie 20000-nél, és előtaggal kell rendelkeznie "-".
Összegzésként
E fejezet után. képesnek kell lennie arra, hogy a Pl. következő szempontjaiért dolgozzon SQL kivételek
- A kivételek kezelése
- Határozzon meg egy kivételt
- Emelje fel a kivételt
- Kivétel terjesztés