Dowiedz się, jak obsługiwać wyjątki w PL / SQL



Ten artykuł jest obszernym przewodnikiem po tym, jak przeprowadzić obsługę wyjątków w PL / SQL, omawiając różne typy wyjątków oferowanych w PL / SQL.

Jeśli jesteś programistą, możesz być zaznajomiony z koncepcją obsługi wyjątków, która jest integralną częścią każdego . Ponieważ błędy są nieuniknione i nawet najmądrzejsi z nas mogą popełniać błędy podczas pisania kodu, musimy wiedzieć, jak sobie z nimi radzić. W tym artykule nauczymy się szczególnie obsługi wyjątków w PL / SQL.

Obsługa wyjątków SQL w PL / SQL-EdurekaPoniżej znajdują się tematy poruszone w tym artykule:





Co to jest wyjątek?

Każdy nienormalny stan lub zdarzenie, które przerywa normalny przepływ naszych instrukcji programu w czasie wykonywania lub w prostych słowach wyjątek jest błędem.

Składnia obsługi wyjątków w PL / SQL

DECLARE BEGIN EXCEPTION WHEN wyjątek1 THEN wyjątek1 instrukcje obsługi WHEN wyjątek2 THEN wyjątek2 instrukcje obsługi WHEN wyjątek3 THEN wyjątek3 instrukcje obsługi ........ WHEN others THEN wyjątek3 instrukcje obsługi END

Tutaj możemy wymienić tyle wyjątków, ile chcemy obsłużyć. Domyślny wyjątek zostanie obsłużony za pomocą opcji „KIEDY inni TO”



Przykład obsługi wyjątków w PL / SQL

Poniższy program wyświetla nazwisko i adres studenta, któremu nadano legitymację. Ponieważ w naszej bazie danych nie ma studenta o identyfikatorze 8, program zgłasza wyjątek w czasie wykonywania NO_DATA_FOUND, który jest przechwytywany w bloku EXCEPTION.

DECLARE s_id studentS.id% type: = 8 s_name studentS.Name% type s_loc studentS.loc% type BEGIN SELECT name, loation INTO s_name, s_loc FROM Students WHERE id = s_id DBMS_OUTPUT.PUT_LINE ('Name:' || s_name) DBMS_OUTPUT .PUT_LINE ('Lokalizacja:' || s_loc) WYJĄTEK GDY no_data_found WTEDY dbms_output.put_line ('Nie ma takiego ucznia!') KIEDY inni TO dbms_output.put_line ('Ups, błąd!') KONIEC

Wynik

Nie ma takiego ucznia! Procedura PL / SQL zakończona pomyślnie.

Tutaj możemy wymienić tyle wyjątków, ile chcemy obsłużyć. Domyślny wyjątek będzie obsługiwany za pomocą „ KIEDY inni WTEDY '

Rodzaje wyjątków w PL / SQL

  • Zdefiniowane w systemie
  • Użytkownik przeciwstawił się

Następnie w tym artykule na temat obsługi wyjątków w PL / SQL , omówmy szczegółowo oba te typy.



Zdefiniowane w systemie

Te wyjątki, zdefiniowane i utrzymywane w sposób dorozumiany przez serwer Oracle, są głównie zdefiniowane w pakiecie Oracle Standard. Ilekroć w programie wystąpi wyjątek, serwer Oracle dopasowuje i identyfikuje odpowiedni wyjątek z dostępnego zestawu wyjątków dostępnych w standardowym pakiecie Oracle. Zasadniczo te wyjątki są wstępnie zdefiniowane w PL / SQL który zostanie podniesiony GDY zostanie naruszona określona reguła bazy danych .

Plik Wyjątki zdefiniowane przez system są dalej podzielone na dwie kategorie:

  • Nazwane wyjątki systemowe
  • Nienazwane wyjątki systemowe

Nazwane wyjątki systemowe

Nazwane wyjątki PL / SQL to wymieniony w standardowym pakiecie PL / SQL , dlatego programista nie musi definiować wyjątków PL / SQL w swoim kodzie. PL / SQL zapewnia wiele predefiniowanych nazwanych wyjątków, które są wykonywane, gdy jakakolwiek reguła bazy danych zostanie naruszona przez program. W poniższej tabeli wymieniono kilka ważnych, predefiniowanych wyjątków i minusów

Wyjątek Błąd Oracle SQLCODE Opis
ACCESS_INTO_NULL06530-6530Jest podnoszony, gdy obiektowi null automatycznie przypisywana jest wartość.
CASE_NOT_FOUND06592-6592Jest podnoszony, gdy żaden z wyborów w klauzuli WHEN a Instrukcja CASE jest zaznaczona i nie ma klauzuli ELSE.
COLLECTION_IS_NULL06531-6531Jest wywoływany, gdy program próbuje zastosować metody kolekcji inne niż EXISTS do niezainicjowanej tabeli zagnieżdżonej lub zmiennej lub program próbuje przypisać wartości do elementów niezainicjowanej tabeli zagnieżdżonej lub zmiennej.
DUP_VAL_ON_INDEX00001-jedenJest podnoszony, gdy zduplikowane wartości mają być przechowywane w kolumnie z unikalnym indeksem.
INVALID_CURSOR01001-1001Jest zgłaszany, gdy podejmowane są próby wykonania operacji kursora, która jest niedozwolona, ​​na przykład zamknięcie nieotwartego kursora.
NIEPRAWIDŁOWY NUMER01722-1722Jest zgłaszany, gdy konwersja ciągu znaków na liczbę nie powiedzie się, ponieważ ciąg nie reprezentuje prawidłowej liczby.
LOGIN_DENIED01017-1017Jest wywoływany, gdy program próbuje zalogować się do bazy danych przy użyciu nieprawidłowej nazwy użytkownika lub hasła.
NIE ZNALEZIONO DANYCH01403+100Jest podnoszony, gdy instrukcja SELECT INTO nie zwraca żadnych wierszy.
NOT_LOGGED_ON01012-1012Jest wywoływany, gdy wywołanie bazy danych jest wykonywane bez połączenia z bazą danych.
PROGRAM_ERROR06501-6501Jest podnoszony, gdy PL / SQL ma wewnętrzny problem.
ROWTYPE_MISMATCH06504-6504Jest podnoszony, gdy kursor pobiera wartość w zmiennej o niezgodnym typie danych.
SELF_IS_NULL30625-30625Jest zgłaszany, gdy wywoływana jest metoda składowa, ale wystąpienie typu obiektu nie zostało zainicjowane.
STORAGE_ERROR06500-6500Jest zgłaszany, gdy PL / SQL zabrakło pamięci lub pamięć została uszkodzona.
TOO_MANY_ROWS01422-1422Jest zgłaszany, gdy instrukcja SELECT INTO zwraca więcej niż jeden wiersz.
VALUE_ERROR06502-6502Jest zgłaszany, gdy wystąpi błąd arytmetyczny, konwersji, obcięcia lub ograniczenia rozmiaru.
ZERO_DIVIDE014761476Jest podnoszony, gdy podejmowana jest próba podzielenia liczby przez zero.

Przykład

PROCEDURA TWORZENIA LUB WYMIANY add_new_student (student _id_in IN NUMBER, student _name_in IN VARCHAR2) BEGIN INSERT INTO student (student _id, student _name) VALUES (student _id_in, student _name_in) WYJĄTEK GDY DUP_VAL_ON_INDEX THEN_publication (-2000) ) KIEDY INNE TO raise_application_error (-20002, 'Wystąpił błąd.') KONIEC

Przechodząc dalej w tym artykule dotyczącym obsługi wyjątków w PL / SQL, pozwól nam zrozumieć, czym są nienazwane wyjątki systemowe.

Nienazwane wyjątki systemowe

Wyjątki systemowe, dla których Oracle nie ma nazwy, nazywane są nienazwanymi wyjątkami systemowymi. Te wyjątki nie występują często i są napisane za pomocą kodu i powiązanego komunikatu.

Zasadniczo istnieją dwa sposoby obsługi nienazwanych wyjątków systemowych:

1. Korzystanie z procedury obsługi wyjątków KIEDY INNE

2. Powiązanie kodu wyjątku z nazwą i używanie jej jako nazwanego wyjątku.

Oto niektóre kroki, jakie należy wykonać w przypadku nienazwanych wyjątków systemowych:

jak skopiować obiekt w java
  • Podnieście je niejawnie.
  • W przypadku, gdy nie są one rozpatrywane w sekcji „KIEDY inni”, należy to zrobić wyraźnie.
  • Aby obsłużyć wyjątek jawnie, można je zadeklarować za pomocą Pragma EXCEPTION_INIT i obsłużyć, odwołując się do nazwy wyjątku zdefiniowanej przez użytkownika w sekcji wyjątków.

Przykład obsługi nienazwanych wyjątków za pomocą Pragma EXCEPTION_INIT znajduje się w dalszej części artykułu. Przechodząc dalej w tym artykule dotyczącym obsługi wyjątków w PL / SQL, pozwól nam zrozumieć wyjątki zdefiniowane przez użytkownika.

Określony przez użytkownika

Podobnie jak wszystkie inne języki programowania, Oracle umożliwia również deklarowanie i wdrażanie własnych wyjątków. W przeciwieństwie do wyjątków zdefiniowanych przez system, te wyjątki są zgłaszane jawnie w bloku PL / SQL.

Kroki deklarowania wyjątków zdefiniowanych przez użytkownika w bazie danych Oracle

Możemy zdefiniować wyjątki zdefiniowane przez użytkownika w bazie danych Oracle na 3 sposoby:

  • Korzystanie ze zmiennej typu EXCEPTION

Tutaj możemy zadeklarować wyjątek zdefiniowany przez użytkownika, deklarując zmienną EXCEPTION typ danych w naszym kodzie i jawnie podnieś ją w naszym programie za pomocą instrukcji RAISE.

  • Korzystanie z funkcji PRAGMA EXCEPTION_INIT

Możemy zdefiniować niezdefiniowany numer błędu za pomocą zmiennej o typie danych EXCEPTION

role i obowiązki administratora systemu Linux
  • Korzystanie z metody RAISE_APPLICATION_ERROR

Korzystając z tej metody, możemy zadeklarować wyjątek zdefiniowany przez użytkownika z własnym niestandardowym numerem błędu i komunikatem.

Do tej pory mogłeś mieć ogólne pojęcie o sposobach, w jakie możemy wywoływać wyjątki zdefiniowane przez użytkownika w PL / SQL. Dowiemy się o każdej z wyżej wymienionych metod z przykładami w dalszej części artykułu na temat obsługi wyjątków w PL / SQL.

Następnie w tym artykule przejdźmy do demonstracji obsługi wyjątków zdefiniowanych przez użytkownika.

Demonstracja wyjątków zdefiniowanych przez użytkownika

Przechodząc dalej w tym artykule o obsłudze wyjątków w PL / SQL, zrozumiemy, jak używać zmiennej typu EXCEPTION.

Korzystanie ze zmiennej typu EXCEPTION

Proces deklarowania wyjątku zdefiniowanego przez użytkownika jest podzielony na trzy części, a te 3 części to:

  • Zadeklaruj zmienny wyjątek typu danych
  • Podnieś wyjątek
  • Obsłuż wyjątek

Napiszmy kod, który szczegółowo pokaże powyższe kroki.

ZADEKLAROWAĆ var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero WYJĄTEK

W powyższym bloku deklaracji mamy cztery zmienne, wśród których pierwsze trzy to zmienne o normalnym typie danych, a czwarta, czyli ex_DivZero, jest zmienną specjalnego typu wyjątku. Czwarty to wyjątek zdefiniowany przez użytkownika.

ZADEKLAROWAĆ var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero WYJĄTEK

Powyższa część wykonawcza tego anonimowego bloku zadziała tylko wtedy, gdy dzielnik będzie równy 0. Jeśli dzielnik jest równy zero, jak to jest w naszym przypadku, błąd zostanie podniesiony, a sterowanie programem pominie wszystkie następne kroki i będzie szukał odpowiedniej obsługi wyjątków. W przypadku, gdy znajdzie inny, wykona akcję odpowiednio, w przeciwnym razie albo zakończy program, albo wyświetli nieobsługiwany błąd zdefiniowany przez system.

WYJĄTEK, GDY ex_DivZero THEN DBMS_OUTPUT.PUT_LINE („BŁĄD, dzielnik nie może wynosić zero”)

To jest program obsługi wyjątków. Gdy tylko użytkownik wprowadzi dzielnik jako 0, pojawi się powyższy komunikat.

Kod końcowy:

ZADEKLAROWAĆ var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION BEGIN IF var_divisor = 0 THEN RAISE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('var_ININ) || = 0 WTEDY PODNIEŚ ex-DivZero KONIEC JEŻELI Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('Wynik =' || var_result) KONIEC

Przechodząc dalej w tym artykule o obsłudze wyjątków w PL / SQL, pozwól nam zrozumieć, jak używać metody PRAGMA_EXCEPTION_INIT.

Korzystanie z funkcji PRAGMA EXCEPTION_INIT

w PRAGMA EXCEPTION_INIT, nazwa wyjątku jest powiązana z numerem błędu Oracle. Tej nazwy można użyć podczas projektowania procedury obsługi wyjątków dla błędu.W przypadku dużych projektów z wieloma błędami zdefiniowanymi przez użytkownika, PRAGMA EXCEPTION_INIT jest najbardziej użyteczną i odpowiednią metodą.

Składnia:

PRAGMA EXCEPTION_INIT (nazwa_wyjątku, -Numer_błędu_Oracle)

Przykład

DECLARE deadlock_detected EXCEPTION PRAGMA EXCEPTION_INIT (deadlock_detected, -60) BEGIN NULL - jakaś operacja powodująca błąd ORA-00060 EXCEPTION WHEN deadlock_detected THEN NULL - obsłuż błąd END

PRAGMA EXCEPTION_INIT mówi kompilatorowi, aby skojarzył nazwę wyjątku z numerem błędu Oracle, jak wspomniano wcześniej. Pozwala odnieść się do dowolnego wewnętrznego wyjątku po nazwie i napisać dla niego określoną procedurę obsługi. Kiedy widzisz stos błędów lub sekwencję komunikatów o błędach, ten na górze jest tym, który może zostać przechwycony i obsłużony.

Przechodząc dalej w tym artykule na temat obsługi wyjątków w PL / SQL, pozwól nam zrozumieć, jak używać metody RAISE_APPLICATION_ERROR.

Korzystanie z metody RAISE_APPLICATION_ERROR

Jest to procedura wbudowana w oprogramowanie Oracle. Korzystając z tej procedury, możemy powiązać numer błędu z niestandardowym komunikatem o błędzie. Łącząc zarówno numer błędu, jak i niestandardowy komunikat o błędzie, można utworzyć ciąg błędu, który wygląda podobnie do tych domyślnych ciągów błędów, które są wyświetlane przez oracle w przypadku napotkania błędu. Procedura RAISE_APPLICATION_ERROR znajduje się w pakiecie DBMS_STANDARD

Składnia

podniesienie_application_error (numer_błędu, komunikat [, PRAWDA])

Przykład

/ * Trg_emp_detail_chk wyzwalacza jest tworzony. * / CREATE OR REPLACE TRIGGER trg_emp_detail_chk / * Czas wyzwalania jest zadeklarowany jako PRZED AKTUALIZACJĄ w tabeli EMPLOYEES. * / Przed AKTUALIZACJĄ NA pracownikach DEKLAROWAĆ odmowę uprawnień EXCEPTION / * Początek warunku IF dzień czasu systemowego to sobota lub niedziela lub nie. * / IF trim (TO_CHAR (sysdate, 'Day')) IN ('Saturday', 'Sunday') THEN raise_application_error (-20000, 'Nie masz uprawnień wszelkie zmiany w weekendy !! ') / * Procedura raise_application_error jest wywoływana z wartością pierwszego parametru równą -20000, a drugim parametrem z domyślnym tekstem informującym, że użytkownik nie ma uprawnień do dokonywania żadnych zmian w weekendy. * / KONIEC JEŚLI KONIEC

Na tym kończymy artykuł „Obsługa wyjątków w PL / SQL”. Mam nadzieję, że ten temat został dobrze zrozumiany i pomógł. Spróbuj napisać własne kody i zastosować metody wyjaśnione w tym artykule.

Jeśli chcesz przeszkolić profesjonalistów w zakresie tej technologii, możesz zdecydować się na zorganizowane szkolenie firmy edureka! Sprawdź to autorstwa Edureka, zaufanej firmy zajmującej się edukacją online, z siecią ponad 250 000 zadowolonych uczniów rozsianych po całym świecie. Ten kurs uczy podstawowych koncepcji oraz zaawansowanych narzędzi i technik zarządzania danymi i administrowania bazą danych MySQL. Obejmuje praktyczną naukę takich pojęć, jak MySQL Workbench, MySQL Server, Data Modeling, MySQL Connector, Database Design, MySQL Command line, MySQL Functions itp. Po zakończeniu szkolenia będziesz mógł tworzyć i administrować własną bazą danych MySQL i zarządzać nią dane.

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy w tym artykule „Obsługa wyjątków w PL / SQL”, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.