Database
 sql >> Baza danych >  >> RDS >> Database

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

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

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&nbsp; 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 5 bardzo często zapytań SQL projektowe błędy, których należy unikać za wszelką cenę

  2. Biblioteka SQLskills Wait Types pokazuje teraz dane SentryOne

  3. Nowa funkcja BYOC – wstrzymywanie i wznawianie klastrów

  4. Planowanie miejsca na dysku dla baz danych

  5. Ogłaszamy ogólną dostępność SQL Compliance Manager 5.9