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.