在PL / SQL函数Oracle中不处理异常

时间:2017-10-23 22:02:05

标签: sql oracle plsql

我编写了以下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;

1 个答案:

答案 0 :(得分:3)

只有在隐式游标中的NO_DATA_FOUND无法返回任何行时才会引发{p> select。当updatedeleteinsert无法找到行时,Oracle不会将其视为错误。

要使代码按预期执行,您需要在sql%rowcount后测试update,然后自行提出错误。

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值的正确方法是在调用函数时处理它。