我编写了以下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;
答案 0 :(得分:3)
NO_DATA_FOUND
无法返回任何行时才会引发{p> select
。当update
,delete
或insert
无法找到行时,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
值的正确方法是在调用函数时处理它。