Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL函数Oracle中未处理异常_Sql_Oracle_Plsql - Fatal编程技术网

PL/SQL函数Oracle中未处理异常

PL/SQL函数Oracle中未处理异常,sql,oracle,plsql,Sql,Oracle,Plsql,我已经编写了下面的PL/SQL函数,它返回过程所需的时间。该函数已成功编译并按预期更新员工的薪资 我还想处理一个异常,如果为函数提供了错误的参数。但是,如果我输入了不存在的员工id,则不会按照我在函数中尝试的方式处理异常。我收到了一份标准错误报告 另一个问题是,当函数成功更新salary时,我看不到INTERVAL DAY到SECOND的返回值 如何查看带有“遇到错误”字符串和返回值的自定义错误消息 CREATE OR REPLACE function myfunction1(e_empno_i

我已经编写了下面的PL/SQL函数,它返回过程所需的时间。该函数已成功编译并按预期更新员工的薪资

我还想处理一个异常,如果为函数提供了错误的参数。但是,如果我输入了不存在的员工id,则不会按照我在函数中尝试的方式处理异常。我收到了一份标准错误报告

另一个问题是,当函数成功更新salary时,我看不到INTERVAL DAY到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\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