Co to jest obsługa wyjątków w PL / SQL?
Wyjątek występuje, gdy silnik PL / SQL napotyka instrukcję, której nie może wykonać z powodu błędu, który występuje w czasie wykonywania. Te błędy nie zostaną przechwycone w czasie kompilacji i dlatego trzeba je obsługiwać tylko w czasie wykonywania.
Na przykład, jeśli silnik PL / SQL otrzyma polecenie podzielenia dowolnej liczby przez „0”, silnik PL / SQL zgłosi to jako wyjątek. Wyjątek jest zgłaszany tylko w czasie wykonywania przez silnik PL / SQL.
Wyjątki zatrzymają dalsze wykonywanie programu, więc aby uniknąć takiego stanu, należy je przechwytywać i obsługiwać osobno. Ten proces jest nazywany obsługą wyjątków, w którym programista obsługuje wyjątek, który może wystąpić w czasie wykonywania.
W tym samouczku nauczysz się następujących tematów:
- Składnia obsługi wyjątków
- Rodzaje wyjątków
- Predefiniowane wyjątki
- Wyjątek zdefiniowany przez użytkownika
- Wyjątek podniesienia PL / SQL
- Ważne punkty do zapamiętania w Wyjątkach
Składnia obsługi wyjątków
Wyjątki są obsługiwane na poziomie bloku, tj. Raz, jeśli wystąpi jakikolwiek wyjątek w jakimkolwiek bloku, sterowanie wyjdzie z części wykonawczej tego bloku. Wyjątek będzie następnie obsługiwany w części tego bloku obsługującej wyjątki. Po obsłużeniu wyjątku nie jest możliwe ponowne wysłanie sterowania z powrotem do sekcji wykonawczej tego bloku.
Poniższa składnia wyjaśnia, jak przechwycić i obsłużyć wyjątek.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Objaśnienie składni:
- W powyższej składni blok obsługi wyjątków zawiera serię warunków WHEN do obsługi wyjątku.
- Po każdym warunku WHEN następuje nazwa wyjątku, która ma zostać zgłoszona w czasie wykonywania.
- Gdy jakikolwiek wyjątek zostanie zgłoszony w czasie wykonywania, silnik PL / SQL będzie szukał w części obsługi wyjątków dla tego konkretnego wyjątku. Rozpocznie się od pierwszej klauzuli „WHEN” i rozpocznie wyszukiwanie.
- Jeśli znalazł obsługę wyjątków dla wyjątku, który został zgłoszony, wykona tę konkretną część kodu obsługi.
- Jeśli żadna z klauzuli „KIEDY” nie występuje dla zgłoszonego wyjątku, silnik PL / SQL wykona część „KIEDY INNI” (jeśli jest obecna). Jest to wspólne dla wszystkich wyjątków.
- Po wykonaniu wyjątku kontrola części wyjdzie z bieżącego bloku.
- Tylko jedna część wyjątku może być wykonana dla bloku w czasie wykonywania. Po jego wykonaniu kontroler pominie pozostałą część obsługi wyjątków i wyjdzie z bieżącego bloku.
Uwaga: KIEDY INNE powinny zawsze znajdować się na ostatniej pozycji sekwencji. Część obsługi wyjątku obecna po KIEDY INNI nigdy nie zostanie wykonana, ponieważ sterowanie wyjdzie z bloku po wykonaniu KIEDY INNE.
Rodzaje wyjątków
Istnieją dwa typy wyjątków w Pl / SQL.
- Predefiniowane wyjątki
- Wyjątek zdefiniowany przez użytkownika
Predefiniowane wyjątki
Firma Oracle wstępnie zdefiniowała pewien typowy wyjątek. Te wyjątki mają unikalną nazwę wyjątku i numer błędu. Te wyjątki są już zdefiniowane w pakiecie „STANDARD” w Oracle. W kodzie możemy bezpośrednio używać tych predefiniowanych nazw wyjątków do ich obsługi.
Poniżej znajduje się kilka predefiniowanych wyjątków
Wyjątek | Kod błędu | Przyczyna wyjątku |
ACCESS_INTO_NULL | ORA-06530 | Przypisz wartość do atrybutów niezainicjowanych obiektów |
CASE_NOT_FOUND | ORA-06592 | Żadna z klauzul „WHEN” w instrukcji CASE nie jest spełniona i nie określono żadnej klauzuli „ELSE” |
COLLECTION_IS_NULL | ORA-06531 | Korzystanie z metod kolekcji (z wyjątkiem EXISTS) lub uzyskiwanie dostępu do atrybutów kolekcji w niezainicjowanych kolekcjach |
CURSOR_ALREADY_OPEN | ORA-06511 | Próbuję otworzyć kursor, który jest już otwarty |
DUP_VAL_ON_INDEX | ORA-00001 | Przechowywanie zduplikowanej wartości w kolumnie bazy danych, która jest ograniczona przez unikalny indeks |
INVALID_CURSOR | ORA-01001 | Niedozwolone operacje kursora, takie jak zamykanie nieotwartego kursora |
NIEPRAWIDŁOWY NUMER | ORA-01722 | Konwersja znaku na liczbę nie powiodła się z powodu nieprawidłowego znaku liczbowego |
NIE ZNALEZIONO DANYCH | ORA-01403 | Gdy instrukcja „SELECT” zawierająca klauzulę INTO nie pobiera żadnych wierszy. |
ROW_MISMATCH | ORA-06504 | Gdy typ danych zmiennej kursora jest niekompatybilny z rzeczywistym typem zwracanym przez kursor |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Odwoływanie się do kolekcji według numeru indeksu, który jest większy niż rozmiar kolekcji |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Odwoływanie się do kolekcji przez numer indeksu spoza dozwolonego zakresu (np .: -1) |
TOO_MANY_ROWS | ORA-01422 | Gdy instrukcja „SELECT” z klauzulą INTO zwraca więcej niż jeden wiersz |
VALUE_ERROR | ORA-06502 | Błąd arytmetyczny lub ograniczenia rozmiaru (np .: przypisanie wartości do zmiennej, która jest większa niż rozmiar zmiennej) |
ZERO_DIVIDE | ORA-01476 | Dzielenie liczby przez „0” |
Wyjątek zdefiniowany przez użytkownika
W Oracle, poza predefiniowanymi wyjątkami powyżej, programista może stworzyć własny wyjątek i obsłużyć go. Można je tworzyć na poziomie podprogramu w części deklaracji. Te wyjątki są widoczne tylko w tym podprogramie. Wyjątek zdefiniowany w specyfikacji pakietu jest wyjątkiem publicznym i jest widoczny wszędzie tam, gdzie pakiet jest dostępny. <
Składnia: na poziomie podprogramu
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- W powyższej składni zmienna „nazwa_wyjątku” jest zdefiniowana jako typ „WYJĄTEK”.
- Można tego użyć w podobny sposób, jak z predefiniowanego wyjątku.
Składnia: na poziomie specyfikacji pakietu
CREATE PACKAGEIS EXCEPTION;… END ;
- W powyższej składni zmienna „nazwa_wyjątku” jest zdefiniowana jako typ „WYJĄTEK” w specyfikacji pakietu
. - Można to wykorzystać w bazie danych wszędzie tam, gdzie można wywołać pakiet „nazwa_pakietu”.
Wyjątek podniesienia PL / SQL
Wszystkie wstępnie zdefiniowane wyjątki są zgłaszane niejawnie za każdym razem, gdy wystąpi błąd. Ale wyjątki zdefiniowane przez użytkownika muszą być jawnie zgłaszane. Można to osiągnąć za pomocą słowa kluczowego „RAISE”. Można to wykorzystać na dowolny ze sposobów wymienionych poniżej.
Jeśli 'RAISE' jest używane osobno w programie, to propaguje już podniesiony wyjątek do bloku nadrzędnego. Tylko w bloku wyjątków można używać, jak pokazano poniżej.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Objaśnienie składni:
- W powyższej składni słowo kluczowe RAISE jest używane w bloku obsługi wyjątków.
- Za każdym razem, gdy program napotyka wyjątek „nazwa_wyjątku”, wyjątek jest obsługiwany i zostanie zakończony normalnie
- Ale słowo kluczowe „RAISE” w części obsługi wyjątków będzie propagować ten szczególny wyjątek do programu nadrzędnego.
Uwaga: Podczas zgłaszania wyjątku do bloku nadrzędnego zgłaszany wyjątek powinien być również widoczny w bloku nadrzędnym, w przeciwnym razie oracle zgłosi błąd.
- Możemy użyć słowa kluczowego „RAISE”, po którym następuje nazwa wyjątku, aby zgłosić ten szczególny wyjątek zdefiniowany przez użytkownika / predefiniowany. Można tego użyć zarówno w części wykonawczej, jak iw części obsługi wyjątków, aby zgłosić wyjątek.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Objaśnienie składni:
- W powyższej składni słowo kluczowe RAISE jest używane w części wykonawczej, po którym występuje wyjątek „nazwa_wyjątku”.
- Spowoduje to podniesienie tego szczególnego wyjątku w momencie wykonania i należy się nim zająć lub dalej poruszać.
Przykład 1 : W tym przykładzie zobaczymy
- Jak zadeklarować wyjątek
- Jak zgłosić zgłoszony wyjątek i
- Jak propagować go do głównego bloku
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:/
Objaśnienie kodu:
- Linia kodu 2 : Zadeklarowanie zmiennej „sample_exception” jako typu EXCEPTION.
- Linia kodu 3 : Procedura deklarowania nested_block.
- Linia kodu 6 : Drukowanie instrukcji „Wewnątrz zagnieżdżonego bloku”.
- Linia kodu 7: Drukowanie instrukcji „Zgłaszanie wyjątku przykładowego z zagnieżdżonego bloku”.
- Linia kodu 8: zgłaszanie wyjątku za pomocą „RAISE sample_exception”.
- Wiersz kodu 10: Procedura obsługi wyjątku dla wyjątku sample_exception w zagnieżdżonym bloku.
- Linia kodu 11: Drukowanie instrukcji „Wyjątek przechwycony w zagnieżdżonym bloku. Podnoszenie do głównego bloku ”.
- Linia kodu 12: Zgłoszenie wyjątku do bloku głównego (propagacja do bloku głównego).
- Linia kodu 15: Drukowanie instrukcji „Wewnątrz bloku głównego”.
- Linia kodu 16: Drukowanie instrukcji „Wywołanie bloku zagnieżdżonego”.
- Linia kodu 17: Wywołanie procedury nested_block.
- Linia kodu 19: procedura obsługi wyjątków dla sample_exception w głównym bloku.
- Linia kodu 20: Drukowanie instrukcji „Wyjątek przechwycony w głównym bloku”.
Ważne punkty do zapamiętania w Wyjątkach
- W funkcji wyjątek powinien zawsze zwracać wartość lub dalej podnosić wyjątek. w przeciwnym razie Oracle zgłosi błąd „Funkcja zwrócona bez wartości” w czasie wykonywania.
- Instrukcje kontroli transakcji można podawać w bloku obsługi wyjątków.
- SQLERRM i SQLCODE to wbudowane funkcje, które podają komunikat i kod wyjątku.
- Jeśli wyjątek nie zostanie obsłużony, domyślnie wszystkie aktywne transakcje w tej sesji zostaną wycofane.
- RAISE_APPLICATION_ERROR (-
, ) może być użyte zamiast RAISE, aby zgłosić błąd wraz z kodem użytkownika i komunikatem. Kod błędu powinien być większy niż 20000 i poprzedzony znakiem „-”.
Podsumowanie
Po tym rozdziale. powinieneś być w stanie pracować nad następującymi aspektami wyjątków Pl SQL
- Obsługa wyjątków
- Zdefiniuj wyjątek
- Podnieś wyjątek
- Propagacja wyjątków