Jeśli jesteś programistą, być może znasz koncepcję obsługi wyjątków jako integralnej części każdego języka programowania. 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 dowiemy się w szczególności o obsłudze wyjątków w PL/SQL.
Poniżej znajdują się tematy poruszane w tym artykule:
- Co to jest wyjątek?
- Składnia obsługi wyjątków
- Rodzaje wyjątków
- Zdefiniowane przez system
- Nazwane wyjątki systemowe
- Nienazwane wyjątki systemowe
- Zdefiniowane przez użytkownika
- Kroki deklarowania funkcji zdefiniowanych przez użytkownika
- Przykłady funkcji zdefiniowanych przez użytkownika
- Zdefiniowane przez system
Co to jest wyjątek?
Wszelkie nienormalne warunki lub zdarzenia, które przerywają normalny przepływ instrukcji naszego 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 <declarations section> BEGIN <executable command(s)> EXCEPTION <exception handling goes here > WHEN exception1 THEN exception1-handling-statements WHEN exception2 THEN exception2-handling-statements WHEN exception3 THEN exception3-handling-statements ........ WHEN others THEN exception3-handling-statements END;
Tutaj możemy wymienić tyle wyjątków, ile chcemy obsłużyć. Domyślny wyjątek będzie obsługiwany za pomocą opcji „GDY inni THEN”
Przykład obsługi wyjątków w PL/SQL
Poniższy program wyświetla imię i nazwisko oraz adres ucznia, któremu nadawany jest identyfikator. Ponieważ w naszej bazie danych nie ma ucznia o wartości ID 8, program zgłasza wyjątek czasu wykonywania NO_DATA_FOUND, który jest przechwycony 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 ('Location: ' || s_loc); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('No such student!'); WHEN others THEN dbms_output.put_line('Oops, Error!'); END;
Wyjście
No such student! PL/SQL procedure successfully completed.
Tutaj możemy wymienić tyle wyjątków, ile chcemy obsłużyć. Domyślny wyjątek będzie obsługiwany za pomocą „GDY inni TO ’
Rodzaje wyjątków w PL/SQL
- Zdefiniowany system
- Użytkownik sprzeciwił się
Następnie w tym artykule na temat obsługi wyjątków w PL/SQL, omówimy szczegółowo oba te typy.
Zdefiniowany przez system
Zdefiniowane i utrzymywane niejawnie przez serwer Oracle, te wyjątki są głównie zdefiniowane w pakiecie Oracle Standard. Za każdym razem, gdy w programie wystąpi wyjątek, serwer Oracle dopasowuje i identyfikuje odpowiedni wyjątek z dostępnego zestawu wyjątków dostępnego w standardowym pakiecie oracle. Zasadniczo te wyjątki są predefiniowane w PL/SQL, które są zgłaszane GDY dana reguła bazy danych jest naruszona .
Wyjątki zdefiniowane przez system są dalej podzielone na dwie kategorie:
- Nazwane wyjątki systemowe
- Nienazwane wyjątki systemowe
Wyjątki systemu nazwanego
Nazwane wyjątki PL/SQL są nazwane 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. Poniższa tabela zawiera kilka ważnych predefiniowanych wyjątków −
Wyjątek | Błąd Oracle | SQLCODE | Opis |
ACCESS_INTO_NULL | 06530 | -6530 | Jest wywoływany, gdy obiektowi zerowemu jest automatycznie przypisywana wartość. |
CASE_NOT_FOUND | 06592 | -6592 | Jest wywoływany, gdy żaden z wyborów w klauzuli WHEN instrukcji CASE nie jest zaznaczony i nie ma klauzuli ELSE. |
COLLECTION_IS_NULL | 06531 | -6531 | Jest wywoływany, gdy program próbuje zastosować metody zbierania 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_INDEX | 00001 | -1 | Jest wywoływany, gdy zduplikowane wartości mają być przechowywane w kolumnie z unikalnym indeksem. |
INVALID_CURSOR | 01001 | -1001 | Jest wywoływany, gdy podejmowane są próby wykonania niedozwolonej operacji kursora, takiej jak zamknięcie nieotwartego kursora. |
INVALID_NUMBER | 01722 | -1722 | Jest wywoływany, gdy konwersja ciągu znaków na liczbę nie powiedzie się, ponieważ ciąg nie reprezentuje prawidłowej liczby. |
LOGIN_DENIED | 01017 | -1017 | Jest wywoływany, gdy program próbuje zalogować się do bazy danych przy użyciu nieprawidłowej nazwy użytkownika lub hasła. |
NO_DATA_FOUND | 01403 | +100 | Jest wywoływany, gdy instrukcja SELECT INTO nie zwraca żadnych wierszy. |
NOT_LOGGED_ON | 01012 | -1012 | Jest wywoływany, gdy wywołanie bazy danych jest wykonywane bez połączenia z bazą danych. |
PROGRAM_ERROR | 06501 | -6501 | Wywołuje się, gdy PL/SQL ma wewnętrzny problem. |
ROWTYPE_MISMATCH | 06504 | -6504 | Jest wywoływany, gdy kursor pobiera wartość ze zmiennej o niezgodnym typie danych. |
SELF_IS_NULL | 30625 | -30625 | Jest wywoływany, gdy wywoływana jest metoda członkowska, ale instancja typu obiektu nie została zainicjowana. |
STORAGE_ERROR | 06500 | -6500 | Jest wywoływany, gdy PL/SQL zabrakło pamięci lub pamięć została uszkodzona. |
TOO_MANY_ROWS | 01422 | -1422 | Jest wywoływany, gdy instrukcja SELECT INTO zwraca więcej niż jeden wiersz. |
VALUE_ERROR | 06502 | -6502 | Jest wywoływany, gdy wystąpi błąd arytmetyki, konwersji, obcięcia lub ograniczenia rozmiaru. |
ZERO_DIVIDE | 01476 | 1476 | Jest wywoływany, gdy podjęto próbę podzielenia liczby przez zero. |
Przykład
CREATE OR REPLACE PROCEDURE add_new_student (student _id_in IN NUMBER, student _name_in IN VARCHAR2) IS BEGIN INSERT INTO student (student _id, student _name ) VALUES ( student _id_in, student _name_in ); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN raise_application_error (-20001,'Duplicate student _id'); WHEN OTHERS THEN raise_application_error (-20002,'An error occurred.'); END;
Przechodząc dalej w tym artykule na temat 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, są nazywane nienazwanymi wyjątkami systemowymi. Te wyjątki nie występują często i są napisane z kodem i powiązanym komunikatem.
Istnieją zasadniczo dwa sposoby obsługi nienazwanych wyjątków systemowych:
1. Korzystanie z procedury obsługi wyjątków WHEN OTHERS
2. Powiązanie kodu wyjątku z nazwą i użycie go jako nazwanego wyjątku.
Niektóre kroki, które należy wykonać w przypadku nienazwanych wyjątków systemowych, to:
- Podnieś je bezwarunkowo.
- W przypadku, gdy nie są one obsługiwane w „GDY inni”, muszą być traktowane wyraźnie.
- Aby jawnie obsłużyć wyjątek, można je zadeklarować przy użyciu Pragma EXCEPTION_INIT i obsłużyć przez odwołanie do nazwy wyjątku zdefiniowanej przez użytkownika w sekcji wyjątku.
Przykład obsługi nienazwanych wyjątków przy użyciu Pragmy EXCEPTION_INIT znajduje się w dalszej części artykułu. Przechodząc dalej w tym artykule na temat obsługi wyjątków w PL/SQL, pozwól nam zrozumieć wyjątki zdefiniowane przez użytkownika.
Zdefiniowane przez użytkownika
Podobnie jak wszystkie inne języki programowania, Oracle umożliwia również zadeklarowanie implementacji reklam własnych wyjątków. W przeciwieństwie do wyjątków zdefiniowanych przez system, te wyjątki są zgłaszane w sposób jawny 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ą typu danych EXCEPTION w naszym kodzie i podnosząc ją jawnie w naszym programie za pomocą instrukcji RAISE.
- Korzystanie z funkcji PRAGMA EXCEPTION_INIT
Możemy zdefiniować niezdefiniowany wcześniej numer błędu za pomocą zmiennej typu danych EXCEPTION
- Korzystanie z metody RAISE_APPLICATION_ERROR
Korzystając z tej metody, możemy zadeklarować wyjątek zdefiniowany przez użytkownika z naszym własnym, dostosowanym numerem błędu i komunikatem.
Do tej pory mogłeś mieć ogólny pomysł na sposoby, w jakie możemy podnieść wyjątki zdefiniowane przez użytkownika w PL/SQL. Dowiemy się o każdej z wyżej wymienionych metod wraz z przykładami w dalszej części tego artykułu na temat obsługi wyjątków w PL/SQL.
W dalszej części tego artykułu przejdźmy do demonstracji obsługi wyjątków zdefiniowanych przez użytkownika.
Wykazanie wyjątków zdefiniowanych przez użytkownika
Kontynuując ten artykuł na temat obsługi wyjątków w PL/SQL, pozwól nam zrozumieć, jak używać zmiennej typu EXCEPTION.
Korzystanie ze zmiennej typu WYJĄTEK
Proces deklarowania wyjątku zdefiniowanego przez użytkownika jest podzielony na trzy części, a te 3 części to:
- Zadeklaruj typ danych wyjątku zmiennej
- Zgłoś wyjątek
- Obsługuj wyjątek
Napiszmy kod, aby szczegółowo zademonstrować powyższe kroki.
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
W powyższym bloku deklaracji mamy cztery zmienne, z których pierwsze trzy to zmienne typu danych o normalnej liczbie, a czwarta, czyli ex_DivZero, to specjalna zmienna typu danych wyjątku. Czwarty to wyjątek zdefiniowany przez użytkownika.
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
Powyższa część wykonania tego anonimowego bloku zacznie działać tylko wtedy, gdy dzielnik będzie równy 0. Jeśli dzielnik ma wartość zero, tak jak w naszym przypadku, zostanie zgłoszony błąd a kontrola programu pominie wszystkie następne kroki i będzie szukać pasującego programu obsługi wyjątków. W przypadku, gdy znajdzie jakikolwiek inny, wykona odpowiednią akcję, w przeciwnym razie albo zakończy działanie programu, albo wyświetli nieobsługiwany błąd zdefiniowany przez system.
EXCEPTION WHEN ex_DivZero THEN DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);
To obsługa wyjątków. Gdy tylko użytkownik wprowadzi dzielnik jako 0, wyświetlony zostanie powyższy ciąg wiadomości.
Kod końcowy:
DECLARE 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 (‘Result = ‘ || var_result); BEGIN IF var_divisor =0 THEN RAISE ex-DivZero; END IF; Var_result := var_dividend/var_divisor; DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result); END;
Przechodząc dalej w tym artykule na temat obsługi wyjątków w PL/SQL, pozwól nam zrozumieć, jak używać metody PRAGMA_EXCEPTION_INIT.
Korzystanie z funkcji PRAGMA EXCEPTION_INIT
W funkcji PRAGMA EXCEPTION_INIT nazwa wyjątku jest powiązana z numerem błędu Oracle. Ta nazwa może być używana 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(exception_name, -Oracle_error_number);
Przykład
DECLARE deadlock_detected EXCEPTION; PRAGMA EXCEPTION_INIT(deadlock_detected, -60); BEGIN NULL; -- Some operation that causes an ORA-00060 error EXCEPTION WHEN deadlock_detected THEN NULL; -- handle the error END;
Pragma EXCEPTION_INIT mówi kompilatorowi, aby skojarzył nazwę wyjątku z numerem błędu Oracle, jak wspomniano wcześniej. Pozwala odwoływać się do dowolnego wyjątku wewnętrznego według nazwy i napisać dla niego określoną procedurę obsługi. Kiedy zobaczysz stos błędów lub sekwencję komunikatów o błędach, ten na górze jest tym, który można przechwycić i obsłużyć.
Kontynuując ten artykuł 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 domyślnych ciągów błędów, które są wyświetlane przez Oracle po napotkaniu błędu. Procedura RAISE_APPLICATION_ERROR znajduje się w pakiecie DBMS_STANDARD
Składnia
raise_application_error (error_number, message [, {TRUE | FALSE}]);
Przykład
/* A trigger trg_emp_detail_chk is created.*/ CREATE OR REPLACE TRIGGER trg_emp_detail_chk /* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/ Before UPDATE ON employees DECLARE permission_denied EXCEPTION; BEGIN /*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/ IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!'); /* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter with a default text stating that the user is not authorized to do any modification in the weekends. */ END IF; END;
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 zastosuj metody wyjaśnione w tym artykule.
Jeśli chcesz szkolić się w tej technologii od profesjonalistów, możesz wybrać ustrukturyzowane szkolenie od edureka! Zapoznaj się z tym szkoleniem certyfikacyjnym MySQL DBA firmy Edureka, zaufanej firmy zajmującej się edukacją online z siecią ponad 250 000 zadowolonych uczniów na całym świecie. Ten kurs uczy podstawowych koncepcji i zaawansowanych narzędzi i technik zarządzania danymi i administrowania bazą danych MySQL. Obejmuje praktyczną naukę takich pojęć, jak MySQL Workbench, MySQL Server, modelowanie danych, 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 oraz zarządzać nią dane.
Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy tego artykułu „Obsługa wyjątków w PL/SQL”, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.