2017-05-29 83 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 ; 

也請記住,當你在處理異常不要忘記提高它;如果不是,數據庫在發生錯誤時不會回滾事務。

如果它在編譯時大喊一些錯誤,我很抱歉,但是我編寫代碼時沒有編譯它(匆匆從我的暴徒那裏)。

乾杯和快樂的編碼。