Ausnahmen

Werbung
Ausnahmebehandlung mit PL/SQL
• Was ist eine Ausnahme?
– Anzeige von Fehlern
Ausnahmebehandlung
• Wie werden sie angezeigt?
– Ein Oracle error erscheint.
– Die Anzeige ist explizit.
• Wie behandelt man es?
– Abfangen mit einem Programm.
– Weiterleiten an die rufende Umgebung.
Copyright © Oracle Corporation, 1998. All rights reserved.
23-2
Ausnahmebehandlung
Abfangen der
Ausnahme
Ausnahme ist
angezeigt
Ausnahme ist
abgefangen
Ausnahmetypen
Weiterleiten der
Ausnahme
DECLARE
DECLARE
BEGIN
BEGIN
EXCEPTION
EXCEPTION
END;
END;
Copyright © Oracle Corporation, 1998. All rights reserved.
• Vordefiniert in Oracle Server
• Nicht vordefiniert in
Oracle Server
Ausnahme ist
angezeigt
• Benutzerdefiniert
Copyright © Oracle Corporation, 1998. All rights reserved.
Ausnahme ist
nicht
abgefangen
23-4
Implizite
Anzeige
Explizite Anzeige
Ausnahme wird
weitergeleitet und die
Umgebung
23-3
}
Copyright © Oracle Corporation, 1998. All rights reserved.
Abfangen von Ausnahmen
Richtlinien zum Abfangen von
Ausnahmen
Syntax
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
statement2;
. . .
[WHEN exception3 [OR exception4 . . .] THEN
statement1;
statement2;
. . .]
[WHEN OTHERS THEN
statement1;
statement2;
. . .]
23-5
Copyright © Oracle Corporation, 1998. All rights reserved.
Abfangen vordefinierter Oracle
Server Errors
• Den Standardnamen der Ausnahmebehandlung benutzen
• Beispiele vordefinierter Ausnahmen:
– NO_DATA_FOUND
– TOO_MANY_ROWS
– INVALID_CURSOR
– ZERO_DIVIDE
• WHEN OTHERS ist die letzte Klausel
• EXCEPTION Schlüsselwort startet die
Ausnahmebehandlung.
• Verschiedene Ausnahmebehadlungen
sind erlaubt
• Nur ein Anwender arbeitet bevor der
Prozess verlassen wird
Copyright © Oracle Corporation, 1998. All rights reserved.
23-6
Vordefinierte Ausnahmen
Syntax
BEGIN SELECT ... COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;
WHEN TOO_MANY_ROWS THEN
statement1;
WHEN OTHERS THEN
statement1;
statement2;
statement3;
END;
– DUP_VAL_ON_INDEX
23-7
Copyright © Oracle Corporation, 1998. All rights reserved.
23-8
Copyright © Oracle Corporation, 1998. All rights reserved.
Abfangen nicht vordefinierter
Oracle Server Errors
Deklaration
Zuordnung
Deklarative Sektion
• Name der
Referenz
Ausnahmebehandlungsteil
• Code der PRAGMA • Behandle die
Ausnahme
EXCEPTION_INIT
angezeigte
Ausnahme
Copyright © Oracle Corporation, 1998. All rights reserved.
23-9
Deklarative
Sektion
• Name der
Ausnahme
23-11
Anzeigen
Ausführbare
Sektion
Referenz
Ausnahmebehandlungssektion
• Explizite Anzeige
• Behandlung
der Ausnahme
mit Gebrauch des
RAISE Statments
der angezeigten Ausnahme
Copyright © Oracle Corporation, 1998. All rights reserved.
Abfangen mit Oracle Server Fehlernummer
-2292 eine Verletzung der referentiellen
Integrität
DECLARE
e_products_invalid
EXCEPTION;
e_products_invalidEXCEPTION;
PRAGMA EXCEPTION_INIT
EXCEPTION_INIT ((
PRAGMA
e_products_invalid,
e_products_invalid, -2292);
-2292);
v_message VARCHAR2(50);
BEGIN
. . .
EXCEPTION
WHEN e_products_invalid THEN
:g_message := 'Product code
specified is not valid.';
. . .
END;
23-10
Abfangen benutzerdefinierter
Ausnahmen
Deklaration
Nicht vordefinierter Fehler
1
2
3
Copyright © Oracle Corporation, 1998. All rights reserved.
Benutzerdefinierte Ausnahmen
Beispiel
[DECLARE]
e_amount_remaining
EXCEPTION;
e_amount_remaining
EXCEPTION;
. . .
BEGIN
. . .
RAISE
RAISEe_amount_remaining;
e_amount_remaining;
. . .
EXCEPTION
e_amount_remaining THEN
WHEN e_amount_remaining
:g_message := 'There is still an amount
in stock.';
. . .
END;
23-12
Copyright © Oracle Corporation, 1998. All rights reserved.
1
2
3
Funktionen zum Abfangen von
Ausnahmen
• SQLCODE
Gibt einen numerischen Wert als Fehlercode zurück
• SQLERRM
Gibt eine Nachricht zusammen mit der
Fehlernummer zurück
Funktionen zum Abfangen von
Ausnahmen
Beispiel
DECLARE
v_error_code
v_error_message
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
v_error_code :=
v_error_message
NUMBER;
VARCHAR2(255);
SQLCODE ;
:= SQLERRM ;
INSERT INTO errors VALUES(v_error_code,
v_error_message);
END;
23-13
Copyright © Oracle Corporation, 1998. All rights reserved.
23-14
Link für Fehlerbehandlung /
Exceptions
Weiterleiten von Ausnahmen
DECLARE
. . .
e_no_rows
exception;
e_integrity
exception;
PRAGMA EXCEPTION_INIT (e_integrity, -2292);
BEGIN
FOR c_record IN emp_cursor LOOP
Subblöcke können eine
Ausnahme behandeln
oder die Ausnahme an
den einschließenden
Block übergeben.
BEGIN
SELECT ...
UPDATE ...
IF SQL%NOTFOUND THEN
RAISE e_no_rows;
END IF;
EXCEPTION
WHEN e_integrity THEN ...
WHEN e_no_rows THEN ...
END;
Copyright © Oracle Corporation, 1998. All rights reserved.
http://fara.cs.unipotsdam.de/~uhlmann/19/ch09.html
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN . . .
WHEN TOO_MANY_ROWS THEN . . .
END;
23-15
Copyright © Oracle Corporation, 1998. All rights reserved.
23-16
Copyright © Oracle Corporation, 1998. All rights reserved.
RAISE_APPLICATION_ERROR
Syntax
raise_application_error (error_number,
message[, {TRUE | FALSE}]);
• Eine Prozedur, die nutzerdefinierte
Fehlermeldungen von einem stored
subprogram ausgeben läßt.
• Benannt nur von einem ausführbaren
stored subprogram.
23-17
Copyright © Oracle Corporation, 1998. All rights reserved.
RAISE_APPLICATION_ERROR
• Kann an zwei unterschiedlichen Stellen
angewandt werden:
– Ausführbare Sektion
– Ausnahme Sektion
• Gibt Fehlerbedingungen in der gleichen
Art wie andere Oracle Server Fehler an
den Nutzer zurück.
23-18
Copyright © Oracle Corporation, 1998. All rights reserved.
Herunterladen