加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么在Oracle中no_data_found ORA-01403是异常?

发布时间:2020-12-12 13:47:48 所属栏目:百科 来源:网络整理
导读:如果SELECT INTO语句不返回至少一行,则抛出ORA-01403. 对于每个其他DBMS,我知道这是一个SELECT的正常. 只有Oracle会这样对待一个SELECT INTO. CREATE OR REPLACE PROCEDURE no_data_proc IS dummy dual.dummy%TYPE;BEGIN BEGIN SELECT dummy INTO dummy FROM
如果SELECT INTO语句不返回至少一行,则抛出ORA-01403.

对于每个其他DBMS,我知道这是一个SELECT的正常.
只有Oracle会这样对待一个SELECT INTO.

CREATE OR REPLACE PROCEDURE no_data_proc IS
   dummy dual.dummy%TYPE;
BEGIN
  BEGIN 
     SELECT dummy  
       INTO dummy
       FROM dual
      WHERE dummy = 'Y';   
  EXCEPTION 
     WHEN no_data_found THEN
        dbms_output.put_line('Why is this needed?');
  END;
END no_data_proc;

为什么?

在我看来,你真的不需要这个例外.这太开销了
有时它是方便的,但你必须写一个整个开始,例外,WHEN,END块.

有没有什么重要的原因我看不到?

不需要异常块,您可以根据上下文使用它.

在这里,您主动忽略异常(程序将成功返回),但大多数情况下,如果您正在执行SELECT INTO,则要使其失败(如果不返回),请考虑:

PROCEDURE update_employee_salary (p_empno) IS
   l_salary NUMBER;
BEGIN
   SELECT sal INTO l_salary FROM emp WHERE empno = p_empno FOR UPDATE;
   /* do something with emp data */
END;

在这里,如果使用在EMP表中不存在的empno调用该函数,我希望我的函数失败.我可能会捕获异常来提出一个有意义的错误信息(with raise_application_error),但大多数时候我对ORA-01403感到满意.

一般来说,您应该捕获的唯一例外是预期的异常(即不应该是捕获所有ORA-01403的标准,或者是所有异常).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读