Database
 sql >> Datenbank >  >> RDS >> Database

Erfahren Sie, wie Sie Ausnahmen in PL/SQL behandeln

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

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