[英]Exception is not handled in PL/SQL function Oracle
我編寫了以下PL / SQL函數,它返回過程所需的時間。 該函數已成功編譯並按預期更新員工的工資。
如果向函數提供了錯誤的參數,我還想處理異常。 但是,如果我輸入不存在的員工ID,則不會按照我在函數中嘗試執行此操作的方式處理異常。 我得到一個標准的錯誤報告。
另一個問題是,當函數成功更新工資時,我看不到INTERVAL DAY TO SECOND的返回值。
如何查看“遇到錯誤的錯誤”字符串和返回值的自定義錯誤消息?
CREATE OR REPLACE function myfunction1(e_empno_in IN NUMBER, e_sal_in IN NUMBER)
RETURN INTERVAL DAY TO SECOND
IS
e_empno emp.empno%TYPE := e_empno_in;
e_sal emp.sal%TYPE := e_sal_in;
thestart TIMESTAMP;
stopwatch INTERVAL DAY TO SECOND;
BEGIN
SELECT current_timestamp INTO thestart FROM dual;
UPDATE emp SET sal = e_sal WHERE empno = e_empno;
SELECT current_timestamp-thestart INTO stopwatch FROM dual;
RETURN stopwatch;
EXCEPTION
WHEN OTHERS
THEN
dbms_output.put_line('An ERROR Was encountered' || DBMS_UTILITY.format_error_stack());
RAISE;
END;
BEGIN
dbms_output.put_line(myfunction1(7654, 2559));
END;
只有在隱式游標中的select
無法返回任何行時才會引發NO_DATA_FOUND
。 當update
, delete
或insert
無法找到行時,Oracle不會將其視為錯誤。
要使代碼按預期執行,您需要在update
后測試sql%rowcount
,然后自己引發錯誤。
BEGIN
SELECT CURRENT_TIMESTAMP INTO thestart FROM DUAL;
UPDATE emp
SET sal = e_sal
WHERE empno = e_empno;
IF SQL%ROWCOUNT = 0 THEN
raise_application_error (-20001, 'No row found for id ' || e_empno);
END IF;
stopwatch := CURRENT_TIMESTAMP - thestart;
RETURN stopwatch;
END;
其他說明
DBMS_OUTPUT
,這樣做會好得多。 未處理的錯誤更難以忽略。 stopwatch
值的正確方法是在調用函數的任何東西中處理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.