簡體   English   中英

在PL / SQL函數Oracle中不處理異常

[英]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 updatedeleteinsert無法找到行時,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM