SQL 如何处理用户自定义函数中的异常?

SQL How to handle an exception in user defined functions?

CREATE OR REPLACE Function fun_Find_Staff_Name( v_staffid IN NUMBER )
RETURN VARCHAR2
IS
staff_name VARCHAR2(60);
CURSOR c_staff IS
  SELECT staff_firstName || ' ' ||  staff_lastName
  into staff_name
  FROM staff
  WHERE staff_id = v_staffid;
BEGIN
OPEN c_staff;
FETCH c_staff INTO staff_name;  
CLOSE c_staff;
RETURN staff_name;
END;

这个函数接受一个staff_id和returns对应的员工姓名。如果用户输入无效的 ID 并显示错误消息,我想处理异常?我在哪里添加异常块?

SET serveroutput ON;
DECLARE
v_staff_ID NUMBER := &StaffID;
v_message VARCHAR2(100);
BEGIN
v_message := fun_Find_Staff_Name(v_staff_ID);
dbms_output.put_line(v_message);
END;

我使用这个匿名块来检查功能是否正常工作。

在我看来,您不需要显式光标,嵌入式 sql 就可以了:

CREATE OR REPLACE Function fun_Find_Staff_Name
( v_staffid IN NUMBER ) 
RETURN VARCHAR2 
IS 
staff_name VARCHAR2(60);
BEGIN
  SELECT staff_firstName || ' ' || staff_lastName 
       INTO staff_name 
     FROM staff WHERE staff_id = v_staffid; 
  RETURN staff_name;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
  --in case of an invalid id no data will be found
  --you can treat your exception here
  --example
    DBMS_OUTPUT.PUT_LINE('No data found for this id: ' || v_staffid);
    RAISE;
  WHEN OTHERS THEN
    RAISE;
END fun_Find_Staff_Name ;

请记住,在处理异常时不要忘记引发它;如果不是,数据库将不会在发生错误时回滚事务。

如果在编译时大喊错误,我很抱歉,但我没有编译就写了代码(我的暴民匆忙)。

干杯,编码愉快。