【问题标题】:SQL How to handle an exception in user defined functions?SQL 如何处理用户定义函数中的异常?
【发布时间】:2017-10-29 23:04:39
【问题描述】:
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 并返回对应的staff 姓名。如果用户输入无效的 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 exception-handling user-defined-functions


    【解决方案1】:

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

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

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

    干杯,编码愉快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多