2016-04-21 4 views
0

Ich schreibe eine Funktion, die den Namen eines Schülers zurückgibt, wenn eine ID eingegeben wird. Wenn eine ID eingegeben wird, die nicht in der Datenbank vorhanden ist, möchte ich eine Ausnahme auslösen. Stattdessen, wenn ich eine falsche Schüler-IDs eingeben, entweder es gibt nichts, wenn ich die grundlegende Ausnahme ausgelöst haben oder gibt diese Fehlermeldung mit einer Ausnahme erklärt:PLSQL Funktion, die die Ausnahme nicht korrekt auslöst

6503. 00000 - "PL/SQL: Function returned without value" 
*Cause: A call to PL/SQL function completed, but no RETURN statement was 
     executed. 
*Action: Rewrite PL/SQL function, making sure that it always returns 
     a value of a proper type. 

Hier ist meine Funktion:

CREATE OR REPLACE Function STUDENT(S_NUM IN NUMBER) 
RETURN varchar2 IS 
STUDENT_NAME varchar2(50); 
NOTEXISTS EXCEPTION; 
    cursor S_CUR is 
    SELECT S_NAME 
     FROM ROSTER 
     WHERE S_NUM = S_ID; 
BEGIN 
    open S_CUR; 
    fetch S_CUR into STUDENT_NAME; 

    if S_CUR%notfound then 
     RAISE NOTEXISTS; 
    end if; 
    close S_CUR; 
RETURN STUDENT_NAME; 

EXCEPTION 
WHEN NOTEXISTS THEN -- handle the error 
     dbms_output.put_line('NO STUDENT FOUND.'); 
END; 

Irgendwelche Ideen?

+0

Sie müssen eine Ausnahme im 'when' Teil" –

+0

Oder "eine RETURN-Anweisung, z. B. RETURN NULL; – DCookie

Antwort

2

Wenn eine Ausnahme auftritt, geben Sie die tatsächliche Fehlermeldung nicht zurück. Ihre Funktion soll Varchar zurückgeben. Sie drucken jedoch nur den Fehler und geben die tatsächliche Fehlermeldung nicht zurück.

EXCEPTION 
WHEN NOTEXISTS THEN -- handle the error 
     dbms_output.put_line('NO STUDENT FOUND.'); 
     return 'No Student Found' 
END; 
+0

Ich verstehe. Also wirklich ich glaube nicht einmal, dass ich dbms_output brauche .... – lnjblue

+0

Ja, das ist normalerweise zum Debuggen und dafür sorgen, dass der Code dort ankommt – cableload

2

Erstens, anstatt Ihre eigene Ausnahme zu definieren, die im Rahmen Ihrer Funktion ist nur gültig ist, verwenden Sie die Standard-Ausnahme, die für diese Situation definiert ist - die NO_DATA_FOUND Ausnahme:

CREATE OR REPLACE Function STUDENT(S_NUM IN ROSTER.S_ID%TYPE) 
    -- Exceptions: raises NO_DATA_FOUND if the student ID passed in 
    --    parameter S_NUM is not found in the STUDENT table. 
    RETURN ROSTER.S_NAME%TYPE 
IS 
    STUDENT_NAME ROSTER.S_NAME%TYPE; 
    bData_found BOOLEAN; 

CURSOR S_CUR IS 
    SELECT S_NAME 
     FROM ROSTER 
     WHERE S_NUM = S_ID; 
BEGIN 
    OPEN S_CUR; 

    FETCH S_CUR INTO STUDENT_NAME; 

    bData_found := S_CUR%NOTFOUND; 

    CLOSE S_CUR; 

    IF bData_found THEN 
    RETURN STUDENT_NAME;  
    ELSE 
    RAISE NO_DATA_FOUND; 
    END IF; 
END STUDENT; 

Zweitens Behandeln Sie die Ausnahme in Ihrer Funktion nicht. Der Zweck einer Ausnahme besteht darin, dem Code zu ermöglichen, anderen Code eine Ausnahmebedingung mitzuteilen. Lassen Sie den Anrufer die Ausnahme behandeln, wie in:

DECLARE 
    nStudent_id  ROSTER.S_ID%TYPE := 12345; 
    strStudent_name ROSTER.S_NAME%TYPE; 
BEGIN 
    strStudent_name := STUDENT(nStudent_id); 
    DBMS_OUTPUT.PUT_LINE('S_ID=' || nStudent_id || ' NAME=' || strStudent_name); 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    DBMS_OUTPUT.PUT_LINE('NO STUDENT FOUND.'); 
END; 

Viel Glück.

+0

Einverstanden, bis zu einem gewissen Punkt. Eine Funktion sollte eigene, funktionsspezifische oder anwendungsspezifische Fehler behandeln, auch wenn sie nur einen Fehler auslösen und an den Aufrufer weitergeben soll. Wenn zum Beispiel die Studenten-IDs nicht größer als 45999 sein sollten, kann die Funktion ihre eigene AUSNAHME haben, um den Anrufer zu warnen, wenn der Benutzer 60444 eingibt. – mathguy

Verwandte Themen