Zunächst einmal wird Oracle selbst eine Fehlermeldung ausgeben, wenn bei der Ausführung der Prozedur ein Fehler auftritt - zum Beispiel:
ORA-02291: integrity constraint (EMP.MGR_FK) violated - parent key not Found
Sie können Fehler explizit behandeln, indem Sie einen Exception-Handler schreiben, aber wenn Sie das nicht gut machen, ist es sehr wahrscheinlich, dass Sie das Problem nur verschleiern. Sie könnten zum Beispiel einfach folgendes hinzufügen (kurz vor dem ENDE Ihrer Prozedur:
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,'An error occured');
Aber jetzt weiß der Benutzer nicht, um welche Art von Fehler es sich handelt, während er vorher darauf schließen konnte, dass der angegebene Manager nicht existiert. Sie könnten den ursprünglichen Fehler auch wie folgt anzeigen:
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,'An error occured: '||SQLERRM);
wenn das einen Mehrwert bringt. Oder Sie könnten einfach einen allgemeinen Fehler anzeigen und den Wert von SQLERRM in eine Protokolltabelle schreiben.
Sie können auch bestimmte Ausnahmen behandeln: zum Beispiel
PROCEDURE ... IS
e_invalid_fk EXCEPTION;
PRAGMA EXCEPTION_INIT(e_invalid_fk,-2291);
BEGIN
...
EXCEPTION
WHEN e_invalid_fk THEN
IF SQLERRM LIKE '%(EMP.MGR_FK)%' THEN
raise_application_error(-20001,'Invalid manager specified');
ELSE
RAISE;
END IF;
END;
Beachten Sie das RAISE: Wenn ein Teil Ihres Ausnahmebehandlungsprogramms weder ein RAISE noch ein RAISE_APPLICATION_ERROR ausgibt, kehren Sie die Ausnahme effektiv unter den Teppich - der Benutzer wird denken, dass das Verfahren funktioniert hat.
DBMS_OUTPUT.PUT_LINE eignet sich übrigens hervorragend zum Ausprobieren und Debuggen in SQL Plus oder einer IDE, hat aber in echtem Code nichts zu suchen, da Benutzer und Anwendungen, die die Prozedur aufrufen, die von ihr erzeugte Ausgabe nie sehen werden.