Oracle 不使用';不能正确地引发异常
我正在编写一个函数,在输入ID时返回学生的姓名。如果输入了数据库中不存在的ID,我希望引发异常。相反,当我输入不正确的学生ID时,如果引发基本异常,则不会返回任何内容,或者返回此错误消息并声明异常:Oracle 不使用';不能正确地引发异常,oracle,function,plsql,exception-handling,Oracle,Function,Plsql,Exception Handling,我正在编写一个函数,在输入ID时返回学生的姓名。如果输入了数据库中不存在的ID,我希望引发异常。相反,当我输入不正确的学生ID时,如果引发基本异常,则不会返回任何内容,或者返回此错误消息并声明异常: 6503. 00000 - "PL/SQL: Function returned without value" *Cause: A call to PL/SQL function completed, but no RETURN statement was executed.
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.
以下是我的功能:
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;
有什么想法吗?当发生异常时,您不会返回实际的错误消息。您的函数应该返回varchar。但是,您只是打印错误,而没有返回实际的错误消息
EXCEPTION
WHEN NOTEXISTS THEN -- handle the error
dbms_output.put_line('NO STUDENT FOUND.');
return 'No Student Found'
END;
发生异常时,您不会返回实际的错误消息。您的函数应该返回varchar。但是,您只是打印错误,而没有返回实际的错误消息
EXCEPTION
WHEN NOTEXISTS THEN -- handle the error
dbms_output.put_line('NO STUDENT FOUND.');
return 'No Student Found'
END;
首先,不要定义仅在函数上下文中有效的您自己的异常,而是使用为这种情况定义的标准异常—
NO\u DATA\u FOUND
异常:
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;
其次,不要在函数中处理异常。异常的目的是允许代码将异常条件传递给其他代码。让调用方处理异常,如中所示:
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;
祝您好运。首先,不要定义您自己的异常(仅在函数上下文中有效),而是使用为这种情况定义的标准异常—
NO\u DATA\u FOUND
异常:
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;
其次,不要在函数中处理异常。异常的目的是允许代码将异常条件传递给其他代码。让调用方处理异常,如中所示:
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;
祝你好运。当
部分或返回语句时,你需要在中引发一个异常,例如returnnull;当
part或RETURN语句时,您需要在中引发一个异常,例如returnnull;是的,这通常是为了调试并确保代码到达目的地。是的,这通常是为了调试并确保代码在某种程度上达到目的地。函数应该处理自己的、特定于函数的或特定于应用程序的错误,即使只是引发错误并将其传递给调用方。例如,如果学生ID不应大于45999,则函数可以有自己的异常,在用户输入60444时向调用者发出警报。在一定程度上同意。函数应该处理自己的、特定于函数的或特定于应用程序的错误,即使只是引发错误并将其传递给调用方。例如,如果学生ID不应大于45999,则函数可以有自己的异常,以便在用户输入60444时向调用者发出警报。