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

时间:2017-05-29 15:19:37

标签: sql exception-handling 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并返回相应的人员姓名。如果用户输入无效的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;

我用这个anonyomus块检查功能是否正常工作。

1 个答案:

答案 0 :(得分:0)

在我看来,你不需要一个显式游标,一个嵌入式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 ;

请记住,当你处理异常时,不要忘记提出异常;如果不是,则数据库在发生错误时不会回滚事务。

如果它在编译时会出现一些错误,我很抱歉,但是我编写了代码而没有编译它(匆忙从我的暴徒那里)。

欢呼和快乐的编码。