Wenn Sie Programmierer sind, sind Sie vielleicht mit dem Konzept der Ausnahmebehandlung vertraut, das ein integraler Bestandteil jeder Programmiersprache ist. Da Fehler unvermeidlich sind und selbst die Klügsten von uns beim Schreiben von Code Fehler machen können, müssen wir damit vertraut sein, wie man damit umgeht. In diesem Artikel lernen wir insbesondere die Ausnahmebehandlung in PL/SQL kennen.
Im Folgenden finden Sie die in diesem Artikel behandelten Themen:
- Was ist eine Ausnahme?
- Syntax der Ausnahmebehandlung
- Arten von Ausnahmen
- Systemdefiniert
- Benannte Systemausnahmen
- Unbenannte Systemausnahmen
- Benutzerdefiniert
- Schritte zum Deklarieren benutzerdefinierter Funktionen
- Beispiele für benutzerdefinierte Funktionen
- Systemdefiniert
Was ist eine Ausnahme?
Jede anormale Bedingung oder jedes Ereignis, das den normalen Ablauf unserer Programmanweisungen zur Laufzeit unterbricht oder in einfachen Worten eine Ausnahme darstellt, ist ein Fehler.
Syntax der Ausnahmebehandlung in 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;
Hier können wir so viele Ausnahmen auflisten, wie wir behandeln möchten. Die Standardausnahme wird mit „WHEN other THEN“ behandelt
Beispiel für Ausnahmebehandlung in PL/SQL
Das folgende Programm zeigt den Namen und die Adresse eines Studenten an, dessen Ausweis angegeben ist. Da es in unserer Datenbank keinen Schüler mit dem ID-Wert 8 gibt, löst das Programm die Laufzeitausnahme NO_DATA_FOUND aus, die im EXCEPTION-Block erfasst wird.
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;
Ausgabe
No such student! PL/SQL procedure successfully completed.
Hier können wir so viele Ausnahmen auflisten, wie wir behandeln möchten. Die Standardausnahme wird mit „WHEN other THEN behandelt ’
Arten von Ausnahmen in PL/SQL
- Systemdefiniert
- Benutzer abgelehnt
Lassen Sie uns als Nächstes in diesem Artikel über die Ausnahmebehandlung in PL/SQL diese beiden Typen im Detail besprechen.
Systemdefiniert
Diese Ausnahmen werden implizit vom Oracle-Server definiert und verwaltet und sind hauptsächlich im Oracle-Standardpaket definiert. Immer wenn eine Ausnahme innerhalb des Programms auftritt, vergleicht und identifiziert der Oracle-Server die entsprechende Ausnahme aus dem verfügbaren Satz von Ausnahmen, die im Oracle-Standardpaket verfügbar sind. Grundsätzlich sind diese Ausnahmen in PL/SQL vordefiniert, die ausgelöst werden WENN eine bestimmte Datenbankregel verletzt wird .
Die systemdefinierten Ausnahmen werden weiter in zwei Kategorien unterteilt:
- Benannte Systemausnahmen
- Unbenannte Systemausnahmen
Benannte Systemausnahmen
Die benannten PL/SQL-Ausnahmen sind im Standardpaket von PL/SQL benannt , daher muss der Entwickler die PL/SQL-Ausnahmen nicht in seinem Code definieren. PL/SQL bietet viele vordefinierte benannte Ausnahmen, die ausgeführt werden, wenn eine Datenbankregel von einem Programm verletzt wird. Die folgende Tabelle listet einige der wichtigen vordefinierten Ausnahmen auf −
Ausnahme | Oracle-Fehler | SQLCODE | Beschreibung |
ACCESS_INTO_NULL | 06530 | -6530 | Er wird ausgelöst, wenn einem Nullobjekt automatisch ein Wert zugewiesen wird. |
CASE_NOT_FOUND | 06592 | -6592 | Es wird ausgelöst, wenn keine der Auswahlmöglichkeiten in der WHEN-Klausel einer CASE-Anweisung ausgewählt ist und es keine ELSE-Klausel gibt. |
COLLECTION_IS_NULL | 06531 | -6531 | Er wird ausgelöst, wenn ein Programm versucht, andere Sammlungsmethoden als EXISTS auf eine nicht initialisierte verschachtelte Tabelle oder varray anzuwenden, oder das Programm versucht, den Elementen einer nicht initialisierten verschachtelten Tabelle oder varray Werte zuzuweisen. |
DUP_VAL_ON_INDEX | 00001 | -1 | Er wird ausgelöst, wenn versucht wird, doppelte Werte in einer Spalte mit einem eindeutigen Index zu speichern. |
INVALID_CURSOR | 01001 | -1001 | Er wird ausgelöst, wenn versucht wird, eine unzulässige Cursoroperation durchzuführen, wie z. B. das Schließen eines ungeöffneten Cursors. |
INVALID_NUMBER | 01722 | -1722 | Er wird ausgelöst, wenn die Konvertierung einer Zeichenfolge in eine Zahl fehlschlägt, weil die Zeichenfolge keine gültige Zahl darstellt. |
LOGIN_DENIED | 01017 | -1017 | Er wird ausgelöst, wenn ein Programm versucht, sich mit einem ungültigen Benutzernamen oder Passwort bei der Datenbank anzumelden. |
NO_DATA_FOUND | 01403 | +100 | Er wird ausgelöst, wenn eine SELECT INTO-Anweisung keine Zeilen zurückgibt. |
NOT_LOGGED_ON | 01012 | -1012 | Er wird ausgelöst, wenn ein Datenbankaufruf ausgegeben wird, ohne mit der Datenbank verbunden zu sein. |
PROGRAM_ERROR | 06501 | -6501 | Es wird ausgelöst, wenn PL/SQL ein internes Problem hat. |
ROWTYPE_MISMATCH | 06504 | -6504 | Er wird ausgelöst, wenn ein Cursor einen Wert in einer Variablen mit inkompatiblem Datentyp abruft. |
SELF_IS_NULL | 30625 | -30625 | Er wird ausgelöst, wenn eine Mitgliedsmethode aufgerufen wird, aber die Instanz des Objekttyps nicht initialisiert wurde. |
STORAGE_ERROR | 06500 | -6500 | Er wird ausgelöst, wenn PL/SQL der Speicher ausgeht oder der Speicher beschädigt wurde. |
TOO_MANY_ROWS | 01422 | -1422 | Er wird ausgelöst, wenn eine SELECT INTO-Anweisung mehr als eine Zeile zurückgibt. |
VALUE_ERROR | 06502 | -6502 | Er wird ausgelöst, wenn ein Arithmetik-, Konvertierungs-, Kürzungs- oder Größenbeschränkungsfehler auftritt. |
ZERO_DIVIDE | 01476 | 1476 | Er wird ausgelöst, wenn versucht wird, eine Zahl durch Null zu teilen. |
Beispiel
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;
Fahren Sie mit diesem Artikel zur Ausnahmebehandlung in PL/SQL fort und lassen Sie uns verstehen, was unbenannte Systemausnahmen sind.
Unbenannte Systemausnahmen
Die Systemausnahmen, für die Oracle keinen Namen hat, werden als unbenannte Systemausnahmen bezeichnet. Diese Ausnahmen treten nicht häufig auf und werden mit einem Code und einer zugehörigen Nachricht geschrieben.
Es gibt grundsätzlich zwei Möglichkeiten, unbenannte Systemausnahmen zu handhaben:
1. Verwenden des Ausnahmehandlers WHEN OTHERS
2. Zuordnen des Ausnahmecodes zu einem Namen und Verwenden als benannte Ausnahme.
Einige Schritte für unbenannte Systemausnahmen sind:
- Erhöhen Sie sie implizit.
- Falls sie nicht in „WHEN Others“ behandelt werden, müssen sie explizit behandelt werden.
- Um die Ausnahme explizit zu behandeln, können sie mit Pragma EXCEPTION_INIT deklariert und behandelt werden, indem auf den benutzerdefinierten Ausnahmenamen im Ausnahmeabschnitt verwiesen wird.
Ein Beispiel für die Behandlung unbenannter Ausnahmen mit Pragma EXCEPTION_INIT wird weiter unten in diesem Artikel bereitgestellt. Fahren Sie in diesem Artikel über die Ausnahmebehandlung in PL/SQL fort und lassen Sie uns die benutzerdefinierten Ausnahmen verstehen.
Benutzerdefiniert
Wie alle anderen Programmiersprachen erlaubt Ihnen auch Oracle, eigene Ausnahmen zu deklarieren und zu implementieren. Im Gegensatz zu systemdefinierten Ausnahmen werden diese Ausnahmen explizit im PL/SQL-Block ausgelöst.
Schritte zum Deklarieren benutzerdefinierter Ausnahmen in der Oracle-Datenbank
Wir können benutzerdefinierte Ausnahmen in der Oracle-Datenbank auf die folgenden 3 Arten definieren:
- Variable vom Typ AUSNAHME verwenden
Hier können wir eine benutzerdefinierte Ausnahme deklarieren, indem wir eine Variable vom Datentyp EXCEPTION in unserem Code deklarieren und sie explizit in unserem Programm mit der RAISE-Anweisung auslösen.
- Verwendung der PRAGMA EXCEPTION_INIT-Funktion
Wir können eine nicht vordefinierte Fehlernummer mit der Variablen vom EXCEPTION-Datentyp
definieren- Verwendung der RAISE_APPLICATION_ERROR-Methode
Mit dieser Methode können wir eine benutzerdefinierte Ausnahme mit unserer eigenen benutzerdefinierten Fehlernummer und Nachricht deklarieren.
Bis jetzt haben Sie vielleicht eine ungefähre Vorstellung davon, wie wir benutzerdefinierte Ausnahmen in PL/SQL auslösen können. Wir werden jede der oben genannten Methoden mit Beispielen weiter unten in diesem Artikel über die Ausnahmebehandlung in PL/SQL kennenlernen.
Lassen Sie uns als Nächstes in diesem Artikel mit den Demonstrationen der benutzerdefinierten Ausnahmebehandlung fortfahren.
Demonstration benutzerdefinierter Ausnahmen
Lassen Sie uns in diesem Artikel über die Ausnahmebehandlung in PL/SQL fortfahren und verstehen, wie die Variable vom Typ EXCEPTION verwendet wird.
Variable vom Typ AUSNAHME verwenden
Der Prozess des Deklarierens einer benutzerdefinierten Ausnahme ist in drei Teile unterteilt und diese 3 Teile sind:
- Deklarieren Sie einen variablen Ausnahmedatentyp
- Lösen Sie die Ausnahme
- Behandeln Sie die Ausnahme
Lassen Sie uns einen Code schreiben, um die obigen Schritte im Detail zu demonstrieren.
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
Im obigen Deklarationsblock haben wir vier Variablen, von denen die ersten drei normale Zahlen-Datentyp-Variablen sind und die vierte, die ex_DivZero ist, die spezielle Ausnahme-Datentyp-Variable ist. Die vierte ist unsere benutzerdefinierte Ausnahme.
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
Der obige Ausführungsteil dieses anonymen Blocks tritt nur in Aktion, wenn der Divisor 0 ist. Wenn der Divisor null ist, wie es in unserem Fall der Fall ist, wird der Fehler ausgelöst und die Steuerung des Programms überspringt alle nächsten Schritte und sucht nach passenden Ausnahmebehandlern. Falls es andere findet, führt es die entsprechende Aktion aus, andernfalls beendet es entweder das Programm oder zeigt uns einen nicht behandelten systemdefinierten Fehler an.
EXCEPTION WHEN ex_DivZero THEN DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);
Dies ist der Ausnahmehandler. Sobald der Benutzer den Divisor als 0 eingibt, wird die obige Meldungszeichenfolge ausgegeben.
Endgültiger Code:
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;
Fahren Sie mit diesem Artikel zur Ausnahmebehandlung in PL/SQL fort und lassen Sie uns verstehen, wie die PRAGMA_EXCEPTION_INIT-Methode verwendet wird.
Verwendung der PRAGMA EXCEPTION_INIT-Funktion
In der Funktion PRAGMA EXCEPTION_INIT wird ein Ausnahmename mit einer Oracle-Fehlernummer verknüpft. Dieser Name kann beim Entwerfen des Ausnahmehandlers für den Fehler verwendet werden. Für große Projekte mit vielen benutzerdefinierten Fehlern ist PRAGMA EXCEPTION_INIT die nützlichste und geeignetste Methode.
Syntax:
PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);
Beispiel
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 weist den Compiler an, einen Ausnahmenamen mit einer Oracle-Fehlernummer zu verknüpfen, wie bereits erwähnt. Sie können damit auf jede interne Ausnahme namentlich verweisen und einen bestimmten Handler dafür schreiben. Wenn Sie einen Fehlerstapel oder eine Folge von Fehlermeldungen sehen, ist die oberste diejenige, die abgefangen und behandelt werden kann.
Lassen Sie uns in diesem Artikel zur Ausnahmebehandlung in PL/SQL weitermachen, wie die RAISE_APPLICATION_ERROR-Methode verwendet wird.
Verwendung der RAISE_APPLICATION_ERROR-Methode
Es ist ein Verfahren, das in die Oracle-Software integriert ist. Mit diesem Verfahren können wir eine Fehlernummer mit einer benutzerdefinierten Fehlermeldung verknüpfen. Durch Kombinieren sowohl der Fehlernummer als auch der benutzerdefinierten Fehlermeldung kann eine Fehlerzeichenfolge zusammengestellt werden, die ähnlich aussieht wie die Standardfehlerzeichenfolgen, die von Oracle angezeigt werden, wenn ein Fehler auftritt. Die RAISE_APPLICATION_ERROR-Prozedur befindet sich im DBMS_STANDARD-Paket
Syntax
raise_application_error (error_number, message [, {TRUE | FALSE}]);
Beispiel
/* 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;
Damit beenden wir diesen Artikel zum Thema „Ausnahmebehandlung in PL/SQL“. Ich hoffe, dieses Thema ist gut verstanden und hat Ihnen geholfen. Versuchen Sie, Ihre eigenen Codes zu schreiben, und integrieren Sie die in diesem Artikel beschriebenen Methoden.
Wenn Sie sich von Fachleuten zu dieser Technologie schulen lassen möchten, können Sie sich für eine strukturierte Schulung von edureka entscheiden! Sehen Sie sich diese MySQL-DBA-Zertifizierungsschulung von Edureka an, einem vertrauenswürdigen Online-Lernunternehmen mit einem Netzwerk von mehr als 250.000 zufriedenen Lernenden auf der ganzen Welt. Dieser Kurs schult Sie in den Kernkonzepten und fortgeschrittenen Tools und Techniken zur Verwaltung von Daten und zur Verwaltung der MySQL-Datenbank. Es umfasst praktisches Lernen zu Konzepten wie MySQL Workbench, MySQL Server, Datenmodellierung, MySQL Connector, Datenbankdesign, MySQL-Befehlszeile, MySQL-Funktionen usw. Am Ende der Schulung sind Sie in der Lage, Ihre eigene MySQL-Datenbank zu erstellen, zu verwalten und zu verwalten Daten.
Haben Sie eine Frage an uns? Bitte erwähnen Sie es im Kommentarbereich dieses Artikels „Ausnahmebehandlung in PL/SQL“ und wir werden uns so schnell wie möglich bei Ihnen melden.