PL/SQL函数Oracle中未处理异常
我已经编写了下面的PL/SQL函数,它返回过程所需的时间。该函数已成功编译并按预期更新员工的薪资 我还想处理一个异常,如果为函数提供了错误的参数。但是,如果我输入了不存在的员工id,则不会按照我在函数中尝试的方式处理异常。我收到了一份标准错误报告 另一个问题是,当函数成功更新salary时,我看不到INTERVAL DAY到SECOND的返回值 如何查看带有“遇到错误”字符串和返回值的自定义错误消息PL/SQL函数Oracle中未处理异常,sql,oracle,plsql,Sql,Oracle,Plsql,我已经编写了下面的PL/SQL函数,它返回过程所需的时间。该函数已成功编译并按预期更新员工的薪资 我还想处理一个异常,如果为函数提供了错误的参数。但是,如果我输入了不存在的员工id,则不会按照我在函数中尝试的方式处理异常。我收到了一份标准错误报告 另一个问题是,当函数成功更新salary时,我看不到INTERVAL DAY到SECOND的返回值 如何查看带有“遇到错误”字符串和返回值的自定义错误消息 CREATE OR REPLACE function myfunction1(e_empno_i
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\u DATA\u FOUND
。当更新
、删除
或插入
找不到行时,Oracle不会将其视为错误
要使代码按预期执行,您需要在更新后测试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\u输出
要好得多。未处理的错误更难忽略
- 由于您将其设计为一个函数,因此获取返回的
stopwatch
值的正确方法是在调用函数的任何地方处理它
为什么不thestart:=SYSTIMESTAMP代码>等等?谢谢你的帮助。但我不得不更改错误号,因为我收到了错误报告-ORA-21000:“用于引发应用程序错误的错误号参数\u错误-10001超出范围”。而且我仍然不知道如何打印返回的秒表?@samba是的,以-20101
为例交换-10001
。因为用户定义的错误号范围为-20000
和-20999
。