4 Stimmen

Prüfen auf Fehler bei der Ausführung einer Prozedur in Orakel

create or replace procedure proc_advertisement(CustomerID in Number,
NewspaperID in number,
StaffID in Number,
OrderDate in date,
PublishDate in date,
Type in varchar,      
Status in varchar, 
Units in number) is 

begin 

insert into PMS.Advertisement(CustomerID, NewspaperID, StaffID, OrderDate, PublishDate, 
Type, Status, Units) 
values(CustomerID,NewspaperID, StaffID, OrderDate, PublishDate, 
Type, Status, Units); 
dbms_output.put_line('Advertisement Order Placed Successfully'); 
end;

Wie kann ich überprüfen, ob bei der Ausführung des Verfahrens ein Fehler aufgetreten ist, und wenn ein Fehler aufgetreten ist, möchte ich eine Fehlermeldung anzeigen.

7voto

Tony Andrews Punkte 125904

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X