2017-05-29 81 views
1
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并显示错误消息,我想处理该异常?我在哪里添加异常块?SQL如何处理用户定义函数中的异常?

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块来检查函数是否正常工作。

回答

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 ; 

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

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

干杯和快乐的编码。